SSE/AVX:浮動小数点関連

アンパック
UNPCKLPS
VUNPCKLPS
単精度アンパック (下位64bit) [SSE]
UNPCKHPS
VUNPCKHPS
単精度アンパック (上位64bit) [SSE]
UNPCKLPD
VUNPCKLPD
倍精度アンパック (下位) [SSE2]
UNPCKHPD
VUNPCKHPD
倍精度アンパック (上位) [SSE2]
隣接した値の複製
MOVSLDUP
VMOVSLDUP
パック単精度の移動/複製 (下位) [SSE3]
MOVSHDUP
VMOVSHDUP
パック単精度の移動/複製 (上位) [SSE3]
MOVDDUP
VMOVDDUP
パック倍精度の移動/複製 (下位) [SSE3]
下位or上位64bitにコピー
MOVLPS
VMOVLPS
単精度 下位64bitの値を下位64bitに移動 [SSE]
MOVHPS
VMOVHPS
単精度 上位64bitの値を上位64bitに移動 [SSE]
MOVLHPS
VMOVLHPS
単精度 下位64bitの値を上位64bitに移動 [SSE]
MOVHLPS
VMOVHLPS
単精度 上位64bitの値を下位64bitに移動 [SSE]
MOVLPD
VMOVLPD
倍精度 下位64bitの値を下位64bitに移動 [SSE2]
MOVHPD
VMOVHPD
倍精度 上位64bitの値を上位64bitに移動 [SSE2]
ブレンドコピー
BLENDPS
VBLENDPS
パック単精度のブレンドコピー (即値) [SSE4.1]
BLENDVPS
VBLENDVPS
パック単精度のブレンドコピー (レジスタ) [SSE4.1]
BLENDPD
VBLENDPD
パック倍精度のブレンドコピー (即値) [SSE4.1]
BLENDVPD
VBLENDVPD
パック倍精度のブレンドコピー (レジスタ) [SSE4.1]
シャッフルコピー
SHUFPS
VSHUFPS
パック単精度のシャッフルコピー [SSE]
SHUFPD
VSHUFPD
パック倍精度のシャッフルコピー [SSE2]
パック抽出/挿入
EXTRACTPS
VEXTRACTPS
パック単精度から抽出 [SSE4.1]
INSERTPS
VINSERTPS
パック単精度に挿入(クリア付き) [SSE4.1]
符号抽出
MOVMSKPS
VMOVMSKPS
パック単精度の符号抽出 [SSE]
MOVMSKPD
VMOVMSKPD
パック倍精度の符号抽出 [SSE2]
(単精度) 最大値/最小値
MINSS
VMINSS
単一単精度の最小値 [SSE]
MINPS
VMINPS
パック単精度の最小値 [SSE]
MAXSS
VMAXSS
単一単精度の最大値 [SSE]
MAXPS
VMAXPS
パック単精度の最大値 [SSE]
(倍精度) 最小値/最大値
MINSD
VMINSD
単一倍精度の最小値 [SSE2]
MINPD
VMINPD
パック倍精度の最小値 [SSE2]
MAXSD
VMAXSD
単一倍精度の最大値 [SSE2]
MAXPD
VMAXPD
パック倍精度の最大値 [SSE2]
アンパック
UNPCKLPS xmm1, xmm2/mem128 | 0F 14 /r
VUNPCKLPS xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.00 14 /r
VUNPCKLPS ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.00 14 /r
128bit 単位で行い、2つのソースの 128bit 中の下位 64bit から、順に単精度値を取り出し、宛先に交互に並べます。

src1 = x0.., src2 = y0..

* 128bit
dst |y1|x1|y0|x0|

* 256bit
dst |y5|x5|y4|x4|y1|x1|y0|x0|
UNPCKHPS xmm1, xmm2/mem128 | 0F 15 /r | SSE
VUNPCKHPS xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.00 15 /r | AVX
VUNPCKHPS ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.00 15 /r | AVX
128bit 単位で行い、2つのソースの 128bit 中の上位 64bit から、順に単精度値を取り出し、宛先に交互に並べます。
UNPCKLPD xmm1, xmm2/mem128 | 66 0F 14 /r | SSE2
VUNPCKLPD xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 14 /r | AVX
VUNPCKLPD ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 14 /r | AVX
128bit 単位で行い、128bit 中の下位 64bit (倍精度) を、2つのソースから取り出し、宛先に交互に並べます。
UNPCKHPD xmm1, xmm2/mem128 | 66 0F 15 /r | SSE2
VUNPCKHPD xmm1, xmm2, xmm3/mem128 | C4 RXB.01 X.src1.0.01 15 /r | AVX
VUNPCKHPD ymm1, ymm2, ymm3/mem256 | C4 RXB.01 X.src1.1.01 15 /r | AVX
128bit 単位で行い、128bit 中の上位 64bit (倍精度) を、2つのソースから取り出し、宛先に交互に並べます。
隣接した値の複製
MOVSLDUP xmm1, xmm2/mem128  | F3 0F 12 /r | SSE3
VMOVSLDUP xmm1, xmm2/mem128 | C4 RXB.00001 X.1111.0.10 12 /r | AVX
VMOVSLDUP ymm1, ymm2/mem256 | C4 RXB.00001 X.1111.1.10 12 /r | AVX
第2オペランドの、2つ単位で隣接した単精度の下位の方の値を、宛先の対応する位置の上位と下位にコピーします。

* 128bit
op2 |4321| -> op1 |3311|

* 256bit
op2 |87654321| -> op1 |77553311|
MOVSHDUP xmm1, xmm2/mem128  | F3 0F 16 /r | SSE3
VMOVSHDUP xmm1, xmm2/mem128 | C4 RXB.00001 X.1111.0.10 16 /r | AVX
VMOVSHDUP ymm1, ymm2/mem256 | C4 RXB.00001 X.1111.1.10 16 /r | AVX
第2オペランドの、2つ単位で隣接した単精度の上位の方の値を、宛先の対応する位置の上位と下位にコピーします。

* 128bit
op2 |4321| -> op1 |4422|

* 256bit
op2 |87654321| -> op1 |88664422|
MOVDDUP xmm1, xmm2/mem64   | F2 0F 12 /r | SSE3
VMOVDDUP xmm1, xmm2/mem64  | C4 RXB.00001 X.1111.0.11 12 /r | AVX
VMOVDDUP ymm1, ymm2/mem256 | C4 RXB.00001 X.1111.1.11 12 /r | AVX
第2オペランドの、2つ単位で隣接した倍精度の下位の方の値を、宛先の対応する位置の上位と下位にコピーします。

* 128bit
op2 |21| -> op1 |11|

* 256bit
op2 |4321| -> op1 |3311|
下位or上位64bitにコピー
MOVLPS xmm1, mem64 | 0F 12 /r | SSE
MOVLPS mem64, xmm1 | 0F 13 /r | SSE
VMOVLPS xmm1, xmm2, mem64 | C4 RXB.00001 X.src.0.00 12 /r  | AVX
VMOVLPS mem64, xmm1       | C4 RXB.00001 X.1111.0.00 13 /r | AVX
下位 64bit (2つの単精度) の値を、宛先の下位 64bit にコピーします。

MOVLPS の場合、宛先の上位 64bit は変更されません。
VMOVLPS (レジスタが宛先) の場合、宛先の上位 64bit は、第2オペランドからコピーされます。
MOVHPS xmm1, mem64 | 0F 16 /r | SSE
MOVHPS mem64, xmm1 | 0F 17 /r | SSE
VMOVHPS xmm1, xmm2, mem64 | C4 RXB.00001 X.src.0.00 16 /r  | AVX
VMOVHPS mem64, xmm1       | C4 RXB.00001 X.1111.0.00 17 /r | AVX
上位 64bit (2つの単精度) の値を、宛先の上位 64bit にコピーします。

MOVHPS の場合、宛先の下位 64bit は変更されません。
VMOVHPS (レジスタが宛先) の場合、宛先の下位 64bit は、第2オペランドからコピーされます。
MOVLHPS xmm1, xmm2 | 0F 16 /r | SSE
VMOVLHPS xmm1, xmm2, xmm3 | C4 RXB.00001 X.src.0.00 16 /r | AVX
ソースの下位 64bit (2つの単精度) の値を、宛先の上位 64bit にコピーします。

MOVLHPS の場合、宛先の下位 64bit は変更されません。
VMOVLHPS の場合、宛先の下位 64bit は、第2オペランドからコピーされます。
MOVHLPS xmm1, xmm2 | 0F 12 /r | SSE
VMOVHLPS xmm1, xmm2, xmm3 | C4 RXB.00001 X.src.0.00 12 /r | AVX
ソースの上位 64bit (2つの単精度) の値を、宛先の下位 64bit にコピーします。

MOVHLPS の場合、宛先の上位 64bit は変更されません。
VMOVHLPS の場合、宛先の上位 64bit は、第2オペランドからコピーされます。
MOVLPD xmm1, mem64 | 66 0F 12 /r | SSE2
MOVLPD mem64, xmm1 | 66 0F 13 /r | SSE2
VMOVLPD xmm1, xmm2, mem64 | C4 RXB.00001 X.src.0.01 12 /r  | AVX
VMOVLPD mem64, xmm1       | C4 RXB.00001 X.1111.0.01 13 /r | AVX
ソースの下位 64bit (1つの倍精度) の値を、宛先の下位 64bit にコピーします。

MOVLPD の場合、宛先の上位 64bit は変更されません。
VMOVLPD (レジスタが宛先) の場合、宛先の上位 64bit は、第2オペランドからコピーされます。
MOVHPD xmm1, mem64 | 66 0F 16 /r | SSE2
MOVHPD mem64, xmm1 | 66 0F 17 /r | SSE2
VMOVHPD xmm1, xmm2, mem64 | C4 RXB.00001 X.src.0.01 16 /r  | AVX
VMOVHPD mem64, xmm1       | C4 RXB.00001 X.1111.0.01 17 /r | AVX
ソースの上位 64bit (1つの倍精度) の値を、宛先の上位 64bit にコピーします。

MOVHPD の場合、宛先の下位 64bit は変更されません。
VMOVHPD (レジスタが宛先) の場合、宛先の下位 64bit は、第2オペランドからコピーされます。
ブレンドコピー
BLENDPS xmm1, xmm2/mem128, imm8 | 66 0F 3A 0C /r ib | SSE4.1
VBLENDPS xmm1, xmm2, xmm3/mem128, imm8 | C4 RXB.00011 X.src.0.01 0C /r ib | AVX
VBLENDPS ymm1, ymm2, ymm3/mem256, imm8 | C4 RXB.00011 X.src.1.01 0C /r ib | AVX
即値バイトの指定に従って、2つのソースのパック単精度のどちらかの値を、宛先の対応する位置にコピーします。

8bit 即値の値は、1bit 単位で、宛先の各位置に対応します。
ビットが 0 の場合は、第1ソースから、ビットが 1 の場合は、第2ソースからコピーします。
BLENDVPS xmm1, xmm2/mem128 | 66 0F 38 14 /r | SSE4.1
VBLENDVPS xmm1, xmm2, xmm3/mem128, xmm4 | C4 RXB.00011 X.src.0.01 4A /r | AVX
VBLENDVPS ymm1, ymm2, ymm3/mem256, ymm4 | C4 RXB.00011 X.src.1.01 4A /r | AVX
マスクの指定に従って、2つのソースのパック単精度のどちらかの値を、宛先の対応する位置にコピーします。

マスク値は、BLENDVPS の場合は XMM0 レジスタで、VBLENDVPS の場合は最後のオペランドで指定します。
32bit 単位で、宛先の各位置に対応し、それぞれの最上位ビットで、どちらからコピーするかを指定します。
ビットが 0 の場合は、第1ソースから、ビットが 1 の場合は、第2ソースからコピーします。
BLENDPD xmm1, xmm2/mem128, imm8 | 66 0F 3A 0D /r ib | SSE4.1
VBLENDPD xmm1, xmm2, xmm3/mem128, imm8 | C4 RXB.00011 X.src.0.01 0D /r ib | AVX
VBLENDPD ymm1, ymm2, ymm3/mem256, imm8 | C4 RXB.00011 X.src.1.01 0D /r ib | AVX
即値バイトの指定に従って、2つのソースのパック倍精度のどちらかの値を、宛先の対応する位置にコピーします。

8bit 即値の値は、1bit 単位で、宛先の各位置に対応します。
ビットが 0 の場合は、第1ソースから、ビットが 1 の場合は、第2ソースからコピーします。
BLENDVPD xmm1, xmm2/mem128 | 66 0F 38 15 /r | SSE4.1
VBLENDVPD xmm1, xmm2, xmm3/mem128, xmm4 | C4 RXB.00011 X.src.0.01 4B /r | AVX
VBLENDVPD ymm1, ymm2, ymm3/mem256, ymm4 | C4 RXB.00011 X.src.1.01 4B /r | AVX
マスクの指定に従って、2つのソースのパック倍精度のどちらかの値を、宛先の対応する位置にコピーします。

マスク値は、BLENDVPD の場合は XMM0 レジスタで、VBLENDVPD の場合は最後のオペランドで指定します。
64bit 単位で、宛先の各位置に対応し、それぞれの最上位ビットで、どちらからコピーするかを指定します。
ビットが 0 の場合は、第1ソースから、ビットが 1 の場合は、第2ソースからコピーします。
シャッフルコピー
SHUFPS xmm1, xmm2/mem128, imm8 | 0F C6 /r ib | SSE
VSHUFPS xmm1, xmm2, xmm3/mem128, imm8 | C4 RXB.01 X.src1.0.00 C6 /r | AVX
VSHUFPS ymm1, ymm2, ymm3/mem256, imm8 | C4 RXB.01 X.src1.1.00 C6 /r | AVX
即値バイトで指定された値に従って、宛先の各単精度の値を、第2オペランドの任意の位置からコピーします。

即値バイトは、2bit x 4 で、宛先の各位置に対応し、コピーするソースの位置を 0〜3 で指定します (32bit 単位)。

256bit の場合、上位 128bit は、同じ即値を使って、同じように処理します (ソースの位置は上位 128bit が対象)。
SHUFPD xmm1, xmm2/mem128, imm8 | 66 0F C6 /r ib | SSE2
VSHUFPD xmm1, xmm2, xmm3/mem128, imm8 | C4 RXB.01 X.src1.0.01 C6 /r | AVX
VSHUFPD ymm1, ymm2, ymm3/mem256, imm8 | C4 RXB.01 X.src1.1.01 C6 /r | AVX
即値バイトで指定された値に従って、宛先の各倍精度の値を、第2オペランドの任意の位置からコピーします。

即値バイトは、1bit x 2 or 4 で、宛先の各位置に対応し、コピーするソースの位置を 0 or 1 で指定します (64bit 単位)。

256bit の場合、bit 3:2 は、上位 128bit の宛先位置に対応します (ソースの位置は上位 128bit が対象)。
パック抽出/挿入
EXTRACTPS reg32/mem32, xmm1 imm8   | 66 0F 3A 17 /r ib | SSE4.1
VEXTRACTPS reg32/mem32, xmm1, imm8 | C4 RXB.00011 X.1111.0.01 17 /r ib | AVX
ソースの、4つのパック単精度のうち、即値バイトで指定された位置 (0〜3) の値を、汎用レジスタまたは 32bit メモリ位置にコピーします。
INSERTPS xmm1, xmm2/mem32, imm8 | 66 0F 3A 21 /r ib | SSE4.1
VINSERTPS xmm1, xmm2, xmm3/mem128, imm8 | C4 RXB.00011 X.src.0.01 21 /r ib | AVX
ソースの、パック単精度 (128bit) の任意の位置の 32bit 値、または、32bit メモリ位置の値を、宛先の任意の位置にコピーし、オプションで、宛先の各位置の値を 0 をクリアします。

即値オペランドは、3つのフィールドに分かれます。

| 7     6 | 5     4 | 3   0 | bit
| COUNT_S | COUNT_D | ZMASK |

COUNT_S: 128bit のソースからコピーする値の位置 (0〜3)。ソースがメモリの場合、0 にします。
COUNT_D: 宛先にコピーする位置 (0〜3)。
ZMASK: 4つのビットが、それぞれ宛先の位置に対応します。ビットが 1 の場合、宛先の値を 0 にします。
符号抽出
MOVMSKPS reg, xmm  | 0F 50 /r | SSE
VMOVMSKPS reg, xmm | C4 RXB.00001 X.1111.0.00 50 /r | AVX
VMOVMSKPS reg, ymm | C4 RXB.00001 X.1111.1.00 50 /r | AVX
パック単精度の各符号ビットを抽出し、汎用レジスタにゼロ拡張して書き込みます。
XMM は 4bit、YMM は 8bit。
MOVMSKPD reg, xmm  | 66 0F 50 /r | SSE2
VMOVMSKPD reg, xmm | C4 RXB.00001 X.1111.0.01 50 /r | AVX
VMOVMSKPD reg, ymm | C4 RXB.00001 X.1111.1.01 50 /r | AVX
パック倍精度の各符号ビットを抽出し、汎用レジスタにゼロ拡張して書き込みます。
XMM は 2bit、YMM は 4bit。
(単精度) 最大値/最小値
MINSS xmm1, xmm2/mem32 | F3 0F 5D /r | SSE
VMINSS xmm1, xmm2, xmm3/mem32 | C4 RXB.00001 X.src.X.10 5D /r | AVX
第1ソースの下位 32bit の単精度値を、第2ソースの対応する値と比較し、小さい方の値を、宛先の下位 32bit に書き込みます。

両方の値が 0 の場合、第2ソースの値が返されます。
いずれかのオペランドが NaN (SNaN or QNaN) で、無効な操作の例外がマスクされている場合、第2ソースが宛先に書き込まれます。
MINPS xmm1, xmm2/mem128 | 0F 5D /r | SSE
VMINPS xmm1, xmm2, xmm3/mem128 | C4 RXB.00001 X.src.0.00 5D /r | AVX
VMINPS ymm1, ymm2, ymm3/mem256 | C4 RXB.00001 X.src.1.00 5D /r | AVX
第1ソースのパック単精度を、それぞれ第2ソースの対応する値と比較し、小さい方の値を、宛先の対応する場所に書き込みます。

両方の値が 0 の場合、第2ソースの値が返されます。
いずれかのオペランドが NaN (SNaN or QNaN) で、無効な操作の例外がマスクされている場合、第2ソースが宛先に書き込まれます。
MAXSS xmm1, xmm2/mem32 | F3 0F 5F /r | SSE
VMAXSS xmm1, xmm2, xmm3/mem32 | C4 RXB.00001 X.src.X.10 5F /r | AVX
第1ソースの下位 32bit の単精度値を、第2ソースの対応する値と比較し、大きい方の値を、宛先の下位 32bit に書き込みます。

両方の値が 0 の場合、第2ソースの値が返されます。
いずれかのオペランドが NaN (SNaN or QNaN) で、無効な操作の例外がマスクされている場合、第2ソースが宛先に書き込まれます。
MAXPS xmm1, xmm2/mem128 | 0F 5F /r | SSE
VMAXPS xmm1, xmm2, xmm3/mem128 | C4 RXB.00001 X.src.0.00 5F /r | AVX
VMAXPS ymm1, ymm2, ymm3/mem256 | C4 RXB.00001 X.src.1.00 5F /r | AVX
第1ソースのパック単精度を、それぞれ第2ソースの対応する値と比較し、大きい方の値を、宛先の対応する場所に書き込みます。

両方の値が 0 の場合、第2ソースの値が返されます。
いずれかのオペランドが NaN (SNaN or QNaN) で、無効な操作の例外がマスクされている場合、第2ソースが宛先に書き込まれます。
(倍精度) 最小値/最大値
MINSD xmm1, xmm2/mem64 | F2 0F 5D /r | SSE2
VMINSD xmm1, xmm2, xmm3/mem64 | C4 RXB.00001 X.src.X.11 5D /r | AVX
第1ソースの下位 64bit 倍精度値を、第2ソースの対応する値と比較し、小さい方の値を、宛先の下位 64bit に書き込みます。

両方の値が 0 の場合、第2ソースの値が返されます。
いずれかのオペランドが NaN (SNaN or QNaN) で、無効な操作の例外がマスクされている場合、第2ソースが宛先に書き込まれます。
MINPD xmm1, xmm2/mem128 | 66 0F 5D /r | SSE2
VMINPD xmm1, xmm2, xmm3/mem128 | C4 RXB.00001 X.src.0.01 5D /r | AVX
VMINPD ymm1, ymm2, ymm3/mem256 | C4 RXB.00001 X.src.1.01 5D /r | AVX
第1ソースのパック倍精度を、それぞれ第2ソースの対応する値と比較し、小さい方の値を、宛先の対応する場所に書き込みます。

両方の値が 0 の場合、第2ソースの値が返されます。
いずれかのオペランドが NaN (SNaN or QNaN) で、無効な操作の例外がマスクされている場合、第2ソースが宛先に書き込まれます。
MAXSD xmm1, xmm2/mem64 | F2 0F 5F /r | SSE2
VMAXSD xmm1, xmm2, xmm3/mem64 | C4 RXB.00001 X.src.X.11 5F /r | AVX
第1ソースの下位 64bit 倍精度値を、第2ソースの対応する値と比較し、大きい方の値を、宛先の下位 64bit に書き込みます。

両方の値が 0 の場合、第2ソースの値が返されます。
いずれかのオペランドが NaN (SNaN or QNaN) で、無効な操作の例外がマスクされている場合、第2ソースが宛先に書き込まれます。
MAXPD xmm1, xmm2/mem128 | 66 0F 5F /r | SSE2
VMAXPD xmm1, xmm2, xmm3/mem128 | C4 RXB.00001 X.src.0.01 5F /r | AVX
VMAXPD ymm1, ymm2, ymm3/mem256 | C4 RXB.00001 X.src.1.01 5F /r | AVX
第1ソースのパック倍精度を、それぞれ第2ソースの対応する値と比較し、大きい方の値を、宛先の対応する場所に書き込みます。

両方の値が 0 の場合、第2ソースの値が返されます。
いずれかのオペランドが NaN (SNaN or QNaN) で、無効な操作の例外がマスクされている場合、第2ソースが宛先に書き込まれます。