|
From: | Ilya Lesokhin |
Subject: | Re: [avr-gcc-list] Incorrect code |
Date: | Sat, 9 Aug 2014 16:24:18 +0300 |
Is this a problem with -Os?
It looks like the compiler has decided that cs is always zero in the code below. The cs calculation appears correct.
In spi_copy.c
...
uint8_t spi_copy_in(uint8_t *dest, uint8_t *source, unsigned int max_len) {
uint8_t cs;
uint8_t len;
uint8_t *ptr1, *ptr2;
cs = 0;
len = source[0];
if (len > max_len) return 0xff;
ptr2 = &source[1];
do {
cs += *ptr2++;
} while (--len);
if (cs == 0) {
len = source[0] - 1; // do not need the checksum
ptr2 = &source[1];
do {
*ptr1++ = *ptr2++;
} while (--len);
}
return cs;
}
...
> make
...
avr-gcc -Os -Wall -Wmissing-prototypes -fno-strict-aliasing -Wall -I../include -I../../Class -mmcu=atmega128 -c -o spi_copy.o ../../Class/spi_copy.c
...
> avr-objdump -d ng02.elf | more
...
0000077c <spi_copy_in>:
77c: fb 01 movw r30, r22
77e: 20 81 ld r18, Z
780: 82 2f mov r24, r18
782: 90 e0 ldi r25, 0x00 ; 0
784: 48 17 cp r20, r24
786: 59 07 cpc r21, r25
788: 38 f0 brcs .+14 ; 0x798 <spi_copy_in+0x1c>
78a: 31 96 adiw r30, 0x01 ; 1
78c: 80 e0 ldi r24, 0x00 ; 0
78e: 91 91 ld r25, Z+
790: 89 0f add r24, r25
792: 21 50 subi r18, 0x01 ; 1
794: e1 f7 brne .-8 ; 0x78e <spi_copy_in+0x12>
796: 08 95 ret
798: 8f ef ldi r24, 0xFF ; 255
79a: 08 95 ret
Tom Dean
_______________________________________________
AVR-GCC-list mailing list
address@hidden
https://lists.nongnu.org/mailman/listinfo/avr-gcc-list
[Prev in Thread] | Current Thread | [Next in Thread] |