我的问题涉及没有舍入语义的 EVEX 编码打包 reg-reg 指令,它允许 SAE 控制(抑制所有异常),例如 VMIN*、VCVTT*、VGETEXT*、VREDUCE*、VRANGE* 等。英特尔仅在完整的情况下声明 SAE 意识512bit向量长度,例如
VMINPD xmm1 {k1}{z}, xmm2, xmm3
VMINPD ymm1 {k1}{z}, ymm2, ymm3
VMINPD zmm1 {k1}{z}, zmm2, zmm3{sae}
但我看不出为什么不能将 SAE 应用于使用 xmm 或 ymm 寄存器的指令。
在 英特尔指令集扩展编程参考表 4-7 的第 4.6.4 章中,在没有舍入语义的指令中,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
我想知道 Knights Landing CPU 是如何执行VMINPD ymm1, ymm2, ymm3{sae}
的(组装为 62F1ED385DCB,EVEX.L'L=01b,EVEX.b=1):
- CPU 抛出异常。英特尔文档表 4-7 具有误导性。
- SAE 生效,CPU 仅使用 xmm 操作,与标量操作相同。NASM 和 NDISASM 做得对,英特尔文档是错误的。
- SAE 被忽略,CPU 根据 Intel 文档中的 VMINPD 规范以 256 位运行。NASM 和 NDISASM 是错误的。
- SAE 生效,CPU 以指令代码中指定的 256 位运行。NASM 和 NDISASM 错误,Intel doc 需要用 {sae} 补充修饰 xmm/ymm 指令。
- SAE 生效,CPU 以隐含的全向量大小 512 位运行,无论 EVEX.L'L 为何,就像允许静态舍入 {er} 一样。NDISASM 和 Intel 文档表 4-7 是错误的。