Сравнивая вектор xmmX

Допустим, вы загрузили вектор xmm1 с четырьмя плавающими точками одинарной точности {1.5, 1.5, 1.5, 1.5} и xmm2 с одинаковыми точками, поэтому xmm1 == xmm2. Теперь вы хотите сравнить их, так что вы пишете в сборке:

movaps  %xmm1, %xmm2
cmpeqps %xmm0, %xmm2

Поскольку cmpeqps не устанавливает флаги, как можно сказать:

jne somewhere

Действительно ли нужно использовать ucomiss для сравнения правой части вектора, затем сдвинуть вправо и повторить еще 3 раза?

Спасибо

2 ответа

Решение

Ты можешь использовать cmpeqpsВам просто нужно извлечь четыре флага. Например (не проверено)

cmpeqps xmm2, xmm1
movmskps eax, xmm2
cmp eax, 15
je somewhere

Алгоритмы для Векторизованной арифметики должны быть разработаны, чтобы избежать условных ветвей. Вместо этого каждая полоса выполняет одни и те же инструкции. Условия обычно выполняются путем оценки всех возможных результатов и выбора правильных с помощью масок.

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