マニュアルページ inline.1
名前
inline - インライン手続き呼び出し展開プログラム
機能説明
指定されたソースファイルのアセンブリ言語の呼び出し命令は、イ
ンラインテンプレート (*.il) ファイルから取得した対応する手続
き本体のコピーによって置き換えられます。
インラインファイルは接尾語 .il を持ちます。
例: % CC foo.il hello.c
インライン化はコンパイラのコードジェネレータにより行わ れ ま
す。
使用例
各インラインファイルには、次の形式の 1 つまたは複数のラベ ル
付きアセンブリ言語テンプレートが含まれています。
<インライン指令>
<命令>
.
.
.
.end
ここで、<命令> は、指定されたルーチンのインライン展開です。<
インライン指令> は次の形式のコマンドです。
.inline <識別子>, <引数サイズ>
これは、<識別子>で指定したルーチンの引数のサイズの合計として
の <引数サイズ>バイトの引数を持つルーチンのコードのブロック
を宣言します。指定されたルーチンの呼び出しは、インラインテン
プレート内のコードで置き換えられます。
注意事項:
引数サイズの値は無視されますが、Sun WorkShop[tm] 5.0 以前 の
コンパイラのバージョンと互換性を保つために引数が含まれる必要
があります。
複数のテンプレートが含まれていても構いません。一致するテンプ
レートは最初のものだけが有効で、あとは無視されます。
すべての Sun システム用のコーディング規則
インラインテンプレートは、C 互換の手続き呼び出しを展開した形
式でコーディングする必要があります。ただし、呼び出し命令は実
行されないため、リターンアドレスが予期された場所にないことも
あります。
インラインテンプレートは、サンの標準のパラメータの渡し方およ
びレジスタ使用法の規則に従う必要があります。したがって、これ
らの規則に違反したルーチンを呼び出すことはできません。たとえ
ば、 setjmp(3c) などのアセンブリルーチンは問題が発生する原因
となります。
下記のレジスタ以外のレジスタは、使用および設定できません。
インラインテンプレート内の分岐命令は、インラインテンプレート
内に定義した数値ラベル (1f、 2b など) にのみ制御を移すことが
できます。それ以外に制御を移すことは許可されません。
テンプレートには、 ret または retl 命令は必要ありません。 こ
れらを含む必要もありません。
Sun コンパイラで生成した命令コードおよびアドレッシングモード
の み が、動作を保証されています。2 進コード化された命令はサ
ポートされていません。
SPARC システム用のコーディング規則
最初の 6 つの引数はレジスタ %o0-%o5 で渡されます。6 つ目を超
え る引数は、ターゲット ABI に従い、スタック位置を使用して渡
されます。 %sp は 64 ビット整列であることが保証され て い ま
す。 呼び出し命令が実行されることはないので、 %o7 の内容は未
定義です。
結果は、 %o0 または %f0/%f1 に格納して返されます。
レジスタ %o0-%o5 および %f0-%f31 は一時レジスタとして使用 す
ることができます。
汎整数型および単精度浮動小数点型の引数は、32 ビットで整列 さ
れています。
倍精度浮動小数点型引数は、オフセットが 8 の倍数である場 合、
64 ビットで整列されていることが保証されています。
各制御移管命令 (分岐および呼び出し) は、直後に nop が必要 で
す。
呼び出し命令は、引数を渡すのに使用するレジスタ数を、呼び出さ
れ た ルーチンに示すための付加 (最終) 引数を持つ必要がありま
す。
SPARC システムの場合は、展開された呼び出しの後に続く命令は、
削除されるので注意してください。
32 ビット x86 システム用のコーディング規則
引数はスタックに蓄積して渡されます。呼び出し命令は実行されて
い ないので、最初の引数は (%esp)、2 つ目の引数は 4 (%esp) に
格納されています。結果が 32 ビット以下の整数となる場 合 は、
%eax に 格 納 し て 返 さ れます。また64 ビット整数の結果は
%edx:%eax に格納して返されます。浮動小数点の結果 は、 %st(0)
に格納して返されます。
コードでは、%eax、%ecx、および %edx のレジスタを使用します。
その他のレジスタの値はすべて、保持する必要があります。浮動小
数点スタックは、インライン展開テンプレートの先頭では空になっ
て い ます。またインライン展開テンプレートの終わりでは、空に
なっていなければなりません (ただし浮動小数点の戻り値は除きま
す)。
x86 に関する特記事項
Solaris x86 SSE/SSE2 Pentium 4 プラットフォームで実行する た
め に -xarch={sse|sse2} を付けてコンパイルしたプログラムは、
SSE/SSE2 対応のプラットフォームでのみ実行する必要が あ り ま
す。 SSE/SSE2 に対応していないプラットフォーム上でそのような
プログラムを実行すると、セグメント例外が発生したり、明示的な
警 告 メッ セー ジなしに不正な結果が発生することがあります。
Solaris 10 release 以降、OS およびコンパイラは、SSE/SSE2 を
使用してコンパイルされたバイナリが SSE/SSE2 非対応のプラット
フォームで実行されないようになっています。
Pentium 4 互換のプラットフォームの場合、Solaris 9 update 6
以降の OS リリースは SSE/SSE2 に対応しています。これより前の
バージョンの Solaris OS は SSE/SSE2 に対応していません。
このことは、.il インラインアセンブリ言語関数を使用しているプ
ロ グラムや、SSE/SSE2 命令を利用している __asm() アセンブラ
コードにも当てはまります。
コンパイルとリンクを別々に行う場合は、必ずコンパイラを使って
リンクし、-xarch={sse|sse2} で適切な起動ルーチンがリンクされ
るようにしてください。
x64 プラットフォームに関するコーディング規則
引数は、その分類に従って渡されます。分類としては、整 数 型、
sse 型、メモリー型引数などがあります。
符号付きと符号なしを問わず、_Bool、char、short、int、 long、
long long、およびポインタ型の引数は、整数型の引数です。サイ
ズが 16 バイト以下で、_ Bool、char、short、int、 long、 long
long、またはポインタ型の整列されたメンバーからなる集合体 (構
造体、共用体、配列) 型の引数も整数型になります。
float および double 型の引数は、sse 型の引数です。サイ ズ が
16 バイト以下で、float または double型の整列されたメンバーか
らなる集合体型の引数も sse 型になります。
long double 型および、サイズが 16 バイトを超えるか、メンバー
が整列されていないメンバーからなる集合体型の引数は、メモリー
型の引数です。
整数型引数は、%rdi、%rsi、%rdx、%rcx、%r8、%r9 の順序で、 整
数レジスタに渡されます。集合体型の整数型引数は、1 つで整数レ
ジスタを 2 つまで保持できます。整数型引数の個数が 6 個より多
い 場 合、7 つ目以降の整数型引数はメモリー型引数と見なされま
す。
sse 型引数は、%xmm0 から %xmm7 の順序で sse レジスタを使用し
て 渡されます。集合体型の sse型引数は、1 つで sse レジスタを
2 つまで保持でき、1 つの sse レジスタは最大 8 バイトの引数を
保 持 できます。たとえば double complex 型の引数は、連続する
sse レジスタ 2 個に渡され、float complex 型の引数は sse レジ
スタ 1 個に渡されます。sse 型引数の個数が 8 個より多い場合、
9 つ目以降の sse 型引数はメモリー型引数と見なされます。
整数型および sse 型引数には、個別に番号が割り当てられます。
メモリー型引数は、関数引数リストで見て右から左の順に、スタッ
クを使って渡されます。スタック上のすべての引数はそのサイズに
従って整列されます。サイズが 8 以下の場合は 8、それ以外の 場
合 は 16 で、インライン展開テンプレートスタックの先頭では 16
で整列されます。
呼び出し命令が発行されないため、最初のメ モ リー 型 引 数 は
(%rsp) の位置、2 つ目の引数は、最初のメモリー型引数のサイズ
と 2 つ目のメモリー引数型の境界整列などに従って 8(%rsp) また
は 16(%rsp) の位置に配置されます。
戻り値は、引数と同様に分類されます。
サイズが 8 バイト以下の整数型の結果は %rax に返され、9 〜 16
バイトの整数型の結果は %rdx:%rax に返されます。
sse 型の結果もまた、そのサ イ ズ に 従っ て %xmm0 ま た は
%xmm1:%xmm0 の形式で返されます。
long double 型の結果は %st(0) に返されます。
戻り値が long double complex の場合、値の実部は %st0、虚部は
%st1 に返されます。
メモリー型の結果の場合、呼び出し元は戻り値用の記憶領域を提供
し、 関数の最初の引数であるかのように、%rdi にこの記憶領域の
アドレスを渡します。この結果、このアドレスは隠れた先頭引数に
な ります。復帰時、%rax には、呼び出し元によって %rdi に渡さ
れたアドレスが含まれます。
コードでレジスタ %rbp を変更してはいけません。インレイン展開
テンプレートの先頭で浮動小数点スタックが空であり、最後も空で
ある必要があります (浮動小数点値が返された場合を除く)。
%rbp に加えて、レジスタ %rbx および %r12 - %r15 の値は、イン
ライン化されたコード全体で維持されなければなりません。
使用例
例として libm.il または vis.il をレビューしてください。コ ン
パイラの lib/ ディレクトリ配下に、サポートされた各アーキテク
チャーに固有のこれらのライブラリのバージョンが見つかります。
警告
inline は、上記のコーディング規則の違反については検査しま せ
ん。
関連項目
Rajat P. Garg および Ilya Sharapov によ る "Techniques for
Optimizing Applications: High Performance Computing" では、
Fortran を使用して役に立つインラインテンプレートの説明が提供
されます。第 8 章を参照してください。
SPARC International Inc. に よ り "The SPARC Architecture
Manual Version 9" が http://www.sparc.com/resource.htm で提
供されます。付録 G を参照してください。