我的问题涉及没有舍入语义的EVEX编码的打包reg-reg指令,该指令允许SAE控制(禁止所有异常),
例如VMIN *,VCVTT *,VGETEXT *,VREDUCE *,VRANGE *等。
英特尔仅声明具有完整512位向量长度的SAE意识,例如
VMINPD xmm1 {k1}{z}, xmm2, xmm3
VMINPD ymm1 {k1}{z}, ymm2, ymm3
VMINPD zmm1 {k1}{z}, zmm2, zmm3{sae}
但是我看不出为什么不能将SAE应用于使用xmm或ymm寄存器的指令的原因。
在第4.6.4章中
Intel Instruction Set Extensions Programming Reference表4-7指出,在不舍入语义的指令中,EVEX.b位指定应用了SAE,而EVEX.L'L位指定显式向量长度:
00b: 128bit (XMM)
01b: 256bit (YMM)
10b: 512bit (ZMM)
11b: reserved
所以他们的组合应该合法。
但是,NASM将
vminpd 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
我想知道骑士登陆CPU如何执行
VMINPD ymm1, ymm2, ymm3{sae}
(组装为62F1ED385DCB,EVEX.L'L = 01b,EVEX.b = 1):
CPU引发异常。英特尔文档表4-7具有误导性。
SAE有效,CPU仅在xmm下运行,与标量相同
操作。 NASM和NDISASM做得对,英特尔文档是
错误。
SAE被忽略,CPU根据VMINPD以256位运行
英特尔文档中的规范。 NASM和NDISASM错误。
SAE有效,CPU按256位中的规定运行
指令代码。 NASM和NDISASM是错误的,英特尔文档需要
用{sae}补充装饰xmm / ymm指令。
SAE有效,CPU在隐式全矢量大小512下运行
位,与EVEX.L'L无关,与静态舍入{er}
允许的。 NDISASM和英特尔文档表4-7错误。
最佳答案
您的VMINPD ymm1, ymm2, ymm3{sae}
指令无效。根据Intel Architecture Instruction Set Extensions Programming Reference (February 2016)中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属性。此功能适用于标量和512位向量长度,仅寄存器对寄存器
设置EVEX.b.设置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异常。由于这似乎与指令摘要中允许的编码直接矛盾,所以我不确定会发生什么。