jcxz 184 23 января, 2021 Опубликовано 23 января, 2021 · Жалоба 18 часов назад, VladislavS сказал: Причём тут GCC? Первая "I" не скопипастилась. Странно.... проверил у себя на всех уровнях оптимизации - всегда LDRSB. Но у меня версия "V8.50.4.261". Получается: или IAR-овцы к вашей "8.50.9.278" это исправили или на M0 оно не проявляется? (у меня M4F) PS: Создал отдельный проект, проверил компиляцией на разные ядра: M0, M0+, M1, M3, M4, M7. Для ядер >= M3 генерится LDRSB, для <M3 - LDRB. Хотя сама команда LDRSB вроде присутствует на всех ядрах. Исходя из этого, получается что это всё-таки баг. Так как какие бы правила си не применялись для этого выражения, результат не должен зависеть от целевого ядра. Надо писать в IAR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 23 января, 2021 Опубликовано 23 января, 2021 · Жалоба 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] Мне кажется, это не бага, а компилятор что-то с выравниванием команд мутит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 23 января, 2021 Опубликовано 23 января, 2021 · Жалоба 1 час назад, VladislavS сказал: На крайней версии компилятора всё так же. Спасибо. Цитата ARM Compiler 6.15, Cortex-M4F ... 0x20001B18 FA01F000 LSL r0,r1,r0 Я смотрю тут своя неоптимальность... А у GCC всё прилично. 1 час назад, VladislavS сказал: Мне кажется, это не бага, а компилятор что-то с выравниванием команд мутит. Сомнительно. Иначе: i0 += 25 << moFault; i0 += 25u << moFault; давали бы одинаковый результат. PS: Уже написал в IAR. Будем ждать ответа. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 8 февраля, 2021 Опубликовано 8 февраля, 2021 · Жалоба IAR-овцы присвоили багу идентификатор "EWARM-8422". Но срок исправления не установили, так как баг несерьёзный. Положен в дальний ящик (long-term). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться