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

Reply via email to