次の表に、ストリーミング SIMD 拡張命令 2 のその他の組込み関数のリストを示します。表の後に、各組込み関数の説明を示します。
ストリーミング SIMD 拡張命令 2 の組込み関数のプロトタイプは、ヘッダファイル 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 | 移動 |
_m128i_mm_movpi64_epi64 | MOVQ2DQ | 移動 |
_mm_move_epi64 | MOVQ | 移動 |
__m128i _mm_packs_epi16(__m128i a, __m128i b)
a と b の 16 の符号付き 16 ビット整数を 8 ビット整数にパックして、飽和処理します。
r0 := SignedSaturate(a0)
r1 := SignedSaturate(a1)
...
r7 := SignedSaturate(a7)
r8 := SignedSaturate(b0)
r9 := SignedSaturate(b1)
...
r15 := SignedSaturate(b7)
__m128i _mm_packs_epi32(__m128i a, __m128i b)
a と b の 8 つの符号付き 32 ビット整数を符号付き 16 ビット整数にパックして、飽和処理します。
r0 := SignedSaturate(a0)
r1 := SignedSaturate(a1)
r2 := SignedSaturate(a2)
r3 := SignedSaturate(a3)
r4 := SignedSaturate(b0)
r5 := SignedSaturate(b1)
r6 := SignedSaturate(b2)
r7 := SignedSaturate(b3)
__m128i _mm_packus_epi16(__m128i a, __m128i b)
a と b の 16 の符号付き 16 ビット整数を符号なし 8 ビット整数にパックして、飽和処理します。
r0 := UnsignedSaturate(a0)
r1 := UnsignedSaturate(a1)
...
r7 := UnsignedSaturate(a7)
r8 := UnsignedSaturate(b0)
r9 := UnsignedSaturate(b1)
...
r15 := UnsignedSaturate(b7)
int _mm_extract_epi16(__m128i a, int imm)
選択された符号付きまたは符号なし16ビット整数を a から抽出して、0 で拡張します。セレクタ imm は、即値でなければなりません。
r := (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 := (imm == 0) ? b : a0;
r1 := (imm == 1) ? b : a1;
...
r7 := (imm == 7) ? b : a7;
int _mm_movemask_epi8(__m128i a)
a の 16 の符号付きまたは符号なし 8 ビット整数の最上位ビットを使用して 16 ビットマスクを作成し、上位ビットを 0 で拡張します。
r := 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 := a8 ; r1 := b8
r2 := a9 ; r3 := b9
...
r14 := a15 ; r15 := b15
__m128i _mm_unpackhi_epi16(__m128i a, __m128i b)
a の上位 4 つの符号付きまたは符号なし 16 ビット整数と、b の上位 4 つの符号付きまたは符号なし 16 ビット整数をインターリーブします。
r0 := a4 ; r1 := b4
r2 := a5 ; r3 := b5
r4 := a6 ; r5 := b6
r6 := a7 ; r7 := b7
__m128i _mm_unpackhi_epi32(__m128i a, __m128i b)
a の上位 2 つの符号付きまたは符号なし 32 ビット整数と、b の上位 2 つの符号付きまたは符号なし 32 ビット整数をインターリーブします。
r0 := a2 ; r1 := b2
r2 := a3 ; r3 := b3
__m128i _mm_unpackhi_epi64(__m128i a, __m128i b)
a の上位の符号付きまたは符号なし 64 ビット整数と、b の上位の符号付きまたは符号なし 64 ビット整数をインターリーブします。
r0 := a1 ; r1 := b1
__m128i _mm_unpacklo_epi8(__m128i a, __m128i b)
a の下位 8 つの符号付きまたは符号なし 8 ビット整数と、b の下位 8 つの符号付きまたは符号なし 8 ビット整数をインターリーブします。
r0 := a0 ; r1 := b0
r2 := a1 ; r3 := b1
...
r14 := a7 ; r15 := b7
__m128i _mm_unpacklo_epi16(__m128i a, __m128i b)
a の下位 4 つの符号付きまたは符号なし 16 ビット整数と、b の下位 4 つの符号付きまたは符号なし 16 ビット整数をインターリーブします。
r0 := a0 ; r1 := b0
r2 := a1 ; r3 := b1
r4 := a2 ; r5 := b2
r6 := a3 ; r7 := b3
__m128i _mm_unpacklo_epi32(__m128i a, __m128i b)
a の下位 2 つの符号付きまたは符号なし 32 ビット整数と、b の下位 2 つの符号付きまたは符号なし 32 ビット整数をインターリーブします。
r0 := a0 ; r1 := b0
r2 := a1 ; r3 := b1
__m128i _mm_unpacklo_epi64(__m128i a, __m128i b)
a の下位の符号付きまたは符号なし 64 ビット整数と、b の下位の符号付きまたは符号なし 64 ビット整数をインターリーブします。
r0 := a0 ; r1 := b0
__m64 _mm_movepi64_pi64(__m128i a)
a の下位 64 ビットを、__m64 型として返します。
r0 := a0 ;
__128i _mm_movpi64_pi64(__m64 a)
a の 64 ビットを結果の下位 64 ビットに移動し、上位ビットを 0 に設定します。
r0 := a0 ; r1 := 0X0 ;
__128i _mm_move_epi64(__128i a)
a の下位 64 ビットを結果の下位 64 ビットに移動し、上位ビットを 0 に設定します。
r0 := a0 ; r1 := 0X0 ;