加算 | |
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 のみが宛先に書き込まれます。
この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 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 整数として飽和し、宛先の対応する位置に書き込みます。
結果を、符号付き 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 整数として飽和し、宛先の対応する位置に書き込みます。
結果を、符号なし 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 のみが宛先に書き込まれます。
この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 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 整数として飽和し、宛先の対応する位置に書き込みます。
結果を、符号付き 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 整数として飽和し、宛先の対応する位置に書き込みます。
結果を、符号なし 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 のみが宛先に書き込まれます。
この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 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 のみが宛先に書き込まれます。
この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 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 のみが宛先に書き込まれます。
この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 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 のみが宛先に書き込まれます。
この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 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 のみが宛先に書き込まれます。
この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 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 のみが宛先に書き込まれます。
この命令は、符号付き整数と符号なし整数の両方を操作します。
結果がオーバーフローした場合、キャリーは無視され、結果の下位 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 のみが宛先に書き込まれます。
結果は、各オペランドの結果の 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 を一単位として、交互に並べます。
結果は、各オペランドの結果の 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 のみが宛先に書き込まれます。
結果は、各オペランドの結果の 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 を一単位として、交互に並べます。
結果は、各オペランドの結果の 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 を一単位として、交互に並べます。
結果は、各オペランドの結果の 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 を一単位として、交互に並べます。
結果は、各オペランドの結果の 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 を書き込みます。
乗算の後、値を 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 整数をパックして、宛先に書き込みます。
結果の符号なし 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 に書き込み、それ以上のビットはクリアします。
また、見つかった値のインデックス位置を、宛先の 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 ビット右シフトすることによって計算されます。
平均値は、値を加算した後、一時的な 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 ビット右シフトすることによって計算されます。
平均値は、値を加算した後、一時的な 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 分を取り出します。
そして、以下の計算を行います。
即値オペランドの 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 単位)。
即値の値を固定した、以下のエイリアス命令があります。
キャリーレス乗算は、2 進多項式乗算とも呼ばれ、キャリーの生成や伝播を行わずに、2 つのオペランドの積を計算する数学演算です。
これは暗号処理の重要なコンポーネントであり、通常は多数のサイクルを必要とします。
Advanced Encryption Standard (AES) で使用される、ガロアカウンターモードの実装に特に役立ちます。
[128bit] CPUID(PCLMULQDQ): 0000_0001h > ECX(bit0)
[256bit] CPUID(VPCLMULQD): 0000_0007h (ECX=0) > ECX(bit10)
即値の 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)