SSE/AVX:整数ビット操作

論理演算 (整数)
POR
VPOR
OR [SSE2]
PAND
VPAND
AND [SSE2]
PANDN
VPANDN
NOT AND [SSE2]
PXOR
VPXOR
XOR [SSE2]
左シフト
PSLLW
VPSLLW
パック16bit 左シフト [SSE2]
PSLLD
VPSLLD
パック32bit 左シフト [SSE2]
PSLLQ
VPSLLQ
パック64bit 左シフト [SSE2]
PSLLDQ
VPSLLDQ
パック128bit 左シフト [SSE2]
VPSLLVDパック32bit 左シフト (個別) [AVX2]
VPSLLVQパック64bit 左シフト (個別) [AVX2]
右シフト
PSRLW
VPSRLW
パック16bit 右シフト (符号なし) [SSE2]
PSRAW
VPSRAW
パック16bit 右シフト (符号付き) [SSE2]
PSRLD
VPSRLD
パック32bit 右シフト (符号なし) [SSE2]
PSRAD
VPSRAD
パック32bit 右シフト (符号付き) [SSE2]
PSRLQ
VPSRLQ
パック64bit 右シフト (符号なし) [SSE2]
PSRLDQ
VPSRLDQ
パック128bit 右シフト (符号なし) [SSE2]
PALIGNR
VPALIGNR
128bit を2つ連結して右シフト [SSE3]
VPSRLVDパック32bit 右シフト (符号なし、個別) [AVX2]
VPSRAVDパック32bit 右シフト (符号付き、個別) [AVX2]
VPSRLVQパック64bit 右シフト (符号なし、個別) [AVX2]
論理演算 (整数)
POR xmm1, xmm2/mem128 | 66 0F EB /r | SSE2
VPOR xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 EB /r | AVX
VPOR ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 EB /r | AVX2
2つのソースでビット単位の OR を行って、結果を宛先に書き込みます。
PAND xmm1, xmm2/mem128 | 66 0F DB /r | SSE2
VPAND xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 DB /r | AVX
VPAND ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 DB /r | AVX2
2つのソースでビット単位の AND を行って、結果を宛先に書き込みます。
PANDN xmm1, xmm2/mem128 | 66 0F DF /r | SSE2
VPANDN xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src.0.01 DF /r | AVX
VPANDN ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src.1.01 DF /r | AVX2
第1ソースの値をビット反転した後、第2ソースの値と AND を行い、結果を宛先に書き込みます。
PXOR xmm1, xmm2/mem128 | 66 0F EF /r | SSE2
VPXOR xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 EF /r | AVX
VPXOR ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 EF /r | AVX2
2つのソースでビット単位の XOR を行って、結果を宛先に書き込みます。
左シフト
PSLLW xmm1, xmm2/mem128 | 66 0F F1 /r    | SSE2
PSLLW xmm, imm8         | 66 0F 71 /6 ib | SSE2
VPSLLW xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 F1 /r    | AVX
VPSLLW xmm1, xmm2, imm8        | C4 RXB.01 X.dest.0.01 71 /6 ib | AVX
VPSLLW ymm1, ymm2, xmm3/mem128 | C4 RXB.01 X.src1.1.01 F1 /r    | AVX2
VPSLLW ymm1, ymm2, imm8        | C4 RXB.01 X.dest.1.01 71 /6 ib | AVX2
パックされた各 16bit 整数を、それぞれ、最後のオペランドで指定された値の数、左にシフトし、結果を宛先に書き込みます。
シフト後の最下位ビットはクリアされます。
PSLLD xmm1, xmm2/mem128 | 66 0F F2 /r    | SSE2
PSLLD xmm, imm8         | 66 0F 72 /6 ib | SSE2
VPSLLD xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 F2 /r    | AVX
VPSLLD xmm1, xmm2, imm8        | C4 RXB.01 X.dest.0.01 72 /6 ib | AVX
VPSLLD ymm1, ymm2, xmm3/mem128 | C4 RXB.01 X.src1.1.01 F2 /r    | AVX2
VPSLLD ymm1, ymm2, imm8        | C4 RXB.01 X.dest.1.01 72 /6 ib | AVX2
パックされた各 32bit 整数を、それぞれ、最後のオペランドで指定された値の数、左にシフトし、結果を宛先に書き込みます。
シフト後の最下位ビットはクリアされます。
PSLLQ xmm1, xmm2/mem128 | 66 0F F3 /r    | SSE2
PSLLQ xmm, imm8         | 66 0F 73 /6 ib | SSE2
VPSLLQ xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 F3 /r    | AVX
VPSLLQ xmm1, xmm2, imm8        | C4 RXB.01 X.dest.0.01 73 /6 ib | AVX
VPSLLQ ymm1, ymm2, xmm3/mem128 | C4 RXB.01 X.src1.1.01 F3 /r    | AVX2
VPSLLQ ymm1, ymm2, imm8        | C4 RXB.01 X.dest.1.01 73 /6 ib | AVX2
パックされた各 64bit 整数を、それぞれ、最後のオペランドで指定された値の数、左にシフトし、結果を宛先に書き込みます。
シフト後の最下位ビットはクリアされます。
PSLLDQ xmm, imm8 | 66 0F 73 /7 ib | SSE2
VPSLLDQ xmm1, xmm2, imm8 | C4 RXB.01 0.dest.0.01 73 /7 ib | AVX
VPSLLDQ ymm1, ymm2, imm8 | C4 RXB.01 0.dest.1.01 73 /7 ib | AVX2
パックされた各 128bit 整数を、それぞれ、最後のオペランドで指定された値の数、左にシフトし、結果を宛先に書き込みます。
シフト後の最下位ビットはクリアされます。

シフト数が 15 より大きい場合、結果は 0 になります。
VPSLLVD xmm1, xmm2, xmm3/mem128 | C4 RXB.02 0.src1.0.01 47 /r | AVX2
VPSLLVD ymm1, ymm2, ymm3/mem256 | C4 RXB.02 0.src1.1.01 47 /r | AVX2
第2オペランドのパックされた各 32bit 整数を、それぞれ、第3オペランドで指定された値の数、左シフトし、結果を宛先に書き込みます。

第3オペランドの値は、32bit 単位で各位置に対応し、それぞれの要素のシフト数を、個別に指定することができます。
VPSLLVQ xmm1, xmm2, xmm3/mem128 | C4 RXB.02 1.src1.0.01 47 /r | AVX2
VPSLLVQ ymm1, ymm2, ymm3/mem256 | C4 RXB.02 1.src1.1.01 47 /r | AVX2
第2オペランドのパックされた各 64bit 整数を、それぞれ、第3オペランドで指定された値の数、左シフトし、結果を宛先に書き込みます。

第3オペランドの値は、64bit 単位で各位置に対応し、それぞれの要素のシフト数を、個別に指定することができます。
右シフト
PSRLW xmm1, xmm2/mem128 | 66 0F D1 /r    | SSE2
PSRLW xmm, imm8         | 66 0F 71 /2 ib | SSE2
VPSRLW xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 D1 /r    | AVX
VPSRLW xmm1, xmm2, imm8        | C4 RXB.01 X.dest.0.01 71 /2 ib | AVX
VPSRLW ymm1, ymm2, xmm3/mem128 | C4 RXB.01 X.src1.1.01 D1 /r    | AVX2
VPSRLW ymm1, ymm2, imm8        | C4 RXB.01 X.dest.1.01 71 /2 ib | AVX2
パックされた各 16bit 整数を、それぞれ、最後のオペランドで指定された値の数、右にシフトし、結果を宛先に書き込みます。
シフト後の最上位ビットはクリアされます。
PSRAW xmm1, xmm2/mem128 | 66 0F E1 /r    | SSE2
PSRAW xmm, imm8         | 66 0F 71 /4 ib | SSE2
VPSRAW xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 E1 /r    | AVX
VPSRAW xmm1, xmm2, imm8        | C4 RXB.01 X.dest.0.01 71 /4 ib | AVX
VPSRAW ymm1, ymm2, xmm3/mem128 | C4 RXB.01 X.src1.1.01 E1 /r    | AVX2
VPSRAW ymm1, ymm2, imm8        | C4 RXB.01 X.dest.1.01 71 /4 ib | AVX2
パックされた各 16bit 整数を、それぞれ、最後のオペランドで指定された値の数、右にシフトし、結果を宛先に書き込みます。
シフト後の最上位ビットは、元の符号ビットがコピーされます。
PSRLD xmm1, xmm2/mem128 | 66 0F D2 /r    | SSE2
PSRLD xmm, imm8         | 66 0F 72 /2 ib | SSE2
VPSRLD xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 D2 /r    | AVX
VPSRLD xmm1, xmm2, imm8        | C4 RXB.01 X.dest.0.01 72 /2 ib | AVX
VPSRLD ymm1, ymm2, xmm3/mem128 | C4 RXB.01 X.src1.1.01 D2 /r    | AVX2
VPSRLD ymm1, ymm2, imm8        | C4 RXB.01 X.dest.1.01 72 /2 ib | AVX2
パックされた各 32bit 整数を、それぞれ、最後のオペランドで指定された値の数、右にシフトし、結果を宛先に書き込みます。
シフト後の最上位ビットはクリアされます。
PSRAD xmm1, xmm2/mem128 | 66 0F E2 /r
PSRAD xmm, imm8         | 66 0F 72 /4 ib
VPSRAD xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 E2 /r
VPSRAD xmm1, xmm2, imm8        | C4 RXB.01 X.dest.0.01 72 /4 ib
VPSRAD ymm1, ymm2, xmm3/mem128 | C4 RXB.01 X.src1.1.01 E2 /r
VPSRAD ymm1, ymm2, imm8        | C4 RXB.01 X.dest.1.01 72 /4 ib
パックされた各 32bit 整数を、それぞれ、最後のオペランドで指定された値の数、右にシフトし、結果を宛先に書き込みます。
シフト後の最上位ビットは、元の符号ビットがコピーされます。
PSRLQ xmm1, xmm2/mem128 | 66 0F D3 /r    | SSE2
PSRLQ xmm, imm8         | 66 0F 73 /2 ib | SSE2
VPSRLQ xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 D3 /r    | AVX
VPSRLQ xmm1, xmm2, imm8        | C4 RXB.01 X.dest.0.01 73 /2 ib | AVX
VPSRLQ ymm1, ymm2, xmm3/mem128 | C4 RXB.01 X.src1.1.01 D3 /r    | AVX2
VPSRLQ ymm1, ymm2, imm8        | C4 RXB.01 X.dest.1.01 73 /2 ib | AVX2
パックされた各 64bit 整数を、それぞれ、最後のオペランドで指定された値の数、右にシフトし、結果を宛先に書き込みます。
シフト後の最上位ビットはクリアされます。
PSRLDQ xmm, imm8 | 66 0F 73 /3 ib | SSE2
VPSRLDQ xmm1, xmm2, imm8 | C4 RXB.01 X.dest.0.01 73 /3 ib | AVX
VPSRLDQ ymm1, ymm2, imm8 | C4 RXB.01 X.dest.1.01 73 /3 ib | AVX2
パックされた各 128bit 整数を、それぞれ、最後のオペランドで指定された値の数、右にシフトし、結果を宛先に書き込みます。

シフト後の最上位ビットはクリアされます。
シフト数が 15 より大きい場合、結果は 0 になります。
PALIGNR xmm1, xmm2/mem128, imm8 | 66 0F 3A 0F /r ib | SSE3
VPALIGNR xmm1, xmm2, xmm3/mem128, imm8 | C4 RXB.03 X.src1.0.01 0F /r ib | AVX
VPALIGNR ymm1, ymm2, ymm3/mem256, imm8 | C4 RXB.03 X.src1.1.01 0F /r ib | AVX2
[128bit]
第1オペランドが上位 128bit、第2オペランドが下位 128bit となり、それを連結した 256bit 値を、即値バイトの数だけ右シフトして、結果の下位 128bit を宛先に書き込みます。

[256bit]
上記と同じように、128bit 単位で src1 と src2 の 128bit を連結し、ソースの下位 128bit と上位 128bit で形成された、2つの 256bit 値を、それぞれ右シフトして、結果のそれぞれの下位 128bit を宛先に書き込みます。

シフト後の最上位ビットは 0 になります。
VPSRLVD xmm1, xmm2, xmm3/mem128 | C4 RXB.02 0.src1.0.01 45 /r | AVX2
VPSRLVD ymm1, ymm2, ymm3/mem256 | C4 RXB.02 0.src1.1.01 45 /r | AVX2
第2オペランドのパックされた各 32bit 整数を、それぞれ、第3オペランドで指定された値の数、右シフトし、結果を宛先に書き込みます。
シフト後の最上位ビットは 0 になります。

第3オペランドの値は、32bit 単位で各位置に対応し、それぞれの要素のシフト数を個別に指定することができます。
VPSRAVD xmm1, xmm2, xmm3/mem128 | C4 RXB.02 0.src1.0.01 46 /r | AVX2
VPSRAVD ymm1, ymm2, ymm3/mem256 | C4 RXB.02 0.src1.1.01 46 /r | AVX2
第2オペランドのパックされた各 32bit 整数を、それぞれ、第3オペランドで指定された値の数、右シフトし、結果を宛先に書き込みます。
シフト後の最上位ビットは、元の符号ビットがコピーされます。

第3オペランドの値は、32bit 単位で各位置に対応し、それぞれの要素のシフト数を個別に指定することができます。
VPSRLVQ xmm1, xmm2, xmm3/mem128 | C4 RXB.02 1.src1.0.01 45 /r | AVX2
VPSRLVQ ymm1, ymm2, ymm3/mem256 | C4 RXB.02 1.src1.1.01 45 /r | AVX2
第2オペランドのパックされた各 64bit 整数を、それぞれ、第3オペランドで指定された値の数、右シフトし、結果を宛先に書き込みます。
シフト後の最上位ビットは 0 になります。

第3オペランドの値は、64bit 単位で各位置に対応し、それぞれの要素のシフト数を個別に指定することができます。