A.7.1 ループ制御変数

ループ終了条件の判定で、サイズの違いによりループ制御変数がその比較対象のデータを表現できない可能性のある場合は、ループ展開最適化がかかりません。たとえばループ制御変数が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