SSE/AVX:浮動小数点演算

(単精度) 加算/減算
ADDSS
VADDSS
単一単精度の加算 [SSE]
ADDPS
VADDPS
パック単精度の加算 [SSE]
SUBSS
VSUBSS
単一単精度の減算 [SSE]
SUBPS
VSUBPS
パック単精度の減算 [SSE]
HADDPS
VHADDPS
パック単精度の隣接加算 [SSE3]
HSUBPS
VHSUBPS
パック単精度の隣接減算 [SSE3]
ADDSUBPS
VADDSUBPS
パック単精度の加算と減算 [SSE3]
(単精度) 乗算/除算
MULSS
VMULSS
単一単精度の乗算 [SSE]
MULPS
VMULPS
パック単精度の乗算 [SSE]
DIVSS
VDIVSS
単一単精度の除算 (商) [SSE]
DIVPS
VDIVPS
パック単精度の除算 (商) [SSE]
DPPS
VDPPS
パック単精度のドット積 [SSE4.1]
(単精度) ほか
SQRTSS
VSQRTSS
単一単精度の平方根 [SSE]
SQRTPS
VSQRTPS
パック単精度の平方根 [SSE]
RCPSS
VRCPSS
単一単精度の逆数近似 [SSE]
RCPPS
VRCPPS
パック単精度の逆数近似 [SSE]
RSQRTSS
VRSQRTSS
単一単精度の平方根の逆数近似 [SSE]
RSQRTPS
VRSQRTPS
パック単精度の平方根の逆数近似 [SSE]
(倍精度) 加算/減算
ADDSD
VADDSD
単一倍精度の加算 [SSE2]
ADDPD
VADDPD
パック倍精度の加算 [SSE2]
SUBSD
VSUBSD
単一倍精度の減算 [SSE2]
SUBPD
VSUBPD
パック倍精度の減算 [SSE2]
HADDPD
VHADDPD
パック倍精度の隣接加算 [SSE3]
HSUBPD
VHSUBPD
パック倍精度の隣接減算 [SSE3]
ADDSUBPD
VADDSUBPD
パック倍精度の加算と減算 [SSE3]
(倍精度) 乗算/除算
MULSD
VMULSD
単一倍精度の乗算 [SSE2]
MULPD
VMULPD
パック倍精度の乗算 [SSE2]
DIVSD
VDIVSD
単一倍精度の除算 (商) [SSE2]
DIVPD
VDIVPD
パック倍精度の除算 (商) [SSE2]
DPPD
VDPPD
パック倍精度ドット積 [SSE4.1]
(倍精度) ほか
SQRTSD
VSQRTSD
単一倍精度の平方根 [SSE2]
SQRTPD
VSQRTPD
パック倍精度の平方根 [SSE2]
(単精度) 加算/減算
ADDSS xmm1, xmm2/mem32 | F3 0F 58 /r | SSE
VADDSS xmm1, xmm2, xmm3/mem32 | C4 RXB.00001 X.src.X.10 58 /r | AVX
第1ソースの下位 32bit の単精度値と、第2ソースの対応する値を加算し、結果を宛先の下位 32bit に書き込みます。

ADDSS: 宛先の bit 127:32 は変更されません。
VADDSS: 宛先の bit 127:32 は第1ソースからコピーされます。
ADDPS xmm1, xmm2/mem128 | 0F 58 /r | SSE
VADDPS xmm1, xmm2, xmm3/mem128 | C4 RXB.00001 X.src.0.00 58 /r | AVX
VADDPS ymm1, ymm2, ymm3/mem256 | C4 RXB.00001 X.src.1.00 58 /r | AVX
第1ソースのパック単精度と、第2ソースの対応する値を加算し、各結果を、宛先の対応する位置に書き込みます。
SUBSS xmm1, xmm2/mem32 | F3 0F 5C /r | SSE
VSUBSS xmm1, xmm2, xmm3/mem32 | C4 RXB.01 X.src1.X.10 5C /r | AVX
第1ソースの下位 32bit の単精度値から、第2ソースの対応する値を減算し、結果を宛先の下位 32bit に書き込みます。
SUBPS xmm1, xmm2/mem128 | 0F 5C /r | SSE
VSUBPS xmm1, xmm2, xmm3/mem128 | C4 RXB.00001 X.src.0.00 5C /r | AVX
VSUBPS ymm1, ymm2, ymm3/mem256 | C4 RXB.00001 X.src.1.00 5C /r | AVX
第1ソースのパック単精度値から、第2ソースの対応する値を減算し、結果を宛先の対応する位置に書き込みます。
HADDPS xmm1, xmm2/mem128 | F2 0F 7C /r | SSE3
VHADDPS xmm1, xmm2, xmm3/mem128 | C4 RXB.00001 X.src.0.11 7C /r | AVX
VHADDPS ymm1, ymm2, ymm3/mem256 | C4 RXB.00001 X.src.1.11 7C /r | AVX
2つのソースオペランドのパック単精度において、それぞれで隣接する位置の値を加算し、結果をパックして宛先に格納します。
一つのオペランドの結果の 64bit を一単位として、交互に並べます。

* HADDPS
op1 |4321|
op2 |8765| -> op1 |7+8|5+6|3+4|1+2|

* VHADDPS
src1: x0-x7, src2: y0-y7
dst |y6+y7|y4+y5|x6+x7|x4+x5|y2+y3|y0+y1|x2+x3|x0+x1|
HSUBPS xmm1, xmm2/mem128 | F2 0F 7D /r | SSE3
VHSUBPS xmm1, xmm2, xmm3/mem128 | C4 RXB.00001 X.src.0.11 7D /r | AVX
VHSUBPS ymm1, ymm2, ymm3/mem256 | C4 RXB.00001 X.src.1.11 7D /r | AVX
2つのソースオペランドのパック単精度において、それぞれで隣接する位置の値から、(下位 - 上位) で減算を行い、結果をパックして宛先に格納します。
一つのオペランドの結果の 64bit を一単位として、交互に並べます。

* HSUBPS
op1 |4321|
op2 |8765| -> op1 |7-8|5-6|3-4|1-2|

* VHSUBPS
src1: x0-x7, src2: y0-y7
dst |y6-y7|y4-y5|x6-x7|x4-x5|y2-y3|y0-y1|x2-x3|x0-x1|
ADDSUBPS xmm1, xmm2/mem128 | F2 0F D0 /r | SSE3
VADDSUBPS xmm1, xmm2, xmm3/mem128 | C4 RXB.00001 X.src.0.11 D0 /r | AVX
VADDSUBPS ymm1, ymm2, ymm3/mem256 | C4 RXB.00001 X.src.1.11 D0 /r | AVX
下位から順に、パック単精度の各値の位置を 0,1,2,3... とした場合、
第1ソースの 0,2,4... の値から、第2ソースの対応する値を減算し、結果を、宛先の対応する位置に書き込みます。
第1ソースの 1,3,5... の値と、第2ソースの対応する値を加算し、結果を、宛先の対応する位置に書き込みます。
(単精度) 乗算/除算
MULSS xmm1, xmm2/mem32 | F3 0F 59 /r | SSE
VMULSS xmm1, xmm2, xmm3/mem32 | C4 RXB.01 X.src1.X.10 59 /r | AVX
第1ソースの下位 32bit 単精度値と、第2ソースの対応する値を乗算し、結果を、宛先の下位 32bit に書き込みます。
MULPS xmm1, xmm2/mem128 | 0F 59 /r | SSE
VMULPS xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.00 59 /r | AVX
VMULPS ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.00 59 /r | AVX
第1ソースのパック単精度と、第2ソースの対応する値を乗算し、それぞれの結果を、宛先の対応する位置に書き込みます。
DIVSS xmm1, xmm2/mem32 | F3 0F 5E /r | SSE
VDIVSS xmm1, xmm2, xmm3/mem32 | C4 RXB.00001 X.src.X.10 5E /r | AVX
第1ソースの下位 32bit の単精度値を、第2ソースの対応する値で除算し、その商を、宛先の下位 32bit に書き込みます。
DIVPS xmm1, xmm2/mem128 | 0F 5E /r | SSE
VDIVPS xmm1, xmm2, xmm3/mem128 | C4 RXB.00001 X.src.0.00 5E /r | AVX
VDIVPS ymm1, ymm2, ymm3/mem256 | C4 RXB.00001 X.src.1.00 5E /r | AVX
第1ソースのパック単精度を、第2ソースの対応する値で除算し、その商を、宛先の対応する位置に書き込みます。
DPPS xmm1, xmm2/mem128, imm8 | 66 0F 3A 40 /r ib | SSE4.1
VDPPS xmm1, xmm2, xmm3/mem128, imm8 | C4 RXB.00011 X.src.0.01 40 /r ib | AVX
VDPPS ymm1, ymm2, ymm3/mem256, imm8 | C4 RXB.00011 X.src.1.01 40 /r ib | AVX
ソースオペランドのドット積を計算します。
即値オペランドは、bit 7:4 で乗算の値、bit 3:0 で書き込む値を指定します。

if(imm8[4] == 0) tmp1 = 0; else tmp1 = src1[31:0] * src2[31:0];
if(imm8[5] == 0) tmp2 = 0; else tmp2 = src1[63:32] * src2[63:32];
if(imm8[6] == 0) tmp3 = 0; else tmp3 = src1[95:64] * src2[95:64];
if(imm8[7] == 0) tmp4 = 0; else tmp4 = src1[127:96] * src2[127:96];

tmp1 = tmp1 + tmp2
tmp3 = tmp3 + tmp4
tmp1 = tmp1 + tmp3

if(imm[0] == 1) dst[31:0] = tmp1; else dst[31:0] = 0;
if(imm[1] == 1) dst[63:32] = tmp1; else dst[63:32] = 0;
if(imm[2] == 1) dst[95:64] = tmp1; else dst[95:64] = 0;
if(imm[3] == 1) dst[127:96] = tmp1; else dst[127:96] = 0;
(単精度) ほか
SQRTSS xmm1, xmm2/mem32 | F3 0F 51 /r | SSE
VSQRTSS xmm1, xmm2, xmm3/mem64 | C4 RXB.01 X.src1.X.10 51 /r | AVX
ソースオペランドの下位 32bit の単精度値の平方根を計算し、結果を宛先の下位 32bit に書き込みます。
+∞ の平方根を実行すると、+∞ が返されます。
SQRTPS xmm1, xmm2/mem128  | 0F 51 /r | SSE
VSQRTPS xmm1, xmm2/mem128 | C4 RXB.01 X.1111.0.00 51 /r | AVX
VSQRTPS ymm1, ymm2/mem256 | C4 RXB.01 X.1111.1.00 51 /r | AVX
ソースオペランドのパック単精度のそれぞれの平方根を計算し、結果を宛先の対応する位置に書き込みます。
+∞ の平方根を実行すると、+∞ が返されます。
RCPSS xmm1, xmm2/mem32 | F3 0F 53 /r | SSE
VRCPSS xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.X.10 53 /r | AVX
ソースオペランドの下位 32bit の単精度値の逆数近似を計算し、結果を宛先の下位 32bit に書き込みます。
MXCSR.RC は結果に影響を与えません。

最大誤差は、真の逆数の 1.5 * 2^-12 倍以下です。
±0 または非正規化のソース値は、ソースと同じ符号の無限大を返します。
アンダーフローした結果は、符号付きの 0 に変更されます。
ソースが SNaN か QNaN の場合、QNaN が返されます。
RCPPS xmm1, xmm2/mem128  | 0F 53 /r | SSE
VRCPPS xmm1, xmm2/mem128 | C4 RXB.01 X.1111.0.00 53 /r | AVX
VRCPPS ymm1, ymm2/mem256 | C4 RXB.01 X.1111.1.00 53 /r | AVX
ソースオペランドのパック単精度のぞれぞれの逆数近似を計算し、結果を宛先の対応する位置に書き込みます。
MXCSR.RC は結果に影響を与えません。

最大誤差は、真の逆数の 1.5 * 2^-12 倍以下です。
±0 または非正規化のソース値は、ソースと同じ符号の無限大を返します。
アンダーフローした結果は、符号付きの 0 に変更されます。
ソースが SNaN か QNaN の場合、QNaN が返されます。
RSQRTSS xmm1, xmm2/mem32 | F3 0F 52 /r | SSE
VRSQRTSS xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.X.10 52 /r | AVX
ソースオペランドの下位 32bit の単精度値の平方根の逆数近似を計算し、結果を下位 32bit に書き込みます。
MXCSR.RC は結果に影響しません。

最大誤差は、真の逆数平方根の 1.5 * 2^-12 倍以下です。
±0 または非正規化のソース値は、ソースと同じ符号の無限大を返します。
-0 と -非正規化 以外の負のソース値は、QNaN を返します。
SNaN と QNaN のソース値では、QNaN が返されます。
RSQRTPS xmm1, xmm2/mem128  | 0F 52 /r | SSE
VRSQRTPS xmm1, xmm2/mem128 | C4 RXB.01 X.1111.0.00 52 /r | AVX
VRSQRTPS ymm1, ymm2/mem256 | C4 RXB.01 X.1111.1.00 52 /r | AVX
ソースオペランドのパック単精度のそれぞれの平方根の逆数近似を計算し、結果を宛先の対応する位置に書き込みます。
MXCSR.RC は結果に影響しません。

最大誤差は、真の逆数平方根の 1.5 * 2^-12 倍以下です。
±0 または非正規化のソース値は、ソースと同じ符号の無限大を返します。
-0 と -非正規化 以外の負のソース値は、QNaN を返します。
SNaN と QNaN のソース値では、QNaN が返されます。
(倍精度) 加算/減算
ADDSD xmm1, xmm2/mem64 | F2 0F 58 /r | SSE2
VADDSD xmm1, xmm2, xmm3/mem64 | C4 RXB.00001 X.src.X.11 58 /r | AVX
第1ソースの下位 64bit の倍精度値と、第2ソースの下位 64bit 値を加算し、結果を宛先の下位 64bit に書き込みます。

ADDSD: 宛先の bit 127:64 は変更されません。
VADDSD: 宛先の bit 127:64 は第1ソースからコピーされます。
ADDPD xmm1, xmm2/mem128 | 66 0F 58 /r | SSE2
VADDPD xmm1, xmm2, xmm3/mem128 | C4 RXB.00001 X.src.0.01 58 /r | AVX
VADDPD ymm1, ymm2, ymm3/mem256 | C4 RXB.00001 X.src.1.01 58 /r | AVX
第1ソースのパック倍精度と、第2ソースの対応する値を加算し、各結果を、宛先の対応する位置に書き込みます。
SUBSD xmm1, xmm2/mem64 | F2 0F 5C /r | SSE2
VSUBSD xmm1, xmm2, xmm3/mem64 | C4 RXB.01 X.src1.X.11 5C /r | AVX
第1ソースの下位 64bit の倍精度値から、第2ソースの対応する値を減算し、結果を宛先の下位 64bit に書き込みます。
SUBPD xmm1, xmm2/mem128 | 66 0F 5C /r | SSE2
VSUBPD xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 5C /r | AVX
VSUBPD ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 5C /r | AVX
第1ソースのパック倍精度から、第2ソースの対応する値を減算し、結果を宛先の対応する位置に書き込みます。
HADDPD xmm1, xmm2/mem128 | 66 0F 7C /r | SSE3
VHADDPD xmm1, xmm2, xmm3/mem128 | C4 RXB.00001 X.src.0.01 7C /r | AVX
VHADDPD ymm1, ymm2, ymm3/mem256 | C4 RXB.00001 X.src.1.01 7C /r | AVX
2つのソースオペランドのパック倍精度において、それぞれで隣接する位置の値を加算し、結果をパックして宛先に格納します。
一つのオペランドの結果の 64bit を一単位として、交互に並べます。

* HADDPD
op1 |B|A|
op2 |D|C| -> op1 |C+D|A+B|

* VHADDPD
src1 |4321|
src2 |8765| -> dst |7+8|3+4|5+6|1+2|
HSUBPD xmm1, xmm2/mem128 | 66 0F 7D /r | SSE3
VHSUBPD xmm1, xmm2, xmm3/mem128 | C4 RXB.00001 X.src.0.01 7D /r | AVX
VHSUBPD ymm1, ymm2, ymm3/mem256 | C4 RXB.00001 X.src.1.01 7D /r | AVX
2つのソースオペランドのパック倍精度において、それぞれで隣接する位置の値から、(下位 - 上位) で減算を行い、結果をパックして宛先に格納します。
一つのオペランドの結果の 64bit を一単位として、交互に並べます。

* HSUBPD
op1 |B|A|
op2 |D|C| -> op1 |C-D|A-B|

* VHSUBPD
src1 |4321|
src2 |8765| -> dst |7-8|3-4|5-6|1-2|
ADDSUBPD xmm1, xmm2/mem128 | 66 0F D0 /r | SSE3
VADDSUBPD xmm1, xmm2, xmm3/mem128 | C4 RXB.00001 X.src.0.01 D0 /r | AVX
VADDSUBPD ymm1, ymm2, ymm3/mem256 | C4 RXB.00001 X.src.1.01 D0 /r | AVX
下位から順に、パック倍精度の各値の位置を 0,1,2,3... とした場合、
第1ソースの 0,2,4... の値から、第2ソースの対応する値を減算し、その結果を、宛先の対応する位置に書き込みます。
第1ソースの 1,3,5... の値と、第2ソースの対応する値を加算し、その結果を、宛先の対応する位置に書き込みます。
(倍精度) 乗算/除算
MULSD xmm1, xmm2/mem64 | F2 0F 59 /r | SSE2
VMULSD xmm1, xmm2, xmm3/mem64 | C4 RXB.01 X.src1.X.11 59 /r | AVX
第1ソースの下位 64bit の倍精度値と、第2ソースの対応する値を乗算し、結果を、宛先の下位 64bit に書き込みます。
MULPD xmm1, xmm2/mem128 | 66 0F 59 /r | SSE2
VMULPD xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src.0.01 59 /r | AVX
VMULPD ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src.1.01 59 /r | AVX
第1ソースのパック倍精度と、第2ソースの対応する値を乗算し、それぞれの結果を、宛先の対応する位置に書き込みます。
DIVSD xmm1, xmm2/mem64 | F2 0F 5E /r | SSE2
VDIVSD xmm1, xmm2, xmm3/mem64 | C4 RXB.00001 X.src.X.11 5E /r | AVX
第1ソースの下位 64bit の倍精度値を、第2ソースの対応する値で除算し、その商を、宛先の下位 64bit に書き込みます。
DIVPD xmm1, xmm2/mem128 | 66 0F 5E /r | SSE2
VDIVPD xmm1, xmm2, xmm3/mem128 | C4 RXB.00001 X.src.0.01 5E /r | AVX
VDIVPD ymm1, ymm2, ymm3/mem256 | C4 RXB.00001 X.src.1.01 5E /r | AVX
第1ソースのパック倍精度を、第2ソースの対応する値で除算し、それぞれの商を、宛先の対応する位置に書き込みます。
DPPD xmm1, xmm2/mem128, imm8 | 66 0F 3A 41 /r ib | SSE4.1
VDPPD xmm1, xmm2, xmm3/mem128, imm8 | C4 RXB.00011 X.src.0.01 41 /r ib | AVX
ソースオペランドのドット積を計算します。
即値オペランドは、bit 5:4 で乗算の値、bit 1:0 で書き込む値を指定します。

if(imm8[4] == 0) tmp1 = 0;
else tmp1 = src1[63:0] * src2[63:0];

if(imm8[5] == 0) tmp2 = 0;
else tmp2 = src1[127:64] * src2[127:64];

tmp1 = tmp1 + tmp2

if(imm[0] == 1) dst[63:0] = tmp1; else dst[63:0] = 0;
if(imm[1] == 1) dst[127:64] = tmp1; else dst[127:64] = 0;
(倍精度) ほか
SQRTSD xmm1, xmm2/mem64 | F2 0F 51 /r | SSE2
VSQRTSD xmm1, xmm2, xmm3/mem64 | C4 RXB.01 X.src1.X.11 51 /r | AVX
ソースオペランドの下位 64bit の倍精度値の平方根を計算し、結果を下位 64bit に書き込みます。
+∞ の平方根を実行すると、+∞ が返されます。
SQRTPD xmm1, xmm2/mem128  | 66 0F 51 /r | SSE2
VSQRTPD xmm1, xmm2/mem128 | C4 RXB.01 X.1111.0.01 51 /r | AVX
VSQRTPD ymm1, ymm2/mem256 | C4 RXB.01 X.1111.1.01 51 /r | AVX
ソースオペランドのパック倍精度のそれぞれの平方根を計算し、結果を宛先の対応する位置に書き込みます。
+∞ の平方根を実行すると、+∞ が返されます。