SSE/AVX:整数演算

加算
PADDB
VPADDB
パック8bit整数加算 [SSE2]
PADDSB
VPADDSB
パック8bit整数加算 (符号付き・飽和) [SSE2]
PADDUSB
VPADDUSB
パック8bit整数加算 (符号なし・飽和) [SSE2]
PADDW
VPADDW
パック16bit整数加算 [SSE2]
PADDSW
VPADDSW
パック16bit整数加算 (符号付き・飽和) [SSE2]
PADDUSW
VPADDUSW
パック16bit整数加算 (符号なし・飽和) [SSE2]
PADDD
VPADDD
パック32bit整数加算 [SSE2]
PADDQ
VPADDQ
パック64bit整数加算 [SSE2]
減算
PSUBB
VPSUBB
パック8bitの減算 [SSE2]
PSUBUSB
VPSUBUSB
パック8bitの減算 (符号なし、飽和) [SSE2]
PSUBSB
VPSUBSB
パック8bitの減算 (符号付き、飽和) [SSE2]
PSUBW
VPSUBW
パック16bitの減算 [SSE2]
PSUBUSW
VPSUBUSW
パック16bitの減算 (符号なし、飽和) [SSE2]
PSUBSW
VPSUBSW
パック16bitの減算 (符号付き、飽和) [SSE2]
PSUBD
VPSUBD
パック32bitの減算 [SSE2]
PSUBQ
VPSUBQ
パック64bitの減算 [SSE2]
隣接加算/減算
PHADDW
VPHADDW
パック16bitの隣接加算 (符号付き) [SSSE3]
PHADDSW
VPHADDSW
パック16bitの隣接加算 (符号付き、飽和) [SSSE3]
PHADDD
VPHADDD
パック32bitの隣接加算 (符号付き) [SSSE3]
PHSUBW
VPHSUBW
パック16bit整数の隣接減算 (符号付き) [SSSE3]
PHSUBSW
VPHSUBSW
パック16bit整数の隣接減算 (符号付き、飽和) [SSSE3]
PHSUBD
VPHSUBD
パック32bit整数の隣接減算 (符号付き) [SSSE3]
乗算
PMULLW
VPMULLW
パック16bitの乗算 (符号付き、下位16bit) [SSE2]
PMULHUW
VPMULHUW
パック16bitの乗算 (符号なし、上位16bit) [SSE2]
PMULHW
VPMULHW
パック16bitの乗算 (符号付き、上位16bit) [SSE2]
PMULHRSW
VPMULHRSW
パック16bit乗算 (符号付き、上位16bit、丸め) [SSSE3]
PMULLD
VPMULLD
パック32bitの乗算 (符号付き、下位32bit) [SSE4.1]
PMULUDQ
VPMULUDQ
パック32bitの乗算 (符号なし、64bit) [SSE2]
PMULDQ
VPMULDQ
パック32bitの乗算 (符号付き、64bit) [SSE4.1]
PMADDUBSW
VPMADDUBSW
パック8bit乗算と隣接加算 (符号なし、飽和) [SSSE3]
PMADDWD
VPMADDWD
パック16bit乗算と隣接加算 (符号付き) [SSE2]
絶対値
PABSB
VPABSB
パック符号付き 8bit 整数の絶対値 [SSE3]
PABSW
VPABSW
パック符号付き 16bit 整数の絶対値 [SSE3]
PABSD
VPABSD
パック符号付き 32bit 整数の絶対値 [SSE3]
差の絶対値
PSADBW
VPSADBW
パック符号なし8bitの差の絶対値 [SSE2]
最小値
PMINUB
VPMINUB
パック符号なし8bitの最小値 [SSE2]
PMINUW
VPMINUW
パック符号なし16bitの最小値 [SSE4.1]
PMINUD
VPMINUD
パック符号なし32bitの最小値 [SSE4.1]
PMINSB
VPMINSB
パック符号付き8bitの最小値 [SSE4.1]
PMINSW
VPMINSW
パック符号付き16bitの最小値 [SSE2]
PMINSD
VPMINSD
パック符号付き32bitの最小値 [SSE4.1]
PHMINPOSUW
VPHMINPOSUW
パック符号なし16bit整数の最小値と位置を取得 [SSE4.1]
最大値
PMAXUB
VPMAXUB
パック符号なし8bitの最大値 [SSE2]
PMAXUW
VPMAXUW
パック符号なし16bitの最大値 [SSE4.1]
PMAXUD
VPMAXUD
パック符号なし32bitの最大値 [SSE4.1]
PMAXSB
VPMAXSB
パック符号付き8bitの最大値 [SSE4.1]
PMAXSW
VPMAXSW
パック符号付き16bitの最大値 [SSE2]
PMAXSD
VPMAXSD
パック符号付き32bitの最大値 [SSE4.1]
平均
PAVGB
VPAVGB
パック符号なし8bit平均値 [SSE2]
PAVGW
VPAVGW
パック符号なし16bit平均値 [SSE2]
ほか
MPSADBW
VMPSADBW
SAD の計算 [SSE4.1]
PCLMULQDQ
VPCLMULQDQ
64bit キャリーレス乗算
加算
PADDB xmm1, xmm2/mem128 | 66 0F FC /r | SSE2
VPADDB xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 FC /r | AVX
VPADDB ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 FC /r | AVX2
第1ソースのパックされた 8bit 整数値と、第2ソースの対応する値を加算し、結果を宛先の対応する位置に書き込みます。

この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 8bit のみが宛先に書き込まれます。
PADDSB xmm1, xmm2/mem128 | 66 0F EC /r | SSE2
VPADDSB xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 EC /r | AVX
VPADDSB ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 EC /r | AVX2
第1ソースのパックされた符号付き 8bit 整数値と、第2ソースの対応する値を加算します。
結果を、符号付き 8bit 整数として飽和し、宛先の対応する位置に書き込みます。
PADDUSB xmm1, xmm2/mem128 | 66 0F DC /r | SSE2
VPADDUSB xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 DC /r | AVX
VPADDUSB ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 DC /r | AVX2
第1ソースのパックされた符号なし 8bit 整数値と、第2ソースの対応する値を加算します。
結果を、符号なし 8bit 整数として飽和し、宛先の対応する位置に書き込みます。
PADDW xmm1, xmm2/mem128 | 66 0F FD /r | SSE2
VPADDW xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 FD /r | AVX
VPADDW ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 FD /r | AVX2
第1ソースのパックされた 16bit 整数値と、第2ソースの対応する値を加算し、結果を、宛先の対応する位置に書き込みます。

この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 16bit のみが宛先に書き込まれます。
PADDSW xmm1, xmm2/mem128 | 66 0F ED /r | SSE2
VPADDSW xmm1, xmm2, xmm3/mem128 | C4 RXB.00001 X.src1.0.01 ED /r | AVX
VPADDSW ymm1, ymm2, ymm3/mem256 | C4 RXB.00001 X.src1.1.01 ED /r | AVX2
第1ソースのパックされた符号付き 16bit 整数値と、第2ソースの対応する値を加算します。
結果を、符号付き 16bit 整数として飽和し、宛先の対応する位置に書き込みます。
PADDUSW xmm1, xmm2/mem128 | 66 0F DD /r | SSE2
VPADDUSW xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 DD /r | AVX
VPADDUSW ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 DD /r | AVX2
第1ソースのパックされた符号なし 16bit 整数値と、第2ソースの対応する値を加算します。
結果を、符号なし 16bit 整数として飽和し、宛先の対応する位置に書き込みます。
PADDD xmm1, xmm2/mem128 | 66 0F FE /r | SSE2
VPADDD xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 FE /r | AVX
VPADDD ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 FE /r | AVX2
第1ソースのパックされた 32bit 整数値と、第2ソースの対応する値を加算し、結果を宛先の対応する位置に書き込みます。

この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 32bit のみが宛先に書き込まれます。
PADDQ xmm1, xmm2/mem128 | 66 0F D4 /r | SSE2
VPADDQ xmm1, xmm2, xmm3/mem128 | C4 RXB.00001 X.src1.0.01 D4 /r | AVX
VPADDQ ymm1, ymm2, ymm3/mem256 | C4 RXB.00001 X.src1.1.01 D4 /r | AVX2
第1ソースのパックされた 64bit 整数値と、第2ソースの対応する値を加算し、結果を宛先の対応する位置に書き込みます。

この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 64bit のみが宛先に書き込まれます。
減算
PSUBB xmm1, xmm2/mem128 | 66 0F F8 /r | SSE2
VPSUBB xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 F8 /r | AVX
VPSUBB ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 F8 /r | AVX2
第1ソースの、パックされた 8bit 整数から、第2ソースの対応する値を減算し、結果を、宛先の対応する位置に書き込みます。

この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 8bit のみが宛先に書き込まれます。
PSUBUSB xmm1, xmm2/mem128 | 66 0F D8 /r | SSE2
VPSUBUSB xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 D8 /r | AVX
VPSUBUSB ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 D8 /r | AVX2
第1ソースの、パックされた符号なし 8bit 整数から、第2ソースの対応する値を減算し、結果を飽和して、宛先の対応する位置に書き込みます。
PSUBSB xmm1, xmm2/mem128 | 66 0F E8 /r | SSE2
VPSUBSB xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 E8 /r | AVX
VPSUBSB ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 E8 /r | AVX2
第1ソースの、パックされた符号付き 8bit 整数から、第2ソースの対応する値を減算し、結果を飽和して、宛先の対応する位置に書き込みます。
PSUBW xmm1, xmm2/mem128 | 66 0F F9 /r
VPSUBW xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 F9 /r
VPSUBW ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 F9 /r
第1ソースの、パックされた 16bit 整数から、第2ソースの対応する値を減算し、結果を、宛先の対応する位置に書き込みます。

この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 16bit のみが宛先に書き込まれます。
PSUBUSW xmm1, xmm2/mem128 | 66 0F D9 /r
VPSUBUSW xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 D9 /r
VPSUBUSW ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 D9 /r
第1ソースの、パックされた符号なし 16bit 整数から、第2ソースの対応する値を減算し、結果を飽和して、宛先の対応する位置に書き込みます。
PSUBSW xmm1, xmm2/mem128 | 66 0F E9 /r | SSE2
VPSUBSW xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 E9 /r | AVX
VPSUBSW ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 E9 /r | AVX2
第1ソースの、パックされた符号付き 16bit 整数から、第2ソースの対応する値を減算し、結果を飽和して、宛先の対応する位置に書き込みます。
PSUBD xmm1, xmm2/mem128 | 66 0F FA /r | SSE2
VPSUBD xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 FA /r | AVX
VPSUBD ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 FA /r | AVX2
第1ソースの、パックされた 32bit 整数から、第2ソースの対応する値を減算し、結果を、宛先の対応する位置に書き込みます。

この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 32bit のみが宛先に書き込まれます。
PSUBQ xmm1, xmm2/mem128 | 66 0F FB /r | SSE2
VPSUBQ xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 FB /r | AVX
VPSUBQ ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 FB /r | AVX2
第1ソースの、パックされた 64bit 整数から、第2ソースの対応する値を減算し、結果を、宛先の対応する位置に書き込みます。

この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 64bit のみが宛先に書き込まれます。
隣接加算/減算
PHADDW xmm1, xmm2/mem128 | 66 0F 38 01 /r | SSSE3
VPHADDW xmm1, xmm2, xmm3/mem128 | C4 RXB.02 X.src1.0.01 01 /r | AVX
VPHADDW ymm1, ymm2, ymm3/mem256 | C4 RXB.02 X.src1.1.01 01 /r | AVX2
2つのオペランドにおいて、それぞれで隣接する位置の符号付き 16bit 整数を加算し、半分の数になったその結果を、符号付き 16bit 整数としてパックして、宛先に格納します。

結果は、各オペランドの結果の 64bit を一単位として、交互に並べます。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 16bit のみが宛先に書き込まれます。
PHADDSW xmm1, xmm2/mem128 | 66 0F 38 03 /r | SSSE3
VPHADDSW xmm1, xmm2, xmm3/mem128 | C4 RXB.02 X.src1.0.01 03 /r | AVX
VPHADDSW ymm1, ymm2, ymm3/mem256 | C4 RXB.02 X.src1.1.01 03 /r | AVX2
2つのオペランドにおいて、それぞれで隣接する位置の符号付き 16bit 整数を加算し、その結果を飽和した上で、符号付き 16bit 整数としてパックして、宛先に格納します。

結果は、各オペランドの結果の 64bit を一単位として、交互に並べます。
PHADDD xmm1, xmm2/mem128 | 66 0F 38 02 /r | SSSE3
VPHADDD xmm1, xmm2, xmm3/mem128 | C4 RXB.02 X.src1.0.01 02 /r | AVX
VPHADDD ymm1, ymm2, ymm3/mem256 | C4 RXB.02 X.src1.1.01 02 /r | AVX2
2つのオペランドにおいて、それぞれで隣接する位置の符号付き 32bit 整数を加算し、その結果を、符号付き 32bit 整数としてパックして、宛先に格納します。

結果は、各オペランドの結果の 64bit を一単位として、交互に並べます。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 32bit のみが宛先に書き込まれます。

src1 = x, src2  = y

* 128bit
dst |y2+y3|y0+y1|x2+x3|x0+x1|

* 256bit
dst |y6+y7|y4+y5|x6+x7|x4+x5|y2+y3|y0+y1|x2+x3|x0+x1|
PHSUBW xmm1, xmm2/mem128 | 66 0F 38 05 /r | SSSE3
VPHSUBW xmm1, xmm2, xmm3/mem128 | C4 RXB.02 X.src1.0.01 05 /r | AVX
VPHSUBW ymm1, ymm2, ymm3/mem256 | C4 RXB.02 X.src1.1.01 05 /r | AVX2
2つのオペランドにおいて、それぞれで隣接する位置の符号付き 16bit 整数を、(下位 - 上位) で減算し、その結果を、符号付き 16bit 整数としてパックして、宛先に格納します。

結果は、各オペランドの結果の 64bit を一単位として、交互に並べます。
PHSUBSW xmm1, xmm2/mem128 | 66 0F 38 07 /r | SSSE3
VPHSUBSW xmm1, xmm2, xmm3/mem128 | C4 RXB.02 X.src1.0.01 07 /r | AVX
VPHSUBSW ymm1, ymm2, ymm3/mem256 | C4 RXB.02 X.src1.1.01 07 /r | AVX2
2つのオペランドにおいて、それぞれで隣接する位置の符号付き 16bit 整数を、(下位 - 上位) で減算し、その結果を飽和した上で、符号付き 16bit 整数としてパックして、宛先に格納します。

結果は、各オペランドの結果の 64bit を一単位として、交互に並べます。
PHSUBD xmm1, xmm2/mem128 | 66 0F 38 06 /r | SSSE3
VPHSUBD xmm1, xmm2, xmm3/mem128 | C4 RXB.02 X.src1.0.01 06 /r | AVX
VPHSUBD ymm1, ymm2, ymm3/mem256 | C4 RXB.02 X.src1.1.01 06 /r | AVX2
2つのオペランドにおいて、それぞれで隣接する位置の符号付き 32bit 整数を、(下位 - 上位) で減算し、その結果を、符号付き 32bit 整数としてパックして、宛先に格納します。

結果は、各オペランドの結果の 64bit を一単位として、交互に並べます。

src1 = x, src2  = y

* 128bit
dst |y2-y3|y0-y1|x2-x3|x0-x1|

* 256bit
dst |y6-y7|y4-y5|x6-x7|x4-x5|y2-y3|y0-y1|x2-x3|x0-x1|
乗算
PMULLW xmm1, xmm2/mem128 | 66 0F D5 /r | SSE2
VPMULLW xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 D5 /r | AVX
VPMULLW ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 D5 /r | AVX2
2つのソースの、パックされた符号付き 16bit 整数を、対応する位置同士で乗算し、結果の下位 16bit をそれぞれパックして、宛先に書き込みます。
PMULHUW xmm1, xmm2/mem128 | 66 0F E4 /r | SSE2
VPMULHUW xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 E4 /r | AVX
VPMULHUW ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 E4 /r | AVX2
2つのソースの、パックされた符号なし 16bit 整数を、対応する位置同士で乗算し、結果の上位 16bit をそれぞれパックして、宛先に書き込みます。
PMULHW xmm1, xmm2/mem128 | 66 0F E5 /r | SSE2
VPMULHW xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 E5 /r | AVX
VPMULHW ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 E5 /r | AVX2
2つのソースの、パックされた符号付き 16bit 整数を、対応する位置同士で乗算し、結果の上位 16bit をそれぞれパックして、宛先に書き込みます。
PMULHRSW xmm1, xmm2/mem128 | 66 0F 38 0B | SSSE3
VPMULHRSW xmm1, xmm2, xmm3/mem128 | C4 RXB.2 X.src1.0.01 0B /r | AVX
VPMULHRSW ymm1, ymm2, ymm3/mem256 | C4 RXB.2 X.src1.1.01 0B /r | AVX2
2つのソースの、パックされた符号付き 16bit 整数を、対応する位置同士で乗算し、結果を上位 16bit に丸めた上で、符号付き 16bit 整数としてパックして、宛先に書き込みます。

乗算の後、値を 14 ビット右シフトし、その値に 1 を加算した後、結果の bit 16:1 の 16bit を書き込みます。
PMULLD xmm1, xmm2/mem128 | 66 0F 38 40 /r | SSE4.1
VPMULLD xmm1, xmm2, xmm3/mem128 | C4 RXB.02 X.src1.0.01 40 /r | AVX
VPMULLD ymm1, ymm2, ymm3/mem256 | C4 RXB.02 X.src1.1.01 40 /r | AVX2
2つのソースの、パックされた符号付き 32bit 整数を、対応する位置同士で乗算し、結果の下位 32bit をそれぞれパックして、宛先に書き込みます。
PMULUDQ xmm1, xmm2/mem128 | 66 0F F4 /r | SSE2
VPMULUDQ xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 F4 /r | AVX
VPMULUDQ ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 F4 /r | AVX2
2つのソースの、パックされた符号なし 32bit 整数を、対応する位置同士で乗算し、その結果を、符号なし 64bit 整数としてパックして、宛先に書き込みます。
PMULDQ xmm1, xmm2/mem128 | 66 0F 38 28 /r | SSE4.1
VPMULDQ xmm1, xmm2, xmm3/mem128 | C4 RXB.02 X.src1.0.01 28 /r | AVX
VPMULDQ ymm1, ymm2, ymm3/mem256 | C4 RXB.02 X.src1.1.01 28 /r | AVX2
2つのソースの、パックされた符号付き 32bit 整数を、対応する位置同士で乗算し、その結果を、符号付き 64bit 整数としてパックして、宛先に書き込みます。
PMADDUBSW xmm1, xmm2/mem128 | 66 0F 38 04 /r | SSSE3
VPMADDUBSW xmm1, xmm2, xmm3/mem128 | C4 RXB.02 X.src1.0.01 04 /r | AVX
VPMADDUBSW ymm1, ymm2, ymm3/mem256 | C4 RXB.02 X.src1.1.01 04 /r | AVX2
第1ソースのパックされた符号なし 8bit 整数と、第2ソースの対応する値を乗算した後、隣接する2つの結果の値を、符号付き 16bit として、飽和付きで加算し、その結果をパックして宛先に格納します。

src1 = x, src2 = y

* 128bit
dst |x14*y14+x15*y15|...|x2*y2+x3*y3|x0*y0+x1*y1| (16bit x 8)
PMADDWD xmm1, xmm2/mem128 | 66 0F F5 /r | SSE2
VPMADDWD xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 F5 /r | AVX
VPMADDWD ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 F5 /r | AVX2
第1ソースのパックされた符号付き 16bit 整数と、第2ソースの対応する値を乗算した後、隣接する2つの結果を加算し、その結果を、符号付き 32bit 整数としてパックして、宛先に格納します。

src1 = x, src2 = y

* 128bit
dst |x6*y6+x7*y7|x4*y4+x5*y5|x2*y2+x3*y3|x0*y0+x1*y1|
絶対値
PABSB xmm1, xmm2/mem128  | 0F 38 1C /r | SSE3
VPABSB xmm1, xmm2/mem128 | C4 RXB.02 X.1111.0.01 1C /r | AVX
VPABSB ymm1, ymm2/mem256 | C4 RXB.02 X.1111.1.01 1C /r | AVX2
第2オペランドの、パックされた符号付き 8bit 整数の絶対値を、第1オペランドの対応する位置に書き込みます。
PABSW xmm1, xmm2/mem128  | 0F 38 1D /r | SSE3
VPABSW xmm1, xmm2/mem128 | C4 RXB.02 X.1111.0.01 1D /r | AVX
VPABSW ymm1, ymm2/mem256 | C4 RXB.02 X.1111.1.01 1D /r | AVX2
第2オペランドの、パックされた符号付き 16bit 整数の絶対値を、第1オペランドの対応する位置に書き込みます。
PABSD xmm1, xmm2/mem128  | 0F 38 1E /r | SSE3
VPABSD xmm1, xmm2/mem128 | C4 RXB.02 X.1111.0.01 1E /r | AVX
VPABSD ymm1, ymm2/mem256 | C4 RXB.02 X.1111.1.01 1E /r | AVX2
第2オペランドの、パックされた符号付き 32bit 整数の絶対値を、第1オペランドの対応する位置に書き込みます。
差の絶対値
PSADBW xmm1, xmm2/mem128 | 66 0F F6 /r | SSE2
VPSADBW xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 F6 /r | AVX
VPSADBW ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 F6 /r | AVX2
第1ソースの、パックされた符号なし 8bit 整数から、第2ソースの対応する値を減算し、その絶対値を計算します。
結果の符号なし 16bit 整数をパックして、宛先に書き込みます。
最小値
PMINUB xmm1, xmm2/mem128 | 66 0F DA /r | SSE2
VPMINUB xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 DA /r | AVX
VPMINUB ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 DA /r | AVX2
2つのソースの、パックされた符号なし 8bit 整数値を比較し、小さい方の値を、宛先の対応する位置に書き込みます。
PMINUW xmm1, xmm2/mem128 | 66 0F 38 3A /r | SSE4.1
VPMINUW xmm1, xmm2, xmm3/mem128 | C4 RXB.02 X.src1.0.01 3A /r | AVX
VPMINUW ymm1, ymm2, ymm3/mem256 | C4 RXB.02 X.src1.1.01 3A /r | AVX2
2つのソースの、パックされた符号なし 16bit 整数値を比較し、小さい方の値を、宛先の対応する位置に書き込みます。
PMINUD xmm1, xmm2/mem128 | 66 0F 38 3B /r | SSE4.1
VPMINUD xmm1, xmm2, xmm3/mem128 | C4 RXB.02 X.src1.0.01 3B /r | AVX
VPMINUD ymm1, ymm2, ymm3/mem256 | C4 RXB.02 X.src1.1.01 3B /r | AVX2
2つのソースの、パックされた符号なし 32bit 整数値を比較し、小さい方の値を、宛先の対応する位置に書き込みます。
PMINSB xmm1, xmm2/mem128 | 66 0F 38 38 /r | SSE4.1
VPMINSB xmm1, xmm2, xmm3/mem128 | C4 RXB.02 X.src1.0.01 38 /r | AVX
VPMINSB ymm1, ymm2, ymm3/mem256 | C4 RXB.02 X.src1.1.01 38 /r | AVX2
2つのソースの、パックされた符号付き 8bit 整数値を比較し、小さい方の値を、宛先の対応する位置に書き込みます。
PMINSW xmm1, xmm2/mem128 | 66 0F EA /r | SSE2
VPMINSW xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 EA /r | AVX
VPMINSW ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 EA /r | AVX2
2つのソースの、パックされた符号付き 16bit 整数値を比較し、小さい方の値を、宛先の対応する位置に書き込みます。
PMINSD xmm1, xmm2/mem128 | 66 0F 38 39 /r | SSE4.1
VPMINSD xmm1, xmm2, xmm3/mem128 | C4 RXB.02 X.src1.0.01 39 /r | AVX
VPMINSD ymm1, ymm2, ymm3/mem256 | C4 RXB.02 X.src1.1.01 39 /r | AVX2
2つのソースの、パックされた符号付き 32bit 整数値を比較し、小さい方の値を、宛先の対応する位置に書き込みます。
PHMINPOSUW xmm1, xmm2/mem128  | 66 0F 38 41 /r | SSE4.1
VPHMINPOSUW xmm1, xmm2/mem128 | C4 RXB.02 X.1111.0.01 41 /r | AVX
第2オペランドの、パックされた符号なし 16bit 整数から、最小値を見つけて、それを第1オペランドの下位 16bit にコピーします。
また、見つかった値のインデックス位置を、宛先の bit 18:16 に書き込み、それ以上のビットはクリアします。
最大値
PMAXUB xmm1, xmm2/mem128 | 66 0F DE /r | SSE2
VPMAXUB xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 DE /r | AVX
VPMAXUB ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 DE /r | AVX2
2つのソースの、パックされた符号なし 8bit 整数値を比較し、大きい方の値を、宛先の対応する位置に書き込みます。
PMAXUW xmm1, xmm2/mem128 | 66 0F 38 3E /r | SSE4.1
VPMAXUW xmm1, xmm2, xmm3/mem128 | C4 RXB.02 X.src1.0.01 3E /r | AVX
VPMAXUW ymm1, ymm2, ymm3/mem256 | C4 RXB.02 X.src1.1.01 3E /r | AVX2
2つのソースの、パックされた符号なし 16bit 整数値を比較し、大きい方の値を、宛先の対応する位置に書き込みます。
PMAXUD xmm1, xmm2/mem128 | 66 0F 38 3F /r | SSE4.1
VPMAXUD xmm1, xmm2, xmm3/mem128 | C4 RXB.02 X.src1.0.01 3F /r | AVX
VPMAXUD ymm1, ymm2, ymm3/mem256 | C4 RXB.02 X.src1.1.01 3F /r | AVX2
2つのソースの、パックされた符号なし 32bit 整数値を比較し、大きい方の値を、宛先の対応する位置に書き込みます。
PMAXSB xmm1, xmm2/mem128 | 66 0F 38 3C /r | SSE4.1
VPMAXSB xmm1, xmm2, xmm3/mem128 | C4 RXB.02 X.src1.0.01 3C /r | AVX
VPMAXSB ymm1, ymm2, ymm3/mem256 | C4 RXB.02 X.src1.1.01 3C /r | AVX2
2つのソースの、パックされた符号付き 8bit 整数値を比較し、大きい方の値を、宛先の対応する位置に書き込みます。
PMAXSW xmm1, xmm2/mem128 | 66 0F EE /r | SSE2
VPMAXSW xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 EE /r | AVX
VPMAXSW ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 EE /r | AVX2
2つのソースの、パックされた符号付き 16bit 整数値を比較し、大きい方の値を、宛先の対応する位置に書き込みます。
PMAXSD xmm1, xmm2/mem128 | 66 0F 38 3D /r | SSE4.1
VPMAXSD xmm1, xmm2, xmm3/mem128 | C4 RXB.02 X.src1.0.01 3D /r | AVX
VPMAXSD ymm1, ymm2, ymm3/mem256 | C4 RXB.02 X.src1.1.01 3D /r | AVX2
2つのソースの、パックされた符号付き 32bit 整数値を比較し、大きい方の値を、宛先の対応する位置に書き込みます。
平均
PAVGB xmm1, xmm2/mem128 | 66 0F E0 /r | SSE2
VPAVGB xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 E0 /r | AVX
VPAVGB ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 E0 /r | AVX2
第1ソースの符号なし 8bit 整数値と、第2ソースの対応する値で、丸められた平均値を計算し、結果を宛先の対応する位置に書き込みます。

平均値は、値を加算した後、一時的な 9bit の値に 1 を加算し、1 ビット右シフトすることによって計算されます。
PAVGW xmm1, xmm2/mem128 | 66 0F E3 /r | SSE2
VPAVGW xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 E3 /r | AVX
VPAVGW ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 E3 /r | AVX2
第1ソースの符号なし 16bit 整数値と、第2ソースの対応する値で、丸められた平均値を計算し、結果を宛先の対応する位置に書き込みます。

平均値は、値を加算した後、一時的な 17bit の値に 1 を加算し、1 ビット右シフトすることによって計算されます。
ほか
MPSADBW xmm1, xmm2/mem128, imm8 | 66 0F 3A 42 /r ib | SSE4.1
VMPSADBW xmm1, xmm2, xmm3/mem128, imm8 | C4 RXB.03 X.src1.0.01 42 /r ib | AVX
VMPSADBW ymm1, ymm2, ymm3/mem256, imm8 | C4 RXB.03 X.src1.1.01 42 /r ib | AVX
第1ソースの 11byte と、第2ソースの 4byte の各バイト値から、差の絶対値を計算して、その4つの値の合計値を 8 or 16 個算出し、それを符号なし 16bit 整数としてパックして、宛先に書き込みます。

即値オペランドの bit 1:0 は、第2ソース内の、連続する4バイトの右端の位置を指定します (32bit 単位)。
bit 2 は、第1ソース内の連続する 11 byte の右端の位置を指定します (32bit 単位)。
bit 7:3 は、128 bit 形式の命令では、無視されます。
bit 4:3 は、256 bit 形式で、第2ソース内の上位の4つの連続するバイトの右端の位置を指定します (32bit 単位。+128bit が追加される)。
bit 5 は、256 bit 形式で、第1ソース内の上位の 11 個の連続したバイトの右端の位置を指定します (32bit 単位。+128bit が追加される)。

まず、src1 の imm8[2]*32 のビット位置から左に 11byte 分を取り出し、src2 の imm8[1:0]*32 のビット位置から左に 4byte 分を取り出します。
そして、以下の計算を行います。

tmp0 = ABS(src1[0] - src2[0])
tmp1 = ABS(src1[1] - src2[1])
tmp2 = ABS(src1[2] - src2[2])
tmp3 = ABS(src1[3] - src2[3])
dst[15:0] = tmp0 + tmp1 + tmp2 + tmp3

tmp0 = ABS(src1[1] - src2[0])
tmp1 = ABS(src1[2] - src2[1])
tmp2 = ABS(src1[3] - src2[2])
tmp3 = ABS(src1[4] - src2[3])
dst[31:16] = tmp0 + tmp1 + tmp2 + tmp3
...
(src1 の位置を 1 ずつずらして、8個の結果を格納)

(256bit の場合、src1 を imm8[5]*32 + 128 の位置、
 src2 を imm8[4:3]*32 + 128 の位置として、上位ビットに同じように8個格納する)
PCLMULQDQ xmm1, xmm2/mem128, imm8 | 66 0F 3A 44 /r ib
VPCLMULQDQ xmm1, xmm2, xmm3/mem128, imm8 | C4 RXB.00011 X.src.0.01 44 /r ib
VPCLMULQDQ ymm1, ymm2, ymm3/mem256, imm8 | C4 RXB.00011 X.src.1.01 44 /r ib
第1ソースの選択された 64bit 値と、第2ソースの選択された 64bit 値のキャリーレス乗算を実行し、その結果を宛先に書き込みます。

即値の bit 0 で第1ソースの値の位置、bit 4 で第2ソースの値の位置を指定します (64bit 単位)。

即値の値を固定した、以下のエイリアス命令があります。

              bit 0 4
(V)PCLMULLQLQDQ | 0 0 | SRC1[63:0]  , SRC2[63:0]
(V)PCLMULLQLQDQ | 1 0 | SRC1[127:64], SRC2[63:0]
(V)PCLMULLQHQDQ | 0 1 | SRC1[63:0]  , SRC2[127:64]
(V)PCLMULHQHQDQ | 1 1 | SRC1[127:64], SRC2[127:64]

キャリーレス乗算は、2 進多項式乗算とも呼ばれ、キャリーの生成や伝播を行わずに、2 つのオペランドの積を計算する数学演算です。
これは暗号処理の重要なコンポーネントであり、通常は多数のサイクルを必要とします。
Advanced Encryption Standard (AES) で使用される、ガロアカウンターモードの実装に特に役立ちます。

[128bit] CPUID(PCLMULQDQ): 0000_0001h > ECX(bit0)
[256bit] CPUID(VPCLMULQD): 0000_0007h (ECX=0) > ECX(bit10)