4

我正在为 AVX2 指令开发代码生成器,并尝试在 AMD A10 8700 处理器上对其进行测试,根据规格,它应该运行 AVX2。

但是,它会因 vgatherdps 指令中的非法指令而崩溃:

vmovdqu     yMM0,  [ r9+  PmainBase +  -256]; LDdqyy;0
lea         r9,    [      PmainBase +  -192];0
vpcmpeqw    ymm8, ymm8, ymm8;0
vgatherdps  YMM0,  [ r9+ yMM0*4 ] ,ymm8;0

cpuid 信息表明包含 avx2,因此 VGATHERDPS 应该是合法的。

有什么线索吗?

4

2 回答 2

3

根据英特尔的指令参考

如果任何一对索引、掩码或目标寄存器相同,则该指令会导致 UD 错误。

您的目标寄存器和索引寄存器是相同的 ( ymm0)。因此该指令是非法的。我很惊讶组装商没有拒绝它。所以我认为这是汇编程序中的一个错误。


这个限制背后的原因是收集指令实际上是在写入两个寄存器。

  1. 它将收集的结果写入目的地。
  2. 它将一个零掩码写回掩码寄存器,指示哪些通道成功。

在正常执行下,掩码寄存器将被零完全覆盖。但是如果发生故障,并不是所有的加载都会成功。所以指令可能只被部分执行。覆盖掩码寄存器的目的是告诉信号处理程序哪些通道成功,哪些通道失败。

索引寄存器不能与目标寄存器或掩码寄存器混为一谈,因为它将被覆盖,从而无法在从信号处理程序返回时恢复指令。

于 2016-09-20T03:22:48.270 回答
1

修复了机器描述以在收集指令和获取中使用不相交的寄存器集作为索引和目标

vmovdqu   yMM4,  [   PmainBase +          -256]; LDdqyy;0
lea r8,[   PmainBase +          -192];0
vpcmpeqw ymm8, ymm8, ymm8;0
vgatherdps  YMM0,[r8+ yMM4*4 ] ,ymm8;0

现在工作正常。

于 2016-09-20T11:23:32.913 回答