cmpeqpd 有时 returns 错误值
cmpeqpd sometimes returns wrong values
出于某种原因,有时在我的程序中我会看到
cmpeqpd xmm3,xmm0
其中 xmm0 == {0x2cd000000000, 0x2cd000000000}
和 xmm3 == {0x0, 0x2011d0800000000}
在 xmm3 中发生 return {0xffffffffffffffff, 0x0}
,这是错误的,因为 (double)0x0
不等于 (double)0x2cd000000000
.
我注意到它只是偶尔发生。我用 rr 记录了程序的执行情况,以便始终如一地重现。有趣的是,在超级简化的简单程序中,我无法再重现此问题。我想知道,是否有任何隐藏的微体系结构状态可以改变 cmpeqpd (cmppd) 的行为?
注意一下,我检查了相应ymm寄存器中的高128位是否为零。
0x2CD000000000(或 0x00002CD000000000 使指数的作用更明显)是非正规的。确实有一个设置可以使非正规比较等于零:
DAZ 标志可能已在某个时候设置,这将解释为什么简化的程序不再显示此行为。
出于某种原因,有时在我的程序中我会看到
cmpeqpd xmm3,xmm0
其中 xmm0 == {0x2cd000000000, 0x2cd000000000}
和 xmm3 == {0x0, 0x2011d0800000000}
在 xmm3 中发生 return {0xffffffffffffffff, 0x0}
,这是错误的,因为 (double)0x0
不等于 (double)0x2cd000000000
.
我注意到它只是偶尔发生。我用 rr 记录了程序的执行情况,以便始终如一地重现。有趣的是,在超级简化的简单程序中,我无法再重现此问题。我想知道,是否有任何隐藏的微体系结构状态可以改变 cmpeqpd (cmppd) 的行为?
注意一下,我检查了相应ymm寄存器中的高128位是否为零。
0x2CD000000000(或 0x00002CD000000000 使指数的作用更明显)是非正规的。确实有一个设置可以使非正规比较等于零:
DAZ 标志可能已在某个时候设置,这将解释为什么简化的程序不再显示此行为。