我正在为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应该是合法的。
任何线索?
答案 0 :(得分:3)
根据Intel's Instruction Reference:
如果任何一对索引,掩码或目标寄存器相同, 该指令导致UD故障。
您的目的地和索引寄存器是相同的(ymm0
)。因此该指令是非法的。我很惊讶汇编程序没有拒绝它。所以我认为汇编程序中存在一个错误。
此限制背后的原因是收集指令实际上是写入两个寄存器。
在正常执行期间,掩码寄存器将被零完全覆盖。但是如果发生故障,并非所有负载都会成功。因此,指令只能部分执行。覆盖掩码寄存器的目的是告诉信号处理器哪条通道成功,哪条通道失败。
索引寄存器不能与目标寄存器或掩码寄存器进行别名,因为它会被覆盖,从而无法在从信号处理程序返回时恢复指令。
答案 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
现在工作正常。