Сумма четырех 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).