私の質問は、VMIN*、VCVTT*、VGETEXT*、VREDUCE*、VRANGE* などの SAE 制御 (Suppress All Exceptions) を可能にするセマンティックを丸めずに EVEX でエンコードされたパックされた reg-reg 命令に関するものです。 512 ビットのベクトル長、たとえば
VMINPD xmm1 {k1}{z}, xmm2, xmm3
VMINPD ymm1 {k1}{z}, ymm2, ymm3
VMINPD zmm1 {k1}{z}, zmm2, zmm3{sae}
しかし、xmm または ymm レジスターが使用されている命令に SAE を適用できなかった理由がわかりません。
Intel Instruction Set Extensions Programming Referenceの 4.6.4 章の 表 4-7 は、セマンティック ビット EVEX.b を丸めない命令では、SAE が適用されることを指定し、ビット EVEX.L'L は明示的なベクトル長を指定すると述べています。
00b: 128bit (XMM)
01b: 256bit (YMM)
10b: 512bit (ZMM)
11b: reserved
したがって、それらの組み合わせは合法でなければなりません。
ただし、NASMvminpd zmm1,zmm2,zmm3,{sae}
は 62F1ED185DCB、つまり EVEX.L'L=00b、EVEX.b=1 としてアセンブルし、NDISASM 2.12 によって逆アセンブルされます。vminpd xmm1,xmm2,xmm3
NASM はアセンブルvminpd ymm1,ymm2,ymm3,{sae}
を拒否し、NDISASM は 62F1ED385DCB (EVEX.L'L=01b、EVEX.b=1) を次のように逆アセンブルします。vminpd xmm1,xmm2,xmm3
Knights Landing CPU はどのように実行されるのだろうかVMINPD ymm1, ymm2, ymm3{sae}
(62F1ED385DCB、EVEX.L'L=01b、EVEX.b=1 としてアセンブル) :
- CPU が例外をスローします。Intel doc の表 4-7 は誤解を招くものです。
- SAE が有効で、CPU はスカラー演算と同様に xmm のみで動作します。NASM と NDISASM は正しく機能しますが、Intel のドキュメントは間違っています。
- SAE は無視され、CPU は Intel doc の VMINPD 仕様に従って 256 ビットで動作します。NASM と NDISASM は間違っています。
- SAE が有効で、CPU は命令コードで指定された 256 ビットで動作します。NASM と NDISASM が間違っています。インテルのドキュメントでは、xmm/ymm 命令を {sae} で補足装飾する必要があります。
- SAE が有効です。CPU は、静的丸め {er} が許可されている場合と同様に、EVEX.L'L に関係なく、暗黙のフル ベクター サイズ 512 ビットで動作します。NDISASM と Intel doc の表 4-7 は間違っています。