double argument casting
Jorge PEREZ
jorge.perez@invia.fr
Wed Oct 27 19:32:00 GMT 2010
Hello everyone, thanks for the feedback :)
With some colleagues we decided looking into this point and we "dared"
modifying the GCC sources. Well actually just one file, the
/gcc/config/sparc/sparc.c
we modified the function *TARGET_PROMOTE_PROTOTYPES
*(http://goo.gl/2pQQ) and set it to the default value which is FALSE.
static bool
sparc_promote_prototypes (const_tree fntype ATTRIBUTE_UNUSED)
{
return TARGET_ARCH32 ? true : false;
}
was replaced by
static bool
sparc_promote_prototypes (const_tree fntype ATTRIBUTE_UNUSED)
{
return false;
}
Then we re-compiled GCC 4.5.1 for SPARC V8 and the results for the
previously mentioned test.c are
short somme(char a, short b){
int i;
for (i=0; i<b; i++){
a+=a;
}
return a+b;
}
short somme2(char a, short b){
int i;
for (i=0; i<b; i++){
a+=b;
}
return a+2*b;
}
int main(){
volatile short b=1;
volatile char a=1, c=1;
b=somme(a,b);
b=somme(c,b);
b=somme(a,c);
b=somme2(a,b);
b=somme2(c,b);
b=somme2(a,c);
b=somme2(a,c*2);
b=somme2(a,c*3);
b=somme2(a,c*4);
return 0;
}
0001024c <somme>:
1024c: 85 2a 60 10 sll %o1, 0x10, %g2
10250: 82 10 20 00 clr %g1
10254: 10 80 00 03 b 10260 <somme+0x14>
10258: 85 38 a0 10 sra %g2, 0x10, %g2
1025c: 82 00 60 01 inc %g1
10260: 80 a0 40 02 cmp %g1, %g2
10264: 26 bf ff fe bl,a 1025c <somme+0x10>
10268: 91 2a 20 01 sll %o0, 1, %o0
1026c: 91 2a 20 18 sll %o0, 0x18, %o0
10270: 91 3a 20 18 sra %o0, 0x18, %o0
10274: 81 c3 e0 08 retl
10278: 90 02 00 09 add %o0, %o1, %o0
0001027c <somme2>:
1027c: 87 2a 60 10 sll %o1, 0x10, %g3
10280: 82 10 20 00 clr %g1
10284: 87 38 e0 10 sra %g3, 0x10, %g3
10288: 10 80 00 03 b 10294 <somme2+0x18>
1028c: 84 10 00 09 mov %o1, %g2
10290: 82 00 60 01 inc %g1
10294: 80 a0 40 03 cmp %g1, %g3
10298: 26 bf ff fe bl,a 10290 <somme2+0x14>
1029c: 90 02 00 02 add %o0, %g2, %o0
102a0: 93 2a 60 01 sll %o1, 1, %o1
102a4: 91 2a 20 18 sll %o0, 0x18, %o0
102a8: 91 3a 20 18 sra %o0, 0x18, %o0
102ac: 81 c3 e0 08 retl
102b0: 90 02 40 08 add %o1, %o0, %o0
000102b4 <main>:
102b4: 9d e3 bf 98 save %sp, -104, %sp
102b8: 82 10 20 01 mov 1, %g1
102bc: c2 37 bf fc sth %g1, [ %fp + -4 ]
102c0: c2 2f bf ff stb %g1, [ %fp + -1 ]
102c4: c2 2f bf fe stb %g1, [ %fp + -2 ]
102c8: d0 0f bf ff ldub [ %fp + -1 ], %o0
102cc: d2 17 bf fc lduh [ %fp + -4 ], %o1
102d0: 7f ff ff df call 1024c <somme>
102d4: 01 00 00 00 nop
102d8: d0 37 bf fc sth %o0, [ %fp + -4 ]
102dc: d0 0f bf fe ldub [ %fp + -2 ], %o0
102e0: d2 17 bf fc lduh [ %fp + -4 ], %o1
102e4: 7f ff ff da call 1024c <somme>
102e8: 01 00 00 00 nop
102ec: d0 37 bf fc sth %o0, [ %fp + -4 ]
102f0: d0 0f bf ff ldub [ %fp + -1 ], %o0
102f4: d2 0f bf fe ldub [ %fp + -2 ], %o1
102f8: 93 2a 60 18 sll %o1, 0x18, %o1
102fc: 7f ff ff d4 call 1024c <somme>
10300: 93 3a 60 18 sra %o1, 0x18, %o1
10304: d0 37 bf fc sth %o0, [ %fp + -4 ]
10308: d0 0f bf ff ldub [ %fp + -1 ], %o0
1030c: d2 17 bf fc lduh [ %fp + -4 ], %o1
10310: 7f ff ff db call 1027c <somme2>
10314: 01 00 00 00 nop
10318: d0 37 bf fc sth %o0, [ %fp + -4 ]
1031c: d0 0f bf fe ldub [ %fp + -2 ], %o0
10320: d2 17 bf fc lduh [ %fp + -4 ], %o1
10324: 7f ff ff d6 call 1027c <somme2>
10328: 01 00 00 00 nop
1032c: d0 37 bf fc sth %o0, [ %fp + -4 ]
10330: d0 0f bf ff ldub [ %fp + -1 ], %o0
10334: d2 0f bf fe ldub [ %fp + -2 ], %o1
10338: 93 2a 60 18 sll %o1, 0x18, %o1
1033c: 7f ff ff d0 call 1027c <somme2>
10340: 93 3a 60 18 sra %o1, 0x18, %o1
10344: d0 37 bf fc sth %o0, [ %fp + -4 ]
10348: d0 0f bf ff ldub [ %fp + -1 ], %o0
1034c: d2 0f bf fe ldub [ %fp + -2 ], %o1
10350: 93 2a 60 18 sll %o1, 0x18, %o1
10354: 7f ff ff ca call 1027c <somme2>
10358: 93 3a 60 17 sra %o1, 0x17, %o1
1035c: d0 37 bf fc sth %o0, [ %fp + -4 ]
10360: d0 0f bf ff ldub [ %fp + -1 ], %o0
10364: c2 0f bf fe ldub [ %fp + -2 ], %g1
10368: 83 28 60 18 sll %g1, 0x18, %g1
1036c: 83 38 60 18 sra %g1, 0x18, %g1
10370: 93 28 60 01 sll %g1, 1, %o1
10374: 7f ff ff c2 call 1027c <somme2>
10378: 92 02 40 01 add %o1, %g1, %o1
1037c: b0 10 20 00 clr %i0
10380: d0 37 bf fc sth %o0, [ %fp + -4 ]
10384: d0 0f bf ff ldub [ %fp + -1 ], %o0
10388: d2 0f bf fe ldub [ %fp + -2 ], %o1
1038c: 93 2a 60 18 sll %o1, 0x18, %o1
10390: 7f ff ff bb call 1027c <somme2>
10394: 93 3a 60 16 sra %o1, 0x16, %o1
10398: d0 37 bf fc sth %o0, [ %fp + -4 ]
1039c: 81 c7 e0 08 ret
103a0: 81 e8 00 00 restore
this reduced the size of the main by 96 bytes which is huge taking into
account that this is a dummy example. However we're not sure if this can
affect other SPARC targets or if it was done right.
Also, we don't understand why sometimes the CALL's delay slots are
filled with NOP instead of other instructions, this is not optimal
either when using the -Os option. Does anyone know why?
We'd appreciate very much any feedback you have about this.
Thanks in advance,
PS: assuming that this fix is correct and pertinent, is there anyway to
propose it to be included in future GCC releases?
laurent wrote:
> When I compile with the new versions of GCC, my code size is reduced
> thanks to the various contribution done in GCC.
>
> Concerning the double casting, I have replayed the example from Jorge. I
> have notice no modification. The double casting is always active.
>
> Salutations,
>
> Laurent
>
>
>
>
>
> On 25/10/2010 18:47, Eric Botcazou wrote:
>
>>> If the casting is done in the callee function (and not in the caller
>>> function), my program is reduced by 5%.
>>>
>>> I think that all the users compiling with -Os option will be please to
>>> implement the casting inside the callee function.
>>>
>>>
>> Make sure to test with a recent compiler (GCC 4.5.x preferably), things may
>> have improved in this area.
>>
>>
>>
>
>
>
More information about the Gcc-help
mailing list