x86 SIMD命令のリスト

x86 命令セットは、SIMD(単一命令複数データ)命令セット拡張によって幾度か拡張されてきました。1997年にPentium MMXで導入されたMMX命令セット拡張に始まるこれらの拡張は、通常、ワイドレジスタと、これらのレジスタを固定サイズのレーンに分割し、各レーンで並列に計算を実行する命令セットを定義します。

SIMD拡張の概要

x86 に導入された主な SIMD 命令セット拡張は次のとおりです。

  1. ^ SSE3 の 13 個の命令には、非 SIMD 命令も含まれておりMONITORMWAITこれらも「Prescott New Instructions」の一部として導入されました。これらの 2 つの命令は、Intel では SSE3 命令とみなされていますが、AMD ではそうではありません。
  2. ^ KX-6000「LuJiaZui」などの古いZhaoxinプロセッサでは、AVX2命令は存在しますが、FMA3のサポートがないためCPUIDを通じて公開されません。 [1]
  3. ^ AVX10仕様の初期ドラフトでは、実装時にサポートされる最大ベクトルレジスタ幅を128/256ビットに制限するオプションも追加されていました[2]。しかし、2025年3月現在、このオプションは削除され、512ビットベクトルレジスタ幅のサポートが再び必須となっています。[3] [4]

MMX命令とその拡張版

これらの手順は、特に明記されていない限り、次の形式で入手できます。

  • MMX: 64 ビット ベクター、mm0..mm7 レジスタで動作 (古い x87レジスタ ファイルの上にエイリアス化)
  • SSE2: 128 ビット ベクター、xmm0..xmm15 レジスタで動作 (32 ビット モードでは xmm0..xmm7)
  • AVX: xmm0..xmm15 レジスタで動作する 128 ビット ベクトル。新しいVEX プレフィックスによって新しい 3 つのオペランド エンコーディングが有効になります。(AVX では 256 ビット ベクトル レジスタが導入されましたが、これらのベクトルの全幅は一般に AVX2 まで整数 SIMD 命令で使用できませんでした。)
  • AVX2: 256 ビット ベクター、ymm0..ymm15 レジスタ (xmm0..xmm15 レジスタの拡張バージョン) で動作します。
  • AVX-512: 512 ビット ベクター、zmm0..zmm31 レジスターで動作します (zmm​​0..zmm15 は ymm0..ymm15 レジスターの拡張バージョンで、zmm16..zmm31 は AVX-512 の新機能です)。AVX-512 では opmask も導入され、ほとんどの命令の操作を opmask レジスターによってレーンごとにマスクできるようになりました (レーン幅は命令ごとに異なります)。AVX-512 では多くの命令にブロードキャスト機能も追加されました。これはメモリ ソース引数と共に使用され、ベクター計算のすべてのレーンに単一の値を複製します。以下の表は、各命令で opmask とブロードキャストがサポートされているかどうか、サポートされている場合はどのレーン幅が使用されているかを示しています。

多くの命令ニーモニックでは、(V)命令ニーモニックが先頭に V がある形式と V がない形式で存在することを示すために が使用されます - 先頭に V がある形式は、AVX/AVX2/AVX-512 によって導入された VEX/EVEX プレフィックス付きの命令バリアントに使用され、先頭に V がない形式は、VEX/EVEX プレフィックスのない従来の MMX/SSE エンコーディングに使用されます。

オリジナルのPentium MMX命令と、そのSSE2/AVX/AVX-512拡張版

説明 命令のニーモニック 基本オペコード MMX
(プレフィックスなし)
SSE2
(66hプレフィックス)
AVX
(VEX.66プレフィックス)
AVX-512 (EVEX.66 プレフィックス)
サポートされている サブセット レーン bcst
空の MMX テクノロジー状態。

すべての FP/MMX レジスタを空としてマークし、後の x87 コードで自由に使用できるようにします。[a]

EMMS(MMX) 0F 77 はい いいえ いいえ[b] いいえ 該当なし 該当なし 該当なし
GPR(汎用レジスタ)またはメモリからベクトルレジスタにスカラー値をゼロフィルで移動します。 32ビット (V)MOVD mm, r/m32 0F 6E /r はい はい はい(L=0、W=0) はい(L=0、W=0) F いいえ いいえ
64ビット
(x86-64)
(V)MOVQ mm, r/m64
MOVD mm, r/m64[c]
はい
(REX.W)
はい
(REX.W)[d]
はい(L=0、W=1) はい(L=0、W=1) F いいえ いいえ
スカラー値をベクトルレジスタからGPRまたはメモリに移動する 32ビット (V)MOVD r/m32, mm 0F 7E /r はい はい はい(L=0、W=0) はい(L=0、W=0) F いいえ いいえ
64ビット
(x86-64)
(V)MOVQ r/m64, mm
MOVD r/m64, mm[c]
はい
(REX.W)
はい
(REX.W)[d]
はい(L=0、W=1) はい(L=0、W=1) F いいえ いいえ
ベクトル レジスタとメモリまたは別のベクトル レジスタ間のベクトル移動。

(V)MOVDQAメモリとの間の移動の場合、バリアントに対してはメモリ アドレスを揃える必要がありますが、 に対しては必要ありませんMOVQ

メモリ引数を持つ128ビットVEXエンコード形式はVMOVDQA、メモリがキャッシュ可能な場合、メモリアクセスをアトミックに実行します。[e]

MOVQ mm/m64, mm(MMX)
(V)MOVDQA xmm/m128,xmm
0F 7F /r MOVQ MOVDQA VMOVDQA[ f] VMOVDQA32(W0) F 32 いいえ
VMOVDQA64(W1) F 64 いいえ
MOVQ mm, mm/m64(MMX)
(V)MOVDQA xmm,xmm/m128
0F 6F /r MOVQ MOVDQA VMOVDQA[ f] VMOVDQA32(W0) F 32 いいえ
VMOVDQA64(W1) F 64 いいえ
32ビットの符号付き整数を飽和付きで16ビットにパックする (V)PACKSSDW mm, mm/m64[ g] 0F 6B /r はい はい はい はい(W=0) 白黒 16 32
16ビットの符号付き整数を飽和付きで8ビットにパックする (V)PACKSSWB mm, mm/m64[ g] 0F 63 /r はい はい はい はい 白黒 8 いいえ
16ビットの符号なし整数を飽和付きで8ビットにパックする (V)PACKUSWB mm, mm/m64[ g] 0F 67 /r はい はい はい はい 白黒 8 いいえ
2つの入力ベクトルの上位半分からパックされた整数を展開してインターリーブする 8ビット (V)PUNPCKHBW mm, mm/m64[ g] 0F 68 /r はい はい はい はい 白黒 8 いいえ
16ビット (V)PUNPCKHWD mm, mm/m64[ g] 0F 69 /r はい はい はい はい 白黒 16 いいえ
32ビット (V)PUNPCKHDQ mm, mm/m64[ g] 0F 6A /r はい はい はい はい(W=0) F 32 32
2つの入力ベクトルの下位半分からパックされた整数を展開してインターリーブする 8ビット (V)PUNPCKLBW mm, mm/m32[ g] [h] 0F 60 /r はい はい はい はい 白黒 8 いいえ
16ビット (V)PUNPCKLWD mm, mm/m32[ g] [h] 0F 61 /r はい はい はい はい 白黒 16 いいえ
32ビット (V)PUNPCKLDQ mm, mm/m32[ g] [h] 0F 62 /r はい はい はい はい(W=0) F 32 32
パック整数を加算する 8ビット (V)PADDB mm, mm/m64 0F FC /r はい はい はい はい 白黒 8 いいえ
16ビット (V)PADDW mm, mm/m64 0F FD /r はい はい はい はい 白黒 16 いいえ
32ビット (V)PADDD mm, mm/m64 0F FE /r はい はい はい はい(W=0) F 32 32
飽和した符号付きパック整数を加算する 8ビット (V)PADDSB mm, mm/m64 0F EC /r はい はい はい はい 白黒 8 いいえ
16ビット (V)PADDSW mm, mm/m64 0F ED /r はい はい はい はい 白黒 16 いいえ
飽和したパックされた符号なし整数を加算する 8ビット (V)PADDUSB mm, mm/m64 0F DC /r はい はい はい はい 白黒 8 いいえ
16ビット (V)PADDUSW mm, mm/m64 0F DD /r はい はい はい はい 白黒 16 いいえ
パック整数を減算する 8ビット (V)PSUBB mm, mm/m64 0F F8 /r はい はい はい はい 白黒 8 いいえ
16ビット (V)PSUBW mm, mm/m64 0F F9 /r はい はい はい はい 白黒 16 いいえ
32ビット (V)PSUBD mm, mm/m64 0F FA /r はい はい はい はい(W=0) F 32 32
飽和を伴うパックされた符号付き整数を減算する 8ビット (V)PSUBSB mm, mm/m64 0F E8 /r はい はい はい はい 白黒 8 いいえ
16ビット (V)PSUBSW mm, mm/m64 0F E9 /r はい はい はい はい 白黒 16 いいえ
飽和状態でパックされた符号なし整数を減算する 8ビット (V)PSUBUSB mm, mm/m64 0F D8 /r はい はい はい はい 白黒 8 いいえ
16ビット (V)PSUBUSW mm, mm/m64 0F D9 /r はい はい はい はい 白黒 16 いいえ
パックされた整数が等しいかどうかを比較する 8ビット (V)PCMPEQB mm, mm/m64 0F 74 /r はい はい はい はい[i] 白黒 8 いいえ
16ビット (V)PCMPEQW mm, mm/m64 0F 75 /r はい はい はい はい[i] 白黒 16 いいえ
32ビット (V)PCMPEQD mm, mm/m64 0F 76 /r はい はい はい はい(W=0)[i] F 32 32
パック整数を比較して符号付き大なり小なりを求める 8ビット (V)PCMPGTB mm, mm/m64 0F 64 /r はい はい はい はい[i] 白黒 8 いいえ
16ビット (V)PCMPGTW mm, mm/m64 0F 65 /r はい はい はい はい[i] 白黒 16 いいえ
32ビット (V)PCMPGTD mm, mm/m64 0F 66 /r はい はい はい はい(W=0)[i] F 32 32
パックされた 16 ビットの符号付き整数を乗算し、結果を 32 ビットの整数に 2 つずつ加算します。 (V)PMADDWD mm, mm/m64 0F F5 /r はい はい はい はい[j] 白黒 32 いいえ
パックされた16ビット符号付き整数を乗算し、結果の上位16ビットを保存します。 (V)PMULHW mm, mm/m64 0F E5 /r はい はい はい はい 白黒 16 いいえ
パックされた16ビット整数を乗算し、結果の下位16ビットを保存します。 (V)PMULLW mm, mm/m64 0F D5 /r はい はい はい はい 白黒 16 いいえ
ベクトルのビット単位のAND (V)PAND mm, mm/m64 0F DB /r はい はい はい VPANDD(W0) F 32 32
VPANDQ(W1) F 64 64
ベクトルのビットごとのAND-NOT (V)PANDN mm, mm/m64 0F DF /r はい はい はい VPANDND(W0) F 32 32
VPANDNQ(W1) F 64 64
ベクトルのビット単位のOR (V)POR mm, mm/m64 0F EB /r はい はい はい VPORD(W0) F 32 32
VPORQ(W1) F 64 64
ベクトルのビット単位のXOR (V)PXOR mm, mm/m64 0F EE /r はい はい はい VPXORD(W0) F 32 32
VPXORQ(W1) F 64 64
共通シフト量を持つ パック整数の左シフト 16ビット (V)PSLLW mm, imm8 0F 71 /6 ib はい はい はい はい 白黒 16 いいえ
(V)PSLLW mm, mm/m64[k] 0F F1 /r はい はい はい はい 白黒 16 いいえ
32ビット (V)PSLLD mm, imm8 0F 72 /6 ib はい はい はい はい(W=0) F 32 32
(V)PSLLD mm, mm/m64[k] 0F F2 /r はい はい はい はい(W=0) F 32 いいえ
64ビット (V)PSLLQ mm, imm8 0F 73 /6 ib はい はい はい はい(W=1) F 64 64
(V)PSLLQ mm, mm/m64[k] 0F F3 /r はい はい はい はい(W=1) F 64 いいえ
共通のシフト量を持つ パックされた符号付き整数の右シフト 16ビット (V)PSRAW mm, imm8 0F 71 /4 ib はい はい はい はい 白黒 16 いいえ
(V)PSRAW mm, mm/m64[k] 0F E1 /r はい はい はい はい 白黒 16 いいえ
32ビット (V)PSRAD mm, imm8 0F 72 /4 ib はい はい はい はい(W=0) F 32 32
(V)PSRAD mm, mm/m64[k] 0F E2 /r はい はい はい はい(W=0) F 32 いいえ
共通のシフト量を持つ パックされた符号なし整数の右シフト 16ビット (V)PSRLW mm, imm8 0F 71 /2 ib はい はい はい はい 白黒 16 いいえ
(V)PSRLW mm, mm/m64[k] 0F D1 /r はい はい はい はい 白黒 16 いいえ
32ビット (V)PSRLD mm, imm8 0F 72 /2 ib はい はい はい はい(W=0) F 32 32
(V)PSRLD mm, mm/m64[k] 0F D2 /r はい はい はい はい(W=0) F 32 いいえ
64ビット (V)PSRLQ mm, imm8 0F 73 /2 ib はい はい はい はい(W=1) F 64 64
(V)PSRLQ mm, mm/m64[k] 0F D3 /r はい はい はい はい(W=1) F 64 いいえ
  1. ^ EMMSは x87 スタックトップを 0 に設定します。
    以前のFNINIT命令とは異なり、EMMSFPU 制御ワードは更新されず、スタックトップ以外の FPU ステータスレジスタも更新されません。マスクされていない保留中の x87 例外がある場合は、EMMS例外を発生させ、 はFNINITそれをクリアします。
  2. ^ オペコード0F 77は VEX エンコードできます (AVXVZEROUPPERVZEROALL命令が生成されます) が、VEX.66 プレフィックスではなく、VEX.NP プレフィックスが必要です。
  3. ^ ab およびオペコードで始まるプレフィックスを使用してエンコードされた64ビット移動命令形式は、 Intelのドキュメント[5]とAMDのドキュメント[6]で異なるニーモニックでリストされていますこれはドキュメントの違いのみで、これらのオペコードによって実行される操作はIntelとAMDで同じです。このドキュメントの違いはこれらのオペコードのMMX/SSE形式にのみ適用されます。VEX/EVEXエンコード形式では、IntelとAMDの両方がニーモニックを使用します。)REX.W0F 6E0F 7EMOVQMOVD

    VMOVQ
  4. ^ ab REX.Wエンコードされた は、MOVQ64ビットの「ロングモード」でのみ利用可能です。SSE2以降では、 xmm/ymm/zmmレジスタへの と からの もそれぞれ とMOVQエンコードできます。これらのエンコードは短く、64ビットモード以外でも利用可能です。F3 0F 7E /r66 0F D6 /r
  5. ^ AVXをサポートするすべてのIntel、[7]、 AMD [8]、Zhaoxin [9]プロセッサでは、128ビット形式VMOVDQA(VEXプレフィックスとVEX.L = 0でエンコード)は、WB(ライトバックキャッシュ可能)メモリをアドレス指定するメモリ引数とともに使用された場合、128ビットのメモリアクセスをアトミックに実行することがアーキテクチャ的に保証されています。これはロードとストアの両方に適用されます。

    (Intel と AMD は、より多くの 128 ビット命令バリアントをカバーする、やや広い保証を提供していますが、Zhaoxin はキャッシュ可能なもののみの保証を提供していますVMOVDQA。)

    128 ビットVMOVDQAはアトミックですが、ロックされていません。通常の x86 ロード/ストアと同じ方法で並べ替えることができます(例: 古いストアを渡すロード)。

    MOVAPSSSEをサポートしているがAVXをサポートしていないプロセッサでは、 / MOVAPD/などの128ビット形式のSSEロード/ストア命令がアトミックに実行されることは保証されMOVDQAませ。このような命令が非アトミックに実行されることが確認されているプロセッサの例としては、Intel Core DuoAMD K10などがあります。[10]

  6. ^ ab VMOVDQAは AVX では 256 ビットのベクトル長で使用可能であり、AVX2 は必要ありません。

    128 ビット形式とは異なり、256 ビット形式ではVMOVDQA特別な原子性保証は提供されません。

  7. ^ abcdefghi および命令については、128 ビットより広いベクトル長のエンコーディングが AVX2 および AVX-512 で使用できますが、このようなエンコーディングの操作は 128 ビットのレーンごとに分割され、各 128 ビット レーンでは内部的に命令の 128 ビット版と同じ操作が実行されます。VPACK*VPUNPCK*
  8. ^ abc命令 のメモリ引数形式において(V)PUNPCKL*、メモリ引数はMMX版命令のみ半角幅となります。SSE/AVX/AVX-512版では、実際には半分しか使用されないにもかかわらず、メモリ引数の幅はベクトル全幅となります。
  9. ^ abcdef および命令のEVEXエンコード版は、結果をAVX-512 opmaskレジスタに書き込みます。これは、比較結果をオール0/オール1のベクトルとして通常のmm/xmm/ymmベクトルレジスタに書き込む、EVEXエンコード版以外の旧バージョンとは異なります。VPCMPEQ*VPCMPGT*
  10. ^ 命令(V)PMADDWDは乗算結果をペアで加算しますが、その合計をアキュムレータに加算しません。AVX512_VNNI は、乗算結果をペアで加算し、さらに 32 ビットレーンごとのアキュムレータに加算する命令VDPWSSDと命令を提供しますWDPWSSDS
  11. ^ abcdefgh MMXパックシフト命令においてPSLL*PSR*ベクトルソース(mmまたはm64)からシフト引数を取得する場合、シフト量は単一の64ビットスカラー値とみなされます。つまり、同じシフト量がデスティネーションベクトルの全レーンに適用されます。このシフト量は符号なしであり、マスクされません。つまり、すべてのビットが考慮されます(例えば、シフト量に を0x80000000_00000000指定でき、シフト量に64を指定した場合と同じ効果があります)。

    これらの命令のすべての SSE2/AVX/AVX512 拡張バリアントでは、シフト量ベクトル引数は 128 ビット (xmm または m128) 引数であると見なされ、下位 64 ビットがシフト量として使用されます。

    レーンごとに可変のシフト量を取ることができるパック シフト命令は、32/64 ビット レーンでは AVX2、16 ビット レーンでは AVX512BW で導入されました ( VPSLLV*、、命令)。VPSRLV*VPSRAV*

MMX+/SSE/SSE2/SSSE3、およびそれらのSSE2/AVX/AVX-512拡張版で追加されたMMX命令

説明 命令のニーモニック 基本オペコード MMX
(プレフィックスなし)
SSE2
(66hプレフィックス)
AVX
(VEX.66プレフィックス)
AVX-512 (EVEX.66 プレフィックス)
サポートされている サブセット レーン bcst
SSEとMMX+で追加
4つの16ビット整数を64ビットベクトル(MMX)でシャッフルする[a] PSHUFW mm,mm/m64,imm8(MMX) 0F 70 /r ib PSHUFW PSHUFD VPSHUFD VPSHUFD
(W=0)
F 32 32
128 ビット ベクトル内の 4 つの 32 ビット整数のシャッフルを実行します (SSE2) (V)PSHUFD xmm,xmm/m128,imm8[b]
16ビットベクトルレジスタレーンに整数を挿入する (V)PINSRW mm,r32/m16,imm8 0F C4 /r ib はい はい はい(L=0,W=0 [c] はい(L=0) 白黒 いいえ いいえ
16ビットベクトルレジスタレーンからゼロ拡張付き整数を抽出します。 (V)PEXTRW r32,mm,imm8[d] 0F C5 /r ib はい はい はい(L=0,W=0 [c] はい(L=0) 白黒 いいえ いいえ
ソースベクトルの各バイトの上位ビットからビットマスクを作成し、整数レジスタに格納します。 (V)PMOVMSKB r32,mm 0F D7 /r はい はい はい いいえ[e] 該当なし 該当なし 該当なし
パックされた符号なし8ビット整数の最小値 (V)PMINUB mm,mm/m64 0F DA /r はい はい はい はい 白黒 8 いいえ
パックされた符号なし8ビット整数の最大値 (V)PMAXUB mm,mm/m64 0F DE /r はい はい はい はい 白黒 8 いいえ
パックされた符号付き16ビット整数の最小値 (V)PMINSW mm,mm/m64 0F EA /r はい はい はい はい 白黒 16 いいえ
パックされた符号付き16ビット整数の最大値 (V)PMAXSW mm,mm/m64 0F EE /r はい はい はい はい 白黒 16 いいえ
パックされた符号なし整数の丸め平均。レーンごとの演算は次のようになります。
dst ← (src1 + src2 + 1)>>1
8ビット (V)PAVGB mm,mm/m64 0F E0 /r はい はい はい はい 白黒 8 いいえ
16ビット (V)PAVGW mm,mm/m64 0F E3 /r はい はい はい はい 白黒 16 いいえ
パックされた16ビットの符号なし整数を乗算し、結果の上位16ビットを格納します。 (V)PMULHUW mm,mm/mm64 0F E4 /r はい はい はい はい 白黒 16 いいえ
非一時的ヒントを使用してベクトル レジスタをメモリに格納します。

メモリオペランドはすべてのバリアントに対して整列されている必要があります(V)MOVNTDQが、 に対しては必要ありませんMOVNTQ

MOVNTQ m64,mm(MMX)
(V)MOVNTDQ m128,xmm
0F E7 /r MOVNTQ MOVNTDQ VMOVNTDQ[女性] VMOVNTDQ
(W=0)
F いいえ いいえ
8 つの 8 ビット符号なし整数の絶対差の合計を計算し、結果を 64 ビット整数として保存します。

ベクトル幅が 64 ビットを超える場合 (SSE/AVX/AVX-512)、この計算はベクトルの 64 ビット レーンごとに個別に実行され、64 ビット整数のベクトルが生成されます。

(V)PSADBW mm,mm/m64 0F F6 /r はい はい はい はい 白黒 いいえ いいえ
非一時的ヒントを使用して、バイト書き込みマスクを使用してベクトル レジスタをメモリに非整列でストアします。

最初の引数は保存するデータを提供し、2番目の引数はバイト書き込みマスク(各バイトの最上位ビット)を提供します。[g]保存先のアドレスはDS:DI/EDI/RDI(DS:セグメントはセグメントプレフィックスで上書き可能)で指定されます。

MASKMOVQ mm,mm(MMX)
(V)MASKMOVDQU xmm,xmm
0F F7 /r MASKMOVQ MASKMOVDQU VMASKMOVDQU
(L=0) [時間]
いいえ[i] 該当なし 該当なし 該当なし
SSE2で追加
パックされた 32 ビットの符号なし整数を乗算し、完全な 64 ビットの結果を保存します。

入力整数は、各 64 ビット ベクトル レーンの下位 32 ビットから取得されます。

(V)PMULUDQ mm,mm/m64 0F F4 /r はい はい はい はい(W=1) F 64 64
パックされた64ビット整数を追加する (V)PADDQ mm, mm/m64 0F D4 /r はい はい はい はい(W=1) F 64 64
パックされた64ビット整数を減算する (V)PSUBQ mm,mm/m64 0F FB /r はい はい はい はい(W=1) F 64 64
SSSE3で追加
ベクトルバイトシャッフル (V)PSHUFB mm,mm/m64[b] 0F38 00 /r はい はい[j] はい はい 白黒 8 いいえ
パックされた整数のペアワイズ水平加算 16ビット (V)PHADDW mm,mm/mm64[b] 0F38 01 /r はい はい はい いいえ 該当なし 該当なし 該当なし
32ビット (V)PHADDD mm,mm/mm64[b] 0F38 02 /r はい はい はい いいえ 該当なし 該当なし 該当なし
飽和ありのパックされた16ビット符号付き整数の水平方向のペア加算 (V)PHADDSW mm,mm/mm64[b] 0F38 03 /r はい はい はい いいえ 該当なし 該当なし 該当なし
パックされた8ビットの符号付き整数と符号なし整数を乗算し、結果を2つずつ加算して16ビットの符号付き整数に変換します(飽和処理付き)。最初のオペランドは符号なしとして、2番目のオペランドは符号付きとして扱われます。 (V)PMADDUBSW mm,mm/m64 0F38 04 /r はい はい はい はい 白黒 16 いいえ
パックされた整数のペアワイズ水平減算。

各ペアの上位の整数が下位の整数から減算されます。

16ビット (V)PHSUBW mm,mm/m64[b] 0F38 05 /r はい はい はい いいえ 該当なし 該当なし 該当なし
32ビット (V)PHSUBD mm,mm/m64[b] 0F38 06 /r はい はい はい いいえ 該当なし 該当なし 該当なし
飽和ありのパックされた16ビット符号付き整数のペアワイズ水平減算 (V)PHSUBSW mm,mm/m64[b] 0F38 07 /r はい はい はい いいえ 該当なし 該当なし 該当なし
2番目のソース引数のパックド符号付き整数の符号に基づいて、最初のソース引数のパックド整数を変更します。レーンごとに実行される操作は次のとおりです。
if( src2 < 0 ) dst ← -src1
そうでない場合(src2 == 0) dst ← 0
それ以外の場合、dst ← src1
8ビット (V)PSIGNB mm,mm/m64 0F38 08 /r はい はい はい いいえ 該当なし 該当なし 該当なし
16ビット (V)PSIGNW mm,mm/m64 0F38 09 /r はい はい はい いいえ 該当なし 該当なし 該当なし
32ビット (V)PSIGND mm,mm/m64 0F38 0A /r はい はい はい いいえ 該当なし 該当なし 該当なし
パックされた 16 ビットの符号付き整数を乗算し、丸めとスケーリングを実行して 16 ビットの符号付き整数の結果を生成します。

16 ビット レーンごとに実行される計算は次のとおりです。
dst ← (src1*src2 + (1<<14)) >> 15

(V)PMULHRSW mm,mm/m64 0F38 0B /r はい はい はい はい 白黒 16 いいえ
パックされた符号付き整数の絶対値 8ビット (V)PABSB mm,mm/m64 0F38 1C /r はい はい はい はい 白黒 8 いいえ
16ビット (V)PABSW mm,mm/m64 0F38 1D /r はい はい はい はい 白黒 8 いいえ
32ビット (V)PABSD mm,mm/m64 0F38 1E /r PABSD PABSD VPABSD VPABSD(W0) F 32 32
64ビット VPABSQ xmm,xmm/m128(AVX-512) VPABSQ(W1) F 64 64
右揃えでパックします。

2つの入力ベクトルを連結して倍長ベクトルを作成し、imm8引数で指定されたバイト数だけ右シフトします。シフト量はマスクされません。シフト量が入力ベクトルのサイズより大きい場合は、ゼロがシフトインされます。

(V)PALIGNR mm,mm/mm64,imm8[b] 0F3A 0F /r ib はい はい はい はい[k] 白黒 8 いいえ
  1. ^ 128 ビット XMM レジスタの 64 ビット セクション内の 4 つの 16 ビット整数をシャッフルするには、SSE2 命令PSHUFLW(opcode F2 0F 70 /r) またはPSHUFHW(opcode F3 0F 70 /r) を使用できます。
  2. ^ abcdefghi 、、、および命令については、ベクトル長が 128 ビットを超えるエンコーディングがAVX2 および/または AVX-512 で使用できますが、このようなエンコーディングの操作は 128 ビット レーンごとに分割され各 128 ビット レーンでは内部的に命令の 128 ビット版と同じ操作が実行されます。VPSHUFDVPSHUFBVPHADD*VPHSUB*VPALIGNR
  3. ^ ab および命令の VEX エンコード形式については、Intel SDM (rev 084 時点) では命令を VEX.W=0 でエンコードする必要があると示されていますが、Intel XED も AMD APM もそのような要件を示していません。VPINSRWVPEXTRW
  4. ^ のバリアントはレジスタへのデスティネーションのみを許可します。SSE4.1以降では、オペコード でメモリへのデスティネーションを許可するバリアントが利用可能です0F C5 /r ibPEXTRW66 0F 3A 15 /r ib
  5. ^ EVEX プレフィックス付きオペコードは使用できません。AVX-512 では、各バイトの上位ビットからビットマスクを作成する代わりにVPMOVB2M、命令 with opcode を使用してEVEX.F3.0F38.W0 29 /r、そのビットマスクをオペマスクレジスタに格納できます。
  6. ^ VMOVNTDQは AVX では 256 ビットのベクトル長で使用でき、AVX2 は必要ありません。
  7. ^ 命令と命令の場合、無効化されたレーンに対する例外およびトラップの動作は実装に依存します。例えば、実装によっては、ゼロマスクされていて実際には書き込まれていないバイトに対して、データブレークポイントやページフォールトが通知される場合があります。MASKMOVQ(V)MASKMOVDQU
  8. ^ AVX では、VMASKMOVPSオペコード付きの命令を使用して、メモリへのマスクされたストアも利用できますVEX.66.0F38 2E /r。 とは異なりVMASKMOVDQU、この命令では、マスクが粗く、レーンあたり 1 バイトに対して 4 バイトですが、一時的なヒントなしで 256 ビットのストアが可能です。
  9. ^ AVX-512ではオペコードは使用できません。AVX-512では、VMOVDQU(8|16|32|64)オペコード 命令を使用してEVEX.F2/F3.0F 7F /r書き込みマスクを提供するオペマスクレジスタを使用することで、メモリへの非整列マスクストア(テンポラルヒントは使用しません)を実行できます。
  10. ^ 128ビットを超えるベクトルを持つAVX2およびAVX-512の場合、VPSHUFB命令は128ビットレーン内のバイトシャッフルに制限されます。128ビットレーン間でシャッフルを実行できる命令には、例えばAVX2命令VPERMD(256ビットYMMレジスタ間で32ビットレーンをシャッフル)やAVX512_VBMI命令VPERMB(64バイトZMMレジスタ間でフルバイトシャッフル)などがあります。
  11. ^ AVX-512ではVPALIGNRサポートされていますが、演算は各128ビットレーン内で実行されます。128ビットレーン間でデータをシフトできるパックアライメントシフトの場合、AVX512FVALIGND命令を使用できますが、シフト量はバイト単位ではなく32ビット単位で指定されます。

SSE命令とその拡張版

通常のエンコードされた浮動小数点SSE/SSE2命令、およびAVX/AVX-512拡張版

以下の表の手順については、特に明記されていない限り、次の考慮事項が適用されます。

  • パック命令はすべてのベクトル長で利用可能(SSE2の場合は128ビット、AVXの場合は128/256ビット、AVX-512の場合は128/256/512ビット)
  • FP32 命令バリアントは SSE の一部として導入されます。FP64 命令バリアントは SSE2 の一部として導入されます。
  • FP32 および FP64 命令の AVX-512 バリアントは、AVX512F サブセットの一部として導入されました。
  • AVX-512 命令バリアントでは、FP32 演算の場合は 32 ビット幅、FP64 演算の場合は 64 ビット幅のオペマスクとブロードキャストが利用可能です。(ブロードキャストはベクトル演算のみで利用可能です。)

SSE2以降、一部のデータ移動/ビット単位命令は、整数形式、FP32形式、FP64形式の3つの形式で存在します。これらの命令は機能的に同一ですが、SSE2を搭載した一部のプロセッサでは、整数、FP32、FP64実行ユニットを3つの異なる実行クラスタとして実装しています。この場合、あるクラスタから別のクラスタへの結果転送にはパフォーマンスの低下が伴う可能性があり、命令形式を適切に選択することで、このようなペナルティを最小限に抑えることができます。(例えば、SSE2には、ベクトルビット単位XOR命令の3つの形式、、、PXORXORPSあり、XORPDこれらはそれぞれ整数、FP32、FP64データで使用することを目的としています。)

指示の説明 基本オペコード 単精度(FP32) 倍精度(FP64)
AVX-512: RC/SAE
パック(プレフィックスなし) スカラー(F3hプレフィックス) パック(66h プレフィックス) スカラー(F2hプレフィックス)
SSE命令 AVX
(ベックス)
AVX-512
(エベックス)
SSE命令 AVX
(VEX)[a]
AVX-512
(エベックス)
SSE2命令 AVX
(ベックス)
AVX-512
(エベックス)
SSE2命令 AVX
(VEX)[a]
AVX-512
(エベックス)
メモリまたはベクトルレジスタからの非整列ロード 0F 10 /r MOVUPS x,x/m128 はい はい[b] MOVSS x,x/m32 はい はい MOVUPD x,x/m128 はい はい[b] MOVSD x,x/m64[c] はい はい いいえ
メモリまたはベクトルレジスタへの非整列ストア 0F 11 /r MOVUPS x/m128,x はい はい[b] MOVSS x/m32,x はい はい MOVUPD x/m128,x はい はい[b] MOVSD x/m64,x[c] はい はい いいえ
メモリまたはXMMレジスタの上位半分から64ビットをXMMレジスタの下位半分にロードし、上位半分は変更しない。 0F 12 /r MOVHLPS x,x (L0)[d] (L0)[d] (MOVSLDUP)[e] MOVLPD x,m64 (L0)[d] (L0)[d] (MOVDDUP)[e] いいえ
MOVLPS x,m64 (L0)[d] (L0)[d]
XMMレジスタの下位半分から64ビットをメモリに格納する 0F 13 /r MOVLPS m64,x (L0)[d] (L0)[d] いいえ いいえ いいえ MOVLPD m64,x (L0)[d] (L0)[d] いいえ いいえ いいえ いいえ
下位浮動小数点値をアンパックしてインターリーブする 0F 14 /r UNPCKLPS x,x/m128 はい[f] はい[f] いいえ いいえ いいえ UNPCKLPD x,x/m128 はい[f] はい[f] いいえ いいえ いいえ いいえ
上位浮動小数点値をアンパックしてインターリーブする 0F 15 /r UNPCKHPS x,x/m128 はい[f] はい[f] いいえ いいえ いいえ UNPCKHPD x,x/m128 はい[f] はい[f] いいえ いいえ いいえ いいえ
メモリまたはXMMレジスタの下位半分から64ビットをXMMレジスタの上位半分にロードし、下位半分は変更しない。 0F 16 /r MOVLHPS x,x (L0)[d] (L0)[d] (MOVSHDUP)[e] MOVHPD x,m64 (L0)[d] (L0)[d] いいえ いいえ いいえ いいえ
MOVHPS x,m64 (L0)[d] (L0)[d]
XMMレジスタの上位半分から64ビットをメモリに格納する 0F 17 /r MOVHPS m64,x (L0)[d] (L0)[d] いいえ いいえ いいえ MOVHPD m64,x (L0)[d] (L0)[d] いいえ いいえ いいえ いいえ
メモリまたはベクトルレジスタからのアラインロード 0F 28 /r MOVAPS x,x/m128 はい はい[b] いいえ いいえ いいえ MOVAPD x,x/m128 はい はい[b] いいえ いいえ いいえ いいえ
メモリまたはベクトルレジスタへのアラインストア 0F 29 /r MOVAPS x/m128,x はい はい[b] いいえ いいえ いいえ MOVAPD x/m128,x はい はい[b] いいえ いいえ いいえ いいえ
汎用レジスタ、MMXレジスタ、またはメモリをソースとして使用した整数から浮動小数点への変換 0F 2A /r CVTPI2PS x,mm/m64[グラム] いいえ いいえ CVTSI2SS x,r/m32
CVTSI2SS x,r/m64
[h]
はい はい[i] CVTPI2PD x,mm/m64[グラム] いいえ いいえ CVTSI2SD x,r/m32
CVTSI2SD x,r/m64
[h]
はい はい[i] RC
ベクトル レジスタからメモリへの非一時的なストア。

パックされたバリアントでは、VEX/EVEX エンコード形式であっても、整列されたメモリ アドレスが必要です。

0F 2B /r MOVNTPS m128,x はい はい[i] MOVNTSS m32,x
(AMD SSE4a)
いいえ いいえ MOVNTPD m128,x はい はい[i] MOVNTSD m64,x
(AMD SSE4a)
いいえ いいえ いいえ
汎用レジスタまたはMMXレジスタを出力先として使用し、切り捨てを伴う浮動小数点から整数への変換 0F 2C /r CVTTPS2PI mm,x/m64[j] いいえ いいえ CVTTSS2SI r32,x/m32
CVTTSS2SI r64,x/m32[k]
はい はい[i] CVTTPD2PI mm,x/m64[j] いいえ いいえ CVTTSD2SI r32,x/m64
CVTTSD2SI r64,x/m64[k]
はい はい[i] SAE
汎用レジスタまたはMMXレジスタを宛先として浮動小数点から整数への変換 0F 2D /r CVTPS2PI mm,x/m64[j] いいえ いいえ CVTSS2SI r32,x/m32
CVTSS2SI r64,x/m32[k]
はい はい[i] CVTPD2PI mm,x/m64[j] いいえ いいえ CVTSD2SI r32,x/m64
CVTSD2SI r64,x/m64[k]
はい はい[i] RC
浮動小数点値を順序なしで比較し、EFLAGS を設定します。

xmm ベクトル レジスタの下部のレーンを比較します。

0F 2E /r UCOMISS x,x/m32 はい はい[i] いいえ いいえ いいえ UCOMISD x,x/m64 はい はい[i] いいえ いいえ いいえ SAE
浮動小数点値を比較し、EFLAGS を設定します。

xmm ベクトル レジスタの下部のレーンを比較します。

0F 2F /r COMISS x,x/m32 はい はい[i] いいえ いいえ いいえ COMISD x,x/m64 はい はい[i] いいえ いいえ いいえ SAE
パックされた浮動小数点符号マスクを抽出する 0F 50 /r MOVMSKPS r32,x はい いいえ[l] いいえ いいえ いいえ MOVMSKPD r32,x はい いいえ[l] いいえ いいえ いいえ 該当なし
浮動小数点平方根 0F 51 /r SQRTPS x,x/m128 はい はい SQRTSS x,x/m32 はい はい SQRTPD x,x/m128 はい はい SQRTSD x,x/m64 はい はい RC
逆平方根近似値[m] 0F 52 /r RSQRTPS x,x/m128 はい いいえ[n] RSQRTSS x,x/m32 はい いいえ[n] いいえ いいえ いいえ[n] いいえ いいえ いいえ[n] 該当なし
逆数近似値[m] 0F 53 /r RCPPS x,x/m128 はい いいえ[o] RCPSS x,x/m32 はい いいえ[o] いいえ いいえ いいえ[o] いいえ いいえ いいえ[o] 該当なし
ベクトルのビット単位のAND 0F 54 /r ANDPS x,x/m128 はい (DQ)[p] いいえ いいえ いいえ ANDPD x,x/m128 はい (DQ)[p] いいえ いいえ いいえ いいえ
ベクトルのビットごとのAND-NOT 0F 55 /r ANDNPS x,x/m128 はい (DQ)[p] いいえ いいえ いいえ ANDNPD x,x/m128 はい (DQ)[p] いいえ いいえ いいえ いいえ
ベクトルのビット単位のOR 0F 56 /r ORPS x,x/m128 はい (DQ)[p] いいえ いいえ いいえ ORPD x,x/m128 はい (DQ)[p] いいえ いいえ いいえ いいえ
ベクトルビット単位のXOR [q] 0F 57 /r XORPS x,x/m128 はい (DQ)[p] いいえ いいえ いいえ XORPD x,x/m128 はい (DQ)[p] いいえ いいえ いいえ いいえ
浮動小数点加算 0F 58 /r ADDPS x,x/m128 はい はい ADDSS x,x/m32 はい はい ADDPD x,x/m128 はい はい ADDSD x,x/m64 はい はい RC
浮動小数点乗算 0F 59 /r MULPS x,x/m128 はい はい MULSS x,x/m32 はい はい MULPD x,x/m128 はい はい MULSD x,x/m64 はい はい RC
浮動小数点形式間の変換
(FP32→FP64、FP64→FP32)
0F 5A /r CVTPS2PD x,x/m64
(SSE2)
はい はい[r] CVTSS2SD x,x/m32
(SSE2)
はい はい[r] CVTPD2PS x,x/m128 はい はい[r] CVTSD2SS x,x/m64 はい はい[r] SAE、
RC [秒]
浮動小数点減算 0F 5C /r SUBPS x,x/m128 はい はい SUBSS x,x/m32 はい はい SUBPD x,x/m128 はい はい SUBSD x,x/m64 はい はい RC
浮動小数点最小値[t] 0F 5D /r MINPS x,x/m128 はい はい MINSS x,x/m32 はい はい MINPD x,x/m128 はい はい MINSD x,x/m64 はい はい SAE
浮動小数点除算 0F 5E /r DIVPS x,x/m128 はい はい DIVSS x,x/m32 はい はい DIVPD x,x/m128 はい はい DIVSD x,x/m64 はい はい RC
浮動小数点最大値[t] 0F 5F /r MAXPS x,x/m128 はい はい MAXSS x,x/m32 はい はい MAXPD x,x/m128 はい はい MAXSD x,x/m64 はい はい SAE
浮動小数点比較。結果は、SSE/AVXでは全0/全1の値(比較が真の場合、全1)としてベクターレジスタに書き込まれ、AVX-512ではopmaskレジスタに書き込まれる。比較関数はimm8引数で指定される。[u] 0F C2 /r ib CMPPS x,x/m128,imm8 はい はい CMPSS x,x/m32,imm8 はい はい CMPPD x,x/m128,imm8 はい はい CMPSD x,x/m64,imm8
[c]
はい はい SAE
パックされたインターリーブシャッフル。

2 つの入力引数のそれぞれに対してシャッフルを実行し、最初の引数からのシャッフル結果の下半分と、2 番目の引数からのシャッフル結果の上半分を保持します。

0F C6 /r ib SHUFPS x,x/m128,imm8[女性] はい はい いいえ いいえ いいえ SHUFPD x,x/m128,imm8[女性] はい はい いいえ いいえ いいえ いいえ
  1. ^ abcdef この表に記載されているスカラー命令のVEXプレフィックスエンコード版は、VEX.L=0でエンコードする必要があります。これらの命令のいずれかにVEX.L=1を設定することは可能ですが、Intel SDMでは「異なるプロセッサー世代間で予測不可能な動作」と説明されている動作が発生します。これは、V(U)COMISSおよびのVEXエンコード版にも適用されますV(U)COMISD。(この動作は、この表に含まれないスカラー命令、例えばVMOVD/には適用されませんVMOVQ。この場合、VEX.L=1は#UD例外を引き起こします。)
  2. ^ abcdefgh 、、の EVEX エンコード版はopmask をサポートしますブロードキャストをサポートしません。VMOVAPSVMOVUPSVMOVAPDVMOVUPD
  3. ^ abc SSE2 MOVSD(MOVe Scalar Double-precision) 命令と(CoMPare Scalar Double-precision) 命令は、古い i386 (MOVe String Doubleword) 命令と(CoMPare String Doubleword) 命令CMPSDと同じ名前ですが、その動作はまったく無関係です。MOVSDCMPSD

    アセンブリ言語レベルでは、XMM レジスタ オペランドの使用によって区別できます。

  4. ^ abcdefghijklmnopqrst VEX または EVEX プレフィックスでエンコードされた 、、、、、のバリアントの場合サポートされるベクトル長は 128 ビット (VEX.L=0 または EVEX.L=0)のみですVMOVLPSVMOVHPSVMOVLPDVMOVHPDVMOVLHPSVMOVHLPS

    EVEX エンコードバリアントでは、ブロードキャストおよび opmask はサポートされていません。

  5. ^ abc 、、命令は規則的にエンコードされたスカラーSSE1/2命令ではなく、不規則に割り当てられたSSE3ベクター命令です。これらの命令の説明については、以下の表を参照してください。MOVSLDUPMOVSHDUPMOVDDUP
  6. ^ abcdefghij 、、命令については、ベクトル長が 128 ビットより広いエンコーディングが AVX2 および AVX-512 で使用できますが、このようなエンコーディングの操作は 128 ビット レーンごとに分割され、各 128 ビット レーンでは内部的に命令の 128 ビット版と同じ操作が実行されます (ただし、 の場合、各 128 ビット レーンでは命令の imm8 引数の異なる 2 ビット部分が使用されます)。VUNPCK*VSHUFPSVSHUFPDVSHUFPD
  7. ^ ab 命令CVTPI2PSCVTPI2PD命令は、メモリまたはMMXレジスタから2つの32ビット符号付き整数のベクトルを入力データとして受け取ります。ソースオペランドがメモリオペランドであっても、x87→MMX遷移が発生します。

    xmm/ymm/zmm レジスタまたは 64 ビットより広いベクトルを入力引数として受け入れることができるベクトル int→FP 変換の場合、SSE2 は次の不規則に割り当てられた命令を提供します (下の表を参照)。

    • CVTDQ2PS0F 5B /r
    • CVTDQ2PDF3 0F E6 /r
    これらは AVX/AVX-512 拡張形式にも存在します。
  8. ^ ab および命令の場合、64 ビット ソース引数を持つバリアントは 64 ビット ロング モードでのみ使用可能であり、REX.W、VEX.W、または EVEX.W を 1 に設定する必要があります。(V)CVTSI2SS(V)CVTSI2SD

    32 ビット モードでは、VEX.W または EVEX.W が 1 に設定されている場合でも、ソース引数は常に 32 ビットになります。

  9. ^ abcdefghijkl EVEXエンコードされた変種の
    • VMOVNTPSVMOVNTSS
    • VCOMISS、、、、VCOMISDVUCOMISSVUCOMISD
    • VCVTSI2SSVCTSI2SD
    • VCVT(T)SS2SIVCVT(T)SD2SI
    opmasks もブロードキャストもサポートしません。
  10. ^ abcd および命令はCVT(T)PS2PICVT(T)PD2PIその結果を 2 つの 32 ビット符号付き整数のベクトルとして MMX レジスタに書き込みます。

    結果を xmm/ymm/zmm レジスタに書き込むことができるベクトル FP→int 変換の場合、SSE2 は次の不規則に割り当てられた命令を提供します (下の表を参照)。

    • CVTPS2DQ66 0F 5B /r
    • CVTTPS2DQF3 0F 5B /r
    • CVTPD2DQF2 0F E6 /r
    • CVTTPD2DQ66 0F E6 /r
    これらは AVX/AVX-512 拡張形式にも存在します。
  11. ^ abcd および命令の場合、64 ビットの宛先レジスタを持つバリアントは 64 ビット長モードでのみ使用でき、REX.W、VEX.W、または EVEX.W を 1 に設定する必要があります。(V)CVT(T)SS2SI(V)CVT(T)SD2SI

    32 ビット モードでは、VEX.W または EVEX.W が 1 に設定されている場合でも、宛先レジスタは常に 32 ビットになります。

  12. ^ ab この命令はEVEXエンコードできません。AVX512DQでは、パックされた浮動小数点符号ビットの抽出は、代わりに 命令と 命令で行うことができVPMOVD2MますVPMOVQ2M
  13. ^ ab 、、(V)RCPSS近似命令は(V)RCPPS最大 の相対誤差で結果を計算します。正確な計算は実装依存であり、x86 CPU ごとに異なることが知られています。[11](V)RSQRTSS(V)RSQRTPS ± 1.5 2 12 {\displaystyle \pm 1.5*2^{-12}}
  14. ^ abcd この命令はEVEXエンコードできません。代わりに、AVX512FはEVEX.66.0F38 4E/4F /r新しいVRSQRT14*逆平方根近似命令用に異なるオペコード - - を提供します。

    AVX-512VRSQRT14*命令と従来のSSE/AVX(V)RSQRT*命令の主な違いは、AVX-512VRSQRT14*命令では、Intelが提供するCリファレンスモデルを使用して、ビット単位で演算が定義されていることです。[12]

  15. ^ abcd この命令はEVEXエンコードできません。代わりに、AVX512FはEVEX.66.0F38 4C/4D /r新しいVRCP14*逆数近似命令用に異なるオペコード - - を提供します。

    AVX-512VRCP14*命令と従来のSSE/AVX(V)RCP*命令の主な違いは、AVX-512VRRCP14*命令では、Intelが提供するCリファレンスモデルを使用して、ビット単位で演算が定義されていることです。[12]

  16. ^ abcdefgh 、、、、、、、命令の EVEX エンコード バージョンはAVX512Fサブセットの一部としてはなく、AVX512DQ サブセットの一部として導入されましたVANDPSVANDPDVANDNPSVANDNPDVORPSVORPDVXORPSVXORPD
  17. 両方のソースオペランドが同じレジスタである^XORPS /は、レジスタをゼロにするイディオムとして一般的に使用され、ほとんどのx86 CPUでは、ソース引数に依存しない命令として認識されます。AVXまたはAVX-512では、この目的のために128ビット形式の を使用することが推奨されています。これにより、一部のCPUでは、256ビットまたは512ビットのベクターレジスタ全体のレジスタをゼロにしながら、より広い形式よりもマイクロオペレーション数が少なくなります。[13]VXORPS
    VXORPS
  18. ^ abcd異なる幅の FP 形式間の変換の EVEX エンコードされたバリアントの場合、opmask レーンの幅は結果の形式によって決まります。 の場合は 64 ビット、の場合は 32 ビットですVCVTPS2PDVCVTSS2SDVCVTPD2PSVCVTSS2SD
  19. ^ FP→FPの拡大変換(CVTPS2PD、、、)はSAE修飾子をサポートします。縮小変換(、 )CVTSS2SDRC修飾子をサポートします。VCVTPH2PDVCVTSH2SDCVTPD2PSCVTSD2SS
  20. ^ ab 浮動小数点最小値命令および最大値命令において(V)MIN*、 2つの入力オペランドが両方ともゼロであるか、少なくとも1つの入力オペランドがNaNである場合、2番目の入力オペランドが返されます。これは、for maximum-valueやfor minimum-value(V)MAX*などの一般的なCプログラミング言語式の動作と一致します((op1)>(op2)?(op1):(op2))((op1)<(op2)?(op1):(op2))
  21. ^ SIMD 浮動小数点比較の場合、imm8 引数の形式は次のとおりです。
    ビット 使用法
    1:0 基本的な比較述語
    2 比較結果を反転する
    3 順序がない場合は比較結果を反転する(VEX/EVEXのみ)
    4 信号動作を反転する(VEX/EVEXのみ)

    基本的な比較述語は次のとおりです。

    価値 意味
    00b 同等(非シグナリング)
    01b より小さい(シグナリング)
    10b 以下(シグナリング)
    11b 順序なし(非シグナリング)

    入力のいずれかが QNaN の場合、シグナリング比較では例外が発生します。

66h プレフィックスを持つ整数 SSE2/4 命令、およびそれらの AVX/AVX-512 拡張バリアント

これらの命令にはMMX形式がなく、プレフィックスなしのエンコードはサポートされていません。これらの命令のほとんどには、VEXエンコード形式とEVEXエンコード形式の拡張バリアントが用意されています。

  • VEXエンコード形式はAVX/AVX2で利用可能です。AVXでは、ベクトル長128ビット(VEX.L=0エンコード)のみ利用可能です。AVX2では、(「L=0」と記された例外を除き)ベクトル長256ビットでも利用可能です。
  • EVEX エンコード形式は AVX-512 で使用できます。各命令に必要な特定の AVX-512 サブセットが命令とともにリストされます。
説明 命令のニーモニック 基本オペコード SSE(66hプレフィックス) AVX
(VEX.66プレフィックス)
AVX-512 (EVEX.66 プレフィックス)
サポートされている サブセット レーン bcst
SSE2で追加
下位64ビット整数をアンパックしてインターリーブする (V)PUNPCKLQDQ xmm,xmm/m128[あ] 0F 6C /r はい はい はい(W=1) F 64 64
上位64ビット整数をアンパックしてインターリーブする (V)PUNPCKHQDQ xmm,xmm/m128[あ] 0F 6D /r はい はい はい(W=1) F 64 64
128ビットの符号なし整数を指定されたバイト数だけ右シフトする (V)PSRLDQ xmm,imm8[あ] 0F 73 /3 ib はい はい はい 白黒 いいえ いいえ
128ビット整数を指定されたバイト数だけ左シフトする (V)PSLLDQ xmm,imm8[あ] 0F 73 /7 ib はい はい はい 白黒 いいえ いいえ
64ビットのスカラー値をxmmレジスタからxmmレジスタまたはメモリに移動します (V)MOVQ xmm/m64,xmm 0F D6 /r はい はい(L=0) はい
(L=0、W=1)
F いいえ いいえ
SSE4.1で追加
可変ブレンド パック バイト。

結果の各バイト レーンについて、対応するバイト レーンの最上位ビットに応じて、最初の引数または 2 番目の引数から値を選択しますXMM0

PBLENDVB xmm,xmm/m128
PBLENDVB xmm,xmm/m128,XMM0[b]
0F38 10 /r はい いいえ[c] いいえ[d] 該当なし 該当なし 該当なし
パック整数を符号拡張して、より幅の広いパック整数にする 8ビット → 16ビット (V)PMOVSXBW xmm,xmm/m64 0F38 20 /r はい はい はい 白黒 16 いいえ
8ビット → 32ビット (V)PMOVSXBD xmm,xmm/m32 0F38 21 /r はい はい はい F 32 いいえ
8ビット → 64ビット (V)PMOVSXBQ xmm,xmm/m16 0F38 22 /r はい はい はい F 64 いいえ
16ビット → 32ビット (V)PMOVSXWD xmm,xmm/m64 0F38 23 /r はい はい はい F 32 いいえ
16ビット → 64ビット (V)PMOVSXWQ xmm,xmm/m32 0F38 24 /r はい はい はい F 64 いいえ
32ビット → 64ビット (V)PMOVSXDQ xmm,xmm/m64 0F38 25 /r はい はい はい(W=0) F 64 いいえ
パックされた 32 ビットの符号付き整数を乗算し、完全な 64 ビットの結果を保存します。

入力整数は、各 64 ビット ベクトル レーンの下位 32 ビットから取得されます。

(V)PMULDQ xmm,xmm/m128 0F38 28 /r はい はい はい(W=1) F 64 64
パックされた64ビット整数が等しいかどうかを比較する (V)PCMPEQQ xmm,xmm/m128 0F38 29 /r はい はい はい(W=1)[e] F 64 64
メモリからの整列した非時間的ベクトルのロード。[f] (V)MOVNTDQA xmm,m128 0F38 2A /r はい はい はい(W=0) F いいえ いいえ
32ビットの符号なし整数を飽和ありで16ビットにパックする (V)PACKUSDW xmm, xmm/m128[あ] 0F38 2B /r はい はい はい(W=0) 白黒 16 32
ゼロ拡張されたパック整数をより広いパック整数にする 8ビット → 16ビット (V)PMOVZXBW xmm,xmm/m64 0F38 30 /r はい はい はい 白黒 16 いいえ
8ビット → 32ビット (V)PMOVZXBD xmm,xmm/m32 0F38 31 /r はい はい はい F 32 いいえ
8ビット → 64ビット (V)PMOVZXBQ xmm,xmm/m16 0F38 32 /r はい はい はい F 64 いいえ
16ビット → 32ビット (V)PMOVZXWD xmm,xmm/m64 0F38 33 /r はい はい はい F 32 いいえ
16ビット → 64ビット (V)PMOVZXWQ xmm,xmm/m32 0F38 34 /r はい はい はい F 64 いいえ
32ビット → 64ビット (V)PMOVZXDQ xmm,xmm/m64 0F38 35 /r はい はい はい(W=0) F 64 いいえ
符号付き整数の最小値 8ビット (V)PMINSB xmm,xmm/m128 0F38 38 /r はい はい はい 白黒 8 いいえ
32ビット (V)PMINSD xmm,xmm/m128 0F38 39 /r PMINSD VPMINSD VPMINSD(W0) F 32 32
64ビット VPMINSQ xmm,xmm/m128(AVX-512) VPMINSQ(W1) F 64 64
符号なし整数の最小値(パック) 16ビット (V)PMINUW xmm,xmm/m128 0F38 3A /r はい はい はい 白黒 16 いいえ
32ビット (V)PMINUD xmm,xmm/m128
0F38 3B /r PMINUD VPMINUD VPMINUD(W0) F 32 32
64ビット VPMINUQ xmm,xmm/m128(AVX-512) VPMINUQ(W1) F 64 64
符号付き整数の最大値(パック) 8ビット (V)PMAXSB xmm,xmm/m128 0F38 3C /r はい はい はい 白黒 8 いいえ
32ビット (V)PMAXSD xmm,xmm/m128 0F38 3D /r PMAXSD VPMAXSD VPMAXSD(W0) F 32 32
64ビット VPMAXSQ xmm,xmm/m128(AVX-512) VPMAXSQ(W1) F 64 64
符号なし整数の最大値(パック) 16ビット (V)PMAXUW xmm,xmm/m128 0F38 3E /r はい はい はい 白黒 16 いいえ
32ビット (V)PMAXUD xmm,xmm/m128
0F38 3F /r PMAXUD VPMAXUD VPMAXUD(W0) F 32 32
64ビット VPMAXUQ xmm,xmm/m128(AVX-512) VPMAXUQ(W1) F 64 64
パックされた 32/64 ビット整数を乗算し、結果の下位半分を保存します。 (V)PMULLD mm,mm/m64
PMULLQ xmm,xmm/m128(AVX-512)
0F38 40 /r PMULLD VPMULLD VPMULLD(W0) F 32 32
VPMULLQ(W1) 失格 64 64
パックされた水平ワードの最小値

16 ビットの符号なし整数のパックされたベクトル内で最小の 16 ビット整数を見つけ、結果ベクトルの下位 2 つの 16 ビット レーンにその整数とそのインデックスを返します。

(V)PHMINPOSUW xmm,xmm/m128 0F38 41 /r はい はい(L=0) いいえ 該当なし 該当なし 該当なし
ブレンドパックされた単語。

結果の 16 ビット レーンごとに、imm8 の対応するビットに応じて、最初のソース引数または 2 番目のソース引数から 16 ビット値を選択します。

(V)PBLENDW xmm,xmm/m128,imm8[あ] 0F3A 0E /r ib はい はい[g] いいえ[h] 該当なし 該当なし 該当なし
ベクトル レジスタのインデックス レーンから整数を抽出し、GPR またはメモリに格納します。

GPR に保存される場合はゼロ拡張されます。

8ビット (V)PEXTRB r32/m8,xmm,imm8[私] 0F3A 14 /r ib はい はい(L=0) はい(L=0) 白黒 いいえ いいえ
16ビット (V)PEXTRW r32/m16,xmm,imm8[私] 0F3A 15 /r ib はい はい(L=0) はい(L=0) 白黒 いいえ いいえ
32ビット (V)PEXTRD r/m32,xmm,imm8 0F3A 16 /r ib はい はい
(L=0,W=0) [j]
はい
(L=0、W=0)
失格 いいえ いいえ
64ビット
(x86-64)
(V)PEXTRQ r/m64,xmm,imm8 はい
(REX.W)
はい
(L=0、W=1)
はい
(L=0、W=1)
失格 いいえ いいえ
汎用レジスタからの整数をベクトルレジスタのインデックスレーンに挿入する 8ビット (V)PINSRB xmm,r32/m8,imm8[k] 0F3A 20 /r ib はい はい(L=0) はい(L=0) 白黒 いいえ いいえ
32ビット (V)PINSRD xmm,r32/m32,imm8 0F3A 22 /r ib はい はい
(L=0,W=0) [j]
はい
(L=0、W=0)
失格 いいえ いいえ
64ビット
(x86-64)
(V)PINSRQ xmm,r64/m64,imm8 はい
(REX.W)
はい
(L=0、W=1)
はい
(L=0、W=1)
失格 いいえ いいえ
絶対差の複数のパック合計を計算します。

この命令の128ビット形式は、最初のソース引数の4バイトのグループと、2番目のソースオペランドの連続する4バイトのグループから、8つの絶対差の合計を計算し、その合計をデスティネーションレジスタの16ビットレーンに書き込みます。2つのソース引数src1とをsrc2uint8値の16エントリ配列2つとみなし、をtempuint16値の8エントリ配列とみなすと、命令の動作は次のようになります。

i = 0 から 7 まで
    温度[i] := 0
    j = 0から3の場合
         a := src1[ i+(imm8[2]*4)+j ]
         b := src2[ (imm8[1:0]*4)+j ]
         temp[i] := temp[i] + abs(ab)
    終わり
終わり
夏時間 := 温度

AVX2 および AVX10.2 でのこの命令のより広い形式の場合、操作は 128 ビットのレーンごとに分割され、各レーンでは内部的に命令の 128 ビット版と同じ操作が実行されます。ただし、奇数レーンでは imm8 のビット 2:0 ではなくビット 5:3 が使用される点が異なります。

(V)MPSADBW xmm,xmm/m128,imm8 0F3A 42 /r ib はい はい はい(W=0) 10.2 [l] 16 いいえ
SSE 4.2で追加
パックされた64ビット符号付き整数を比較し、より大きいか (V)PCMPGTQ xmm, xmm/m128 0F38 37 /r はい はい はい(W=1)[e] F 64 64
明示的な長さの文字列をパック比較し、マスクを返す (V)PCMPESTRM xmm,xmm/m128,imm8 0F3A 60 /r ib はい[m] はい(L=0) いいえ 該当なし 該当なし 該当なし
明示的な長さの文字列をパック比較し、インデックスを返す (V)PCMPESTRI xmm,xmm/m128,imm8 0F3A 61 /r ib はい[m] はい(L=0) いいえ 該当なし 該当なし 該当なし
暗黙的な長さの文字列をパック比較し、マスクを返す (V)PCMPISTRM xmm,xmm/m128,imm8 0F3A 62 /r ib はい[m] はい(L=0) いいえ 該当なし 該当なし 該当なし
暗黙的な長さの文字列をパック比較し、インデックスを返す (V)PCMPISTRI xmm,xmm/m128,imm8 0F3A 63 /r ib はい[m] はい(L=0) いいえ 該当なし 該当なし 該当なし
  1. ^ abcdef 、、、および命令については、ベクトル長が 128 ビットを超えるエンコーディングがAVX2 および/または AVX-512 で使用できますが、このようなエンコーディングの操作は 128 ビットのレーンごとに分割され各 128 ビット レーンでは内部的に命令の 128 ビット版と同じ操作が実行されます。(V)PUNPCK*(V)PACKUSDW(V)PBLENDW(V)PSLLDQ(V)PSLRDQ
  2. ^ アセンブラは、3 番目の引数としてwith または without を受け入れる場合があります。PBLENDVBXMM0
  3. ^ オペコード の命令はVEXエンコードできません。AVXはに似た命令を提供していますが、オペコードとオペランドエンコードが異なります( )PBLENDVB66 0F38 10 /rVPBLENDVBPBLENDVBVEX.66.0F3A.W0 4C /r /is4
  4. ^ オペコードはEVEXエンコードできません。AVX-512では、命令(オペコード)でパックバイトの可変長混合が可能ですVPBLENDMBEVEX.66.0F38.W0 66 /r
  5. ^ ab および命令のEVEXエンコード版は、結果をAVX-512 opmaskレジスタに書き込みます。これは、比較結果をオール0/オール1のベクトルとして通常のmm/xmm/ymmベクトルレジスタに書き込む、EVEXエンコード版以外の旧バージョンとは異なります。VPCMPEQ*VPCMPGT*
  6. ^ によって実行されるロードは(V)MOVNTDQA弱順序付けされています。他のロード、ストア、さらには s- に対して順序付けを変更して、LOCK他のロード/ストアに対する順序付けを強制したり、MFENCEシリアル化したりすることができます。

    をキャッシュされていないメモリで使用すると(V)MOVNTDQA、実際に要求されたデータの周囲のキャッシュ ライン サイズのデータ​​ ブロックをフェッチすることがあります。後続の(V)MOVNTDQA命令では、 またはシリアル化によって区切られていない限り、この方法でフェッチされたブロックからデータを返すことがありますMFENCE

  7. ^ AVX の場合、命令VBLENDPSVPBLENDD命令を使用して 32 ビット レーンとのブレンドを実行できるため、1 つの imm8 マスクを繰り返しなしで 256 ビット ベクトル全体に広げることができます。
  8. ^ オペコードはEVEXエンコードできません。AVX-512では、パックドワードの可変長混合はVPBLENDMW命令(オペコードEVEX.66.0F38.W1 66 /r)で実行できます。
  9. ^ ab および の(V)PEXTRB場合(V)PEXTRW、宛先引数がレジスタであれば、抽出された 8/16 ビット値は 32/64 ビットにゼロ拡張されます。
  10. ^ ab 非64ビットモードの命令および命令については、Intel [14]のCPUではVEX.W=1でエンコードできることが文書化されているが、AMD [15]のCPUではできない(ただし、これには例外があり、例えばBulldozerはそのようなエンコードを許可している[16] 、 Sandy Bridgeは許可していない[17]64ビットモードでは、これらの命令はIntelとAMDの両方のプロセッサでVEX.W=0を必要とする — VEX.W=1のエンコードは/として解釈されるVPEXTRDVPINSRD
    VPEXTRQVPINSRQ
  11. ^ へのレジスタソース引数の場合(V)PINSRB、引数は8ビットレジスタではなく、下位8ビットが使用される32ビットレジスタとみなされます。つまり、AH/BH/CH/DHを へのソース引数として指定することはできません(V)PINSRB
  12. ^ EVEX エンコードされたVMPSADBW命令のバリアントは、AVX10.2 がサポートされている場合にのみ使用できます。
  13. ^ abcd SSE4.2 パック文字列比較PCMP*STR*命令では、従来の SSE エンコーディングを使用している場合でも、16 バイトのメモリオペランドが不整列であっても許容されます。

その他のSSE/2/3/4 SIMD命令、およびそれらのAVX/AVX-512拡張版

上記のいずれのグループにも当てはまらないSSE SIMD命令。これらの命令の多くはAVX/AVX-512拡張形式を持ちます。特に明記されていない限り(L=0または脚注)、これらの拡張形式はAVXでは128/256ビット演算、AVX-512では128/256/512ビット演算をサポートします。

説明 命令のニーモニック 基本オペコード   南南東   AVX
(VEXプレフィックス)
AVX-512 (EVEX プレフィックス)
サポートされている サブセット レーン bcst rc/sae
SSEで追加
MXCSR(メディア拡張制御およびステータスレジスタ)をメモリからロードします。 (V)LDMXCSR m32 NP 0F AE /2 はい はい
(L=0)
いいえ 該当なし 該当なし 該当なし 該当なし
MXCSRをメモリに保存する (V)STMXCSR m32 NP 0F AE /3 はい はい
(L=0)
いいえ 該当なし 該当なし 該当なし 該当なし
SSE2で追加
64ビットデータ項目をMMXレジスタからXMMレジスタの下位半分に移動します。上位半分はゼロに設定されます。 MOVQ2DQ xmm,mm F3 0F D6 /r はい いいえ いいえ 該当なし 該当なし 該当なし 該当なし
64 ビットのデータ項目を XMM レジスタの下位半分から MMX レジスタに移動します。 MOVDQ2Q mm,xmm F2 0F D6 /r はい いいえ いいえ 該当なし 該当なし 該当なし 該当なし
メモリまたはXMMレジスタから64ビット整数をXMMレジスタの下位64ビットにゼロ埋めでロードする (V)MOVQ xmm,xmm/m64 F3 0F 7E /r はい はい(L=0) はい(L=0、W=1) F いいえ いいえ いいえ
非整列メモリまたはベクトルレジスタからのベクトルロード (V)MOVDQU xmm,xmm/m128 F3 0F 6F /r はい はい VMOVDQU64(W1) F 64 いいえ いいえ
VMOVDQU32(W0) F 32 いいえ いいえ
F2 0F 6F /r いいえ いいえ VMOVDQU16(W1) 白黒 16 いいえ いいえ
VMOVDQU8(W0) 白黒 8 いいえ いいえ
非整列メモリまたはベクトルレジスタへのベクトルストア (V)MOVDQU xmm/m128,xmm F3 0F 7F /r はい はい VMOVDQU64(W1) F 64 いいえ いいえ
VMOVDQU32(W0) F 32 いいえ いいえ
F2 0F 7F /r いいえ いいえ VMOVDQU16(W1) 白黒 16 いいえ いいえ
VMOVDQU8(W0) 白黒 8 いいえ いいえ
ソースベクトルの上位4つの16ビットレーンをシャッフルし、結果を宛先ベクトルの上位半分に配置する (V)PSHUFHW xmm,xmm/m128,imm8[あ] F3 0F 70 /r ib はい はい[b] はい 白黒 16 いいえ いいえ
ソースベクトルの下位4つの16ビットレーンをシャッフルし、結果を宛先ベクトルの下半分に配置する (V)PSHUFLW xmm,xmm/m128,imm8[あ] F2 0F 70 /r ib はい はい[b] はい 白黒 16 いいえ いいえ
パックされた符号付き32ビット整数をFP32に変換する (V)CVTDQ2PS xmm,xmm/m128 NP 0F 5B /r はい はい はい(W=0) F 32 32 RC
パックされた FP32 値をパックされた符号付き 32 ビット整数に変換する (V)CVTPS2DQ xmm,xmm/m128 66 0F 5B /r はい はい はい(W=0) F 32 32 RC
パックされたFP32値を、ゼロに丸めてパックされた符号付き32ビット整数に変換します。 (V)CVTTPS2DQ xmm,xmm/m128 F3 0F 5B /r はい はい はい(W=0) F 32 32 SAE
パックされたFP64値を、ゼロに丸めてパックされた符号付き32ビット整数に変換します。 (V)CVTTPD2DQ xmm,xmm/m64 66 0F E6 /r はい はい はい(W=1) F 32 64 SAE
パックされた符号付き32ビット整数をFP64に変換する (V)CVTDQ2PD xmm,xmm/m64 F3 0F E6 /r はい はい はい(W=0) F 64 32 RC [c]
パックされた FP64 値をパックされた符号付き 32 ビット整数に変換する (V)CVTPD2DQ xmm,xmm/m128 F2 0F E6 /r はい はい はい(W=1) F 32 64 RC
SSE3で追加
偶数レーンの浮動小数点値を次の奇数レーンに複製する 32ビット (V)MOVSLDUP xmm,xmm/m128 F3 0F 12 /r はい はい はい(W=0) F 32 いいえ いいえ
64ビット (V)MOVDDUP xmm/xmm/m128 F2 0F 12 /r はい はい はい(W=1) F 64 いいえ いいえ
奇数レーンから次の偶数レーンに FP32 値を複製します。 (V)MOVSHDUP xmm,xmm/m128 F3 0F 16 /r はい はい はい(W=0) F 32 いいえ いいえ
浮動小数点値のパックされたペアワイズ水平加算 32ビット (V)HADDPS xmm,xmm/m128[あ] F2 0F 7C /r はい はい いいえ 該当なし 該当なし 該当なし 該当なし
64ビット (V)HADDPD xmm,xmm/m128[あ] 66 0F 7C /r はい はい いいえ 該当なし 該当なし 該当なし 該当なし
浮動小数点値のパックされたペアワイズ水平減算 32ビット (V)HSUBPS xmm,xmm/m128[あ] F2 0F 7D /r はい はい いいえ 該当なし 該当なし 該当なし 該当なし
64ビット (V)HSUBPD xmm,xmm/m128[あ] 66 0F 7D /r はい はい いいえ 該当なし 該当なし 該当なし 該当なし
パックされた浮動小数点の加算/減算を交互にレーンごとに実行します。偶数レーン(0から数える)では減算が行われ、奇数レーンでは加算が行われます。 32ビット (V)ADDSUBPS xmm,xmm/m128 F2 0F D0 /r はい はい いいえ 該当なし 該当なし 該当なし 該当なし
64ビット (V)ADDSUBPD xmm,xmm/m128 66 0F D0 /r はい はい いいえ 該当なし 該当なし 該当なし 該当なし
より緩いセマンティクスを持つ、アラインメントされていないメモリからのベクトル ロード(V)MOVDQU

とは異なり(V)MOVDQU、データを複数回フェッチしたり、不整列アクセスの場合は、実際に要求されたデータの下または上にある次の 16/32 バイトのアラインメント境界まで追加データをフェッチしたりすることがあります。

(V)LDDQU xmm,m128 F2 0F F0 /r はい はい いいえ 該当なし 該当なし 該当なし 該当なし
SSE4.1で追加
ベクトル論理テスト。

第一オペランドと第二オペランドのビット単位の論理積がすべて0の場合はZF=1、そうでない場合はZF=0を設定します。第二オペランドと第一オペランドのビット単位の論理積がすべて0の場合はCF=1、そうでない場合はCF=0を設定します。

(V)PTEST xmm,xmm/m128 66 0F38 17 /r はい はい いいえ[d] 該当なし 該当なし 該当なし 該当なし
変数ブレンドのパックされた浮動小数点値。

結果の各レーンについて、対応するレーンの最上位ビットに応じて、最初の引数または 2 番目の引数から値を選択しますXMM0

32ビット BLENDVPS xmm,xmm/m128
BLENDVPS xmm,xmm/m128,XMM0[e]
66 0F38 14 /r はい いいえ[f] いいえ 該当なし 該当なし 該当なし 該当なし
64ビット BLENDVPD xmm,xmm/m128
BLENDVPD xmm,xmm/m128,XMM0[e]
66 0F38 15 /r はい いいえ[f] いいえ 該当なし 該当なし 該当なし 該当なし
パックされた浮動小数点値を整数に丸めます。

imm8 引数で指定された丸めモード。

32ビット (V)ROUNDPS xmm,xmm/m128,imm8 66 0F3A 08 /r ib はい はい いいえ[g] 該当なし 該当なし 該当なし 該当なし
64ビット (V)ROUNDPD xmm,xmm/m128,imm8 66 0F3A 09 /r ib はい はい いいえ[g] 該当なし 該当なし 該当なし 該当なし
スカラー浮動小数点値を整数に丸めます。 32ビット (V)ROUNDSS xmm,xmm/m128,imm8 66 0F3A 0A /r ib はい はい いいえ[g] 該当なし 該当なし 該当なし 該当なし
64ビット (V)ROUNDSD xmm,xmm/m128,imm8 66 0F3A 0B /r ib はい はい いいえ[g] 該当なし 該当なし 該当なし 該当なし
パックされた浮動小数点値をブレンドします。結果の各レーンについて、対応するimm8ビットに応じて、最初の引数または2番目の引数から値を選択します。 32ビット (V)BLENDPS xmm,xmm/m128,imm8 66 0F3A 0C /r ib はい はい いいえ 該当なし 該当なし 該当なし 該当なし
64ビット (V)BLENDPD xmm,xmm/m128,imm8 66 0F3A 0D /r ib はい はい いいえ 該当なし 該当なし 該当なし 該当なし
XMM レジスタの 32 ビット レーンを汎用レジスタまたはメモリ ロケーションに抽出します。

imm8のビット[1:0]はレーンを選択するために使用されます。

(V)EXTRACTPS r/m32,xmm,imm8 66 0F3A 17 /r ib はい はい(L=0) はい(L=0) F いいえ いいえ いいえ
ソース XMM レジスタまたはメモリから 32 ビット値を取得し、宛先 XMM レジスタの指定されたレーン内に挿入します。

ソース引数がXMMレジスタの場合、imm8のビット[7:6]を使用して、どの32ビットレーンからソースを選択するかを選択します。それ以外の場合は、指定された32ビットメモリ値が使用されます。この32ビット値は、imm8のビット[5:4]で指定された宛先レジスタレーンに挿入されます。挿入後、宛先レジスタの各32ビットレーンは、オプションでゼロクリアできます。imm8のビット[3:0]は、ゼロクリアするレーンのビットマップを提供します。

(V)INSERTPS xmm,xmm/m32,imm8 66 0F3A 21 /r ib はい はい(L=0) はい(L=0、W=0) F いいえ いいえ いいえ
32 ビット浮動小数点値の 4 成分のドット積。

imm8のビット[7:4]は、どのレーンがドット積に参加​​するかを指定し、ビット[3:0]は、結果のどのレーンがドット積を受け取るかを指定します(残りのレーンはゼロで埋められます)

(V)DPPS xmm,xmm/m128,imm8[あ] 66 0F3A 40 /r ib はい はい いいえ 該当なし 該当なし 該当なし 該当なし
64 ビット浮動小数点値の 2 成分ドット積。

imm8のビット[5:4]は、どのレーンがドット積に参加​​するかを指定し、ビット[1:0]は、結果のどのレーンがドット積を受け取るかを指定します(残りのレーンはゼロで埋められます)

(V)DPPD xmm,xmm/m128,imm8[あ] 66 0F3A 41 /r ib はい はい いいえ 該当なし 該当なし 該当なし 該当なし
SSE4a で追加 (AMD のみ)
XMM レジスタの下位 64 ビットを使用した 64 ビット ビットフィールド挿入。

最初の引数はビットフィールドを挿入する XMM レジスタであり、2 番目の引数は挿入するビットフィールド (ビット 0 から開始) を含むソース レジスタです。

4引数バージョンでは、最初のimm8はビットフィールドの長さを指定し、2番目のimm8はビットフィールドを挿入するビットオフセットを指定します。2引数バージョンでは、長さとオフセットはそれぞれ2番目の引数のビット[69:64]とビット[77:72]から取得されます。

INSERTQ xmm,xmm,imm8,imm8 F2 0F 78 /r ib ib はい いいえ いいえ[h] 該当なし 該当なし 該当なし 該当なし
INSERTQ xmm,xmm F2 0F 79 /r はい いいえ いいえ[h] 該当なし 該当なし 該当なし 該当なし
XMM レジスタの下位 64 ビットからの 64 ビット ビットフィールド抽出。

最初の引数は、ビットフィールドの抽出元とビットフィールドの書き込み先の両方として機能します。

3引数バージョンでは、最初のimm8はビットフィールド長を指定し、2番目のimm8はビットフィールドのビットオフセットを指定します。2引数バージョンでは、2番目の引数はビット[5:0]にビットフィールド長、ビット[13:8]にビットオフセットを格納するXMMレジスタです。

EXTRQ xmm,imm8,imm8 66 0F 78 /0 ib ib はい いいえ いいえ[h] 該当なし 該当なし 該当なし 該当なし
EXTRQ xmm,xmm 66 0F 79 /r はい いいえ いいえ[h] 該当なし 該当なし 該当なし 該当なし
  1. ^ abcdefgh 、、、、および命令については、ベクトル長が 128 ビットを超えるエンコーディングがAVX2 および/または AVX-512 で使用できますが、このようなエンコーディングの操作は 128 ビット レーンごとに分割され各 128 ビット レーンでは内部的に命令の 128 ビット版と同じ操作が実行されます。VPSHUFLWVPSHUFHWVHADDP*VHSUBP*VDPPSVDPPD
  2. ^ ab AVX では、命令VPSHUFHWVPSHUFLW命令は 128 ビット形式でのみ使用できます。これらの命令の 256 ビット形式では AVX2 が必要です。
  3. ^ の EVEX エンコード形式ではVCVTDQ2PD、EVEX 埋め込み丸め制御は許可されますが、効果はありません。
  4. ^ オペコードはEVEXエンコードできません。AVX-512でベクトル論理テストを実行するには、少なくとも2つの命令(例: )のシーケンスが必要VPTESTMDですKORTESTW
  5. ^ ab アセンブラは、3 番目の引数の有無にかかわらずBLENDVPS/命令を受け入れることができます。BLENDVPDXMM0
  6. ^ ab AVX はVBLENDVPS/VPDと機能的に類似した命令を提供しますがBLENDVPS/VPD、異なるオペコードとオペランド エンコーディングを使用します - VEX.66.0F3A.W0 4A/4B /r /is4
  7. ^ abcd オペコードは AVX-512 では使用できません。代わりに、AVX512F ではEVEX.66.0F3A (08..0B) /r ib新しいVRNDSCALE*丸め命令用に異なるオペコード - - が提供されています。
  8. ^ abcd AVX-512 では、 /オペコードを EVEX エンコードすると、SSE4a とはまったく関係のない AVX-512 命令、つまりおよびが生成されますINSERTQEXTRQVCVT(T)P(S|D)2UQQVCVT(T)S(S|D)2USI


AVX/AVX2命令、およびそれらのAVX-512拡張版

ここでは、AVX および AVX2 に新しく追加された命令/オペコードについて説明します。

AVX および AVX2 には、多数の MMX/SSE 命令の拡張 VEX エンコード形式も含まれています。上記の表を参照してください。

一部の AVX/AVX2 命令は、AVX-512 の拡張 EVEX エンコード形式でも存在します。

AVX命令

指示の説明 命令のニーモニック 基本オペコード(VEX) AVX AVX-512(EVEXエンコード)
サポートされている サブセット レーン bcst
YMM/ZMMレジスタの上位ビットをゼロにします。[a]

ymm0 から ymm15 のビット 127:0 を除くすべてのビットをゼロにします。

VZEROUPPER VEX.NP.0F 77[b] (L=0) いいえ 該当なし 該当なし 該当なし
YMM/ZMMレジスタをゼロにします。[a]

レジスタ ymm0 から ymm15 をゼロにします。

VZEROALL (L=1) いいえ 該当なし 該当なし 該当なし
浮動小数点データをメモリまたは XMM レジスタの下部から XMM/YMM/ZMM レジスタのすべてのレーンへブロードキャストします。 32ビット VBROADCASTSS ymm,xmm/m32[c] VEX.66.0F38.W0 18 /r はい はい F 32 (32)[d]
64ビット VBROADCASTSD ymm,xmm/m64[c]
VBROADCASTF32X2 zmm,xmm/m64(AVX-512)
VEX.66.0F38 19 /r VBROADCASTSD
(L=1 [e]、W=0)
VBROADCASTF32X2(L≠0,W=0) 失格 32 (64)[d]
VBROADCASTSD(L≠0,W=1) F 64 (64)[d]
128ビット VBROADCASTF128 ymm,m128
VBROADCASTF32X4 zmm,m128(AVX-512)
VBROADCASTF64X2 zmm,m128(AVX-512)
VEX.66.0F38 1A /r VBROADCASTF128
(L=1、W=0)
VBROADCASTF32X4(L≠0,W=0) F 32 (128)[d]
VBROADCASTF64X2(L≠0,W=1) 失格 64 (128)[d]
より広いベクトルレジスタから128ビットの浮動小数点データのベクトルレーンを抽出します。 VEXTRACTF128 xmm/m128,ymm,imm8
VEXTRACTF32X4 xmm/m128,zmm,imm8(AVX-512)
VEXTRACTF64X2 xmm/m128,zmm,imm8(AVX-512)
VEX.66.0F3A 19 /r ib VEXTRACTF128
(L=1、W=0)
VEXTRACTF32X4(L≠0,W=0) F 32 いいえ
VEXTRACTF64X2(L≠0,W=1) 失格 64 いいえ
浮動小数点データの128ビットベクトルを、より広いベクトルの128ビットレーンに挿入します。 VINSERTF128 ymm,ymm,xmm/m128,imm8
VINSERTF32X4 zmm,zmm,xmm/m128,imm8(AVX-512)
VINSERTF64X2 zmm,zmm,xmm/m128,imm8(AVX-512)
VEX.66.0F3A 18 /r ib VINSERTF128
(L=1、W=0)
VINSERTF32X4(L≠0,W=0) F 32 いいえ
VINSERTF64X2(L≠0,W=1) 失格 64 いいえ
2つのソースベクトルを4つの128ビット要素のベクトルに連結し、imm8を使用してベクトルのインデックスを作成します。
  • imm8のビット[1:0]は結果の下位128ビットに使用する要素を選択する
  • imm8のビット[3:2]は結果の上位128ビットに使用する要素を選択する
VPERM2F128 ymm,ymm,ymm/m256,imm8 VEX.66.0F3A.W0 06 /r /ib (L=1) いいえ 該当なし 該当なし 該当なし
ベクトルの各 128 ビット レーン内で 32 ビット サブレーンのシャッフルを実行します。

可変シャッフル形式では、各レーンのビット[1:0]を選択に使用します。imm8
形式では、128ビットのレーンごとに同じシャッフルを使用します。

VPERMILPS ymm,ymm,ymm/m256 VEX.66.0F38.W0 0C /r はい はい F 32 32
VPERMILPS ymm,ymm/m256,imm8 VEX.66.0F3A.W0 04 /r ib はい はい F 32 32
ベクトルの各 128 ビット レーン内で 64 ビット サブレーンのシャッフルを実行します。

可変シャッフル形式では、選択に各レーンのビット[1]を使用します。imm8
形式では、128ビットのレーンごとにimm8の2ビットを使用します。

VPERMILPD ymm,ymm,ymm/m256 VEX.66.0F38.W0 0D /r はい はい F 64 64
VPERMILPD ymm,ymm/m256,imm8 VEX.66.0F3A.W0 05 /r ib はい はい F 64 64
レーンごとの書き込みマスキングによる浮動小数点データのパックされたメモリ ロード/ストア。

最初の引数は宛先、3番目の引数は送信元です。2番目の引数は、各32ビットレーンの最上位ビットにマスクを指定します。

32ビット VMASKMOVPS ymm,ymm,m256 VEX.66.0F38.W0 2C /r はい いいえ[f] 該当なし 該当なし 該当なし
VMASKMOVPS m256,ymm,ymm VEX.66.0F38.W0 2E /r はい いいえ[f] 該当なし 該当なし 該当なし
64ビット VMASKMOVPD ymm,ymm,m256 VEX.66.0F38.W0 2D /r はい いいえ[f] 該当なし 該当なし 該当なし
VMASKMOVPD m256,ymm,ymm VEX.66.0F38.W0 2F /r はい いいえ[f] 該当なし 該当なし 該当なし
変数ブレンドのパックされた浮動小数点値。

結果の各レーンについて、4 番目の引数の対応するレーンの最上位ビットに応じて、2 番目または 3 番目の引数から値を選択します。

32ビット VBLENDVPS ymm,ymm,ymm/m256,ymm VEX.66.0F3A.W0 4A /r /is4 はい いいえ 該当なし 該当なし 該当なし
64ビット VBLENDVPD ymm,ymm,ymm/m256,ymm VEX.66.0F3A.W0 4B /r /is4 はい いいえ 該当なし 該当なし 該当なし
可変ブレンド パック バイト。

結果の各バイト レーンについて、4 番目の引数の対応するバイト レーンの最上位ビットに応じて、2 番目または 3 番目の引数から値を選択します。

VPBLENDVB xmm,xmm,xmm/m128,xmm[グラム] VEX.66.0F3A.W0 4C /r is4 はい いいえ 該当なし 該当なし 該当なし
パックされた浮動小数点値のベクトル論理符号ビット テスト。

第一オペランドと第二オペランドの符号ビット間のビット単位の論理積(AND)の結果がすべて0の場合はZF=1、それ以外の場合はZF=0を設定します。第二オペランドの符号ビット間のビット単位の論理積と第一オペランドのビット単位の論理否定(NOT)の結果がすべて0の場合はCF=1、それ以外の場合はCF=0を設定します。

32ビット VTESTPS ymm,ymm/m256 VEX.66.0F38.W0 0E /r はい いいえ 該当なし 該当なし 該当なし
64ビット VTESTPD ymm,ymm/m256 VEX.66.0F38.W0 0F /r はい いいえ 該当なし 該当なし 該当なし
  1. ^ ab レガシーSSE命令と256ビットAVX命令を混在させる可能性のあるコードでは、AVX命令の実行後、SSE命令の実行前に または 命令を実行することを強く推奨しますVZEROUPPERVZEROALLこれを行わない場合、後続のレガシーSSEコードは深刻なパフォーマンス低下を招く可能性があります。[18]
  2. ^ 命令と命令はアーキテクチャ上VEX.Wビットを無視するように記述されていますが、初期のAVX実装(例えばSandy Bridge [19] )では、命令と命令がVEX.W=1でエンコードされると#UDが発生します。そのため、これらの命令はVEX.W=0でエンコードすることが推奨されます。VZEROUPPERVZEROALLVZEROUPPERVZEROALL
  3. ^ ab VBROADCASTSSおよびVBROADCASTSDレジスタ ソース オペランドは AVX ではサポートされていません。これらの命令の xmm レジスタ ソース オペランドのサポートは AVX2 で追加されました。
  4. ^ abcde 命令V(P)BROADCAST*は通常の操作の一部としてブロードキャストを実行します。EVEX プレフィックス付きの AVX-512 では、EVEX.b 修飾子は必要とせず、受け入れません。
  5. ^ このVBROADCASTSD命令は、64ビットデータを128ビットベクトルにブロードキャストすることはできません。64ビットデータを128ビットベクトルにブロードキャストするには、SSE3(V)MOVDDUP命令またはAVX2VPBROADCASTQ命令を使用してください。
  6. ^ abcd AVX-512では、EVEXエンコード形式のVMASKMOVP(S|D)命令は使用できません。AVX-512におけるFP32/FP64値のメモリへの/からのマスク付き移動では、opmaskレジスタと共にVMOVUPSとを使用できます。VMOVUPD
  7. ^ AVXでは、このVPBLENDVB命令は128ビットベクトル幅(VEX.L=0)でのみ利用可能です。256ビットベクトル幅のサポートはAVX2で追加されました。

AVX2命令

指示の説明 命令のニーモニック 基本オペコード(VEX) AVX2 AVX-512(EVEXエンコード)
サポートされている サブセット レーン bcst
メモリまたはXMMレジスタの下部レーンからXMM/YMM/ZMMレジスタのすべてのレーンに整数データをブロードキャストします。 8ビット VPBROADCASTB ymm,xmm/m8 VEX.66.0F38.W0 78 /r はい はい 白黒 8 (8)[b]
16ビット VPBROADCASTW ymm,xmm/m16 VEX.66.0F38.W0 79 /r はい はい 白黒 16 (16)[b]
32ビット VPBROADCASTD ymm,xmm/m32 VEX.66.0F38.W0 58 /r はい はい F 32 (32)[b]
64ビット VPBROADCASTQ ymm,xmm/m64
VBROADCASTI32X2 zmm,xmm/m64(AVX-512)
VEX.66.0F38 59 /r VPBROADCASTQ
(W=0)
VBROADCASTI32X2(W=0) 失格 32 (64)[b]
VPBROADCASTQ(W=1)[a] F 64 (64)[b]
128ビット VBROADCASTI128 ymm,m128
VBROADCASTI32X4 zmm,m128(AVX-512)
VBROADCASTI64X2 zmm,m128(AVX-512)
VEX.66.0F38 5A /r VBROADCASTI128
(L=1、W=0)
VBROADCASTI32X4(L≠0,W=0) F 32 (128)[b]
VBROADCASTI64X2(L≠0,W=1) 失格 64 (128)[b]
より広いベクトルレジスタから128ビットのベクトルレーンの整数データを抽出する VEXTRACTI128 xmm/m128,ymm,imm8
VEXTRACTI32X4 xmm/m128,zmm,imm8(AVX-512)
VEXTRACTI64X2 xmm/m128,zmm,imm8(AVX-512)
VEX.66.0F3A 39 /r ib VEXTRACTI128
(L=1、W=0)
VEXTRACTI32X4(L≠0,W=0) F 32 いいえ
VEXTRACTI64X2(L≠0,W=1) 失格 64 いいえ
128ビットの整数データのベクトルを、より広いベクトルのレーンに挿入します。 VINSERTI128 ymm,ymm,xmm/m128,imm8
VINSERTI32X4 ymm,ymm,xmm/m128,imm8(AVX-512)
VINSERTI64X2 ymm,ymm,xmm/m128,imm8(AVX-512)
VEX.66.0F3A 38 /r ib VINSERTI128
(L=1、W=0)
VINSERTI32X4(L≠0,W=0) F 32 いいえ
VINSERTI64X2(L≠0,W=1) 失格 64 いいえ
2つのソースベクトルを4つの128ビット要素のベクトルに連結し、imm8を使用してベクトルのインデックスを作成します。
  • imm8のビット[1:0]は結果の下位128ビットに使用する要素を選択する
  • imm8のビット[3:2]は結果の上位128ビットに使用する要素を選択する
VPERM2I128 ymm,ymm,ymm/m256,imm8 VEX.66.0F3A.W0 46 /r ib (L=1) いいえ 該当なし 該当なし 該当なし
ベクトル内のFP64値のシャッフルを実行する VPERMPD ymm,ymm/m256,imm8 VEX.66.0F3A.W1 01 /r ib (L=1)[c] はい(L≠0)[d] F 64 64
ベクトル内の64ビット整数のシャッフルを実行する VPERMQ ymm,ymm/m256,imm8 VEX.66.0F3A.W1 00 /r ib (L=1)[c] はい(L≠0)[d] F 64 64
ベクトル内のFP32値の変数シャッフルを実行する VPERMPS ymm,ymm,ymm/m256 VEX.66.0F38.W0 16 /r (L=1)[c] はい(L≠0) F 32 32
ベクトル内の32ビット整数の変数シャッフルを実行する VPERMD ymm,ymm,ymm/m256 VEX.66.0F38.W0 36 /r (L=1)[c] はい(L≠0) F 32 32
レーンごとの書き込みマスキングを使用した整数データのパックされたメモリ ロード/ストア。

最初の引数は宛先、3番目の引数は送信元です。2番目の引数は各レーンの最上位ビットのマスクを指定します。

32ビット VPMASKMOVD ymm,ymm,m256 VEX.66.0F38.W0 8C /r はい いいえ 該当なし 該当なし 該当なし
VPMASKMOVD m256,ymm,ymm VEX.66.0F38.W0 8E /r はい いいえ 該当なし 該当なし 該当なし
64ビット VPMASKMOVQ ymm,ymm,m256 VEX.66.0F38.W1 8C /r はい いいえ 該当なし 該当なし 該当なし
VPMASKMOVQ m256,ymm,ymm VEX.66.0F38.W1 8E /r はい いいえ 該当なし 該当なし 該当なし
パックされた 32 ビット整数値をブレンドします。

結果の 32 ビット レーンごとに、imm8 引数の対応するビットに応じて、2 番目または 3 番目の引数から値を選択します。

VPBLENDD ymm,ymm,ymm/m256,imm8 VEX.66.0F3A.W0 02 /r ib はい いいえ 該当なし 該当なし 該当なし
レーンごとのシフト量を持つパック整数の左シフト 32ビット VPSLLVD ymm,ymm,xmm/m256 VEX.66.0F38.W0 47 /r はい はい F 32 32
64ビット VPSLLVQ ymm,ymm,xmm/m256 VEX.66.0F38.W1 47 /r はい はい F 32 64
レーンごとのシフト量を持つ右シフトのパックされた符号付き整数 32ビット VPSRAVD ymm,ymm,ymm/m256 VEX.66.0F38 46 /r VPSRAVD
(W=0)
VPSRAVD(W=0) F 32 32
64ビット VPSRAVQ zmm,zmm,zmm/m512(AVX-512) VPSRAVQ(W=1) F 64 64
レーンごとのシフト量を持つ右シフトパック符号なし整数 32ビット VPSRLVD ymm,ymm,ymm/m256 VEX.66.0F38.W0 45 /r はい はい F 32 32
64ビット VPSRLVQ ymm,ymm,ymm/m256 VEX.66.0F38.W5 45 /r はい はい F 64 64
条件付きベクトルメモリ収集。

特定の入力ベクトル レジスタの 32/64 ビット コンポーネントごとに、そのコンポーネントを x86 SIBbase+scale*index+displacementアドレス計算のインデックスとして扱い、計算されたメモリ アドレスから 32/64 ビット データ項目をロードします。

命令の3番目の引数はマスク引数です。各宛先ベクターレーンでは、対応するマスク引数レーンのMSBが1に設定されている場合にのみメモリロードが実行されます。各ロードでは、対応するマスク引数レーンはゼロに設定されます。[e]

s32→i32 VPGATHERDD ymm1,vm32y,ymm2 VEX.66.0F38.W0 90 /r /vsib はい はい[e] F 32 いいえ
s32→i64 VPGATHERDQ ymm1,vm32x,ymm2 VEX.66.0F38.W1 90 /r /vsib はい はい[e] F 64 いいえ
s64→i32 VPGATHERQD xmm1,vm64y,xmm2 VEX.66.0F38.W0 91 /r /vsib はい はい[e] F 32 いいえ
s64→i64 VPGATHERQQ ymm1,vm64y,ymm2 VEX.66.0F38.W1 91 /r /vsib はい はい[e] F 64 いいえ
s32→fp32 VGATHERDPS ymm1,vm32y,ymm2 VEX.66.0F38.W0 92 /r /vsib はい はい[e] F 32 いいえ
s32→fp64 VGATHERDPD ymm1,vm32x,ymm2 VEX.66.0F38.W1 92 /r /vsib はい はい[e] F 64 いいえ
s64→fp32 VGATHERQPS ymm1,vm64y,ymm2 VEX.66.0F38.W0 93 /r /vsib はい はい[e] F 32 いいえ
s64→fp64 VGATHERQPD ymm1,vm64x,ymm2 VEX.66.0F38.W1 93 /r /vsib はい はい[e] F 64 いいえ
  1. ^ abcd AVX-512では、VPBROADCAST(B/W/D/Q)汎用レジスタをソースとして使用できる命令のバリエーションも存在し、オペコードは次の通りである。EVEX.66.0F38.W0 (7A..7C)
  2. ^ abcdefg 命令V(P)BROADCAST*は通常の操作の一部としてブロードキャストを実行します。EVEX プレフィックス付きの AVX-512 では、EVEX.b 修飾子は必要とされず、受け入れられません。
  3. ^ abcd 場合、サポートされる最小ベクトル幅は256ビットです。128ビットベクトルでのシャッフルには、または を使用しますVPERMPSVPERMPDVPERMDVPERMQVPERMILPSVPERMILPD
  4. ^ ab AVX-512では、ベクトル幅が512ビットの命令と命令を実行すると、VPERMPD演算VPERMQは256ビットの半分に分割され、imm8スウィズルがそれぞれの半分に別々に適用されます。AVX -512では、命令と命令
    の可変シャッフル版が存在し、それぞれオペコードが と です。これらの版では、演算は256ビットの半分に分割されません。VPERMPDVPERMQEVEX.66.0F38.W1 16 /rEVEX.66.0F38.W1 36 /r
  5. ^ abcdefghi AVX-512 の命令 の EVEX エンコード形式の場合V(P)GATHER*、レーン マスキングは XMM/YMM/ZMM ベクター レジスタではなく、opmask レジスタを使用して行われます。

その他のVEXエンコードSIMD命令

SIMD 命令は、VEX プレフィックスを使用する拡張を設定し、ベースライン AVX/AVX2/AVX-512、FMA3/4、または AMX の一部とは見なされません。

VEX プレフィックスを使用する整数、opmask、暗号化命令 (BMI2、CMPccXADD、VAES、SHA512 拡張機能など) は含まれません。

命令セット拡張 指示の説明 命令のニーモニック 基本オペコード(VEX) AVX-512(EVEXエンコード) 追加された
補足 サブセット レーン bcst rc/sae
F16C
FP16とFP32間のパック変換
FP16 から FP32 へのパックされた変換。 VCVTPH2PS ymm1,xmm2/m128 VEX.66.0F38.W0 13 /r はい F 32 16 SAE アイビーブリッジ
パイルドライバー
ジャガー
ナノクアッドコアC4000
張江
FP32 から FP16 へのパックされた変換。

Imm8引数は丸め制御を提供します。[a]

VCVTPS2PH xmm1,ymm2/m256,imm8 VEX.66.0F3A.W0 1D /r ib はい  F 16 いいえ SAE
AVX-VNNI
ベクトルニューラルネットワークの命令
各 32 ビット レーンについて、2 つのソース引数 (最初の引数は符号なし、2 番目の引数は符号付き) からの 8 ビット コンポーネントの整数ドット積を計算し、そのドット積の結果を累算器に追加します。 飽和なし VPDPBUSD ymm1,ymm2,ymm3/m256 VEX.66.0F38.W0 50 /r はい VNNI 32 32 いいえ
AVX512_VNNI:
カスケード湖
禅4
AVX-VNNI:
アルダーレイク
サファイアラピッズ
ゼン5
符号付き飽和度 VPDPBUSDS ymm1,ymm2,ymm3/m256 VEX.66.0F38.W0 51 /r はい VNNI 32 32 いいえ
各 32 ビット レーンについて、2 つのソース引数 (両方とも符号付き) からの 16 ビット コンポーネントの整数ドット積を計算し、ドット積の結果を累算器に追加します。 飽和なし VPDPWSSD ymm1,ymm2,ymm3/m256 VEX.66.0F38.W0 52 /r はい VNNI 32 32 いいえ
符号付き飽和度 VPDPWSSDS ymm1,ymm2,ymm3/m256 VEX.66.0F38.W0 53 /r はい VNNI 32 32 いいえ
AVX-IFMA
整数融合乗算加算
各 64 ビット レーンについて、2 つのソース引数それぞれの下位 52 ビットの符号なし乗算を実行し、104 ビット積の下位半分または上位半分を符号なし 52 ビット整数として抽出し、それを宛先レジスタの対応する 64 ビット レーンに追加します。 下半分 VPMADD52LUQ ymm1,ymm2,ymm3/m256 VEX.66.0F38.W1 B4 /r はい IFMA 64 64 いいえ
AVX512_IFMA:
キャノンレイク
アイスレイク
ゼン4
AVX-IFMA:
ルナ湖
アロー湖
ハイハーフ VPMADD52HUQ ymm1,ymm2,ymm3/m256 VEX.66.0F38.W1 B5 /r はい IFMA 64 64 いいえ
 
AVX-NE-CONVERT
例外なしのFP16 / BF16変換命令
パック FP32 をパックBF16に変換し、最も近い偶数に丸めます。 VCVTNEPS2BF16 xmm1,ymm2/m256 VEX.F3.0F38.W0 72 /r はい BF16 [b] 16  32 いいえ
AVX512_BF16:
クーパー湖
ゼン4
サファイアラピッズ
AVX-NE-CONVERT:
ルナ湖
アロー湖
パックされた FP16 または BF16 値のベクトルをメモリからロードし、そのベクトル内のすべての偶数要素または奇数要素 (命令によって異なります) をパックされた FP32 値に変換します。 BF16でも VCVTNEEBF162PS ymm,m256 VEX.F3.0F38.W0 B0 /r いいえ 該当なし 該当なし 該当なし 該当なし
FP16でも  VCVTNEEPH2PS ymm,m256 VEX.66.0F38.W0 B0 /r いいえ 該当なし 該当なし 該当なし 該当なし
BF16、奇数 VCVTNEOBF162PS ymm,m256 VEX.F2.0F38.W0 B0 /r いいえ 該当なし 該当なし 該当なし 該当なし
FP16、奇数 VCVTNEOPH2PS ymm,m256 VEX.NP.0F38.W0 B0 /r いいえ 該当なし 該当なし 該当なし 該当なし
メモリからスカラー FP16 または BF16 値をロードし、FP32 に変換してから、宛先ベクトル レジスタにブロードキャストします。 BF16  VBCSTNEBF162PS ymm,m16 VEX.F3.0F38.W0 B1 /r いいえ 該当なし 該当なし 該当なし 該当なし
FP16 VBCSTNESH2PS ymm,m16 VEX.66.0F38.W0 B1 /r いいえ 該当なし 該当なし 該当なし 該当なし
AVX-VNNI-INT8
各32ビットレーンについて、2つのソース引数から4つの8ビット要素の整数内積を計算し、その結果をアキュムレータに加算します。2つのソース引数のそれぞれは、符号付きまたは符号なしのいずれかの要素を持つことができます。アキュムレータへの加算は、命令に応じて、飽和処理の有無(符号付きまたは符号なし)に関係なく実行されます。 s8*s8 VPDPBSSD ymm1,ymm2,ymm3/m256 VEX.F2.0F38.W0 50 /r いいえ 該当なし 該当なし 該当なし 該当なし ルナ湖
アロー湖
s8*s8、ssat VPDPBSSDS ymm1,ymm2,ymm3/m256 VEX.F2.0F38.W0 51 /r いいえ 該当なし 該当なし 該当なし 該当なし
s8*u8 VPDPBSUD ymm1,ymm2,ymm3/m256 VEX.F3.0F38.W0 50 /r いいえ 該当なし 該当なし 該当なし 該当なし
s8*u8、ssat VPDPBSUDS ymm1,ymm2,ymm3/m256 VEX.F3.0F38.W0 50 /r いいえ 該当なし 該当なし 該当なし 該当なし
u8*u8 VPDPBUUD ymm1,ymm2,ymm3/m256 VEX.NP.0F38.W0 50 /r いいえ 該当なし 該当なし 該当なし 該当なし
u8*u8、usat VPDPBUUDS ymm1,ymm2,ymm3/m256 VEX.NP.0F38.W0 50 /r いいえ 該当なし 該当なし 該当なし 該当なし
AVX-VNNI-INT16
各32ビットレーンについて、2つのソース引数から2つの16ビット要素の整数内積を計算し、その結果をアキュムレータに加算します。2つのソース引数のそれぞれの要素は、符号付きまたは符号なしとして扱われます。アキュムレータへの加算は、命令に応じて、飽和処理の有無(符号付きまたは符号なし)に関係なく実行されます。 s16*u16 VPDPWSUD ymm1,ymm2,ymm3/m256 VEX.F3.0F38.W0 D2 /r いいえ 該当なし 該当なし 該当なし 該当なし ルナ湖
アロー湖-S
s16*u16、ssat VPDPWSUDS ymm1,ymm2,ymm3/m256 VEX.F3.0F38.W0 D3 /r いいえ 該当なし 該当なし 該当なし 該当なし
u16*s16 VPDPWUSD ymm1,ymm2,ymm3/m256 VEX.66.0F38.W0 D2 /r いいえ 該当なし 該当なし 該当なし 該当なし
u16*s16、ssat VPDPWUSDS ymm1,ymm2,ymm3/m256 VEX.66.0F38.W0 D3 /r いいえ 該当なし 該当なし 該当なし 該当なし
u16*u16 VPDPWUUD ymm1,ymm2,ymm3/m256 VEX.NP.0F38.W0 D2 /r いいえ 該当なし 該当なし 該当なし 該当なし
u16*u16、usat VPDPWUUDS ymm1,ymm2,ymm3/m256 VEX.NP.0F38.W0 D3 /r いいえ 該当なし 該当なし 該当なし 該当なし
  1. ^ この命令においてVCVTPS2PH、imm8引数のビット2が設定されている場合、使用する丸めモードはMXCSRから取得されます。それ以外の場合、丸めモードはimm8のビット1:0から取得されます(imm8の上位5ビットは無視されます)。サポートされている丸めモードは以下のとおりです。
    価値 丸めモード
    0 最も近い偶数に丸める
    1 切り捨て
    2 切り上げする
    3 ゼロに丸める
  2. ^ これVCVTNEPS2BF16は、AVX-NE-CONVERT拡張によってVEXエンコード形式が提供される唯一のAVX512_BF16命令です。その他のAVX512_BF16命令(いずれもVEXエンコード形式を持たない)はここには記載されていません。


FMA3およびFMA4命令

浮動小数点融合積和演算命令は、x86 において「FMA3」と「FMA4」という 2 つの命令セット拡張として導入されました。どちらもAVX をベースに構築されており、xmm/ymm/zmm ベクターレジスタを使用するスカラー/ベクター命令セットを提供します。FMA3 は、3 つの入力オペランドを受け取り、その結果を最初のオペランドに書き戻す 3 オペランド融合積和演算命令セットを定義します。FMA4 は、4 つの入力オペランド(宛先オペランド 1 つとソースオペランド 3 つ)を受け取る 4 オペランド融合積和演算命令セットを定義します。

FMA3 はHaswell以降の Intel CPU 、 Piledriver以降の AMD CPU 、およびYongFeng 以降のZhaoxin CPU でサポートされています。FMA4 は AMD Family 15h (Bulldozer) CPU でのみサポートされており、 AMD Zen以降では廃止されています。AVX2 をサポートするすべての Intel および AMD (Zhaoxin は除く) プロセッサは FMA3 もサポートしていますが、FMA3/FMA4 拡張機能は AVX または AVX2 の本質的な部分とは見なされていません。ただし、FMA3 命令 (EVEX エンコード形式) はAVX-512基本命令です。FMA3
および FMA4 命令セットはどちらも 10 個の Fused-multiply-add 演算のセットを定義し、すべて FP32 および FP64 バリアントで使用できます。これらのバリアントのそれぞれについて、FMA3 は 3 つのオペランド順序を定義し、FMA4 は 2 つのオペランド順序を定義します。
FMA3 エンコーディング FMA3 命令は、または の形式でVEXまたはEVEX プレフィックスを
使用してエンコードされます。VEX.W/EVEX.W ビットは浮動小数点形式を選択します (W=0 はFP32、W=1 はFP64を意味します)。オペコードバイトは2 つのニブルで構成され、上位ニブルはオペランドの順序 ( ='132'、='213'、='231') を選択し、下位ニブル(値 6..F) は 10 個の Fused-Multiply-Add 演算のうち実行する 1 つを選択します。 (指定された範囲外の値を指定する、FMA3 命令ではない結果になります。) アセンブリ言語レベル では、オペランドの順序は命令のニーモニックで指定されます。 VEX.66.0F38 xy /rEVEX.66.0F38 xy /rxyx9AByxy

  • vfmadd132sd xmm1,xmm2,xmm3実行するxmm1 ← (xmm1*xmm3)+xmm2
  • vfmadd213sd xmm1,xmm2,xmm3実行するxmm1 ← (xmm2*xmm1)+xmm3
  • vfmadd231sd xmm1,xmm2,xmm3実行するxmm1 ← (xmm2*xmm3)+xmm1

すべての FMA3 バリアントにおいて、最初の 2 つの引数は xmm/ymm/zmm ベクター レジスタ引数である必要があり、最後の引数はベクター レジスタまたはメモリ引数のいずれかにすることができます。AVX-512 および AVX10 では、EVEX エンコード バリアントは EVEX プレフィックス エンコードされたブロードキャスト、オペマスク、および丸め制御をサポートします。Sapphire Rapids
で導入された AVX512-FP16 拡張は、 FMA3 命令のFP16バリアントを追加します。これらはすべて、FP32/FP64 バリアントと同じように動作するオペコード バイトの形式をとります。2024 年に公開された AVX10.2 拡張[20]も同様に、パックされた (ただしスカラーではない) FMA3 命令のBF16バリアントを追加します。これらはすべて、FP32/FP64 バリアントと同じように動作するオペコード バイトの形式をとります。 (FMA4命令では、FP16またはBF16のバリアントは定義されていません。) FMA4エンコーディング FMA4命令は、VEXプレフィックスを使用してエンコードされます(EVEXエンコーディングは定義されていません)。オペコードバイトは、最下位ビットで浮動小数点形式(0=FP32、1=FP64)を選択し、残りのビットで実行する10種類の積和演算のうち1つを選択します。 EVEX.66.MAP6.W0 xy /rEVEX.NP.MAP6.W0 xy /r

VEX.66.0F3A xx /r ibxx

FMA4では、オペランドの順序はVEX.Wビットによって制御されます。VEX.W=0の場合、第3オペランドは命令のModR/Mバイトで指定されるr/mオペランド、第4オペランドは命令のib (8ビット即値)部のビット7:4で指定されるレジスタオペランドです。VEX.W=1の場合、これら2つのオペランドは入れ替えられます。例:

  • vfmaddsd xmm1,xmm2,[mem],xmm3実行されxmm1 ← (xmm2*[mem])+xmm3、W=0 エンコーディングが必要になります。
  • vfmaddsd xmm1,xmm2,xmm3,[mem]実行されxmm1 ← (xmm2*xmm3)+[mem]、W = 1 エンコーディングが必要になります。
  • vfmaddsd xmm1,xmm2,xmm3,xmm4実行されxmm1 ← (xmm2*xmm3)+xmm4、W=0 または W=1 のいずれかでエンコードできます。


オペコード表
10 個の FMA 演算とそれによって発生する 122 個の命令バリアントが次の表に示されています。FMA4 命令は * と黄色のセルで強調表示され、FMA3 命令は強調表示されていません。

  1. ^ベクトル レジスタ レーン数は、 リトルエンディアン方式で 0 から順にカウントされます。つまり、ベクトルの最初のバイトを含むレーン数は偶数であると見なされます。

AVX-512

2014年に導入されたAVX-512は、512ビット幅のベクターレジスタ(新しいレジスタの下位半分となる256ビットレジスタを拡張)を追加し、その数を2倍の32ビットにした。新しいレジスタはzmm0からzmm31と名付けられる。また、k0からk7と名付けられた8つのマスクレジスタも追加され、ベクターレジスタの特定の部分への操作を制限するために使用できる。以前の命令セット拡張とは異なり、AVX-512は複数のグループに実装されており、必須なのは基礎拡張(「AVX-512F」)のみである。[21] 追加された命令のほとんどは、256ビットおよび128ビットレジスタでも使用できる。

AVX-512 基礎、バイト/ワードおよびダブルワード/クワッドワード命令 (F、BW、DQ サブセット)

ここでは、AVX-512 の F、BW、および DQ サブセットに新しく追加された命令について説明します。

これらの AVX-512 サブセットには、多数の MMX/SSE/AVX 命令の拡張 EVEX エンコード形式も含まれています。上記の表を参照してください。

規則的にエンコードされた浮動小数点命令

これらの手順はすべて、次のような特定のパターンに従います。

  • EVEX.Wは浮動小数点形式を指定するために使用されます(0=FP32、1=FP64)
  • 最下位のオペコードビットは、パック演算とスカラー演算を選択するために使用されます(0:パック、1:スカラー)
  • 特定の操作では、すべてのスカラー/パックバリアントは同じ AVX-512 サブセットに属します。
  • これらの命令はすべて、opmaskレジスタによる結果のマスクをサポートしています。また、パックドバリアントのメモリオペランドのブロードキャストもサポートしています。
  • AVX512VL がサポートされている場合、パックされたバリアントではすべてのベクトル幅 (128 ビット、256 ビット、および 512 ビット) がサポートされます。
指示の説明 AVX-512
サブセット
基本オペコード FP32命令(EVEX.W=0) FP64命令(EVEX.W=1) RC/SAE
満員 スカラー 満員 スカラー
浮動小数点値の2のべき乗スケーリング。命令の動作は以下のとおりVSCALEF* dst,src1,src2です。
夏時間 ソース1 2 ソース2 {\displaystyle {\text{dst}}\leftarrow {\text{src1}}*2^{{\text{floor}}\left({\text{src2}}\right)}}
F EVEX.66.0F38 (2C/2D) /r VSCALEFPS z,z,z/m512 VSCALEFSS x,x,x/m32 VSCALEFPD z,z,z/m512 VSCALEFSD x,x,x/m32 SAE
浮動小数点値の指数を浮動小数点値に変換します。VGETEXP* dst,src1命令の動作は次のとおりです。[a]
夏時間 ログ 2 | ソース1 | {\displaystyle {\text{dst}}\leftarrow {\text{floor}}\left(\log _{2}\left|{\text{src1}}\right|\right)}
F EVEX.66.0F38 (42/43) /r VGETEXPPS z,z/m512 VGETEXPSS x,x,x/m32 VGETEXPPD z,z/m512 VGETEXPSD x,x,x/m32 SAE
逆数近似値(精度:[b]) 2 14 {\displaystyle 2^{-14}} F EVEX.66.0F38 (4C/4D) /r VRCP14PS z,z/m512 VRCP14SS x,x,x/m32 VRCP14PD z,z/m512 VRCP14SD x,x,x/m64
逆平方根近似値(精度[b]) 2 14 {\displaystyle 2^{-14}} F EVEX.66.0F38 (4E/4F) /r VRSQRT14PS z,z/m512 VRSQRT14SS x,x,x/m32 VRSQRT14PD z,z/m512 VRSQRT14SD x,x,x/m64
浮動小数点値から正規化された仮数を抽出します。入力数値を2の累乗でスケーリングし、結果の絶対値が特定の正規化間隔内に収まるようにします。
  • imm8引数のビット[1:0]は正規化間隔[c]を指定する。
  • imm8引数のビット[3:2]は符号制御[d]を指定する。
F EVEX.66.0F3A (26/27) /r ib VGETMANTPS z,z/m512,imm8 VGETMANTSS x,x,x/m32,imm8 VGETMANTPD z,z/m512,imm8 VGETMANTSD x,x,x/m64,imm8 SAE
特殊な浮動小数点値を修正します。

最初のソース引数は、フィックスアップを実行するための浮動小数点値を提供します。フィックスアップは、まず浮動小数点値を8つのクラスに分類し、その結果0~7の範囲のインデックスを生成することによって行われます。[e] 2番目の引数の下位32ビットは、それぞれ4ビット幅の8つのエントリを持つルックアップテーブルとして扱われます。分類インデックスは、このルックアップテーブルから4ビットのエントリを検索するために使用されます。この4ビットのエントリは、最初の引数の浮動小数点値に対する16個のレスポンス値のいずれかを選択するために使用されます。[f]結果は、デスティネーションレジスタに格納されます。

(パックされたバリアントの場合、2 番目のソース引数は、各ベクトル レーンごとに 1 つのルックアップ テーブルを提供するものと解釈されます。分類、テーブル ルックアップ、および応答値の選択は、各ベクトル レーンごとに独立して実行されます。)

imm8引数は、特定の特殊値に対して通知されるべき浮動小数点例外を示すために使用されます。[g]

F EVEX.66.0F3A (54/55) /r ib VFIXUPIMMPS z,z,z/m512,imm8 VFIXUPIMMSS x,x,x/m32,imm8 VFIXUPIMMPD z,z,z/m512,imm8 VFIXUPIMMSD x,x,x/m64,imm8 SAE
範囲制限計算。

まず、2つのソース引数を比較し、imm8引数のビット1:0で指定されたとおりに1つを選択します。[h]次に、imm8引数のビット3:2で指定されたとおりに、選択したソース引数の符号ビットを変更します。[i]

失格 EVEX.66.0F3A (50/51) /r ib VRANGEPS x,x,x/m128,imm8 VRANGESS x,x,x/m32,imm8 VRANGEPD x,x,x/m128,imm8 VRANGESD x,x,x/m64,imm8 SAE
縮約変換。演算[j]を実行します。ここで、は命令のimm8引数のビット7~4から取得される符号なし4ビット整数であり、使用される丸めモードはimm8のビット2~0から取得されます。(imm8のビット3は精度例外を抑制するために使用されます。)
夏時間 ソース1 ラウンド 2 M s r c 1 2 M {\displaystyle {\text{dst}}\leftarrow {\text{src1}}-\left({\text{ROUND}}\left(2^{M}*src1\right)*2^{-M}\right)}
M {\displaystyle M} ラウンド {\displaystyle {\text{ROUND}}()}
失格 EVEX.66.0F3A (56/57) /r ib VREDUCEPS x,x/m128,imm8 VREDUCESS x,x,x/m32,imm8 VREDUCEPD x,x/m128,imm8 VREDUCESD x,x,x/m64,imm8 SAE
浮動小数点分類テスト。

imm8 は、ビットマップとしてテストする浮動小数点数クラスのセットを指定します。[k]結果は opmask レジスタに書き込まれます。各レーンについて、入力値が imm8 引数で指定されたクラスのいずれかに属している場合は、対応する opmask ビットに 1 が書き込まれ、それ以外の場合は 0 がそのビットに書き込まれます。

失格 EVEX.66.0F3A (66/67) /r ib VFPCLASSPS k,x/m128,imm8 VFPCLASSSS k,x/m32,imm8 VFPCLASSPD k,x/m128,imm8 VFPCLASSSD k,x/m64,imm8
  1. ^ 手順については、以下をご覧くださいVGETEXP*
    • ソース引数が ±0 の場合、命令は を返します s r c 1 {\displaystyle src1} {\displaystyle -\infty}
    • ソース引数が の場合、命令は を返します s r c 1 {\displaystyle src1} ± {\displaystyle \pm \infty} + {\displaystyle +\infty}
  2. ^ ab および近似命令の動作はビット厳密な方法で定義されています。C参照モデルはIntelによって提供されています。[12]VRCP14*VRSQRT14*
  3. ^ 命令でサポートされている正規化間隔はVGETMANT*次のとおりです。
    価値 正規化間隔
    0 [ 1 2 {\displaystyle [1,2)}
    1 [ 0.5 2 {\displaystyle [0.5,2)}
    2 [ 0.5 1 {\displaystyle [0.5,1)}
    3 [ 0.75 1.5 {\displaystyle [0.75,1.5)}
    正規化間隔の場合、入力値は 4 の累乗でスケーリングされます。入力値が 0.0 または の場合、 の結果は1.0 になり、符号制御によって変更される可能性があります。 [ 0.5 2 {\displaystyle [0.5,2)} ± {\displaystyle \pm \infty} VGETMANT*
  4. ^ 命令においてVGETMANT*、imm8引数のビット3が設定され、入力値が負の場合(負とはみなされない)、結果はqNaNに変換されます。それ以外の場合、ビット2が設定されている場合は結果の符号ビットがクリアされ、それ以外の場合は入力の符号ビットが保持されます。 0.0 {\displaystyle -0.0} VGETMANT*
  5. ^ 命令が認識する 浮動小数点クラスは次のとおりです。VFIXUPIMM*
    数値型 分類
    インデックス
    静かなNaN 0
    NaNのシグナリング 1
    ゼロ(±0.0) 2
    +1.0 3
    負の無限大 4
    正の無限大 5
    負の有限値 6
    正の有限値(+1.0以外) 7
    MXCSR.DAZ が設定されている場合、非正規数はゼロとして分類され、設定されていない場合は正/負の有限値として分類されます。
  6. ^ 命令の4ビットテーブルルックアップ結果 によって選択できる応答値は次のとおりです。VFIXUPIMM*
    索引 応答値
    0 行き先
    1 ソース
    2 ソースに基づく QNaN (ソースのすべての指数ビットと最上位の仮数ビットを 1 でビット単位の OR 演算したもの)
    3 QNaN_Indefinite (符号、すべての指数ビット、および最上位仮数ビットが 1 に設定される)
    4 + {\displaystyle +\infty}
    5 {\displaystyle -\infty}
    6 ± {\displaystyle \pm \infty} 、ソースと同じ符号
    7 0.0 {\displaystyle -0.0}
    8 + 0.0 {\displaystyle +0.0}
    9 1.0 {\displaystyle -1.0}
    10 + 1.0 {\displaystyle +1.0}
    11 + 0.5 {\displaystyle +0.5}
    12 + 90.0 {\displaystyle +90.0}
    13 π / 2 {\displaystyle \pi /2} (最も近いものに丸められます)
    14 MAX_FLOAT
    15 -MAX_FLOAT
    MXCSR.DAZ が設定されている場合、応答値が選択される前に、非正規化ソース値(宛先値は除く)がゼロにフラッシュされます。(これは応答 1 と 2 に影響します。)
  7. ^ 命令の imm8 引数で示される浮動小数点例外は次VFIXUPIMM*のとおりです。
    少し 報告の例外
    0 #ZEの場合 s r c 1 0.0 {\displaystyle src1=0.0}
    1 #IEの場合 s r c 1 0.0 {\displaystyle src1=0.0}
    2 #ZEの場合 s r c 1 1.0 {\displaystyle src1=1.0}
    3 #IEの場合 s r c 1 1.0 {\displaystyle src1=1.0}
    4 #IEの場合 s r c 1 s 1つの {\displaystyle src1=sNaN}
    5 #IEの場合 s r c 1 {\displaystyle src1=-\infty}
    6 #IE src1 が負の有限値の場合
    7 #IEの場合 s r c 1 + {\displaystyle src1=+\infty }
    非正規化ソース値は、MXCSR.DAZ が設定されている場合は 0.0 として扱われ、それ以外の場合は正/負の有限値として扱われます。
  8. ^ 命令の場合VRANGE*、命令の imm8 引数のビット 1:0 は、次のように実行する比較と選択を選択します。
    価値 意味
    0 最小値:
    src1 ≤ src2 ? src1 : src2
    1 最大値:
    src1 ≤ src2 ? src2 : src1
    2 最小絶対値:
    |src1| ≤ |src2| ? src1 : src2
    3 最大絶対値:
    |src1| ≤ |src2| ? src2 : src1
    両方のソース引数が の場合、この比較と選択の目的において、は より小さいとみなされます。どちらかの入力が の場合、結果は になります ± 0.0 {\displaystyle \pm 0.0} 0.0 {\displaystyle -0.0} + 0.0 {\displaystyle +0.0} 1つの {\displaystyle NaN} 1つの {\displaystyle NaN}
  9. ^ 命令ではVRANGE*、imm8 のビット 3:2 は次のように結果の符号ビットを選択するために使用されます。
    価値 意味
    0 src1の符号ビットを使用する
    1 選択した値の符号ビットを使用する
    2 符号ビットを0に設定する
    3 符号ビットを1に設定する
  10. ^ のソース引数が の場合VREDUCE*結果は になります ± {\displaystyle \pm \infty} + 0.0 {\displaystyle +0.0}
  11. ^ 命令の imm8 引数のVFPCLASS*レイアウトは次のようになります。
    少し テストの分類
    0 qNaN
    1 + 0.0 {\displaystyle +0.0}
    2 0.0 {\displaystyle -0.0}
    3 + {\displaystyle +\infty}
    4 {\displaystyle -\infty}
    5 非正規化
    6 負の有限
    7 sNaN
    MXCSR.DAZ が設定されている場合、分類テストでは非正規化数は ±0 として扱われます。

Opmask命令

AVX-512では、512ビットのベクターに加えて、k0、k1、k2、…k7という8つのオペマスクレジスタが導入されています。これらのレジスタは、AVX512BWをサポートする実装では64ビット幅、それ以外の実装では16ビット幅です。これらのレジスタは主に、AVX-512ベクター命令のほとんどにおいて、レーンごとに動作を有効/無効にするために使用されます。これらのレジスタは通常、ベクター比較命令や、レーンごとに1ビットの結果を生成する命令で設定されますが、AVX-512では、オペマスクレジスタの手動操作を支援するために、55個の新しい命令セットが定義されています。

これらの命令は、ほとんどの場合、4つの命令のグループで定義されます。グループ内の4つの命令は、基本的に同じ基本演算の8ビット、16ビット、32ビット、64ビットのバリエーションです(レジスタの下位8/16/32/64ビットのみが特定の演算に関与し、結果がレジスタに書き戻される場合、下位8/16/32/64ビットを除くすべてのビットはゼロに設定されます)。opmask命令はすべてVEXプレフィックスでエンコードされます( EVEXプレフィックスでエンコードされる他のすべてのAVX-512命令とは異なります)。

一般に、命令の 16 ビット バリアントは AVX512F (およびを除く) によって導入されKADDWKTESTW8 ビット バリアントは AVX512DQ 拡張によって導入され、32/64 ビット バリアントは AVX512BW 拡張によって導入されます。

ほとんどの命令は非常に規則的なエンコード パターンに従っており、グループ内の 4 つの命令は、VEX.pp フィールドと VEX.W フィールドを除いて同一のエンコードを持ちます。

  1. ^ ab 16 ビットの opmask 命令KADDWKTESTWAVX512F ではなく AVX512DQ で導入されました。
  2. ^ abcd Intel APX をサポートするプロセッサでは、すべての形式のKMOV*命令 (ただし、その他の opmask 命令は除く) を EVEX エンコードできます。
  3. ^ abcd 32/64ビットのKMOVD/KMOVQ命令は、オペマスクレジスタと汎用レジスタ間を移動するために存在しますが、この表のオペコードのパターンとは一致しません。以下の表を参照してください。

すべての opmask 命令が上記のパターンに適合するわけではありません。残りの命令は次のとおりです。

  1. ^ ab命令 ではKSHIFT*、imm8 シフト量はマスクされません。オペランドサイズ以上のシフト量を指定すると、結果はすべてゼロになります。
  2. ^ abcd Intel APX をサポートするプロセッサでは、すべての形式のKMOV*命令 (ただし、その他の opmask 命令は除く) を EVEX エンコードできます。
  3. 64ビット汎用レジスタをオペランドとする^ab命令は、x86-64ロングモードでのみ利用可能です。命令は32ビットモードと同様に実行されます。KMOVQKMOVD

比較、テスト、ブレンド、opmask-convert命令

結果のライトバック マスクとしてだけではなく、他の方法で opmask を使用するベクター レジスタ命令。

  1. ^ abcdef AVX-512V(P)BLENDM*命令では、結果書き込みマスキングは使用できません。通常、他のほとんどの AVX-512 命令で書き込みマスキングに使用される EVEX プレフィックス opmask レジスタ引数は、代わりにソース選択に使用されます。
  2. ^ abcdefgh および命令はEVEXエンコードされたopmaskレジスタによる結果のマスクをサポートしていないため、EVEX.aaa=0が必要です。これらの命令で実際に指定されるopmaskレジスタは、ModR/Mバイトによって指定されます。VPMOVM2*VPMOV*2M

データ変換手順

  1. ^ ab 符号なし 32 ビット整数から FP64 (VCVTUDQ2PDおよび の W=0 バリアントVCVTUSI2SD) への変換を実行する命令の場合、EVEX 組み込み丸め制御は許可されますが、効果はありません。
  2. ^ abcdef 64ビット整数(EVEX.W=1エンコードの、、、、、)との間のスカラー変換は、VCVTSS2USI64ビットモードVCVTSD2USIでのみ利用可能です。64ビットモード以外では、これらの命令はEVEX.Wを無視し、EVEX.W= 0として実行され、結果として32ビット整数演算となります。VCVTTSS2USIVCVTTSD2USIVCVTUSI2SSVCVTUSI2SD

データ移動指示

  1. ^ ソースをメモリまたは XMM レジスタから取得できる命令のバリアントは、 AVX2 で導入されました。VPBROADCAST*
  2. 64ビットレジスタソースオペランドを持つ^ VPBROADCASTQ命令は、64ビットロングモードでのみ使用できます。32ビットモードでは、EVEX.W=0として実行され、32ビット演算となります。
  3. ^ abcd 命令V(P)BROADCAST*は通常の操作の一部としてブロードキャストを実行します。EVEX プレフィックス付きの AVX-512 では、EVEX.b 修飾子は必要ありません。

シフト/回転命令

AVX-512の基礎に関するその他の指示

AMX

Intel AMXは、8つの新しいタイルレジスタtmm0(~ )を追加しますtmm7。各タイルレジスタは、64バイトの16行の行列を保持します。また、8つのタイルレジスタそれぞれに保持される実際の行列のサイズを設定するレジスタと、これらのレジスタ上で行列乗算を実行するための命令セットも追加さTILECFGています

  1. ^ abcde AMX と Intel APX の両方をサポートするプロセッサでは、メモリオペランド ( 、、、)受け入れることができる AMX 命令はEVEX エンコードできます。LDTILECFGSTTILECFGTILELOADDTILELOADDT1TILESTORED
  2. ^ の場合TILEZERO、クリアするタイルレジスタは、命令のModR/Mバイトのビット5:3で指定されます。ビット7:6は11b、ビット2:0は000bに設定する必要があります。
  3. ^ abc 、 、命令の場合、メモリ引数はSIBバイトを使用したメモリアドレッシングモードを使用する必要があります。このアドレッシングモードでは、ベースレジスタとディスプレイスメントを使用して、メモリへのロード/ストアを行うタイルの最初の行の開始アドレスを指定します。スケールとインデックスは、行ごとのストライドを指定します。これらの命令はすべて割り込み可能です。これらの命令の途中で割り込みまたはメモリ例外が発生すると、進捗状況追跡情報が に書き込まれるため、割り込み後も部分的にロード/ストアされたタイルで命令を続行できます。TILELOADDTILELOADDT1TILESTORED
    TILECFG.start_row
  4. ^ abcdefgh すべての AMX 行列乗算命令では、3 つの引数が 3 つの異なるタイル レジスタである必要があります。そうでない場合、命令は #UD になります。

参照

参考文献

  1. ^ Chips and Cheese、「VIAの奇妙で風変わりな世界 パート2:ZhaoxinのElectric Boogalooとは程遠い」、2021年9月22日、「AVX2の部分的サポート」セクションを参照。2024年10月14日アーカイブ。
  2. ^ Intel、Intel Advanced Vector Extensions 10 Architecture Specification、rev 1.0、注文番号355989-001US、2023年7月、14ページのセクション1.2。2023年7月24日にアーカイブ。
  3. ^ Intel、「The Converged Vector ISA: Intel Advanced Vector Extensions 10 Technical Paper」、注文番号356368-003US、2025年3月、5ページと8ページ。2025年4月17日アーカイブ。
  4. ^ Intel、『Intel 64 および IA-32 アーキテクチャー・ソフトウェア開発者マニュアル 第 2A 巻: 命令セット・リファレンス』、AL、注文番号 253666-087US、2025 年 3 月、346 ページと 348 ページの CPUID 命令に関する項目を参照。2025 年 5 月 4 日にアーカイブ。
  5. ^ Intel、『Intel 64 および IA-32 アーキテクチャ ソフトウェア開発者マニュアル』注文番号 325462-086、2024 年 12 月、第 2B 巻、MOVD/MOVQ 命令エントリ、1289 ページ。2024 年 12 月 30 日にアーカイブ。
  6. ^ AMD、「AMD64アーキテクチャプログラマーズマニュアル」第1~5巻、出版番号40332、改訂4.08、2024年4月、MOVD2159ページと3040ページの手順に関する項目を参照。2025年1月19日アーカイブ。
  7. ^ Intel、Intel 64 および IA-32 アーキテクチャー ソフトウェア開発者マニュアル、注文番号 325462-086、2024 年 12 月、第 3B 巻、セクション 10.1.1、ページ 3368。2024 年 12 月 30 日にアーカイブ。
  8. ^ AMD、「AMD64アーキテクチャプログラマーズマニュアル」第1~5巻、出版番号40332、改訂4.08、2024年4月、第2巻、650ページのセクション7.3.2。2025年1月19日にアーカイブ。
  9. ^ GCC Bugzilla、Bug 104688 - gcc と libatomic は、AVX 搭載の Intel および AMD CPU 上で 128 ビットのアトミックロードに SSE を使用できます。Zhaoxin によるアトミック性に関する声明については、コメント 34 と 38 を参照してくださいVMOVDQA。2024 年 12 月 12 日にアーカイブされました。
  10. ^ Stack Overflow、SSE命令:どのCPUがアトミック16Bメモリ操作を実行できますか? 2024年9月30日にアーカイブ。
  11. ^ AMD、「ゲスト移行の課題」、2009年6月27日、15ページ。2014年10月27日時点のオリジナルよりアーカイブ。
  12. ^ abc Intel、「Intel アーキテクチャ近似命令 VRCP14、VRSQRT14、VRCP28、VRSQRT28、および VEXP2 のリファレンス実装」、id #671685、2015 年 12 月 28 日。2023 年 9 月 18 日にアーカイブ。

    Cコード「recip14.c」は2023年9月18日にアーカイブされました。

  13. ^ Stack Overflow、AMD Jaguar/Bulldozer/Zen での vxorps-zeroing は、ymm よりも xmm レジスタを使用した方が高速ですか?、2017 年 5 月 3 日。2015 年 5 月 10 日にアーカイブ。
  14. ^ Intel、『Intel 64 および IA-32 アーキテクチャー ソフトウェア開発者マニュアル』注文番号 325462-086、2024 年 12 月、第 2B 巻、VPEXTRD1511 ページのエントリとVPINSRD1530 ページのエントリ。2024 年 12 月 30 日にアーカイブ。
  15. ^ AMD、「AMD64アーキテクチャプログラマーズマニュアル」第1~5巻、出版番号40332、改訂4.08、2024年4月、VPEXTRD2302ページとVPINSRD2329ページのエントリを参照。2025年1月19日アーカイブ。
  16. ^ AMD、「AMDファミリー15hモデル00h-0Fhプロセッサのリビジョンガイド」、pub.no. 38603 rev 3.24、2014年9月、37ページのerratum 592を参照。2025年1月22日にアーカイブ。
  17. ^ Intel、第2世代Intel Coreプロセッサー・ファミリー・デスクトップ仕様アップデート、注文番号324643-037、2016年4月、43ページのエラッタBJ72を参照。2017年7月6日時点のオリジナルよりアーカイブ。
  18. ^ Intel、「AVX-SSE 移行ペナルティの回避」、セクション 3.3 を参照。2024 年 9 月 20 日にアーカイブ。
  19. ^ Intel、第2世代Intel Coreプロセッサー・ファミリー・デスクトップ仕様アップデート、注文番号324643-037、2016年4月、36ページのエラッタBJ49を参照。2017年7月6日時点のオリジナルよりアーカイブ。
  20. ^ Intel、「Advanced Vector Extensions 10.2 Architecture Specification」、注文番号361050-001、改訂1.0、2024年7月。2024年8月1日にアーカイブ。
  21. ^ 「Intel AVX-512命令」。Intel . 2022年6月21日閲覧
「https://en.wikipedia.org/w/index.php?title=List_of_x86_SIMD_instructions&oldid=1330353174」から取得