|
|
  |
100 байт не хватает |
|
|
|
Dec 30 2008, 12:19
|
дятел
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
Dec 30 2008, 13:17
|

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

|
Цитата IAR в таких случаях действительно оптимизирует,gcc увы следует стандарту и умножает 32X32 Причем тут стандарт? Оба компилятора поступили по стандартую Только оптимизатор иара чутьнамного более умный и понимает, что если мы преобразовали short в long, то два старших байта будут равны 0. А следовательно, результат умножения с этими байтами можно заменить на 0, а затем, рассматривая сложение с 0, банально его (сложение) убирает. Все рады  А вообще, хотел ответить в духе "ну и пусть этот гнусь вместе со своими адептами подхода "жрите что дают" убъются апстену", ну будем считать, что сдержался
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Dec 30 2008, 13:26
|
Знающий
   
Группа: Участник
Сообщений: 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)  А вообще, хотел ответить в духе "ну и пусть этот гнусь вместе со своими адептами подхода "жрите что дают" убъются апстену", ну будем считать, что сдержался  Жрите что дают, не нравиться готовте сами, не умеете платите деньги... Не сдержался..... Анатолий.
Сообщение отредактировал aesok - Dec 30 2008, 13:31
|
|
|
|
|
Dec 30 2008, 13:49
|
дятел
    
Группа: Свой
Сообщений: 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 итд.
|
|
|
|
|
Dec 30 2008, 14:35
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 30 2008, 15:06
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(aesok @ Dec 30 2008, 17:35)  Так как последние не реализованы для avr платформы, то компилятор всегда использует 32-битное умножение для 16- и 32-битных операндов, если необходим 32-битный результат. дык это все понятно, просто ИМХО, если нет реализации для avr платформы, то можно было бы их просто в libc прописать... ну и добавить типа 24/8=16 итд, что бывает очень актуально для авр... усилий то для этого минимум, а в результате не нужно самописные модули организовывать.
|
|
|
|
|
Dec 31 2008, 07:40
|
Гуру
     
Группа: Участник
Сообщений: 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 ?
|
|
|
|
|
Dec 31 2008, 08:27
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 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 должно хватать)
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|