https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49807

Georg-Johann Lay <gjl at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           See Also|                            |https://gcc.gnu.org/bugzill
                   |                            |a/show_bug.cgi?id=84211

--- Comment #8 from Georg-Johann Lay <gjl at gcc dot gnu.org> ---
(In reply to Georg-Johann Lay from comment #0)
> #define SPDR (*((char volatile*) 0x2c))
> 
> void read_adc (long big)
> { 
>    SPDR = big >> 24;
>    SPDR = big >> 16;
>    SPDR = big >> 8; 
>    SPDR = big;
> } 

The code size in v15 is considerably reduced as a byproduct of PR84211 which
adds an avr-specific post-reload optimization pass.

Code without PR84211 / -mno-fuse-move -Os -mmcu=atmega8 -dp -S

read_adc:
        movw r20,r22     ;  50  [c=4 l=1]  *movhi/0
        movw r22,r24     ;  51  [c=4 l=1]  *movhi/0
        mov r24,r23      ;  52  [c=24 l=6]  *ashrsi3_const/2
        clr r27
        sbrc r24,7
        com r27
        mov r25,r27
        mov r26,r27
        out 0xc,r24      ;  40  [c=4 l=1]  movqi_insn/2
        movw r24,r22     ;  53  [c=24 l=5]  *ashrsi3_const/2
        clr r27
        sbrc r25,7
        com r27
        mov r26,r27
        out 0xc,r24      ;  42  [c=4 l=1]  movqi_insn/2
        clr r27  ;  54  [c=24 l=6]  *ashrsi3_const/2
        sbrc r23,7
        dec r27
        mov r26,r23
        mov r25,r22
        mov r24,r21
        out 0xc,r24      ;  44  [c=4 l=1]  movqi_insn/2
        out 0xc,r20      ;  45  [c=4 l=1]  movqi_insn/2
        ret              ;  48  [c=0 l=1]  return

Code with PR84211 / -mfuse-move -Os -mmcu=atmega8 -dp -S

read_adc:
        movw r20,r22     ;  71  [c=4 l=1]  *movhi/0
        movw r22,r24     ;  72  [c=4 l=1]  *movhi/0
        out 0xc,r23      ;  40  [c=4 l=1]  movqi_insn/2
        out 0xc,r24      ;  42  [c=4 l=1]  movqi_insn/2
        out 0xc,r21      ;  44  [c=4 l=1]  movqi_insn/2
        out 0xc,r20      ;  45  [c=4 l=1]  movqi_insn/2
        ret              ;  48  [c=0 l=1]  return

The superfluous MOV instructions are due to sub-optimal IRA / reload.  LRA even
adds one more instruction.

Reply via email to