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
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?
Cheers,
--
PMatos