<コンパイル・オプション / オブジェクトオプション>
[指定形式]
-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文などの分岐先は対象ではありません。 |
[例]
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
|