ストリーミング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 := a3 << 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)