Hi,

I'm wondering why gcc doens't release the stack immediatly after
calling such functions which need arguments passed on the stack.
Example:

==================================================================
void test(){


    print("%i %i %i\r\n", 1, 2, 3, 4);
    728a:       30 12 04 00     push    #4              ;#0x0004
    728e:       30 12 03 00     push    #3              ;#0x0003
    7292:       23 12           push    #2              ;r3 As==10
    7294:       13 12           push    #1              ;r3 As==01
    7296:       30 12 7e 72     push    #29310          ;#0x727e
    729a:       b0 12 62 7e     call    #32354          ;#0x7e62
    print("%i %i %i\r\n", 8, 7, 6, 5);
    729e:       30 12 05 00     push    #5              ;#0x0005
    72a2:       30 12 06 00     push    #6              ;#0x0006
    72a6:       30 12 07 00     push    #7              ;#0x0007
    72aa:       30 12 08 00     push    #8              ;#0x0008
    72ae:       30 12 7e 72     push    #29310          ;#0x727e
    72b2:       b0 12 62 7e     call    #32354          ;#0x7e62

    argtest(1, 2, 3, 4, 5, 6, 7, 8);
    72b6:       30 12 08 00     push    #8              ;#0x0008
    72ba:       30 12 07 00     push    #7              ;#0x0007
    72be:       30 12 06 00     push    #6              ;#0x0006
    72c2:       30 12 05 00     push    #5              ;#0x0005
    72c6:       2c 42           mov     #4,     r12     ;r2 As==10
    72c8:       3d 40 03 00     mov     #3,     r13     ;#0x0003
    72cc:       2e 43           mov     #2,     r14     ;r3 As==10
    72ce:       1f 43           mov     #1,     r15     ;r3 As==01
    72d0:       b0 12 7c 72     call    #29308          ;#0x727c

    special();
    72d4:       b0 12 7a 72     call    #29306          ;#0x727a
    72d8:       31 50 1c 00     add     #28,    r1      ;#0x001c

}
    72dc:       30 41           ret
==================================================================

The stack is only cleaned once at 72d8, but i'd like to see it directly
after each call.

This is surely a nice optimization, but doesn't that also mean, that
the function special can't go as deep as it could go if the stack
is cleand up after each function call (in this example, special
would have 28 bytes less stack space because of both prints and argtest) ???
And that for the cost of some adds ?

One way i found to force stack cleanup before another function call is
to put a goto label in front of that function call:

==================================================================
void test(){

    print("%i %i %i\r\n", 1, 2, 3, 4);
    728a:       30 12 04 00     push    #4              ;#0x0004
    728e:       30 12 03 00     push    #3              ;#0x0003
    7292:       23 12           push    #2              ;r3 As==10
    7294:       13 12           push    #1              ;r3 As==01
    7296:       30 12 7e 72     push    #29310          ;#0x727e
    729a:       b0 12 62 7e     call    #32354          ;#0x7e62
    print("%i %i %i\r\n", 8, 7, 6, 5);
    729e:       30 12 05 00     push    #5              ;#0x0005
    72a2:       30 12 06 00     push    #6              ;#0x0006
    72a6:       30 12 07 00     push    #7              ;#0x0007
    72aa:       30 12 08 00     push    #8              ;#0x0008
    72ae:       30 12 7e 72     push    #29310          ;#0x727e
    72b2:       b0 12 62 7e     call    #32354          ;#0x7e62

    argtest(1, 2, 3, 4, 5, 6, 7, 8);
    72b6:       30 12 08 00     push    #8              ;#0x0008
    72ba:       30 12 07 00     push    #7              ;#0x0007
    72be:       30 12 06 00     push    #6              ;#0x0006
    72c2:       30 12 05 00     push    #5              ;#0x0005
    72c6:       2c 42           mov     #4,     r12     ;r2 As==10
    72c8:       3d 40 03 00     mov     #3,     r13     ;#0x0003
    72cc:       2e 43           mov     #2,     r14     ;r3 As==10
    72ce:       1f 43           mov     #1,     r15     ;r3 As==01
    72d0:       b0 12 7c 72     call    #29308          ;#0x727c

    goto l;
    72d4:       31 50 1c 00     add     #28,    r1      ;#0x001c
    l: special();
    72d8:       b0 12 7a 72     call    #29306          ;#0x727a

}
    72dc:       30 41           ret
==================================================================

Now (at least) the stack is cleaned before the special call.
Is there any nicer way to achieve this behaviour?

There seems to be a threshhold for stack clean up, because
if i move in more prints, the stack gets cleaned in between.
The value for this lies somewhere between 30 and 40 bytes.
Can i somehow just set this to zero and so force
stack cleanup after every call?

Is this a gcc or mspgcc issue?!

Thanks in advance,
Björn Lichtblau




----------------------------------------------------------------
This message was sent using IMP, the Internet Messaging Program.

Reply via email to