assembly - cmpeqpd 有时会返回错误的值
问题描述
出于某种原因,有时在我的程序中我看到
cmpeqpd xmm3,xmm0
where xmm0 == {0x2cd000000000, 0x2cd000000000}
andxmm3 == {0x0, 0x2011d0800000000}
恰好在 xmm3 中返回{0xffffffffffffffff, 0x0}
,这是错误的,因为(double)0x0
不等于(double)0x2cd000000000
.
我注意到它只是偶尔发生。我已经用 rr 记录了程序的执行,以便一致地重现它。有趣的是,在一个超级简化的简单程序中,我再也无法重现这个问题了。我想知道,是否有任何隐藏的微架构状态可以改变 cmpeqpd (cmppd) 行为?
请注意,我检查了相应 ymm 寄存器中的高 128 位是否为零。
解决方案
0x2CD000000000(或 0x00002CD000000000 使指数在做什么更明显)是非正规的。确实有一个设置可以使非正规比较等于零:DAZ 标志
DAZ 标志可能在某个时候被设置,它可以解释为什么简化的程序不再显示这种行为。
推荐阅读
- vue.js - HTTPS 请求中的跨域请求被阻止错误
- java - Hibernate Derby 连接问题
- linux - vim - 为什么搜索会找到它但搜索和替换不会?(这个转义的特殊字符模式)
- excel - 需要根据选择的名称从一张表中获取数据并打印出所有信息
- apache-pig - 为什么 ToDate 不适用于字符串格式
- automation - 赛普拉斯 - 通过时不要录制视频
- java - 为 java 链码添加属性文件
- java - Realm Java 排序使 changelistener 变慢
- hibernate - 当我在 Jaxrs 资源上添加 @Transactional 时发生异常
- postgresql - 从交易表中查询历史余额数据