avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [avr-gcc-list] compiler improvments


From: Dmitry K.
Subject: Re: [avr-gcc-list] compiler improvments
Date: Fri, 9 Jan 2004 18:49:00 +1000
User-agent: KMail/1.5

9 Jan 2004 HutchinsonAndy wrote:
> I got it down to 60.
>
> Try -fnew-ra (it might bomb if sign/zero extended are used)

What version?

avr-gcc (GCC) 3.3.2 with -fnew-ra:
   code   64 = 0x0040 (  25), prologues  20, epilogues  19
   + Use of a stack (it even more important) is reduced.

"it might bomb" ?  Produce erroneous code? 

> I have been using Butterfly code as a trial.
What is it, "Butterfly"?

About funny example:

> >Program:
> >
> >   typedef struct { long lo; int in; } lo_in;
> >   lo_in foo (void)
> >   {
> >       lo_in x;
> >       x.lo = 1;
> >       x.in = 2;
> >       return x;
> >   }
> >

In my opinion, this example combines a set of optimization omissions:

   1. "mov r24,r26" -- filling unused place in structure.
     See "-O0": r24/r25 -- return arbitrary values (stack contents).

   2. Read from RAM: "ldd r*,Y+* / mov r*,r*".
     It can be done without extra "mov"es.

   3. Save/restore a set of unused registers:
     r8,r9,r10,r11,r13

   4. Does not prefer free registers: r0,r27,r30

Regards.

--------------------------------------------------------------------
"-Os -fnew-ra" result:
foo:
/* prologue: frame size=6 */
        push r8
        push r9
        push r10
        push r11
        push r12
        push r13
        push r14
        push r15
        push r16
        push r17
        push r28
        push r29
        in r28,__SP_L__
        in r29,__SP_H__
        sbiw r28,6
        in __tmp_reg__,__SREG__
        cli
        out __SP_H__,r29
        out __SREG__,__tmp_reg__
        out __SP_L__,r28
/* prologue end (size=20) */
        ldi r24,lo8(1)
        ldi r25,hi8(1)
        ldi r26,hlo8(1)
        ldi r27,hhi8(1)
        std Y+1,r24
        std Y+2,r25
        std Y+3,r26
        std Y+4,r27
        ldi r24,lo8(2)
        ldi r25,hi8(2)
        std Y+5,r24
        std Y+6,r25
        ldd r31,Y+6
        ldd r12,Y+1
        ldd r15,Y+2
        ldd r14,Y+3
        ldd r17,Y+4
        ldd r16,Y+5
        mov r18,r12
        mov r19,r15
        mov r20,r14
        mov r21,r17
        mov r22,r16
        mov r23,r31
        mov r24,r26
/* epilogue: frame size=6 */
        adiw r28,6
        in __tmp_reg__,__SREG__
        cli
        out __SP_H__,r29
        out __SREG__,__tmp_reg__
        out __SP_L__,r28
        pop r29
        pop r28
        pop r17
        pop r16
        pop r15
        pop r14
        pop r13
        pop r12
        pop r11
        pop r10
        pop r9
        pop r8
        ret
/* epilogue end (size=19) */





reply via email to

[Prev in Thread] Current Thread [Next in Thread]