我想添加 SSE 寄存器的四个组件以获得单个浮点数。这就是我现在的做法:
float a[4];
_mm_storeu_ps(a, foo128);
float x = a[0] + a[1] + a[2] + a[3];
是否有直接实现此目的的 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() 两次来完成。