-instalign8


コンパイル・オプション / オブジェクトオプション

[指定形式]

-instalign8[={loop|inmostloop}]

 

-

省略時解釈

分岐先の命令実行向け整合を行いません。

[詳細説明]

-

分岐先の命令実行向け整合を行います。

-

instalign8を指定した場合は8バイトでそれぞれ配置アドレスを命令実行向け整合します。

-

命令実行向け整合とは、-instalign8のサブオプションで選択した種類の分岐先の命令が、アライメント数(8)の倍数であるアドレスをまたいでいる場合(*1)にだけ整合を取るものです。

-

分岐先の種類は、-instalign8のサブオプションの指定により次の3種類から選択します(*2)。

-

指定なし:関数先頭、switch文のcaseおよびdefaultラベル

-

inmostloop:各最内周ループの先頭、関数先頭、switch文のcaseおよびdefaultラベル

-

loop:各ループの先頭、関数先頭、switch文のcaseおよびdefaultラベル

-

本オプションを選択すると、プログラムセクションのアライメント数が1から8に変わります。

-

本オプションは、分岐先命令のアドレス整合することでRX CPUの命令キューを効率よく動作させ、プログラムの実行速度向上を図るものです。

-

次の用途を想定した仕様となっております。

-

instalign8 … 命令キューが64ビットのCPU(主にRX600シリーズ)で速度向上を図る場合

注 1.

命令サイズがアライメント数以下の場合です。命令サイズがアライメント数よりも大きい場合は、またいでいる箇所が2以上の場合にだけ整合を取ります。

注 2.

ここに挙げたもの以外の分岐先は、命令実行向け整合の対象ではありません。たとえば、loopを選択した場合はループの先頭は対象ですが、ループ内にあるループを構成しないif文などの分岐先は対象ではありません。

[例]

-

<Cソース>

long a;
int f1(int num)
{
    return (num+1);
}
void f2(void)
{
    a = 0;
}
void f3(void)
{
}

-

<出力コード>

[-instalign8を指定してコンパイルした場合]

下記は、各関数の先頭を、8バイトで命令実行向け整合させた場合の例です。

8バイトの命令実行向け整合では、対象命令が8バイトの境界をまたがない限り、配置アドレスを変更しないため、実際に整合がかかるのは関数f2のアドレスだけです。

    .SECTION P,CODE,ALIGN=8
    .INSTALIGN 8
_f1:                        ; 関数f1。配置アドレス=0000H
    ADD     #01H,R1         ; 2バイト
    RTS                     ; 1バイト
    .INSTALIGN 8
_f2:                        ; 関数f2。配置アドレス=0008H *整合有り
                            ; 0003Hに6バイト命令が来ると、8バイト境界を
                            ; またぐため、整合が取られる。
    MOV.L   #_a,R4          ; 6バイト
    MOV.L   #0,[R4]         ; 3バイト
    RTS                     ; 1バイト
    .INSTALIGN 8
_f3:                        ; 関数f3。配置アドレス=0012H
     RTS
    .END