MMX(R) テクノロジー命令の組み込み関数とストリーミング SIMD 拡張命令 (SSE) の組み込み関数では、次の機能を使用します。
インテル(R) プロセッサーは、特別なレジスターセットを用意しています。
MMX 命令は、8 個の 64 ビット・レジスター (mm0〜mm7) を使用します。これらのレジスターは、浮動小数点スタックレジスターに別名を付けて使用されます。
ストリーミング SIMD 拡張命令レジスターは、8 個の 128 ビット・レジスター (xmm0〜xmm7) を使用します。
各レジスターが複数のデータ要素を保持できるため、プロセッサーは複数のデータ要素を同時に処理できます。このような処理方法は、SIMD (Single Instruction, Multiple Data) 処理と呼ばれます。
新しい拡張命令セットのそれぞれの計算命令とデータ操作命令について、その命令を直接に実行する C 組み込み関数を用意しています。これにより、プログラマーは、レジスターの管理とアセンブリー言語のプログラミングを行う必要がなくなります。また、コンパイラーは、命令のスケジューリングを最適化して、実行ファイルの処理速度を上げられます。
MM レジスターと XMM レジスターは、それぞれ MMX テクノロジーの組み込み関数と SSE/SSE2 の組み込み関数を実行するために、IA-32 プラットフォーム上で使用される SIMD レジスターです。IA-64 アーキテクチャーでは、MMX テクノロジーの組み込み関数と SSE の組み込み関数は、64 ビット汎用レジスターと、80 ビット浮動小数点レジスターの 64 ビットの仮数部を使用します。
組み込み関数は、4 つの新しい C データ型をオペランドとして使用します。4 つのデータ型は、組み込み関数に対するオペランドとして使用される新しいレジスターを表しています。
次の表に、各命令でサポートされる新しいデータ型を示します。
新しいデータ型 | MMX テクノロジー | ストリーミング SIMD 拡張命令 | ストリーミング SIMD 拡張命令 2 | ストリーミング SIMD 拡張命令 3 |
---|---|---|---|---|
__m64 | 利用可能 | 利用可能 | 利用可能 | 利用可能 |
__m128 | 利用できません | 利用可能 | 利用可能 | 利用可能 |
__m128d | 利用できません | 利用できません | 利用可能 | 利用可能 |
__m128i | 利用できません | 利用できません | 利用可能 | 利用可能 |
__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 ビット整数値を保持できます。
コンパイラーは、__m128d 型および _m128i 型のローカルデータとグローバルデータのアライメントを、スタック上の 16 バイト境界に合わせます。integer 型、float 型、またはdouble 型の配列のアライメントを合わせるには、declspec 文を使用します。
これらの新しいデータ型は、基本的な ANSI C データ型ではありません。このため、次のような使用上の制限があります。
8 ビット・データにアクセスするには:
#define _mm_extract_epi8(x, imm) \
((((imm) & 0x1) == 0) ? \
_mm_extract_epi16((x), (imm) >> 1) & 0xff : \
_mm_extract_epi16(_mm_srli_epi16((x), 8), (imm) >> 1))
16 ビット・データの場合、次の組み込み関数を使用します。
int _mm_extract_epi16(__m128i a, int imm)
32 ビット・データにアクセルするには:
#define _mm_extract_epi32(x, imm) \
_mm_cvtsi128_si32(_mm_srli_si128((x), 4 * (imm)))
64 ビット・データ (インテル(R) 64 アーキテクチャーのみ) にアクセスするには:
#define _mm_extract_epi64(x, imm) \
_mm_cvtsi128_si64(_mm_srli_si128((x), 8 * (imm)))