启用AVX2的处理器上的非法指令vgatherdps

时间:2016-09-19 10:48:47

标签: assembly x86 avx avx2 illegal-instruction

我正在为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应该是合法的。

任何线索?

2 个答案:

答案 0 :(得分:3)

根据Intel's Instruction Reference

  

如果任何一对索引,掩码或目标寄存器相同,   该指令导致UD故障。

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

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

  1. 它将聚集的结果写入目的地。
  2. 它将一个零掩码写回掩码寄存器,指示哪些通道成功。
  3. 在正常执行期间,掩码寄存器将被零完全覆盖。但是如果发生故障,并非所有负载都会成功。因此,指令只能部分执行。覆盖掩码寄存器的目的是告诉信号处理器哪条通道成功,哪条通道失败。

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

答案 1 :(得分:1)

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

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

现在工作正常。