Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly AVX512矢量长度和SAE控制_Assembly_X86_Avx512 - Fatal编程技术网

Assembly AVX512矢量长度和SAE控制

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寄存器的指

我的问题涉及无舍入语义的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寄存器的指令的原因

在第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)

  • CPU抛出一个异常。英特尔文件表4-7具有误导性
  • SAE有效,CPU仅使用xmm运行,与标量相同 操作。NASM和NDISSM做得对,英特尔文档 错
  • SAE被忽略,CPU根据VMINPD以256位运行 英特尔文档中的规范。NASM和NDISSM是错误的
  • SAE生效时,CPU以中规定的256位运行 指令代码。NASM和NDISSM是错误的,英特尔文档需要 用{sae}修改xmm/ymm指令的补充说明
  • SAE有效,CPU以隐含的全向量大小512运行 位,与EVEX.L'L无关,与静态舍入{er}相同 允许。NDISAM和英特尔文档表4-7错误

  • 您的
    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}