The following macro expands to some rather frightful code on the AVR:
#define BSWAP_16(x) \ ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)) uint16_t bswap_16(uint16_t x) { 0: 9c 01 movw r18, r24 2: 89 2f mov r24, r25 4: 99 27 eor r25, r25 6: 32 2f mov r19, r18 8: 22 27 eor r18, r18 return BSWAP_16(x); } a: 82 2b or r24, r18 c: 93 2b or r25, r19 e: 08 95 ret Ideally, this macro would expand to three mov instructions and a ret. Is there anything I can do to help GCC along here? I'm using GCC 4.1.0 with -O2. I won't bother to show bswap_32 here, which produces a real disaster! Think 47 instructions, for what should be 6. Cheers, Shaun $ avr-gcc --version |head -1 avr-gcc (GCC) 4.1.0