Assembly AVX512矢量长度和SAE控制
我的问题涉及无舍入语义的EVEX编码压缩reg reg指令,该指令允许SAE控制(抑制所有异常), 例如VMIN*、VCVTT*、VGETEXT*、VREDUCE*、VRANGE*等。 英特尔声明SAE感知仅具有完整的512位向量长度,例如Assembly AVX512矢量长度和SAE控制,assembly,x86,avx512,Assembly,X86,Avx512,我的问题涉及无舍入语义的EVEX编码压缩reg reg指令,该指令允许SAE控制(抑制所有异常), 例如VMIN*、VCVTT*、VGETEXT*、VREDUCE*、VRANGE*等。 英特尔声明SAE感知仅具有完整的512位向量长度,例如 VMINPD xmm1 {k1}{z}, xmm2, xmm3 VMINPD ymm1 {k1}{z}, ymm2, ymm3 VMINPD zmm1 {k1}{z}, zmm2, zmm3{sae} 但我看不出SAE不能应用于使用xmm或ymm寄存器的指
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章中
表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,由NDISSM 2.12反汇编为vminpd xmm1,xmm2,xmm3
NASM拒绝组装vminpd ymm1、ymm2、ymm3、{sae}
NDISAM将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):
您的
VMINPD ymm1、ymm2、ymm3{sae}
指令无效。根据中MINPD的指令集参考,仅允许以下编码:
请注意,只有最后一个版本显示有一个{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
- 操作码独立#UD条件见表4-9
- 操作数编码#UD条件见表4-10
- Opmask编码#UD条件见表4-11
- 如果伊芙.L'L!=10b(VL=512)
这里似乎只有最后一个原因适用,但这意味着您的指令将生成带或不带
{sae}
修饰符的#UD异常。由于这似乎直接与指令摘要中允许的编码相矛盾,我不确定会发生什么。很好的一点是,无论编码细节如何,文档都说您不能这样做。然而,神秘主义者的回答指出,EVEX.L'L与EVEX.RC重叠,并且EVEX.b选择它们被解释为哪一个。@PeterCordes除非,如问题中所述,表4-7与该解释相矛盾。它说,对于“不带舍入语义的FP指令,可能会导致#XF”,EVEX.b选择“SAE控制”,而EVEX.L'L确定向量长度,EVEX.RC不适用。根据该表,指令类型决定了对P2[6:5]
的解释。例如,VMINPD ymm1,ymm2,[rax]{1to8}
设置了EVEX.b,而EVEX.L'L是01b,EVEX.RC是N/A。OPs问题是这对{sae}
不起作用。他想要的编码是存在的,但这是不允许的。起初,我强烈反对你的回答。但在详细阅读了表4-7之后,我确定PDF要么不完整,要么自相矛盾。FP指令具有“舍入语义”的概念。但文件中没有列出哪些指令缺少这些指令。表4-7表明,对于缺乏“舍入语义”的FP指令,P2[6:5]
总是被解释为EVEX.L
。@mystical我看不出矛盾。VMINPD不在“舍入语义”类中,因为指令摘要在任何指令版本上都没有{er}
。表4-7表示这意味着P2[6:5]位编码EVEX.L'L,而VMINPD摘要表示,如果使用{sae}
,则长度必须为512,即EVEX.L'L必须为10b。从设计角度考虑这一点。表4-7似乎暗示Intel最初可能打算允许SAE在不舍入语义的情况下为stuff使用向量长度。但到了实现硬件的时候,它可能会成为阻碍。就目前而言,硬件不需要单独的指令类。P2[6:5]
位无关紧要,因为舍入是不可操作的。因此,问题在于是否有逻辑在无效情况下执行UD。我很好奇Intel emulator会做什么,以及它是否与实际的硬件战相同
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}