A.6.6 外部変数アクセス最適化時のリンカのセクションアドレス指定順

レジスタ相対形式でメモリにアクセスする命令では、ディスプレースメント値が小さいほうが、命令サイズが小さくなります。

以下の指標を参考にリンカでのセクション割り付け順を変更するとコードサイズを改善できる場合があります。

-

関数内でのアクセス回数の多い外部変数のセクションを前にする。

-

型サイズの小さい外部変数のセクションを前にする。

但し、外部変数アクセス最適化は、コンパイラが2度実行されるのでビルド時間は長くなります。

【使用例】

改善前ソースコード

/* D_1 セクション */
char d11=0, d12=0, d13=0, d14=0;
/* D_2 セクション */
short d21=0, d22=0, d23=0, d24=0, dmy2[12]={0};
/* D セクション */
int d41=0, d42=0, d43=0, d44=0, dmy4[60]={0}
 
void func(int a){
        d11 = a;
        d12 = a;
        d13 = a;
        d14 = a;
        d21 = a;
        d22 = a;
        d23 = a;
        d24 = a;
        d41 = a;
        d42 = a;
        d43 = a;
        d44 = a;
}

改善前アセンブリ展開コード

<セクションの割り付け順をD, D_2, D_1 またはD*とした場合>
_func:
       MOV.L #d41,R4
       MOV.B R1,0120H[R4]
       MOV.B R1,0121H[R4]
       MOV.B R1,0122H[R4]
       MOV.B R1,0123H[R4]
       MOV.W R1,0100H[R4]
       MOV.W R1,0102H[R4]
       MOV.W R1,0104H[R4]
       MOV.W R1,0106H[R4]
       MOV.L R1,[R4]
       MOV.L R1,04H[R4]
       MOV.L R1,08H[R4]
       MOV.L R1,0CH[R4]
       RTS

改善後ソースコード

/* D_1 セクション */
char d11=0, d12=0, d13=0, d14=0;
/* D_2 セクション */
short d21=0, d22=0, d23=0, d24=0, dmy2[12]={0};
/* D セクション */
int d41=0, d42=0, d43=0, d44=0, dmy4[60]={0}
 
void func(int a){
        d11 = a;
        d12 = a;
        d13 = a;
        d14 = a;
        d21 = a;
        d22 = a;
        d23 = a;
        d24 = a;
        d41 = a;
        d42 = a;
        d43 = a;
        d44 = a;
}

改善後アセンブリ展開コード

<セクションの割り付け順をD_1, D_2, D またはD*とした場合>
_func:
       MOV.L #d11,R4
       MOV.B R1,[R4]
       MOV.B R1,01H[R4]
       MOV.B R1,02H[R4]
       MOV.B R1,03H[R4]
       MOV.W R1,04H[R4]
       MOV.W R1,06H[R4]
       MOV.W R1,08H[R4]
       MOV.W R1,0AH[R4]
       MOV.L R1,24H[R4]
       MOV.L R1,28H[R4]
       MOV.L R1,2CH[R4]
       MOV.L R1,30H[R4]
       RTS