Перейти к содержанию
    

Следующий баг IAR (сдвиги на переменную величину).

18 часов назад, VladislavS сказал:

Причём тут GCC? Первая "I" не скопипастилась.

Странно.... проверил у себя на всех уровнях оптимизации - всегда LDRSB.  :wacko2:

Но у меня версия "V8.50.4.261". Получается: или IAR-овцы к вашей "8.50.9.278" это исправили или на M0 оно не проявляется? (у меня M4F)

 

PS: Создал отдельный проект, проверил компиляцией на разные ядра: M0, M0+, M1, M3, M4, M7.

Для ядер >= M3 генерится LDRSB, для <M3 - LDRB. Хотя сама команда LDRSB вроде присутствует на всех ядрах.

Исходя из этого, получается что это всё-таки баг. Так как какие бы правила си не применялись для этого выражения, результат не должен зависеть от целевого ядра. Надо писать в IAR. :unknw:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

37 минут назад, jcxz сказал:

Для ядер >= M3 генерится LDRSB, для <M3 - LDRB

На крайней версии компилятора всё так же.

 

-----------------------------------------

 

ARM Compiler 6.15, Cortex-M4F

0x20001B00 B081      SUB           sp,sp,#0x04
    10:   i0 += 25 << moFault;   
0x20001B02 F2422030  MOVW          r0,#0x2230
0x20001B06 F2C20000  MOVT          r0,#0x2000
0x20001B0A F2422240  MOVW          r2,#0x2240
0x20001B0E 7800      LDRB          r0,[r0,#0x00]
0x20001B10 F2C20200  MOVT          r2,#0x2000
0x20001B14 2119      MOVS          r1,#0x19
0x20001B16 6813      LDR           r3,[r2,#0x00]
0x20001B18 FA01F000  LSL           r0,r1,r0
0x20001B1C 4418      ADD           r0,r0,r3
0x20001B1E 6010      STR           r0,[r2,#0x00]
    11:   volatile int x = i0;         
0x20001B20 9000      STR           r0,[sp,#0x00]
0x20001B22 BF00      NOP           
0x20001B24 E7FE      B             0x20001B24

 

------------------------------------------

 

GCC 10.1 , Cortex-M4F, -03

    10:   i0 += 25 << moFault;  
0x200002c4 05 4B                ldr r3, [pc, #20]	; (0x200002dc <main()+24>) 
0x200002c6 06 4A                ldr r2, [pc, #24]	; (0x200002e0 <main()+28>) 
0x200002c8 18 78                ldrb r0, [r3, #0] 
0x200002ca 11 68                ldr r1, [r2, #0] 
0x200002cc 19 23                movs r3, #25 
     9: { 
0x200002ce 82 B0                sub sp, #8 
0x200002d0 83 40                lsls r3, r0 
0x200002d2 0B 44                add r3, r1 
0x200002d4 13 60                str r3, [r2, #0] 

 

 

Мне кажется, это не бага, а компилятор что-то с выравниванием команд мутит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, VladislavS сказал:

На крайней версии компилятора всё так же.

Спасибо.

Цитата

ARM Compiler 6.15, Cortex-M4F

...

0x20001B18 FA01F000  LSL           r0,r1,r0

Я смотрю тут своя неоптимальность... :wink:

А у GCC всё прилично.

1 час назад, VladislavS сказал:

Мне кажется, это не бага, а компилятор что-то с выравниванием команд мутит.

Сомнительно. Иначе:

i0 += 25 << moFault;

i0 += 25u << moFault;

давали бы одинаковый результат.

 

PS: Уже написал в IAR. Будем ждать ответа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

IAR-овцы присвоили багу идентификатор "EWARM-8422". Но срок исправления не установили, так как баг несерьёзный. Положен в дальний ящик (long-term). :unknw:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...