2013-04-26 4 views
6

私はVisual C++ 2012を使用してSSE組み込み関数を使い始めましたが、いくつかのポインタが必要でした。2組の4つのショートパンツをXMMレジスタにロードする方法は?

私はそれぞれ4個のsigned shortを含む2つの配列を持っています(各配列は64ビットなので合計128です)。 XMMレジスタの上位ビットに1をロードし、下位ビットに1をロードします。 SSE組み込み関数を使用してこれを効率的に達成できますか?もしそうなら、どうですか?

+0

SSE4.1は許可されていますか? – Mysticial

+0

私はそう思いますが、可能であれば、直接命令を書くのではなく、使用可能な組み込み関数を使用したいと考えています。 – Asik

答えて

12

SSE2:AまたはBための位置合わせ要件がないこと

short A[] = {0,1,2,3}; 
short B[] = {4,5,6,7}; 

__m128i v; 
v = _mm_loadl_epi64((const __m128i*)A); 
v = _mm_insert_epi64(v,*(const long long*)B,1); 

// v = {0,1,2,3,4,5,6,7} 

注:+ x64の

short A[] = {0,1,2,3}; 
short B[] = {4,5,6,7}; 

__m128i a,b,v; 
a = _mm_loadl_epi64((const __m128i*)A); 
b = _mm_loadl_epi64((const __m128i*)B); 
v = _mm_unpacklo_epi64(a,b); 

// v = {0,1,2,3,4,5,6,7} 

SSE4.1。しかし、私は両方ともとにかく8バイトに調整することをお勧めしたいと思います。

+0

ありがとうございます。あなたの最初の例のように2つのloadl_epi64をやっていると思いますが、_mm_unpacklo_epi64を使って展開しますか?それはまた働くだろうか? – Asik

+0

ええ、それは実際には良いです。私は更新します。私の心を越えていない。 :) – Mysticial

+2

私はマスター(何か冗談)教えた。どうもありがとう! – Asik

関連する問題