我想添加一個SSE寄存器的四個組件來獲得一個浮點數。這就是我要做的事現在:添加一個SSE寄存器的組件
float a[4];
_mm_storeu_ps(a, foo128);
float x = a[0] + a[1] + a[2] + a[3];
是否有直接達到這樣的一個SSE指令?
我想添加一個SSE寄存器的四個組件來獲得一個浮點數。這就是我要做的事現在:添加一個SSE寄存器的組件
float a[4];
_mm_storeu_ps(a, foo128);
float x = a[0] + a[1] + a[2] + a[3];
是否有直接達到這樣的一個SSE指令?
你也許可以使用HADDPS SSE3指令,或它的編譯器的內部_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的分量的總和。
那麼,我不知道任何這樣的功能,但它可以使用_mm_hadd_ps()兩次完成。
如果您希望代碼在SSE3之前的CPU(不支持_mm_hadd_ps)上工作,則可以使用以下代碼。它使用更多指令,但在大多數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)));
我懷疑存在,但如果這樣做,該指令將可能把結果的128位輸出寄存器的32位區域,而不是在一個32位的寄存器本身。 – 2011-12-16 15:21:23