ストリーミング SIMD 拡張命令 2 のその他の操作

次の表に、ストリーミング SIMD 拡張命令 2 (SSE2) のその他の組み込み関数のリストを示します。表の後に、各組み込み関数の説明を示します。

SSE2 の組み込み関数のプロトタイプは、ヘッダーファイル emmintrin.h 内にあります。

組み込み関数 操作 対応する
命令
_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)

ab の 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)

ab の 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)

ab の 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

 

__128i _mm_movpi64_pi64(__m64 a)

a の 64 ビットを結果の下位 64 ビットに移動し、上位ビットを 0 に設定します。

R0 R1
a0 0X0

 

__128i _mm_move_epi64(__m128i a)

a の 64 ビットを結果の下位 64 ビットに移動し、上位ビットを 0 に設定します。

R0 R1
a0 0X0

 

__m128d _mm_unpackhi_pd(__m128d a, __m128d b)

ab の上位の倍精度浮動小数点値をインターリーブ (交互に配置) します。

R0 R1
a1 b1

 

__m128d _mm_unpacklo_pd(__m128d a, __m128d b)

ab の下位の倍精度浮動小数点値をインターリーブ (交互に配置) します。

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 に基づいて、ab から 2 つの倍精度浮動小数点値を選択します。マスクは即値でなければなりません。シャッフルのセマンティクスについては、「シャッフルを行うマクロ関数」を参照してください。