avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[avr-gcc-list] Incorrect code


From: Thomas D. Dean
Subject: [avr-gcc-list] Incorrect code
Date: Sat, 09 Aug 2014 05:51:34 -0700
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0

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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]