inline(1)

名前
inline - インライン手続き呼び出し展開プログラム

機能説明

指定されたソースファイルのアセンブリ言語の呼び出し命令は、 インラインテンプレート (*.il) ファイルから取得した対応する手続き本体の コピーによって置き換えられます。

インラインファイルは接尾語 .il を持ちます。

    例: % CC foo.il hello.c

インライン化はコードジェネレータ (cg) により行われます。

使用例
各インラインファイル には、次の形式の 1 つまたは複数のラベル付き アセンブリ言語テンプレートが含まれています。
    <インライン指令>
    <命令>
    .
    .
    .
    .end

ここで、 <命令> は、指定されたルーチンのインライン展開です。 <インライン指令> は次の形式のコマンドです。

    .inline <識別子>, <引数サイズ>

これは、<識別子>で指定したルーチンの引数のサイズの合計としての <引数サイズ>バイトの引数を持つルーチンのコードのブロックを宣言します。 指定されたルーチンの呼び出しは、インラインテンプレート内のコードで 置き換えられます。

注意事項:
引数サイズ の値は無視されますが、 Sun WorkShop[tm] 5.0 以前のコンパイラのバージョン と互換性を保つために引数が含まれる必要があります。

複数のテンプレートが含まれていても構いません。 一致するテンプレートは最初のものだけが有効で、後は無視されます。 重複したテンプレートを対応するハードウェアのパフォーマンスの 降順に並べて、最も効率のよいバージョンが選択されるようにすることができます。

  すべての Sun システム用のコーディング規則
インラインテンプレートは、C 互換の手続き呼び出しを展開した形式で コーディングする必要があります。ただし、呼び出し命令は実行されないため、 リターンアドレスが予期された場所にないこともあります。

インラインテンプレートは、サンの標準のパラメータの渡し方および レジスタ使用法の規則に従う必要があります。 したがって、これらの規則に違反したルーチンを呼び出すことはできません。 たとえば、 setjmp(3c) などのアセンブリルーチンは問題が発生する原因となります。

下記のレジスタ以外のレジスタは、使用および設定できません。

インラインテンプレート内の分岐命令は、 インラインテンプレート内に定義した数値ラベル (1f、 2b など) にのみ制御を移すことができます。それ以外に制御を移すことは許可されません。

テンプレートには、 ret または retl 命令は必要ありません。これらを含む必要もありません。

Sun コンパイラで生成した命令コードおよびアドレッシングモードのみが、 動作を保証されています。2 進コード化された命令はサポートされていません。

  SPARC システム用のコーディング規則
引数はレジスタ %o0-%o5 と [%sp+0x5c] で始まるメモリー位置に格納して渡されます。 %sp は 64 ビット整列であることが保証されています。 呼び出し命令が実行されることはないので、 %o7 の内容は未定義です。

結果は、 %o0 または %f0/%f1 に格納して返されます。

レジスタ %o0-%o5 および %f0-%f31 は一時レジスタとして使用することができます。

汎整数型および単精度浮動小数点型の引数は、32 ビットで整列されています。

倍精度浮動小数点型引数は、オフセットが 8 の倍数である場合、 64 ビットで整列されていることが保証されています。

各制御移管命令 (分岐および呼び出し) は、直後に nop が必要です。

呼び出し命令は、引数を渡すのに使用するレジスタ数を、 呼び出されたルーチンに示すための付加 (最終) 引数を持つ必要があります。

SPARC システムの場合は、展開された呼び出しの後に続く命令は、 削除されるので注意してください。

  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 に対応していないプラットフォーム上でそ のようなプログラムを実行すると、セグメント例外が発生したり、明 示的な警告メッセージなしに不正な結果が発生することがあります。 SSE/SSE2 でコンパイルされたバイナリが SSE/SSE2 に対応していない プラットフォームで実行されることのないようにするための OS および コンパイラに対するパッチが、後日提供されるかもしれません。

Pentium 4 互換のプラットフォームの場合、Solaris 9 update 6 以降 の OS リリースは SSE/SSE2 に対応しています。これより前のバー ジョンの Solaris OS は SSE/SSE2 に対応していません。

このことは、.il インラインアセンブリ言語関数を使用してい るプログラムや、SSE/SSE2 命令を利用している __asm() ア センブラコードにも当てはまります。

コンパイルとリンクを別々に行う場合は、必ずコンパイラを 使ってリンクし、-xarch={sse|sse2} で 適切な起動ルーチンがリンクされるようにしてください。

使用例
例として 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 を参照してください。