インテル® C++ コンパイラー 19.0 デベロッパー・ガイドおよびリファレンス
次の表に、インテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2) のその他の組込み関数のリストを示します。表の後に、各組込み関数の説明を示します。
インテル® SSE2 の組込み関数のプロトタイプは、ヘッダーファイル emmintrin.h 内にあります。
これらの組込み関数を使用する場合、次のように immintrin.h ファイルをインクルードします。
#include <immintrin.h>
組込み関数 |
演算 |
対応するインテル® SSE2 命令 |
---|---|---|
_mm_packs_epi16 |
パックド飽和 |
PACKSSWB |
_mm_packs_epi32 |
パックド飽和 |
PACKSSDW |
_mm_packus_epi16 |
パックド飽和 |
PACKUSWB |
_mm_extract_epi16 |
抽出 |
PEXTRW |
_mm_insert_epi16 |
挿入 |
PINSRW |
_mm_movemask_epi8 |
マスクの作成 |
PMOVMSKB |
_mm_shuffle_epi32 |
シャッフル |
PSHUFD |
_mm_shufflehi_epi16 |
シャッフル |
PSHUFHW |
_mm_shufflelo_epi16 |
シャッフル |
PSHUFLW |
_mm_unpackhi_epi8 |
インターリーブ |
PUNPCKHBW |
_mm_unpackhi_epi16 |
インターリーブ |
PUNPCKHWD |
_mm_unpackhi_epi32 |
インターリーブ |
PUNPCKHDQ |
_mm_unpackhi_epi64 |
インターリーブ |
PUNPCKHQDQ |
_mm_unpacklo_epi8 |
インターリーブ |
PUNPCKLBW |
_mm_unpacklo_epi16 |
インターリーブ |
PUNPCKLWD |
_mm_unpacklo_epi32 |
インターリーブ |
PUNPCKLDQ |
_mm_unpacklo_epi64 |
インターリーブ |
PUNPCKLQDQ |
_mm_movepi64_pi64 |
移動 |
MOVDQ2Q |
_mm_movpi64_epi64 |
移動 |
MOVDQ2Q |
_mm_move_epi64 |
移動 |
MOVQ |
_mm_unpackhi_pd |
インターリーブ |
UNPCKHPD |
_mm_unpacklo_pd |
インターリーブ |
UNPCKLPD |
_mm_movemask_pd |
マスクの作成 |
MOVMSKPD |
_mm_shuffle_pd |
値の選択 |
SHUFPD |
__m128i _mm_packs_epi16(__m128i a, __m128i b);
a と b の 16 の符号付き 16 ビット整数を 8 ビット整数にパックして、飽和処理します。
R0 |
... |
R7 |
R8 |
... |
R15 |
---|---|---|---|---|---|
Signed Saturate(a0) |
... |
Signed Saturate(a7) |
Signed Saturate(b0) |
... |
Signed Saturate(b7) |
__m128i _mm_packs_epi32(__m128i a, __m128i b);
a と b の 8 つの符号付き 32 ビット整数を符号付き 16 ビット整数にパックして、飽和処理します。
R0 |
... |
R3 |
R4 |
... |
R7 |
---|---|---|---|---|---|
Signed Saturate(a0) |
... |
Signed Saturate(a3) |
Signed Saturate(b0) |
... |
Signed Saturate(b3) |
__m128i _mm_packus_epi16(__m128i a, __m128i b);
a と b の 16 の符号付き 16 ビット整数を符号なし 8 ビット整数にパックして、飽和処理します。
R0 |
... |
R7 |
R8 |
... |
R15 |
---|---|---|---|---|---|
Unsigned Saturate(a0) |
... |
Unsigned Saturate(a7) |
Unsigned Saturate(b0) |
... |
Unsigned Saturate(b15) |
int _mm_extract_epi16(__m128i a, int imm);
選択された符号付きまたは符号なし 16 ビット整数を a から抽出して、0 で拡張します。セレクター imm は、即値でなければなりません。
R0 |
---|
(imm == 0) ? a0: ( (imm == 1) ? a1: ...(imm==7) ? a7) |
__m128i _mm_insert_epi16(__m128i a, int b, int imm);
b の最下位 16 ビットを、a の選択された 16 ビット整数に挿入します。セレクター imm は、即値でなければなりません。
R0 |
R1 |
... |
R7 |
---|---|---|---|
(imm == 0) ? b : a0; |
(imm == 1) ? b : a1; |
... |
(imm == 7) ? b : a7; |
int _mm_movemask_epi8(__m128i a);
a の 16 の符号付きまたは符号なし 8 ビット整数の最上位ビットを使用して 16 ビット・マスクを作成し、上位ビットを 0 で拡張します。
R0 |
---|
a15[7] << 15 | a14[7] << 14 | ... a1[7] << 1 | a0[7] |
__m128i _mm_shuffle_epi32(__m128i a, int imm);
imm の指定に従って、a の 4 つの符号付きまたは符号なし 32 ビット整数をシャッフルします。シャッフル値 imm は、即値でなければなりません。シャッフルのセマンティクスについては、このセクションの最後の「シャッフルを行うマクロ関数」を参照してください。
__m128i _mm_shufflehi_epi16(__m128i a, int imm);
imm の指定に従って、a の上位 4 つの符号付きまたは符号なし 16 ビット整数をシャッフルします。シャッフル値 imm は、即値でなければなりません。シャッフルのセマンティクスについては、このセクションの最後の「シャッフルを行うマクロ関数」を参照してください。
__m128i _mm_shufflelo_epi16(__m128i a, int imm);
imm の指定に従って、a の下位 4 つの符号付きまたは符号なし 16 ビット整数をシャッフルします。シャッフル値 imm は、即値でなければなりません。シャッフルのセマンティクスについては、このセクションの最後の「シャッフルを行うマクロ関数」を参照してください。
__m128i _mm_unpackhi_epi8(__m128i a, __m128i b);
a の上位 8 つの符号付きまたは符号なし 8 ビット整数と、b の上位 8 つの符号付きまたは符号なし 8 ビット整数をインターリーブ (交互に配置) します。
R0 |
R1 |
R2 |
R3 |
... |
R14 |
R15 |
---|---|---|---|---|---|---|
a8 |
b8 |
a9 |
b9 |
... |
a15 |
b15 |
__m128i _mm_unpackhi_epi16(__m128i a, __m128i b);
a の上位 4 つの符号付きまたは符号なし 16 ビット整数と、b の上位 4 つの符号付きまたは符号なし 16 ビット整数をインターリーブします。
R0 |
R1 |
R2 |
R3 |
R4 |
R5 |
R6 |
R7 |
---|---|---|---|---|---|---|---|
a4 |
b4 |
a5 |
b5 |
a6 |
b6 |
a7 |
b7 |
__m128i _mm_unpackhi_epi32(__m128i a, __m128i b);
a の上位 2 つの符号付きまたは符号なし 32 ビット整数と、b の上位 2 つの符号付きまたは符号なし 32 ビット整数をインターリーブします。
R0 |
R1 |
R2 |
R3 |
---|---|---|---|
a2 |
b2 |
a3 |
b3 |
__m128i _mm_unpackhi_epi64(__m128i a, __m128i b);
a の上位の符号付きまたは符号なし 64 ビット整数と、b の上位の符号付きまたは符号なし 64 ビット整数をインターリーブします。
R0 |
R1 |
---|---|
a1 |
b1 |
__m128i _mm_unpacklo_epi8(__m128i a, __m128i b);
a の下位 8 つの符号付きまたは符号なし 8 ビット整数と、b の下位 8 つの符号付きまたは符号なし 8 ビット整数をインターリーブします。
R0 |
R1 |
R2 |
R3 |
... |
R14 |
R15 |
---|---|---|---|---|---|---|
a0 |
b0 |
a1 |
b1 |
... |
a7 |
b7 |
__m128i _mm_unpacklo_epi16(__m128i a, __m128i b);
a の下位 4 つの符号付きまたは符号なし 16 ビット整数と、b の下位 4 つの符号付きまたは符号なし 16 ビット整数をインターリーブします。
R0 |
R1 |
R2 |
R3 |
R4 |
R5 |
R6 |
R7 |
---|---|---|---|---|---|---|---|
a0 |
b0 |
a1 |
b1 |
a2 |
b2 |
a3 |
b3 |
__m128i _mm_unpacklo_epi32(__m128i a, __m128i b);
a の下位 2 つの符号付きまたは符号なし 32 ビット整数と、b の下位 2 つの符号付きまたは符号なし 32 ビット整数をインターリーブします。
R0 |
R1 |
R2 |
R3 |
---|---|---|---|
a0 |
b0 |
a1 |
b1 |
__m128i _mm_unpacklo_epi64(__m128i a, __m128i b);
a の下位の符号付きまたは符号なし 64 ビット整数と、b の下位の符号付きまたは符号なし 64 ビット整数をインターリーブします。
R0 |
R1 |
---|---|
a0 |
b0 |
__m64 _mm_movepi64_pi64(__m128i a);
a の下位 64 ビットを、__m64 型として返します。
R0 |
---|
a0 |
__m128i _mm_movpi64_pi64(__m64 a);
a の 64 ビットを結果の下位 64 ビットに移動し、上位ビットを 0 に設定します。
R0 |
R1 |
---|---|
a0 |
0X0 |
__m128i _mm_move_epi64(__m128i a);
a の 64 ビットを結果の下位 64 ビットに移動し、上位ビットを 0 に設定します。
R0 |
R1 |
---|---|
a0 |
0X0 |
__m128d _mm_unpackhi_pd(__m128d a, __m128d b);
a と b の上位の倍精度浮動小数点値をインターリーブ (交互に配置) します。
R0 |
R1 |
---|---|
a1 |
b1 |
__m128d _mm_unpacklo_pd(__m128d a, __m128d b);
a と b の下位の倍精度浮動小数点値をインターリーブ (交互に配置) します。
R0 |
R1 |
---|---|
a0 |
b0 |
int _mm_movemask_pd(__m128d a);
a の 2 つの倍精度浮動小数点値の符号ビットから、2 ビット・マスクを作成します。
R |
---|
sign(a1) << 1 | sign(a0) |
__m128d _mm_shuffle_pd(__m128d a, __m128d b, int i)
マスク i に基づいて、a と b から 2 つの倍精度浮動小数点値を選択します。マスクは即値でなければなりません。シャッフルのセマンティクスについては、「シャッフルを行うマクロ関数」を参照してください。