Привет всем!
Неожиданно проявилась проблема с IAR.
После перехода на версию 5.4 Full девайс на LPC1766 стал глючить.
Оптимизация - High/Balanced.
Анализ выявил следующее.
Заглючила строка сравнивающая старшее и младшее слово
Код
INT32U kc=key_code; // key_code тоже INT32U
if(!(0xFFFF&(kc^(kc>>16)))) {...}
Компилятор породил следущий код
Код
\ 0000013C 080C LSRS R0,R1,#+16 // в R1 находится kc
\ 0000013E 91EA000F TEQ R1,R0
\ 00000142 4DD1 BNE.N ??__int_display_2
Очевидно, что 0xFFFF проигнорирован напрочь.
Простая перестановка его в конец ничего не изменила.
Однако, после некоторых манипуляций, конструкция была изменена на
Код
if((0xFFFF&kc)==(kc>>16)){...}
Что породило уже рабочую последовательность
Код
\ 0000013C 88B2 UXTH R0,R1 // в R1 находится kc
\ 0000013E B0EB114F CMP R0,R1, LSR #+16
\ 00000142 4DD1 BNE.N ??__int_display_2
Я, конечно, понимаю, что в IAR люди работают и ничего человеческое им не чуждо.
Посмотрел на сайте и скачал Evalution версии 5.41, однако ничего не изменилось!!!!
На мой взгляд, оба варианта сравнения идентичны по сути.
Может быть первоначальный вариант и не столь очевиден, НО компилятора это не должно касаться.
Такого рода конструкций в проге куча.
Что же теперь, всё перепроверять на понятность и адекватность компилятора?
Печально, но я IARу раньше доверял как родному.
Суть вопроса - версию 5.4 в топку или я чего-то не не понимаю?
Заранее благодарен.