Paulo J. Matos schrieb: > Hi all, > > I am looking at the avr backend in order to try to sort some things out > on my own backend. > > One of the tests I am doing is by compiling the following: > int x = 0x1010; > int y = 0x0101; > > int add(void) > { > return x+y; > } > > It compiles to (in gcc-4.3.5_avr with -Os) > add: > /* prologue: function */ > /* frame size = 0 */ > lds r18,y > lds r19,(y)+1 > lds r24,x > lds r25,(x)+1 > add r18,r24 > adc r19,r25 > mov r24,r18 > mov r25,r19 > /* epilogue start */ > ret > > I don't know much avr assembler so bear with me but I would expect this
note that the last moves are two QI moves, the add is HI. Without splitting HI the moves will disappear, try -fno-split-wide-types. Johann > to be written: > add: > /* prologue: function */ > /* frame size = 0 */ > lds r18,y > lds r19,(y)+1 > lds r24,x > lds r25,(x)+1 > add r24,r18 > adc r25,r19 > /* epilogue start */ > ret > > By inverting the add arguments we save two mov instructions. > > If it can be written like this any ideas on why GCC is avoiding it? Try newer version of gcc, like 4.5.2 > > Cheers, > > -- > PMatos