Сумма четырех 32-битных элементов вектора _m128

Я использую встроенные функции для оптимизации моей программы. Но теперь я хотел бы суммировать четыре элемента в векторе __m128, чтобы сравнить результат со значением с плавающей запятой. Например, допустим, у меня есть этот 128-битный вектор: {a, b c, d}. Как я могу сравнить a+b+c+d с e, где e имеет тип float?

Предоставляет ли SSE2 или SSE3 способ сделать это просто, или у вас есть какой-нибудь фрагмент кода, который может мне помочь? Спасибо!

1 ответ

Решение

Лучшее, что я могу сделать, это:

; assumes    xmm0 = [0, B, 0, A] or similar
mulps xmm0,xmm0   ; [0, B*B, 0, A*A]
xorps xmm1,xmm1
movhlps xmm1,xmm0 ; [0, 0, 0, B * B]
addps xmm0,xmm1   ; [0, 0, 0, A * A + B * B]

Если A и B обязательно должны быть в низком четырехсловном слове, то, насколько я могу судить, вам нужна перестановка, которая медленнее на пре-Пенрине (а на Пенрине доступно решение DPPS).

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