【问题标题】:cmpeqpd sometimes returns wrong valuescmpeqpd 有时会返回错误的值
【发布时间】:2021-04-08 11:58:57
【问题描述】:

由于某种原因,有时在我的程序中我看到了

cmpeqpd xmm3,xmm0

xmm0 == {0x2cd000000000, 0x2cd000000000}xmm3 == {0x0, 0x2011d0800000000} 碰巧在 xmm3 中返回 {0xffffffffffffffff, 0x0},这是错误的,因为 (double)0x0 不等于 (double)0x2cd000000000

我注意到它只是偶尔发生。我已经用 rr 记录了程序的执行,以便一致地重现它。有趣的是,在一个超级简化的简单程序中,我不能再重现这个问题了。我想知道,是否有任何隐藏的微架构状态可以改变 cmpeqpd (cmppd) 的行为?

请注意,我检查了相应 ymm 寄存器中的高 128 位是否为零。

【问题讨论】:

    标签: assembly floating-point sse avx denormal-numbers


    【解决方案1】:

    0x2CD000000000(或 0x00002CD000000000 使指数在做什么更明显)是非正规的。确实有一个设置可以使非正规比较等于零:DAZ flag

    DAZ 标志可能在某个时候被设置,它可以解释为什么简化的程序不再显示这种行为。

    【讨论】:

    • 疯了,我认为一定有一些标志寄存器应该控制这种行为。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2016-03-01
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 2016-06-10
    • 1970-01-01
    相关资源
    最近更新 更多