Хитрые, необычные алгоритмы и код

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 110
Зарегистрирован: Вт фев 28, 2017 08:13:31
Откуда: Свердловская обл.

Сообщение Zikon »

jcxz писал(а): Пн авг 17, 2026 18:42:10
Zikon писал(а): Чт авг 13, 2026 07:16:07так это уже сам компилятор умеет
abs1.png
Так себе оптимизация. :)
Древний IAR 7.80.4 for ARM компилит модуль в 2 команды:

Код: Выделить всё

     n = ABS32(iu);                                   
0xEA83 0x77E3      EOR      R7,R3,R3, ASR #+31        
0xEBA7 0x77E3      SUB      R7,R7,R3, ASR #+31
На входе аргумент (iu) - в R3; результат (n) - в R7.
так это Cortex-M0 ! а у вас уже Cortex-M3/M4

я в курсе что IAR - круто компилирует
( и даже с отключенной оптимизацией)

вот некоторые тесты по компиляторам ( закладка Tests )
на основе теста Coremark
https://docs.google.com/spreadsheets/d/ ... sp=sharing

// (a > 0) ? a : -a ;
GCC для Cortex-M3/M4 делает 3 команды
но используется только один регистр и по коду 3 х 16бит

Код: Выделить всё

 0x2800	cmp	r0, #0
 0xbfb8	it	lt
 0x4240	neglt	r0, r0
 
Реклама
Мудрый кот
Сообщения: 1799
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

Zikon писал(а): Вт авг 18, 2026 07:46:18// (a > 0) ? a : -a ;
GCC для Cortex-M3/M4 делает 3 команды
но используется только один регистр и по коду 3 х 16бит

Код: Выделить всё

 0x2800	cmp	r0, #0
 0xbfb8	it	lt
 0x4240	neglt	r0, r0
 
Ну вот собственно - о чём я и говорил, когда писал, что на ARM не всегда имеет смысл избавляться от классики.
А если непосредственно перед этим "(a > 0) ? a : -a" идут команды вычисления "a", влияющие на флаги, то "cmp r0, #0" может и не быть. И будет только две 16-битных команды. О чём я выше также писал.
Реклама
Ответить

Вернуться в «Разные вопросы по МК»