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