ループ終了条件の判定で、サイズの違いによりループ制御変数がその比較対象のデータを表現できない可能性のある場合は、ループ展開最適化がかかりません。たとえばループ制御変数がsigned charで比較対象のデータがsigned longの場合はループ展開最適化がかかりません。
そのため、signed char, signed shortに比べ、signed longの方がループ展開最適化を適用し易くなります。ループ展開最適化を活用したい場合はループ制御変数を4バイト整数型としてください。
【使用例】
改善前ソースコード
signed long array_size=16;
signed char array[16];
void func()
{
signed char i;
for(i=0;i<array_size;i++)
{
array[i]=0;
}
}
|
改善前アセンブリ展開コード
<loop=2指定時>
_func:
MOV.L #_array_size,R4
MOV.L [R4],R2
MOV.L #00000000H,R5
BRA L11
L12:
MOV.L #_array,R14
MOV.L #00000000H,R3
MOV.B R3,[R5,R4]
ADD #01H,R5
L11:
MOV.B R5,R5
CMP R2,R5
BLT L12
L13:
RTS
|
改善後ソースコード
signed long array_size=16;
signed char array[16];
void func()
{
signed long i;
for(i=0;i<array_size;i++)
{
array[i]=0;
}
}
|
改善後アセンブリ展開コード
<loop=2指定時>
_func:
MOV.L #_array_size,R5
MOV.L [R5],R2
MOV.L #00000000H,R4
ADD #0FFFFFFFFH,R2,R3
CMP R3,R2
BLE L12
L11:
MOV.L #_array,R1
MOV.L R1,R5
BRA L13
L14:
MOV.W #0000H,[R5]
ADD #02H,R5
ADD #02H,R4
L13:
CMP R3,R4
BLT L14
L15:
CMP R2,R4
BGE L17 L16:
MOV.L #00000000H,R5
MOV.B R5,[R4,R1]
RTS
L12:
MOV.L #_array,R5
MOV.L #00000000H,R3
L19:
CMPR2,R4
BGE L17
L20:
MOV.B R3,[R5+]
ADD #01H,R4
BRA L19
L17:
RTS
|