реклама на сайте
подробности

 
 
6 страниц V  « < 4 5 6  
Reply to this topicStart new topic
> 100 байт не хватает
singlskv
сообщение Dec 30 2008, 12:19
Сообщение #76


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Rst7 @ Dec 30 2008, 14:13) *
Где?
IAR в таких случаях действительно оптимизирует,
gcc увы следует стандарту и умножает 32X32
Код
  6a:    0c d0           rcall    .+24     ; 0x84 <__mulsi3>
.................................
00000084 <__mulsi3>:
  84:    62 9f           mul    r22, r18
  86:    d0 01           movw    r26, r0
  88:    73 9f           mul    r23, r19
  8a:    f0 01           movw    r30, r0
  8c:    82 9f           mul    r24, r18
  8e:    e0 0d           add    r30, r0
  90:    f1 1d           adc    r31, r1
  92:    64 9f           mul    r22, r20
  94:    e0 0d           add    r30, r0
  96:    f1 1d           adc    r31, r1
  98:    92 9f           mul    r25, r18
  9a:    f0 0d           add    r31, r0
  9c:    83 9f           mul    r24, r19
  9e:    f0 0d           add    r31, r0
  a0:    74 9f           mul    r23, r20
  a2:    f0 0d           add    r31, r0
  a4:    65 9f           mul    r22, r21
  a6:    f0 0d           add    r31, r0
  a8:    99 27           eor    r25, r25
  aa:    72 9f           mul    r23, r18
  ac:    b0 0d           add    r27, r0
  ae:    e1 1d           adc    r30, r1
  b0:    f9 1f           adc    r31, r25
  b2:    63 9f           mul    r22, r19
  b4:    b0 0d           add    r27, r0
  b6:    e1 1d           adc    r30, r1
  b8:    f9 1f           adc    r31, r25
  ba:    bd 01           movw    r22, r26
  bc:    cf 01           movw    r24, r30
  be:    11 24           eor    r1, r1
  c0:    08 95           ret
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 30 2008, 12:24
Сообщение #77


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Rst7 @ Dec 30 2008, 15:13) *
Где?

Вы про IAR, а мы про GCC smile.gif

Вообще-то, если присмотреться, то необходимость сохранения контекста из-за того, что в умножении участвуют аж 11 регистров, сводит к нулю всю борьбу за красоту и скорость. Поэтому, толку от "отдельно стоЯщих правильных умножений" - чуть.
Другое дело, когда их в прерывании штук 10 надо сделать - тогда все красиво. Но асмом...
Go to the top of the page
 
+Quote Post
Rst7
сообщение Dec 30 2008, 13:17
Сообщение #78


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
IAR в таких случаях действительно оптимизирует,gcc увы следует стандарту и умножает 32X32


Причем тут стандарт? Оба компилятора поступили по стандартую Только оптимизатор иара чутьнамного более умный и понимает, что если мы преобразовали short в long, то два старших байта будут равны 0. А следовательно, результат умножения с этими байтами можно заменить на 0, а затем, рассматривая сложение с 0, банально его (сложение) убирает. Все рады smile.gif

А вообще, хотел ответить в духе "ну и пусть этот гнусь вместе со своими адептами подхода "жрите что дают" убъются апстену", ну будем считать, что сдержался smile.gif


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
aesok
сообщение Dec 30 2008, 13:26
Сообщение #79


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(singlskv @ Dec 30 2008, 15:19) *
gcc увы следует стандарту и умножает 32X32


Дело не в стандарте, просто в avr back-end нет инструкций для (s/u)16x(s/u)16=32-умножения. Я смотрел это, в принципе их несложно добавить.

При их наличии может немного возрастать размер кода, но время выполнения уменьшиться.

Анатолий.

Цитата(Rst7 @ Dec 30 2008, 16:17) *
А вообще, хотел ответить в духе "ну и пусть этот гнусь вместе со своими адептами подхода "жрите что дают" убъются апстену", ну будем считать, что сдержался smile.gif


Жрите что дают, не нравиться готовте сами, не умеете платите деньги... Не сдержался.....


Анатолий.

Сообщение отредактировал aesok - Dec 30 2008, 13:31
Go to the top of the page
 
+Quote Post
singlskv
сообщение Dec 30 2008, 13:49
Сообщение #80


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(aesok @ Dec 30 2008, 16:26) *
Дело не в стандарте, просто в avr back-end нет инструкций для (s/u)16x(s/u)16=32-умножения. Я смотрел это, в принципе их несложно добавить.
про стандарт я имел в виду что gcc делает строго по стандарту, те "обязан"
при таком обращении преобразовать к 32бит.

На самом деле, ИМХО, стоило бы просто добавить в libc набор функций(частично инлайн)"
16x8=32
16x16=32
24x8=32
32/8=32
32/16=16
24/8=24
24/16=16
итд.
Go to the top of the page
 
+Quote Post
aesok
сообщение Dec 30 2008, 14:35
Сообщение #81


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(singlskv @ Dec 30 2008, 16:49) *
про стандарт я имел в виду что gcc делает строго по стандарту, те "обязан"
при таком обращении преобразовать к 32бит.


В GCC имеется полный набор шаблонов инструкций для описания 32 битных
операций умножения 'mulsi3', `ssmulsi3', `usmulsi3', где 'si' означеает
single integer (или 32-бит) mode 's' и 'u' signed/unsigned. Также есть набор
шаблонов для 16x16=32 бит умножения `mulhisi3', `umulhisi3', `usmulhisi3',
где 'hi' half integer (16-бит) mode размерность операндов и 'si" mode размерность
результата.

Так как последние не реализованы для avr платформы, то компилятор всегда
использует 32-битное умножение для 16- и 32-битных операндов, если необходим
32-битный результат.

Добавить эти инструкции несложно, при этом добаляются функции __mulhisi3,
__ssmulhisi3 __sumulhisi3, Но может оказаться так что в результирующем коде
вместо 4 вызовов функции __mulsi3, будет по одному вызову __mulsi3,
__mulhisi3, __ssmulhisi3 __sumulhisi3 при этом размер кода возрастет. Но все
равно в большинстве случаях должен быть выигрыш и в размере кода тоже, не
только в скорости.

Анатолий.

Сообщение отредактировал aesok - Dec 30 2008, 14:36
Go to the top of the page
 
+Quote Post
singlskv
сообщение Dec 30 2008, 15:06
Сообщение #82


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(aesok @ Dec 30 2008, 17:35) *
Так как последние не реализованы для avr платформы, то компилятор всегда
использует 32-битное умножение для 16- и 32-битных операндов, если необходим
32-битный результат.
дык это все понятно, просто ИМХО, если нет реализации для avr платформы,
то можно было бы их просто в libc прописать...
ну и добавить типа 24/8=16 итд, что бывает очень актуально для авр...

усилий то для этого минимум, а в результате не нужно самописные модули организовывать.
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Dec 31 2008, 07:40
Сообщение #83


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



Цитата(aesok @ Dec 26 2008, 07:13) *
Для этого нужно перекомпилировать под свой проект crtXXXX.o.


Пытался добавить в проект разные crt*.S компилит с ошибками типа

"stdint.h:116: Error: unknown opcode `typedef'"

В файле stdint.h такая строка:

typedef int int8_t __attribute__((__mode__(__QI__)));

Если не включать avr/io.h тогда в принципе собирается, но нужно либо самому все дефайнить, либо убирать большую часть crt*.S, ни то и ни другое не подходит. Так как правильно скомпилить crt*.S ?
Go to the top of the page
 
+Quote Post
ReAl
сообщение Dec 31 2008, 08:27
Сообщение #84


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Огурцов @ Dec 31 2008, 09:40) *
Пытался добавить в проект разные crt*.S компилит с ошибками типа

"stdint.h:116: Error: unknown opcode `typedef'"
...
Так как правильно скомпилить crt*.S ?

Да должно быть так же, как и остальные .S файлы:
Код
AS    := avr-gcc -x assembler-with-cpp

И по разбросанным по .h- файлам #ifndef __ASSEMBLER__ лишнее изымается (не из всех, в wdt.h, кажется, остаются лишние чисто С-шные вещи, но для crt должно хватать)


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 31 2008, 11:11
Сообщение #85


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Огурцов @ Dec 31 2008, 11:40) *
Если не включать avr/io.h тогда в принципе собирается

С оригинальным avr/io.h такого нету - он за собой stdint.h не цепляет при вызове из асма. Переставьте WinAVR
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Dec 31 2008, 16:55
Сообщение #86


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



Цепляет, он там косвенно, через полдюжины #include цепляет. Пришлось сделать две вещи - включить common.h в gcrt1.S (после! #include "macros.inc") и добавить -D__ASSEMBLER__ к gcrt1.S.

gcrt1.o: ../Avr-libc/gcrt1.S
$(CC) $(INCLUDES) $(ASMFLAGS) -c -D__ASSEMBLER__ $<

хотя -x assembler-with-cpp были уже добавлены:

## Assembly specific flags
ASMFLAGS = $(COMMON)
ASMFLAGS += $(CFLAGS)
ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2

На мой взгляд как-то все еще не очень красиво, но таки уже компилится. Размер 1986, при том, что добавлены новые фичи - мультизагрузка всех устройств на шине, не взирая на серийник, и режим симуляции записи.
Go to the top of the page
 
+Quote Post

6 страниц V  « < 4 5 6
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 09:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.0147 секунд с 7
ELECTRONIX ©2004-2016