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

 
 
> Глюк оптимизации WinAVR(GCC), сдвиги << и >>
singlskv
сообщение Jan 28 2007, 05:05
Сообщение #1


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Вот такой код:
Код
unsigned char x,y=0x34,z;

int main()
{
  x=5;
  y=y>>5;
  z=5;
  return 0;
}

А это "оптимизированный" выход, опции -O2 или -O1
Код
7:          x=5;
+00000032:   E095        LDI     R25,0x05         Load immediate
+00000033:   93900062    STS     0x0062,R25       Store direct to data space
8:          y=y>>5;
+00000035:   91800060    LDS     R24,0x0060       Load direct from data space
+00000037:   2E09        MOV     R0,R25           Copy register
+00000038:   C001        RJMP    PC+0x0002        Relative jump
+00000039:   9586        LSR     R24              Logical shift right
+0000003A:   940A        DEC     R0               Decrement
+0000003B:   F7EA        BRPL    PC-0x02          Branch if plus
+0000003C:   93800060    STS     0x0060,R24       Store direct to data space
9:          z=5;
+0000003E:   93900063    STS     0x0063,R25       Store direct to data space

Смотрим на цикл и тихо радуемся sad.gif
Если x!=z то код получается нормальный
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
pulsar-17
сообщение Jan 28 2007, 11:37
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 32
Регистрация: 7-12-04
Из: Московская область
Пользователь №: 1 376



Все правильно, оптимизация сработала. В R25 загружается число 5, которое равно количеству сдвигов(загружается в R0: MOV R0, R25) и равно z(запись в память: STS 0x0063, R25).
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 28 2007, 13:32
Сообщение #3


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(pulsar-17 @ Jan 28 2007, 11:37) *
Все правильно, оптимизация сработала. В R25 загружается число 5, которое равно количеству сдвигов(загружается в R0: MOV R0, R25) и равно z(запись в память: STS 0x0063, R25).


Ну если это оптимизация smile.gif

Если поменять z
Код
  x=5;
  y=y>>5;
  z=6;

то получим
Код
7:          x=5;
+00000032:   E085        LDI     R24,0x05         Load immediate
+00000033:   93800062    STS     0x0062,R24       Store direct to data space
8:          y=y>>5;
+00000035:   91800060    LDS     R24,0x0060       Load direct from data space
+00000037:   9582        SWAP    R24              Swap nibbles
+00000038:   9586        LSR     R24              Logical shift right
+00000039:   7087        ANDI    R24,0x07         Logical AND with immediate
+0000003A:   93800060    STS     0x0060,R24       Store direct to data space
9:          z=6;
+0000003C:   E086        LDI     R24,0x06         Load immediate
+0000003D:   93800063    STS     0x0063,R24       Store direct to data space
1

Почуствуйте разницу

А особенно весело выглядит вот это:
Код
  x=1;
  y=y>>1;
  z=1;

7:          x=1;
+00000032:   E091        LDI     R25,0x01         Load immediate
+00000033:   93900062    STS     0x0062,R25       Store direct to data space
8:          y=y>>1;
+00000035:   91800060    LDS     R24,0x0060       Load direct from data space
+00000037:   2E09        MOV     R0,R25           Copy register
+00000038:   C001        RJMP    PC+0x0002        Relative jump
+00000039:   9586        LSR     R24              Logical shift right
+0000003A:   940A        DEC     R0               Decrement
+0000003B:   F7EA        BRPL    PC-0x02          Branch if plus
+0000003C:   93800060    STS     0x0060,R24       Store direct to data space
9:          z=1;
+0000003E:   93900063    STS     0x0063,R25       Store direct to data space
1

вместо
Код
+00000035:   91800060    LDS     R24,0x0060       Load direct from data space
+000000xx:   9586        LSR     R24              Logical shift right
+000000xx:   93800060    STS     0x0060,R24       Store direct to data space
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 15:01
Рейтинг@Mail.ru


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