5

私の質問は、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 としてアセンブル) :

  1. CPU が例外をスローします。Intel doc の表 4-7 は誤解を招くものです。
  2. SAE が有効で、CPU はスカラー演算と同様に xmm のみで動作します。NASM と NDISASM は正しく機能しますが、Intel のドキュメントは間違っています。
  3. SAE は無視され、CPU は Intel doc の VMINPD 仕様に従って 256 ビットで動作します。NASM と NDISASM は間違っています。
  4. SAE が有効で、CPU は命令コードで指定された 256 ビットで動作します。NASM と NDISASM が間違っています。インテルのドキュメントでは、xmm/ymm 命令を {sae} で補足装飾する必要があります。
  5. SAE が有効です。CPU は、静的丸め {er} が許可されている場合と同様に、EVEX.L'L に関係なく、暗黙のフル ベクター サイズ 512 ビットで動作します。NDISASM と Intel doc の表 4-7 は間違っています。
4

2 に答える 2

4

あなたのVMINPD ymm1, ymm2, ymm3{sae}指示は無効です。Intel Architecture Instruction Set Extensions Programming Reference (2016 年 2 月)の MINPD の命令セット リファレンスによると、次のエンコーディングのみが許可されています。

66 0F 5D /r                  MINPD xmm1, xmm2/m128 
VEX.NDS.128.66.0F.WIG 5D /r  VMINPD xmm1, xmm2, xmm3/m128
VEX.NDS.256.66.0F.WIG 5D /r  VMINPD ymm1, ymm2, ymm3/m256
EVEX.NDS.128.66.0F.W1 5D /r  VMINPD xmm1 {k1}{z}, xmm2, xmm3/m128/m64bcst
EVEX.NDS.256.66.0F.W1 5D /r  VMINPD ymm1 {k1}{z}, ymm2, ymm3/m256/m64bcst
EVEX.NDS.512.66.0F.W1 5D /r  VMINPD zmm1 {k1}{z}, zmm2, zmm3/m512/m64bcst{sae}

最後のバージョンのみが{sae}サフィックス付きで表示されていることに注意してください。これは、それを使用できる命令の唯一の形式であることを意味します。特定の命令をエンコードするためのビットが存在するからといって、その命令が有効であるとは限りません。

また、セクション 4.6.3「EVEX での SAE サポート」では、SAE が 128 ビットまたは 256 ビットのベクターには適用されないことが明確になっています。

EVEX エンコーディング システムでは、セマンティックを丸めずに算術浮動小数点命令を SAE 属性でエンコードできます。この機能は、EVEX.b を設定することにより、スカラーおよび 512 ビットのベクトル長、レジスタ間のみに適用されます。EVEX.b が設定されている場合、「すべての例外を抑制する」ことが暗示されます。[...]

ただし、EVEX.b ビットが単に無視される場合、または EVEX.L'L ビットが無視される場合、手作りの命令が無効なオペコード例外を生成するかどうかはわかりません。EVEX でエンコードされた VMINPD 命令はタイプ E2 例外クラスに属し、表 4-17、タイプ E2 クラスの例外条件に従って、命令は次のいずれかの場合に #UD 例外を生成できます。

  • 州の要件、表 4-8 が満たされていません。
  • 表 4-9 のオペコード独立 #UD 条件。
  • 表 4-10 の #UD 条件をエンコードするオペランド。
  • 表 4-11 の Opmask エンコーディング #UD 条件。
  • EVEX.L'L != 10b (VL=512) の場合。

{sae}ここでは最後の理由のみが当てはまるようですが、修飾子の有無にかかわらず、命令が #UD 例外を生成することを意味します。これは、命令の概要で許可されているエンコーディングと直接矛盾しているように見えるため、何が起こるかわかりません。

于 2016-08-15T18:20:55.277 に答える