Hi everyone,

I am currently porting some assembly code to C, using avr-gcc 4.8.3 on
GNU/linux. While comparing the output I found some strangeness that
persisted regardless of -Os, -O2 or -O3 optimization settings:

avr-objdump -h -S main.elf  (abbreviated)

#include <avr/io.h>

int main (void) {
    unsigned char reg;
    do {
        reg = PIND;
  38:   80 b3           in      r24, 0x10       ; 16
    } while ((~reg) & 0x18);
  3a:   90 e0           ldi     r25, 0x00       ; 0
  3c:   80 95           com     r24
  3e:   90 95           com     r25
  40:   88 71           andi    r24, 0x18       ; 24
  42:   99 27           eor     r25, r25
  44:   89 2b           or      r24, r25
  46:   c1 f7           brne    .-16            ; 0x38 <main>
}

All those operations involving R25 are equivalent to NOPs? That's about
half the instructions in this small example. Are there any compiler
flags beyond general optimization levels I could set to avoid this?

Please CC: me on replies, as I am not subscribed to the list.

Best regards,
Christian

_______________________________________________
AVR-GCC-list mailing list
AVR-GCC-list@nongnu.org
https://lists.nongnu.org/mailman/listinfo/avr-gcc-list

Reply via email to