SSE 内在函数复制寄存器中的字节
SSE intrinsics to copy bytes within a register
假设我有四个浮点数加载到寄存器中(f0
到 f3
),如以下伪代码所示:
__m128 xmm1 = < f0, f1, f2, f3 >
现在我想把第一个元素复制到其他位置,这样我得到一个如下所示的寄存器:
__m128 xmm2 = < f0, f0, f0, f0 >
(f0
仅在该 SSE 寄存器内可用)
如何尽可能高效地存档?我知道有一个简单的天真的解决方案(卸载第一个元素,然后使用 _mm_set_ps1
),但我想知道这是否可以更有效地完成。
您可以使用 _mm_shuffle_ps (SHUFPS):
#include "xmmintrin.h" // SSE
xmm2 = _mm_shuffle_ps(xmm1, xmm1, _MM_SHUFFLE(0, 0, 0, 0));
注意:根据您在上面示例中对元素的排序方式,它可能需要是:
xmm2 = _mm_shuffle_ps(xmm1, xmm1, _MM_SHUFFLE(3, 3, 3, 3));
假设我有四个浮点数加载到寄存器中(f0
到 f3
),如以下伪代码所示:
__m128 xmm1 = < f0, f1, f2, f3 >
现在我想把第一个元素复制到其他位置,这样我得到一个如下所示的寄存器:
__m128 xmm2 = < f0, f0, f0, f0 >
(f0
仅在该 SSE 寄存器内可用)
如何尽可能高效地存档?我知道有一个简单的天真的解决方案(卸载第一个元素,然后使用 _mm_set_ps1
),但我想知道这是否可以更有效地完成。
您可以使用 _mm_shuffle_ps (SHUFPS):
#include "xmmintrin.h" // SSE
xmm2 = _mm_shuffle_ps(xmm1, xmm1, _MM_SHUFFLE(0, 0, 0, 0));
注意:根据您在上面示例中对元素的排序方式,它可能需要是:
xmm2 = _mm_shuffle_ps(xmm1, xmm1, _MM_SHUFFLE(3, 3, 3, 3));