Oracle Solaris Studio 12.4 Man Pages

印刷ビューの終了

更新: January 2015
 
 

inline(1)

名前

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

説明

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

インラインファイルは、次の例のように接尾辞 .il を持ちます。

% CC foo.il hello.c

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

使用法

inlinefile には、次の形式の 1 つまたは複数のラベル付きアセンブリ言語テンプレートが含まれています。

 
inline-directive
instructions
...
.end

ここで、instructions は、指定されたルーチンのインライン展開です。inline-directive は次の形式のコマンドです。

.inline   identifier, argsize

これは、identifier で指定したルーチンのコードのブロックを宣言し、ルーチンの引数の合計サイズ (バイト単位) として argsize を指定します。指定されたルーチンの呼び出しは、インラインテンプレート内のコードで置き換えられます。

注: argsize の値は無視されますが、Sun WorkShop[tm] 5.0 コンパイラより前のコンパイラバージョンとの互換性を保つために、この引数を含めるようにしてください。

複数のテンプレートが含まれていてもかまいません。一致するテンプレートのうち、最初のもの以外は無視されます。

コーディング規則

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

インラインテンプレートは、あとで詳しく述べるように、Oracle Solaris Studio の標準のパラメータの渡し方およびレジスタ使用法の規則に従う必要があります。このような慣習に違反したルーチンは呼び出さないでください。たとえば、setjmp(3C) などのアセンブリ言語のルーチンを呼び出すと、問題が発生する可能性があります。

下記のレジスタ以外のレジスタは、使用および設定してはいけません。

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

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

Oracle Solaris Studio コンパイラで生成したオペレーションコードおよびアドレッシングモードのみが、動作を保証されています。バイナリエンコードされた命令はサポートされていません。

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 に関する特記事項

x86 に関する特記事項

Oracle Solaris x86 SSE/SSE2 Pentium 4 互換プラットフォームで実行するために -xarch={sse|sse2} を付けてコンパイルしたプログラムは、SSE/SSE2 対応のプラットフォームでのみ実行する必要があります。SSE/SSE2 に対応していないプラットフォーム上でそのようなプログラムを実行すると、セグメント例外が発生したり、明示的な警告メッセージなしに不正な結果が発生したりすることがあります。Solaris 10 リリース以降、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 型の引数は連続する 2 つの sse レジスタで渡され、float complex 型の引数は 1 つの sse レジスタで渡されます。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 では、前述のコーディング規則の違反は検査されません。

関連項目

Darryl Gove 著『Solaris Application Programming』(Prentice-Hall 2008 ISBN: 0138134553)

SPARC International Inc. 提供『The SPARC Architecture Manual Version 9』(http://www.sparc.com/resource.htm)。付録 G を参照してください。