2017-04-17 7 views
3

__m128ベクトルの任意の要素をブロードキャストする必要があります。例えば 第二の要素:__m128ベクトルの任意の要素をブロードキャストします。

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

私は組み込み関数の_mm_set1_ps(フロート)と_mm_broadcast_ss(フロート*)があることを知っています。 しかし、これらの組み込み関数は、メモリの共通使用レジスタから値をロードできます。 別のベクトルレジスタからスカラー値を設定する方法はありますか?

答えて

4

あなたは_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; 
} 
+0

ありがとうございました。それは私が欲しいことです。 – Alex

5

あなたはちょうどこのよう_mm_shuffle_psを使用することができます。

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

ありがとうございます。あなたのソリューションは同じ結果を得ます。私は今は最高です。 – Alex

+2

@Alex通常これは、違いがあるときはいつでも。誤ってタイプされた命令を使用すると、文脈とμarchに応じて余分なバイパス遅延が発生する可能性があります。 – harold

+0

この命令の欠点は、追加のレジスタ移動が必要な場合があることです(ただし、影響があるかもしれません) – chtz

関連する問題