Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Почему AVR-GCC так странно оптимизирует?...

Отправлено megaboy 09 апреля 2009, г. 19:01


WinAVR-20080512 c оптимизацией -Os
Юзаю AVR Studio 4.14

Исходник:

Код
typedef volatile struct
{
char* buffer;
u08 size;
u08 wr_index;
u08 rd_index;
u08 char_cnt;
unsigned char overflow:1;

}FifoBuff08;

FifoBuff08 urc_fifo;

int main(void)
{
init_buff08(&urc_fifo, urc_buffer, URC_SIZE);

push_buff08(data, &urc_fifo);
data = pop_buff08(&urc_fifo);

}

char pop_buff08 (FifoBuff08* fifo)
{
if(fifo->rd_index == fifo->wr_index)
{
return 0;
}
char data = fifo->buffer[fifo->rd_index];
if(++(fifo->rd_index) == fifo->size)
{
fifo->rd_index = 0; //закальцовка
}
fifo->overflow = 0;
fifo->char_cnt--;
return data;
}
Листинг:

Код
@0000031C: pop_buff08
1049: {
+0000031C: 01DC MOVW R26,R24 Copy register pair
1050: if(fifo->rd_index == fifo->wr_index)
+0000031D: 9614 ADIW R26,0x04 Add immediate to word
+0000031E: 919C LD R25,X Load indirect
+0000031F: 9714 SBIW R26,0x04 Subtract immediate from word
+00000320: 9613 ADIW R26,0x03 Add immediate to word
+00000321: 918C LD R24,X Load indirect
+00000322: 9713 SBIW R26,0x03 Subtract immediate from word
+00000323: 1798 CP R25,R24 Compare
+00000324: F411 BRNE PC+0x03 Branch if not equal
+00000325: E0E0 LDI R30,0x00 Load immediate
+00000326: C028 RJMP PC+0x0029 Relative jump
1054: char data = fifo->buffer[fifo->rd_index];
+00000327: 91ED LD R30,X+ Load indirect and postincrement
+00000328: 91FC LD R31,X Load indirect
+00000329: 9711 SBIW R26,0x01 Subtract immediate from word
+0000032A: 9614 ADIW R26,0x04 Add immediate to word
+0000032B: 918C LD R24,X Load indirect
+0000032C: 9714 SBIW R26,0x04 Subtract immediate from word
+0000032D: 0FE8 ADD R30,R24 Add without carry
+0000032E: 1DF1 ADC R31,R1 Add with carry
+0000032F: 81E0 LDD R30,Z+0 Load indirect with displacement
1055: if(++(fifo->rd_index) == fifo->size)
+00000330: 9614 ADIW R26,0x04 Add immediate to word
+00000331: 918C LD R24,X Load indirect
+00000332: 9714 SBIW R26,0x04 Subtract immediate from word
+00000333: 5F8F SUBI R24,0xFF Subtract immediate
+00000334: 9614 ADIW R26,0x04 Add immediate to word
+00000335: 938C ST X,R24 Store indirect
+00000336: 9714 SBIW R26,0x04 Subtract immediate from word
+00000337: 9614 ADIW R26,0x04 Add immediate to word
+00000338: 919C LD R25,X Load indirect
+00000339: 9714 SBIW R26,0x04 Subtract immediate from word
+0000033A: 9612 ADIW R26,0x02 Add immediate to word
+0000033B: 918C LD R24,X Load indirect
+0000033C: 9712 SBIW R26,0x02 Subtract immediate from word
+0000033D: 1798 CP R25,R24 Compare
+0000033E: F419 BRNE PC+0x04 Branch if not equal
1057: fifo->rd_index = 0; //закальцовка
+0000033F: 9614 ADIW R26,0x04 Add immediate to word
+00000340: 921C ST X,R1 Store indirect
+00000341: 9714 SBIW R26,0x04 Subtract immediate from word
1059: fifo->overflow = 0;
+00000342: 9616 ADIW R26,0x06 Add immediate to word
+00000343: 918C LD R24,X Load indirect
+00000344: 9716 SBIW R26,0x06 Subtract immediate from word
+00000345: 7F8E ANDI R24,0xFE Logical AND with immediate
+00000346: 9616 ADIW R26,0x06 Add immediate to word
+00000347: 938C ST X,R24 Store indirect
+00000348: 9716 SBIW R26,0x06 Subtract immediate from word
1060: fifo->char_cnt--;
+00000349: 9615 ADIW R26,0x05 Add immediate to word
+0000034A: 918C LD R24,X Load indirect
+0000034B: 9715 SBIW R26,0x05 Subtract immediate from word
+0000034C: 5081 SUBI R24,0x01 Subtract immediate
+0000034D: 9615 ADIW R26,0x05 Add immediate to word
+0000034E: 938C ST X,R24 Store indirect
1062: }
+0000034F: 2F8E MOV R24,R30 Copy register
+00000350: 9508 RET Subroutine return

Внимание, вопрос! А почему он не может сгенерить код в 2 раза компактнее???? Вот хотя бы так?
Может какие то флаги в мейке спасут отца русской демократии?

Код
//Моя редакция в течение пары минут
pop_buff08
{
MOVW R26,R24
if(fifo->rd_index == fifo->wr_index)
LDD R25,X+4
LDD R24,X+3
CP R25,R24
BRNE PC+0x03
LDI R30,0x00
RJMP PC+0x00xx
char data = fifo->buffer[fifo->rd_index];
LD R30,X
LDD R31,X+1
LDD R24,X+4
ADD R30,R24
ADC R31,R1
LDD R30,Z+0
if(++(fifo->rd_index) == fifo->size)
LD R24,X+4
SUBI R24,0xFF
STD X+4,R24
LDD R25,X+4
LDD R24,X+2
CP R25,R24
BRNE PC+0x04
fifo->rd_index = 0; //закальцовка
STD X+4,R1
fifo->overflow = 0;
LDD R24,X+6
ANDI R24,0xFE
STD X+6,R24
fifo->char_cnt--;
LDD R24,X+5
SUBI R24,0x01
STD X+5,R24
}
MOV R24,R30
RET


Составить ответ | Вернуться на конференцию.

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 123:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru