添加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各分量的和

如果您希望您的代码在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)));

嗯,我不知道有任何这样的函数,但是可以使用_mm_hadd_ps()两次。

最新更新