組込み関数を使用する大きなメリットは、従来のコーディング手法では使用できない重要な機能を利用できることです。組込み関数を使用すれば、アセンブリ言語の代わりに、C の関数呼び出しと変数の構文を使用してコーディングできます。ほとんどの MMX® テクノロジ、ストリーミング SIMD 拡張命令およびストリーミング SIMD 拡張命令 2 の組込み関数は、これらの命令を直接使用する C の関数に対応します。これによって、プログラマは、レジスタを管理する必要がなくなり、コンパイラは命令のスケジューリングを最適化できます。
MMX テクノロジ命令の組込み関数とストリーミング SIMD 拡張命令の組込み関数では、次の新しい機能を使用します:
ストリーミング SIMD 拡張命令 2 の組込み関数は、IA-32 についてのみ定義されており、Itanium® ベースのシステムについては定義されていません。ストリーミング SIMD 拡張命令 2 は、128 ビットデータ (2 個の 64 ビット倍精度浮動小数点値) を操作します。Itanium アーキテクチャでは、ストリーミング SIMD 拡張命令 2 をサポートしていないため、Itanium ベースのシステム上では、ストリーミング SIMD 拡張命令 2 は実行できません。
新しいプロセッサ・アーキテクチャには、新しいレジスタセットが追加されています。MMX 命令は、8 個の 64 ビットレジスタ (mm0〜mm7) を使用します。これらのレジスタは、浮動小数点スタックレジスタに別名を付けて使用されます。
ストリーミング SIMD 拡張命令レジスタは、8 個の 128 ビットレジスタ (xmm0〜xmm7) を使用します。
これらの新しいデータレジスタによって、データ要素の並列処理が可能になります。各レジスタが複数のデータ要素を保持できるため、プロセッサは複数のデータ要素を同時に処理できます。このような処理方法は、SIMD (Single Instruction, Multiple Data) 処理と呼ばれます。
新しい拡張命令セットのそれぞれの計算命令とデータ操作命令について、その命令を直接に実行する C 組込み関数を用意しています。これにより、プログラマは、レジスタの管理とアセンブリ言語のプログラミングを行う必要がなくなります。また、コンパイラは、命令のスケジューリングを最適化して、実行ファイルの処理速度を上げられます。
注
MMX テクノロジ・レジスタと XMM レジスタは、それぞれ MMX テクノロジの組込み関数とストリーミング SIMD 拡張命令/ストリーミング SIMD 拡張命令 2 の組込み関数を実行するために、IA-32 プラットフォーム上で使用される SIMD レジスタです。Itanium ベースのプラットフォーム上では、MMX テクノロジの組込み関数とストリーミング SIMD 拡張命令の組込み関数は、64 ビット汎用レジスタと、80 ビット浮動小数点レジスタの 64 ビットの仮数部を使用します。
組込み関数は、4 つの新しい C データ型をオペランドとして使用します。4 つのデータ型は、組込み関数に対するオペランドとして使用される新しいレジスタを表しています。次の表に、プロセッサごとに、これらの新しいデータ型が使用可能かどうかを示します。
新しいデータ型 | MMX テクノロジ | ストリーミング SIMD 拡張命令 | ストリーミング SIMD 拡張命令 2 | Itanium プロセッサ |
---|---|---|---|---|
__m64 | X | X | X | X |
__m128 | N/A | X | X | X |
__m128d | N/A | N/A | X | X |
__m128i | N/A | N/A | X | X |
__m64 データ型は、MMX テクノロジの組込み関数に使用される MMX テクノロジ・レジスタの内容を表します。__m64 データ型は、8 個の 8 ビット値、4 個の 16 ビット値、2 個の 32 ビット値、または 1 個の 64 ビット値を保持できます。
__m128 データ型は、ストリーミング SIMD 拡張命令の組込み関数に使用するストリーミング SIMD 拡張命令レジスタの内容を表します。__m128 データ型は、4 つの 32 ビット浮動小数点値を保持できます。
__m128d データ型は、2 つの 64 ビット浮動小数点値を保持できます。
__m128i データ型は、16 個の 8 ビット整数値、8 個の 16 ビット整数値、4 個の 32 ビット整数値、または 2 個の 64 ビット整数値を保持できます。
コンパイラは、__m128 型のローカルデータとグローバル・データのアライメントを、スタック上の 16 バイト境界に合わせます。integer 型、float 型、またはdouble 型の配列のアライメントを合わせるには、declspec 文を使用します。
これらの新しいデータ型は、基本的な ANSI C データ型ではありません。このため、次のような使用上の制限があります: