реклама на сайте
подробности

 
 
> Глюки IAR ARM 5.4, Глючная оптимизация в IAR ARM 5.4
Ytrnj
сообщение Jan 18 2010, 14:35
Сообщение #1





Группа: Участник
Сообщений: 10
Регистрация: 21-12-06
Из: Питер
Пользователь №: 23 756



Привет всем!

Неожиданно проявилась проблема с 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 в топку или я чего-то не не понимаю?

Заранее благодарен.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KRS
сообщение Jan 18 2010, 23:00
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



действительно с XORом какой то глюк! При проверке на 0
Код
volatile int beep;
void test1(unsigned a)
{
    if ((a ^ (a >> 16)) & 0xffff)
        beep = 1;
}

void test2(unsigned a)
{
    if ((a ^ (a >> 1)) & 0xffff)
        beep = 1;
}

unsigned test3(unsigned a)
{
    return ((a ^ (a >> 16)) & 0xffff);

}

void test4(unsigned a, unsigned b)
{
    if ((a ^ (b >> 16)) & 0xffff)
        beep = 1;
}

void test5(unsigned a, unsigned b)
{
    if ((a ^ (b >> 1)) & 0xffff)
        beep = 1;
}

void test6(unsigned a, unsigned b)
{
    if (((a & 0xffff) ^ (b >> 16)))
        beep = 1;
}

void test7(unsigned a)
{
    if (((a & 0xffff) ^ (a >> 16)))
        beep = 1;
}

void test8(unsigned a)
{
    if (((a & 0xffff) ^ (a >> 1)))
        beep = 1;
}

void test9(unsigned a, unsigned b)
{
    if (((a & 0xffff) ^ (b >> 1)))
        beep = 1;
}


Все эти функции кроме 3, 8, 9
компилируются с ошибкой!

Код
      2          void test1(unsigned a)
      3          {
      4              if ((a ^ (a >> 16)) & 0xffff)
   \                     test1:
   \   00000000   010C               LSRS     R1,R0,#+16
   \   00000002   90EA010F           TEQ      R0,R1
   \   00000006   02D0               BEQ.N    ??test1_0
      5                  beep = 1;
   \   00000008   ....               LDR.N    R0,??DataTable7 ;; beep
   \   0000000A   0121               MOVS     R1,#+1
   \   0000000C   0160               STR      R1,[R0, #+0]
      6          }
   \                     ??test1_0:
   \   0000000E   7047               BX       LR              ;; return
      7          

   \                                 In section .text, align 2, keep-with-next
      8          void test2(unsigned a)
      9          {
     10              if ((a ^ (a >> 1)) & 0xffff)
   \                     test2:
   \   00000000   4108               LSRS     R1,R0,#+1
   \   00000002   90EA010F           TEQ      R0,R1
   \   00000006   02D0               BEQ.N    ??test2_0
     11                  beep = 1;
   \   00000008   ....               LDR.N    R0,??DataTable7 ;; beep
   \   0000000A   0121               MOVS     R1,#+1
   \   0000000C   0160               STR      R1,[R0, #+0]
     12          }
   \                     ??test2_0:
   \   0000000E   7047               BX       LR              ;; return
     13          

   \                                 In section .text, align 2, keep-with-next
     14          unsigned test3(unsigned a)
     15          {
     16              return ((a ^ (a >> 16)) & 0xffff);
   \                     test3:
   \   00000000   80EA1040           EOR      R0,R0,R0, LSR #+16
   \   00000004   80B2               UXTH     R0,R0
   \   00000006   7047               BX       LR              ;; return
     17          
     18          }
     19          

   \                                 In section .text, align 2, keep-with-next
     20          void test4(unsigned a, unsigned b)
     21          {
     22              if ((a ^ (b >> 16)) & 0xffff)
   \                     test4:
   \   00000000   090C               LSRS     R1,R1,#+16
   \   00000002   90EA010F           TEQ      R0,R1
   \   00000006   02D0               BEQ.N    ??test4_0
     23                  beep = 1;
   \   00000008   ....               LDR.N    R0,??DataTable7 ;; beep
   \   0000000A   0121               MOVS     R1,#+1
   \   0000000C   0160               STR      R1,[R0, #+0]
     24          }
   \                     ??test4_0:
   \   0000000E   7047               BX       LR              ;; return
     25          

   \                                 In section .text, align 2, keep-with-next
     26          void test5(unsigned a, unsigned b)
     27          {
     28              if ((a ^ (b >> 1)) & 0xffff)
   \                     test5:
   \   00000000   4908               LSRS     R1,R1,#+1
   \   00000002   90EA010F           TEQ      R0,R1
   \   00000006   02D0               BEQ.N    ??test5_0
     29                  beep = 1;
   \   00000008   ....               LDR.N    R0,??DataTable7 ;; beep
   \   0000000A   0121               MOVS     R1,#+1
   \   0000000C   0160               STR      R1,[R0, #+0]
     30          }
   \                     ??test5_0:
   \   0000000E   7047               BX       LR              ;; return
     31          

   \                                 In section .text, align 2, keep-with-next
     32          void test6(unsigned a, unsigned b)
     33          {
     34              if (((a & 0xffff) ^ (b >> 16)))
   \                     test6:
   \   00000000   090C               LSRS     R1,R1,#+16
   \   00000002   90EA010F           TEQ      R0,R1
   \   00000006   02D0               BEQ.N    ??test6_0
     35                  beep = 1;
   \   00000008   ....               LDR.N    R0,??DataTable7 ;; beep
   \   0000000A   0121               MOVS     R1,#+1
   \   0000000C   0160               STR      R1,[R0, #+0]
     36          }
   \                     ??test6_0:
   \   0000000E   7047               BX       LR              ;; return
     37          

   \                                 In section .text, align 2, keep-with-next
     38          void test7(unsigned a)
     39          {
     40              if (((a & 0xffff) ^ (a >> 16)))
   \                     test7:
   \   00000000   010C               LSRS     R1,R0,#+16
   \   00000002   90EA010F           TEQ      R0,R1
   \   00000006   02D0               BEQ.N    ??test7_0
     41                  beep = 1;
   \   00000008   ....               LDR.N    R0,??DataTable7 ;; beep
   \   0000000A   0121               MOVS     R1,#+1
   \   0000000C   0160               STR      R1,[R0, #+0]
     42          }
   \                     ??test7_0:
   \   0000000E   7047               BX       LR              ;; return
     43          

   \                                 In section .text, align 2, keep-with-next
     44          void test8(unsigned a)
     45          {
     46              if (((a & 0xffff) ^ (a >> 1)))
   \                     test8:
   \   00000000   81B2               UXTH     R1,R0
   \   00000002   91EA500F           TEQ      R1,R0, LSR #+1
   \   00000006   02D0               BEQ.N    ??test8_0
     47                  beep = 1;
   \   00000008   ....               LDR.N    R0,??DataTable7 ;; beep
   \   0000000A   0121               MOVS     R1,#+1
   \   0000000C   0160               STR      R1,[R0, #+0]
     48          }
   \                     ??test8_0:
   \   0000000E   7047               BX       LR              ;; return
     49          

   \                                 In section .text, align 2, keep-with-next
     50          void test9(unsigned a, unsigned b)
     51          {
     52              if (((a & 0xffff) ^ (b >> 1)))
   \                     test9:
   \   00000000   80B2               UXTH     R0,R0
   \   00000002   90EA510F           TEQ      R0,R1, LSR #+1
   \   00000006   02D0               BEQ.N    ??test9_0
     53                  beep = 1;
   \   00000008   ....               LDR.N    R0,??DataTable7 ;; beep
   \   0000000A   0121               MOVS     R1,#+1
   \   0000000C   0160               STR      R1,[R0, #+0]
     54          }
   \                     ??test9_0:
   \   0000000E   7047               BX       LR              ;; return
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Ytrnj   Глюки IAR ARM 5.4   Jan 18 2010, 14:35
- - Ytrnj   Доброго времени суток. Посмотрел в старой копии, ...   Jan 18 2010, 18:02
|- - RabidRabbit   Цитата(Ytrnj @ Jan 18 2010, 21:02) Учитыв...   Jan 19 2010, 06:17
- - zltigo   Цитата(Ytrnj @ Jan 18 2010, 17:35) Такого...   Jan 18 2010, 18:43
- - KRS   А вы уверены в правильности своего кода? Дело в то...   Jan 18 2010, 21:40
|- - Сергей Борщ   Цитата(KRS @ Jan 18 2010, 23:40) Дело в т...   Jan 18 2010, 22:25
|- - Ytrnj   Цитата(KRS @ Jan 19 2010, 03:00) действит...   Jan 19 2010, 07:14
- - IgorKossak   Никому не приходило в голову, что 16-ричная конста...   Jan 19 2010, 07:51
|- - Сергей Борщ   Цитата(IgorKossak @ Jan 19 2010, 09:51) Н...   Jan 19 2010, 08:23
||- - IgorKossak   Цитата(Сергей Борщ @ Jan 19 2010, 10:23) ...   Jan 19 2010, 08:56
||- - Сергей Борщ   Цитата(IgorKossak @ Jan 19 2010, 10:56) Э...   Jan 19 2010, 11:28
||- - KRS   Цитата(Сергей Борщ @ Jan 19 2010, 14:28) ...   Jan 19 2010, 11:44
||- - Сергей Борщ   Цитата(KRS @ Jan 19 2010, 13:44) Не всегд...   Jan 19 2010, 12:18
|- - KRS   Цитата(IgorKossak @ Jan 19 2010, 10:51) Н...   Jan 19 2010, 09:08
|- - _4afc_   Цитата(IgorKossak @ Jan 19 2010, 10:51) Н...   Jan 19 2010, 15:14
|- - IgorKossak   Цитата(_4afc_ @ Jan 19 2010, 17:14) Вы на...   Jan 19 2010, 16:14
- - IgorKossak   Проверяли только XOR или другие операции тоже?   Jan 19 2010, 09:22
|- - KRS   Цитата(IgorKossak @ Jan 19 2010, 12:22) П...   Jan 19 2010, 09:33
- - MALLOY2   Да это баг для Cortex-M3, на других ядрах работает...   Jan 19 2010, 16:16
|- - KRS   Цитата(MALLOY2 @ Jan 19 2010, 19:16) Да э...   Jan 19 2010, 21:16
- - Alechek   Тема про компилятор 5.40 или 5.41? Я было плевался...   Jan 20 2010, 04:59
- - MALLOY2   ЦитатаТема про компилятор 5.40 или 5.41 Я тестиров...   Jan 20 2010, 06:25
|- - Ytrnj   Цитата(MALLOY2 @ Jan 20 2010, 10:25) Так ...   Jan 20 2010, 07:16
||- - IgorKossak   Цитата(Ytrnj @ Jan 20 2010, 09:16) Письмо...   Jan 20 2010, 07:32
|- - KRS   Цитата(MALLOY2 @ Jan 20 2010, 09:25) Я те...   Jan 20 2010, 10:48
|- - Alechek   Цитата(MALLOY2 @ Jan 20 2010, 11:25) Пото...   Jan 20 2010, 12:49
- - Ytrnj   Ну что, IAR ответил . Следует отметить, что дост...   Jan 21 2010, 15:48
|- - KRS   Цитата(Ytrnj @ Jan 21 2010, 18:48) sorry,...   Jan 21 2010, 16:14
|- - Ytrnj   Цитата(KRS @ Jan 21 2010, 20:14) Что то я...   Jan 22 2010, 08:54
- - MALLOY2   В версии 5.41.2 баги исправлены!!!...   Feb 25 2010, 13:42


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 06:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01431 секунд с 7
ELECTRONIX ©2004-2016