微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

cmpeqpd 有时会返回错误的值

如何解决cmpeqpd 有时会返回错误的值

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

cmpeqpd xmm3,xmm0

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

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

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

解决方法

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。