ストリーミング SIMD 拡張命令 2 の整数シフト操作

ストリーミング SIMD 拡張命令 2 に対応したシフト演算組込み関数とその説明を下表に示します。

ストリーミング SIMD 拡張命令 2 の組込み関数のプロトタイプは、ヘッダファイル emmintrin.h 内にあります。

組込み関数 シフト
の方向
シフト
の種類
対応する
命令
_mm_slli_si128 論理 PSLLDQ
_mm_slli_epi16 論理 PSLLW
_mm_sll_epi16 論理 PSLLW
_mm_slli_epi32 論理 PSLLD
_mm_sll_epi32 論理 PSLLD
_mm_slli_epi64 論理 PSLLQ
_mm_sll_epi64 論理 PSLLQ
_mm_srai_epi16 算術 PSRAW
_mm_sra_epi16 算術 PSRAW
_mm_srai_epi32 算術 PSRAD
_mm_sra_epi32 算術 PSRAD
_mm_srli_si128 論理 PSRLDQ
_mm_srli_epi16 論理 PSRLW
_mm_srl_epi16 論理 PSRLW
_mm_srli_epi32 論理 PSRLD
_mm_srl_epi32 論理 PSRLD
_mm_srli_epi64 論理 PSRLQ
_mm_srl_epi64 論理 PSRLQ

__m128i _mm_slli_si128(__m128i a, int imm)

a の 128 ビット値を imm バイトだけ左にシフトし、下位ビットを 0 で埋めます。imm は即値でなければなりません。
r := a << (imm * 8)

__m128i _mm_slli_epi16(__m128i a, int count)

a に含まれている 8 つの符号付きまたは符号なし 16 ビット整数を左に count ビットだけシフトし、ゼロをシフトインします。
r0 := a0 << count
r1 := a1 << count
...
r7 := a7 << count

__m128i _mm_sll_epi16(__m128i a, __m128i count)

a に含まれている 8 つの符号付きまたは符号なし 16 ビット整数を左に count ビットだけシフトし、ゼロをシフトインします。
r0 := a0 << count
r1 := a1 << count
...
r7 := a7 << count

__m128i _mm_slli_epi32(__m128i a, int count)

a に含まれている 4 つの符号付きまたは符号なし 32 ビット整数を左に count ビットだけシフトし、ゼロをシフトインします。
r0 := a0 << count
r1 := a1 << count
r2 := a2 << count
r3 := a3 << count

__m128i _mm_sll_epi32(__m128i a, __m128i count)

a に含まれている 4 つの符号付きまたは符号なし 32 ビット整数を左に count ビットだけシフトし、ゼロをシフトインします。
r0 := a0 << count
r1 := a1 << count
r2 := a2 << count
r3 := a3 << count

__m128i _mm_slli_epi64(__m128i a, int count)

a に含まれている 2 つの符号付きまたは符号なし 64 ビット整数を左に count ビットだけシフトし、ゼロをシフトインします。
r0 := a0 << count
r1 := a1 << count

__m128i _mm_sll_epi64(__m128i a, __m128i count)

a に含まれている 2 つの符号付きまたは符号なし 64 ビット整数を左に count ビットだけシフトし、ゼロをシフトインします。
r0 := a0 << count
r1 := a1 << count

__m128i _mm_srai_epi16(__m128i a, int count)

a に含まれている 8 つの符号付き 16 ビット整数を右に count ビットだけシフトし、その符号ビットをシフトインします。
r0 := a0 >> count
r1 := a1 >> count
...
r7 := a7 >> count

__m128i _mm_sra_epi16(__m128i a, __m128i count)

a に含まれている 8 つの符号付き 16 ビット整数を右に count ビットだけシフトし、その符号ビットをシフトインします。
r0 := a0 >> count
r1 := a1 >> count
...
r7 := a7 >> count

__m128i _mm_srai_epi32(__m128i a, int count)

a に含まれている 4 つの符号付き 32 ビット整数を右に count ビットだけシフトし、その符号ビットをシフトインします。
r0 := a0 >> count
r1 := a1 >> count
r2 := a2 >> count
r3 := a3 >> count

__m128i _mm_sra_epi32(__m128i a, __m128i count)

a に含まれている 4 つの符号付き 32 ビット整数を右に count ビットだけシフトし、その符号ビットをシフトインします。
r0 := a0 >> count
r1 := a1 >> count
r2 := a2 >> count
r3 := i3 >> count

__m128i _mm_srli_si128(__m128i a, int imm)

a に含まれている 128 ビット値を右に imm バイトだけシフトし、ゼロをシフトインします。imm は即値でなければなりません。
r := srl(a, imm*8)

__m128i _mm_srli_epi16(__m128i a, int count)

a に含まれている 8 つの符号付きまたは符号なし 16 ビット整数を右に count ビットだけシフトし、ゼロをシフトインします。
r0 := srl(a0, count)
r1 := srl(a1, count)
...
r7 := srl(a7, count)

__m128i _mm_srl_epi16(__m128i a, __m128i count)

a に含まれている 8 つの符号付きまたは符号なし 16 ビット整数を右に count ビットだけシフトし、ゼロをシフトインします。
r0 := srl(a0, count)
r1 := srl(a1, count)
...
r7 := srl(a7, count)

__m128i _mm_srli_epi32(__m128i a, int count)

a に含まれている 4 つの符号付きまたは符号なし 32 ビット整数を右に count ビットだけシフトし、ゼロをシフトインします。
r0 := srl(a0, count)
r1 := srl(a1, count)
r2 := srl(a2, count)
r3 := srl(a3, count)

__m128i _mm_srl_epi32(__m128i a, __m128i count)

a に含まれている 4 つの符号付きまたは符号なし 32 ビット整数を右に count ビットだけシフトし、ゼロをシフトインします。
r0 := srl(a0, count)
r1 := srl(a1, count)
r2 := srl(a2, count)
r3 := srl(a3, count)

__m128i _mm_srli_epi64(__m128i a, int count)

a に含まれている 2 つの符号付きまたは符号なし 64 ビット整数を右に count ビットだけシフトし、ゼロをシフトインします。
r0 := srl(a0, count)
r1 := srl(a1, count)

__m128i _mm_srl_epi64(__m128i a, __m128i count)

a に含まれている 2 つの符号付きまたは符号なし 64 ビット整数を右に count ビットだけシフトし、ゼロをシフトインします。
r0 := srl(a0, count)
r1 := srl(a1, count)