cmpeqpd иногда возвращает неправильные значения
Почему-то иногда в своей программе я вижу, что
cmpeqpd xmm3,xmm0
где
xmm0 == {0x2cd000000000, 0x2cd000000000}
а также
xmm3 == {0x0, 0x2011d0800000000}
случается вернуться
{0xffffffffffffffff, 0x0}
в xmm3, что, в общем, неверно, поскольку
(double)0x0
не равно
(double)0x2cd000000000
.
Я заметил, что это случается лишь изредка. Я записал выполнение программы с помощью rr, чтобы воспроизвести это последовательно. Как ни странно, в очень упрощенной простой программе я больше не могу воспроизвести эту проблему. Интересно, есть ли какие-либо скрытые микроархитектурные состояния, которые могут изменить поведение cmpeqpd (cmppd)?
Просто примечание, я проверил, что верхние 128 бит в соответствующих регистрах ymm обнулены.
1 ответ
0x2CD000000000 (или 0x00002CD000000000, чтобы было более очевидно, что делает экспонента) денормален. Действительно, существует параметр, при котором денормальное сравнение будет равно нулю: флаг DAZ.
Флаг DAZ мог быть установлен в какой-то момент, и это объясняло бы, почему упрощенная программа больше не показывала такое поведение.