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