マニュアルページ 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 を参照してください。