インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
インテル® ストリーミング SIMD 拡張命令 (インテル® SSE) の組込み関数では、次の機能を使用します。
新しいレジスター - 最大 128 ビットのパックドデータの最適な SIMD 処理が可能です。
新しいデータ型 - 最大 16 要素のデータを 1 つのレジスターにパックできます。
インテル® ストリーミング SIMD 拡張命令レジスターは、8 個の 128 ビット・レジスター (XMM0 ~ XMM7) を使用します。
各レジスターは複数のデータ要素を保持できるため、プロセッサーは複数のデータ要素を同時に処理できます。このような処理方法は、SIMD (Single Instruction Multiple Data) 処理と呼ばれます。
新しい拡張命令セットのそれぞれの計算命令とデータ操作命令について、その命令を直接実装する C 組込み関数が用意されています。これにより、プログラマーは、レジスターの管理とアセンブリー言語のプログラミングを行う必要がなくなります。また、コンパイラーは、命令のスケジュールを最適化して、実行ファイルの処理速度を上げることができます。
MM および XMM レジスターは、IA-32 アーキテクチャー・ベースのシステムでインテル® MMX® テクノロジーおよびインテル® SSE/SSE2 の実装に使用される SIMD レジスターです。
これらの組込み関数は、4 つの新しい C データ型をオペランドとして使用します。4 つのデータ型は、組込み関数に対するオペランドとして使用される新しいレジスターを表しています。
次の表に、各命令でサポートされる新しいデータ型を示します。
新しいデータ型 |
インテル® SSE の組込み関数 |
インテル® SSE2 の組込み関数 |
インテル® SSE3 の組込み関数 |
---|---|---|---|
__m64 |
利用可能 |
利用可能 |
利用可能 |
__m128 |
利用可能 |
利用可能 |
利用可能 |
__m128d |
利用できません |
利用可能 |
利用可能 |
__m128i |
利用できません |
利用可能 |
利用可能 |
__m128 データ型は、インテル® SSE 組込み関数に使用するインテル® SSE レジスターの内容を表します。__m128 データ型は、4 つの 32 ビット浮動小数点値を保持できます。
__m128d データ型は、2 つの 64 ビット浮動小数点値を保持できます。
__m128i データ型は、16 個の 8 ビット整数値、8 個の 16 ビット整数値、4 個の 32 ビット整数値、または 2 個の 64 ビット整数値を保持できます。
コンパイラーは、__m128d 型および _m128i 型のローカルデータとグローバルデータのアライメントを、スタック上の 16 バイト境界に合わせます。integer 型、float 型、または double 型の配列のアライメントを合わせるには、__declspec(align) 文を使用します。
これらの新しいデータ型は、基本的な 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)))