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

 
 
> Глюк Keil MDK 4.01 при компиляции в Thumb-2
aaarrr
сообщение Jan 29 2010, 14:15
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



В ходе развлекательных экспериментов с кортексом выявился такой вот неприятный глюк:

Пример:
Код
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.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 1)
defunct
сообщение Jan 31 2010, 04:52
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Мда... забавно ускорили...
при том что 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
Go to the top of the page
 
+Quote Post

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

 


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


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