我的问题涉及到EVEX编码的打包reg-reg指令,它没有舍入语义,它允许SAE控制(抑制所有异常),例如VMIN*、VCVTT*、VGETEXT*、VREDUCE*、VRANGE*等等。
VMINPD xmm1 {k1}{z}, xmm2, xmm3
VMINPD ymm1 {k1}{z}, ymm2, ymm3
VMINPD zmm1 {k1}{z}, zmm2, zmm3{sae}
但我看不出为什么SAE不能应用于使用xmm或ymm寄存器的指令。
在Intel指令集扩展编程参考表4-7的第4.6.4章中,表4-7指出,在没有舍入语义位的指令中,EVEX.b指定应用SAE,BITEVEX.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
我想知道骑士如何执行VMINPD ymm1, ymm2, ymm3{sae}
(组装为62F1ED385DCB,EVEX.L'L=01b,EVEX.b=1)
发布于 2016-08-15 18:20:55
您的VMINPD ymm1, ymm2, ymm3{sae}
指令无效。根据Intel体系结构指令集扩展编程参考(2016年2月)中MINPD的指令集引用,只允许进行以下编码:
660F5D /r 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 3/M 256 EVEX.NDS.128.66.0F.W1 5D /r VMINPD xmm1 {k1}{z},xmm2,xmm3/m 128/m64bst EVEX.NDS.256.66.0F.W1 5D /r VMINPD /r{z}{z},,EVEX.NDS.512.66.0F.W1 5D /r zmm1 {k1}{z},zmm2,zmm3/m 512/m64bcst{sae}
请注意,只有最后一个版本以{sae}
后缀显示,这意味着它是允许使用它的唯一指令形式。仅仅因为比特存在来编码特定的指令,并不意味着它是有效的。
还请注意,第4.6.3节( EVEX中的SAE支持)明确指出,SAE不适用于128位或256位向量:
EVEX编码系统允许不舍入语义的算术浮点指令使用SAE属性进行编码。这一能力适用于标量和512位矢量长度,仅通过设置EVEX.b寄存器到寄存器。当设置EVEX.b时,意味着“禁止所有异常”。..。
但是,我不确定手工编写的指令是否会生成无效的Opcode异常,如果EVEX.b位被忽略,或者EVEX.L'L位将被忽略。EVEX编码的VMINPD指令属于类型E2异常类,根据表4-17类型的E2类异常条件,该指令可以在下列任何情况下生成#UD异常:
只有最后一个理由似乎适用于这里,但这意味着您的指令将生成带或不带{sae}
修饰符的#UD异常。因为这似乎直接与指令摘要中允许的编码相矛盾,所以我不确定会发生什么。
发布于 2021-06-22 09:36:41
在推特上,iximeow给出了一些增编对罗斯里奇的回答如下:
L'L
选择了特定的ymm
模式,因此如果您设置L'L
来指示ymm
,则只得到{rd-sae}
。b
设置为sae
,则向量宽度将立即固定为512位。(@Pepijn的评论 on Ross的答案已经链接到了这些推特上,但我认为这是一个值得单独回答的问题,如果仅仅是为了显而易见的话。)
https://stackoverflow.com/questions/36814429
复制相似问题