PPC-gccのオプティマイズの様を観察してみたメモです。参考になるかどうかは
不明です(^^;
int add(int i,int j)
{
return( i+j ) ;
}
add:
add 3,3,4
blr
double add(double i,double j)
{
return( i+j ) ;
}
add:
fadd 1,1,2
blr
次の様なCコードをコンパイルしてみました。
000001: for( i=0 ; i<=100 ; i++){
000002: if( i==10 || i==86 ){
000003: printf( "%d\n",i ) ;
000004: }else{
000005: printf( "%f\n",sqrt(i) ) ;
000006: }
000007: }
.L6:
lwz 0,16(31)
cmpwi 0,0,10 ← 10と比較
bc 12,2,.L8
lwz 0,16(31)
cmpwi 0,0,86 ← 86と比較
bc 12,2,.L8
b .L7
.L6:
xori 9,31,10
subfic 11,9,0
adde 9,11,9
xori 0,31,86
subfic 11,0,0
adde 0,11,0
or. 11,9,0
bc 12,2,.L7
la 3,.LC0@l(28)
mr 4,31
crxor 6,6,6
bl printf
b .L5
PPCのbitシフト命令は部分シフトやマスク付きシフトを行えるなど、非常に 強力なものになっています。
unsigned int swap1(unsigned int i)
{
return ( (i&0xff000000)>>24 |
(i&0x00ff0000)>>8 |
(i&0x0000ff00)<<8 |
(i&0x000000ff)<<24 ) ;
}
swap1:
srwi 0,3,24
rlwinm 9,3,24,1
rlwinm 11,3,8,8
or 0,0,9
or 0,0,11
slwi 3,3,24
or 3,0,3
blr
unsigned int swap2(unsigned int i,unsigned int j)
{
return ( (i&0xffff0000) | (j&0x0000ffff) ) ;
}
swap2:
rlwinm 4,4,0,0xffff
rlwimi 3,4,0,16,31
blr