Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Глюк Keil MDK 4.01 при компиляции в Thumb-2
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
aaarrr
В ходе развлекательных экспериментов с кортексом выявился такой вот неприятный глюк:

Пример:
Код
unsigned int test_lsl(unsigned int a, unsigned int b)
{
    if(a > b)
    {
        a -= b;
        a <<= 1;
        a |= 1;
    }
    else a <<= 1;
    return a;
}

На уровнях оптимизации 2 и 3 компилируется так:
Код
                  test_lsl PROC
;;;88    
;;;89     unsigned int test_lsl(unsigned int a, unsigned int b)
0000c6  4288              CMP      r0,r1
;;;90     {
;;;91         if(a > b)
;;;92         {
;;;93             a -= b;
0000c8  bf88              IT       HI
0000ca  1a40              SUBHI    r0,r0,r1
;;;94             a <<= 1;
;;;95             a |= 1;
;;;96         }
;;;97         else a <<= 1;
0000cc  0040              LSLS     r0,r0,#1
0000ce  bf88              IT       HI                   ;95
0000d0  f0400001          ORRHI    r0,r0,#1             ;95
;;;98         return a;
;;;99     }
0000d4  4770              BX       lr
;;;100    
                          ENDP

LSLS перетирает флаг С, в результате чего OR выполняется совсем не по условию a > b.
defunct
Мда... забавно ускорили...
при том что 3.50 дает такой результат (-O3):

Код
    17:     if(a > b)
    18:     {
0x000001B8 4288      CMP      r0,r1
0x000001BA D904      BLS      0x000001C6
    19:         a -= b;
0x000001BC 1A40      SUBS     r0,r0,r1
    20:         a <<= 1;
0x000001BE 0040      LSLS     r0,r0,#1
    21:         a |= 1;
    22:     }
0x000001C0 F0400001  ORR      r0,r0,#0x01
0x000001C4 E000      B        0x000001C8
    23:     else a <<= 1;
    24:     return a;
0x000001C6 0040      LSLS     r0,r0,#1
0x000001C8 4770      BX       lr
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.