インテル® プロセッサーは、命令ごとに特別なレジスターセットを用意しています。
MMX® 命令は、8 個の 64 ビット・レジスター (mm0 ~ mm7) を使用します。これらのレジスターは、浮動小数点スタックレジスターに別名を付けて使用されます。
インテル® ストリーミング SIMD 拡張命令 (インテル® SSE) と AES (Advanced Encryption Standard) 命令は、8 個の 128 ビット・レジスター (xmm0 ~ xmm7) を使用します。
インテル® Advanced Vector Extension (インテル® AVX) 命令は、128 ビット SIMD レジスターの拡張である 256 ビット・レジスターを使用します。
各レジスターは複数のデータ要素を保持できるため、プロセッサーは複数のデータ要素を同時に処理できます。このような処理方法は、SIMD (Single Instruction, Multiple Data) 処理と呼ばれます。
新しい拡張命令セットのそれぞれの計算命令とデータ操作命令について、その命令を直接実行する C 組み込み関数が用意されています。これにより、プログラマーは、レジスターの管理とアセンブリー言語のプログラミングを行う必要がなくなります。また、コンパイラーは、命令のスケジューリングを最適化して、実行ファイルの処理速度を上げることができます。
MM レジスターと XMM レジスターは、それぞれ MMX® テクノロジーの組み込み関数とインテル® SSE/インテル® SSE2 の組み込み関数を実行するために、IA-32 アーキテクチャー・ベースのプラットフォーム上で使用される SIMD レジスターです。
組み込み関数は、新しい C データ型をオペランドとして使用します。これらのデータ型は、組み込み関数に対するオペランドとして使用される新しいレジスターを表しています。
次の表に、各命令でサポートされる新しいデータ型を示します。組み込み関数グループでデータ型を使用できる場合は ○ が、使用できない場合は X が表示されています。
データ型 --> 組み込み関数グループ |
__m64 | __m128 |
__m128d |
__m128i |
__m256 | __m256d | __m256i |
---|---|---|---|---|---|---|---|
MMX® テクノロジーの組み込み関数 | ○ |
X |
X |
X |
X |
X |
X |
インテル® ストリーミング SIMD 拡張命令の組み込み関数 |
○ |
○ |
X |
X |
X |
X |
X |
インテル® ストリーミング SIMD 拡張命令 2 の組み込み関数 |
○ |
○ |
○ |
○ |
X |
X |
X |
インテル® ストリーミング SIMD 拡張命令 3 の組み込み関数 |
○ |
○ |
○ |
○ |
X |
X |
X |
AES + キャリーなし乗算 |
○ |
○ |
○ |
○ |
X |
X |
X |
Half Float 型 |
○ |
○ |
○ |
○ |
X |
X |
X |
インテル® Advanced Vector Extensions (インテル® AVX) の組み込み関数 |
○ |
○ |
○ |
○ |
○ |
○ |
○ |
__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 align 文を使用します。
typedef struct __declspec(align(16)) { float f[4]; } __m128;
typedef struct __declspec(align(16)) { double d[2]; } __m128d;
typedef struct __declspec(align(16)) { int i[4]; } __m128i;
__m128 データ型は、IA-32 アーキテクチャー・ベースのプラットフォーム (x86 プロセッサー) で通常どおり 処理されます (つまり、4 個の浮動小数点値として解釈されます)。ただし、インテル® デバッガーはすべてのプラットフォームで __128 データ型を 4 個の浮動小数点値として解釈します。
IA-32 およびインテル® 64 アーキテクチャー・ベースのシステムで 8 ビット・データにアクセスするには、次のように mm_extract 組み込み関数を使用します。
#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 ビット・データ (インテル® 64 アーキテクチャーのみ) にアクセスするには:
#define _mm_extract_epi64(x, imm) \
_mm_cvtsi128_si64(_mm_srli_si128((x), 8 * (imm)))
__m256 データ型は、拡張 SSE レジスター (インテル® AVX 組み込み関数で使用される YMM レジスター) の内容を表します。
通常、__m256 データ型は 8 個の 32 ビット浮動小数点値、__m256 データ型は 4 個の 64 ビット倍精度浮動小数点値、__m256i データ型は 32 個の 8 ビット整数値、16 個の 16 ビット整数値、8 個の 32 ビット整数値、または 4 個の 64 ビット整数値を保持できます。詳細は、「インテル® Advanced Vector Extensions (インテル® AVX) 組み込み関数と FMA (Fused Multiply-Add) 組み込み関数の詳細」を参照してください。
© 1996-2010 Intel Corporation. 無断での引用、転載を禁じます。