Assembly cmpeqpd有时返回错误的值
出于某种原因,有时在我的节目中我看到了这一点Assembly cmpeqpd有时返回错误的值,assembly,floating-point,sse,avx,denormal-numbers,Assembly,Floating Point,Sse,Avx,Denormal Numbers,出于某种原因,有时在我的节目中我看到了这一点 cmpeqpd xmm3,xmm0 其中xmm0=={0x2cd000000000,0x2cd000000000} 和xmm3=={0x0,0x2011D08000000000} 在xmm3中恰好返回{0xffffffffffffffff,0x0},这是错误的,因为(double)0x0不等于(double)0x2cd00000000 我注意到这种情况只是偶尔发生。我用rr记录了程序的执行情况,以便一致地重现。有趣的是,在一个超级简化的简单程序中,
cmpeqpd xmm3,xmm0
其中xmm0=={0x2cd000000000,0x2cd000000000}
和xmm3=={0x0,0x2011D08000000000}
在xmm3中恰好返回{0xffffffffffffffff,0x0}
,这是错误的,因为(double)0x0
不等于(double)0x2cd00000000
我注意到这种情况只是偶尔发生。我用rr记录了程序的执行情况,以便一致地重现。有趣的是,在一个超级简化的简单程序中,我再也不能重现这个问题了。我想知道,是否有任何隐藏的微体系结构状态可以改变cmpeqpd(cmppd)行为
请注意,我检查了相应ymm寄存器中的高128位是否为零。0x2CD000000000(或0x00002CD00000000,以使指数的作用更加明显)是非规范的。确实有一个设置可以使非规范比较等于零:
DAZ标志可能是在某个时候设置的,这可以解释为什么简化程序不再显示这种行为。疯狂,我认为一定有一些标志寄存器可以控制这种行为。谢谢!