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

 
 
> Глюк оптимизации 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 31 2007, 21:28
Сообщение #2


Участник
*

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



На какой версии GCC компилировалось?

Вот что делает WinAVR от 22.01.2007 с GCC 4.1.1 (оптимизация - "s"):

000000ca <main>:
main():
ca: 95 e0 ldi r25, 0x05 ; 5
cc: 90 93 02 01 sts 0x0102, r25
d0: 80 91 00 01 lds r24, 0x0100
d4: 82 95 swap r24
d6: 86 95 lsr r24
d8: 87 70 andi r24, 0x07 ; 7
da: 80 93 00 01 sts 0x0100, r24
de: 90 93 03 01 sts 0x0103, r25
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 3 2008, 10:14
Сообщение #3


кекс
******

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



нет тут никакого глюка.
и нет смысла проверять оптимизацию на программках из трех строк.

хотите чтобы компилятор делал частные случаи - объявляйте константы должным образом (const x = 5).

Не должен компилятор генерить swap если количество сдвигов задано переменной.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Apr 3 2008, 11:32
Сообщение #4


дятел
*****

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



Цитата(defunct @ Apr 3 2008, 14:14) *
нет тут никакого глюка.
и нет смысла проверять оптимизацию на программках из трех строк.
Глюк есть.
На трех строках никто и не проверял, это выжимка из реального кода в которой проблема осталась.
Цитата
Не должен компилятор генерить swap если количество сдвигов задано переменной.
да не задано оно переменной, сдвиг на 5 разрядов к переменной x
не имеет никакого отношения
Было что-то типа такого:
Код
#include <avr\io.h>

unsigned char y=0x34;

int main()
{

  ADMUX = (1<<MUX2)|(1<<MUX0);
  ............................
  y = y >> 5;
  ............................
  TCNT0 = 5;
  ...........................
  while (1);
}
С вот таким результатом компиляции:
Код
8:          ADMUX = (1<<MUX2)|(1<<MUX0);
+00000032:   E095        LDI     R25,0x05         Load immediate
+00000033:   B997        OUT     0x07,R25         Out to I/O location
10:         y = y >> 5;
+00000034:   91800060    LDS     R24,0x0060       Load direct from data space
+00000036:   2E09        MOV     R0,R25           Copy register
+00000037:   C001        RJMP    PC+0x0002        Relative jump
+00000038:   9586        LSR     R24              Logical shift right
+00000039:   940A        DEC     R0               Decrement
+0000003A:   F7EA        BRPL    PC-0x02          Branch if plus
+0000003B:   93800060    STS     0x0060,R24       Store direct to data space
12:         TCNT0 = 5;
+0000003D:   BF92        OUT     0x32,R25         Out to I/O location
Go to the top of the page
 
+Quote Post

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


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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 17:25
Рейтинг@Mail.ru


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