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

Reply via email to