インライン・アセンブリー

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

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

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

prompt>icpc -ip -nolib_inline sum.cpp

IPO の詳細は、「プロシージャー間の最適化」を参照してください。

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

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

GNU* スタイルのインライン・アセンブリー (IA-32 のみ)

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

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

警告

インテル C++ コンパイラーは、UNIX スタイルの asm と MASM スタイルの asm の混在をサポートしていません。

構文要素 説明
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 へ続行します。オペランドの合計数は 0-29 個です。
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 つのマシンレジスター名を指定します。レジスター名は、オプションで先頭に % を使用できます。任意の有効なマシンレジスターを指定することができます。また、clobber-spec で "メモリー" を指定することもできます。これを指定すると、コンパイラーはレジスターにキャッシュされたデータを asm 文に渡さないようにします。