This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

AVR byte swap optimization


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]