2011-12-16 3 views
17

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

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

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

+0

Я сомневаюсь, что он существует, но если это так, команда скорее всего поместит результат в 32-разрядную область 128-битного выходного регистра, а не в 32-битный регистр. –

ответ

10

Вы могли бы использовать инструкцию 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.

3

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

4

Если вы хотите, чтобы ваш код работал на CPU до 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)));