インライン・アセンブリ

デフォルトでは、C、C++、および数値演算の各標準ライブラリ関数のいくつかはコンパイラによってインライン化します。通常、この処理によってプログラムの実行速度が速くなります。

ライブラリ関数をインライン展開すると、予期しない結果になる場合があります。インライン化されたライブラリ関数では、errno変数は設定されません。したがって、errno変数を設定するかしないかによって動作が異なるコードに対しては、-nolib_inlineオプションを使用しなければなりません。そうすれば、ライブラリ関数のインライン展開は禁止されます。また、コンパイラから提供されるライブラリ関数と同じ名前を持つ関数はライブラリ関数と見なすため、元々の呼び出し命令は、インライン化したものと置き換わります。したがって、既知のライブラリ・ルーチンのいずれかと同じ名前を持つ関数がプログラムの中で定義している場合は、その関数そのものが必ず使用されるように-nolib_inlineオプションを使用する必要があります。

ライブラリ関数の自動インライン展開は、プロシージャ間の最適化処理中にコンパイラが行うインライン展開とは関連がありません。例えば、次のコマンドを実行すると、sum.c というプログラムがコンパイルされます。このとき、ライブラリ関数の展開は行いませんが、プロシージャ間の最適化(IPO)によるインライン展開は行います。

IPOの詳細は、「プロシージャ間の最適化とプロファイルに基づく最適化」を参照してください。

MASM* スタイルのインライン・アセンブリ

インテル® C++ コンパイラは、 -use_msasmオプションによってMASM* スタイルのインライン・アセンブリをサポートしています。構文については、MASM のマニュアルを参照してください。

GNU* 式スタイルのインライン・アセンブリ

インテル C++ コンパイラは、 GNU式 スタイルのインライン・アセンブリをサポートしています。構文は、次のとおりです。

asm-keyword [ volatile-keyword ] ( asm-template [ asm-interface ] ) ;

構文要素 説明
asm-keyword asm文はasmキーワードで始まります。または、互換性のため、__asmもしくは__asm__ が使用されることもあります。
volatile-keyword オプションの volatile キーワードが指定されたら、asm はvolatile です。2 つのvolatile asm 文は、お互いに移動しません。volatile変数への参照は、volatile asmへ相対移動しません。または、互換性のため、__volatileもしくは__volatile__ が使用されることもあります。
asm-template asm-templateは、アセンブリ・コードを出力する方法を指定する C 言語の ASCII 文字列です。テンプレートの多くは固定文字列です。代入ディレクティブ以外のすべては、アセンブリにそのまま渡されます。代入ディテクティブの構文は、%の後に1または2文字続きます。サポートされた代入ディテクティブは、次のセクションで指定されます。
asm-interface asm-interface は次の3つの部分で構成されます。
1. output-list(オプション)
2. input-list(オプション)
3. clobber-list(オプション)
これらは、コロン(:)で区切ります。output-list がなく、input-list が指定される場合、output-list の代わりに、input-list は2つのコロン(::) に続きます。asm-interfaceがすべて省略された場合、 volatile-keywordの指定の有無にかかわらず、asm文はvolatileとみなされます。
output-list output-list は、カンマで区切られた1つ以上のoutput-specs から構成されます。asm-template に代入するために、各output-specには番号が付けられます。output-list の最初のオペランドは 0 で、次は 1 のようになります。番号付けは、output-listからinput-list へ続行します。オペランドの合計数は10個までです(0-9)。
input-list output-listと類似して、 input-list はカンマで区切られた1つ以上のinput-specs から構成されます。asm-templateに代入するために、各input-specは番号が付けられます。番号は、output-listのオペランドから続きます。
clobber-list clobber-listasm が特定のマシンレジスタを使用または変更することをコンパイラに伝えます。特定のマシンレジスタは直接asmにコードされるか、アセンブリの命令によって暗黙的に変更されます。clobber-list は、カンマで区切られたclobber-specs のリストです。
input-spec input-specs は、挿入されたアセンブリの命令によって必要とされる値の式をコンパイラに伝えます。asm の必須入力をすべて示すのに、実際にはasm-templateに参照されないinput-specを一覧表示できます。
clobber-spec clobber-specは、壊れた1つのマシン・レジスタ名を指定します。レジスタ名は、オプションで先頭に%を使用できます。有効なレジスタ名: eax, ebx, ecx, edx, esi, edi, ebp, esp, ax, bx, cx, dx, si, di, bp, sp, al, bl, cl, dl, ah, bh, ch, dh, st, st(1) ?Est(7), mm0 ?Emm7, xmm0 ?Exmm7 および cc また、clobber-spec で"メモリ" を指定することもできます。これを指定すると、コンパイラはレジスタにキャッシュされたデータをasm文に渡さないようにします。