Подтвердить что ты не робот

Добавление компонентов регистра SSE

Я хочу добавить четыре компонента регистра SSE, чтобы получить один float. Вот как я это делаю сейчас:

float a[4];
_mm_storeu_ps(a, foo128);
float x = a[0] + a[1] + a[2] + a[3];

Есть ли инструкция SSE, которая непосредственно достигает этого?

4b9b3361

Ответ 1

Возможно, вы могли бы использовать инструкцию SSE3 HADDPS или ее встроенный компилятор _mm_hadd_ps,

Например, см. http://msdn.microsoft.com/en-us/library/yd9wecaa(v=vs.80).aspx

Если у вас есть два регистра v1 и v2:

v = _mm_hadd_ps(v1, v2);
v = _mm_hadd_ps(v, v);

Теперь v [0] содержит сумму компонент v1, а v [1] содержит сумму компонент v2.

Ответ 2

Если вы хотите, чтобы ваш код работал на процессорах до SSE3 (которые не поддерживают _mm_hadd_ps), вы можете использовать следующий код. Он использует больше инструкций, но декодирует до меньшего количества микросхем на большинстве процессоров.

 __m128 temp = _mm_add_ps(_mm_movehl_ps(foo128, foo128), foo128);
 float x;
 _mm_store_ss(&x, _mm_add_ss(temp, _mm_shuffle_ps(temp, 1)));

Ответ 3

Ну, я не знаю о какой-либо такой функции, но это можно сделать с помощью _mm_hadd_ps() два раза.