广播 __m128 向量的任意一个元素
Broadcast one arbitrary element of __m128 vector
我需要广播 __m128 向量的任意一个元素。
比如第二个元素:
__m128 a = {a0, a1, a2, a3};
__m128 b = {a1, a1, a1, a1};
我知道有内在函数 _mm_set1_ps(float) 和 _mm_broadcast_ss(float*)。
但是这些内在函数可以从内存的常用寄存器加载值。
是否存在从另一个向量寄存器设置标量值的方法?
我想你必须看看 _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;
}
您可以像这样使用 _mm_shuffle_ps
:
b = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1,1,1,1));
我需要广播 __m128 向量的任意一个元素。 比如第二个元素:
__m128 a = {a0, a1, a2, a3};
__m128 b = {a1, a1, a1, a1};
我知道有内在函数 _mm_set1_ps(float) 和 _mm_broadcast_ss(float*)。 但是这些内在函数可以从内存的常用寄存器加载值。 是否存在从另一个向量寄存器设置标量值的方法?
我想你必须看看 _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;
}
您可以像这样使用 _mm_shuffle_ps
:
b = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1,1,1,1));