广播__M128矢量的一个任意元素



我需要广播__M128向量的一个任意元素。例如第二个元素:

__m128 a = {a0, a1, a2, a3};
__m128 b = {a1, a1, a1, a1};

我知道有内在的_mm_set1_ps(float(和_mm_broadcastrongs(float*(。但是这些内在可以从共同使用记忆寄存器中加载价值。存在从另一个向量寄存器设置标量值的任何方法吗?

您可以像这样使用_mm_shuffle_ps

b = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1,1,1,1));

我认为您必须查看_mm_shuffle_epi32((。对于下一个辅助功能,它的使用将很容易:

#include <emmintrin.h>
template <int index> inline __m128 Broadcast(const __m128 & a)
{
    return _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(a), index * 0x55));
}
int main()
{
    __m128 a = {a0, a1, a2, a3};
    __m128 b = Broadcast<1>(a);
    return 0;
}

相关内容

最新更新