2011-12-16 5 views
17

Desidero aggiungere i quattro componenti di un registro SSE per ottenere un singolo float. Ecco come faccio ora:aggiunta dei componenti di un registro SSE

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

C'è un'istruzione SSE che raggiunge direttamente questo?

+0

Dubito che esista, ma se lo fa, l'istruzione probabilmente inserirà il risultato in una regione a 32 bit del registro di uscita a 128 bit, non in un registro a 32 bit stesso. –

risposta

10

Probabilmente si può utilizzare l'istruzione SSE3 HADDPS, o il suo compilatore intrinseca _mm_hadd_ps,

Ad esempio, vedere http://msdn.microsoft.com/en-us/library/yd9wecaa(v=vs.80).aspx

Se si dispone di due registri V1 e V2:

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

Ora, v [0] contiene la somma dei componenti di v1 e v [1] contiene la somma dei componenti di v2.

3

Bene, non conosco alcuna funzione di questo tipo, ma può essere eseguita utilizzando _mm_hadd_ps() due volte.

4

Se si desidera che il codice funzioni su CPU pre-SSE3 (che non supportano _mm_hadd_ps), è possibile utilizzare il seguente codice. Usa più istruzioni, ma decodifica a meno microops sulla maggior parte delle CPU.

__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)));