-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文などの分岐先は対象ではありません。

-

本オプションを使用しないでコンパイルして生成したオブジェクト・モジュール・ファイルや標準ライブラリとリンクした場合、リンク時にW0561322 の警告を出力しますが、動作は問題ありません。

[例]

-

<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