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 мог быть установлен в какой-то момент, и это объясняло бы, почему упрощенная программа больше не показывала такое поведение.

Другие вопросы по тегам