2013-05-16 17 views

答えて

10

それは通常の負荷後に32ビットint要素を逆にすることは非常に簡単です:あなたは16ビットshort要素に対して同じことを行うことができます

__m128i v = _mm_load_si128(buff);     // MOVDQA 
v = _mm_shuffle_epi32(v, _MM_SHUFFLE(0, 1, 2, 3)); // PSHUFD - mask = 00 01 10 11 = 0x1b 

が、それはより多くの命令を取る:

__m128i v = _mm_load_si128(buff);     // MOVDQA 
v = _mm_shuffle_epi32(v, _MM_SHUFFLE(0, 1, 2, 3)); // PSHUFD - mask = 00 01 10 11 = 0x1b 
v = _mm_shufflelo_epi16(v, _MM_SHUFFLE(2, 3, 0, 1)); // PSHUFLW - mask = 10 11 00 01 = 0xb1 
v = _mm_shufflehi_epi16(v, _MM_SHUFFLE(2, 3, 0, 1)); // PSHUFHW - mask = 10 11 00 01 = 0xb1 

これは、SSSE3が利用可能であれば、_mm_shuffle_epi8 (PSHUFB)を使用するより少ない命令で行うことができます。

const __m128i vm = _mm_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1); 
            // initialise vector mask for use with PSHUFB 
            // NB: do this once, outside any processing loop 
... 
__m128i v = _mm_load_si128(buff); // MOVDQA 
v = _mm_shuffle_epi8(v, vm);   // PSHUFB 
+0

ありがとうPaul.Yourロジックは正常に動作しています。しかし、私は第2パラメータ "0x1B"の使用法を理解できませんでした。それは何らかのマスクですか?もう一つの疑問は..ショートで同じ作業をすることは可能でしょうか? – Andy

+0

ショートパンツの読み込みと逆転の2番目の例を追加しました。マスクはインテルのドキュメントでカバーされていますが、ビルド方法を示すコメントが追加されています。 –

+0

P.S. [Intel Intrinsics Guide](http://software.intel.com/en-us/articles/intel-intrinsics-guide)をダウンロードすることを強くお勧めします。これはWIN/Mac OS X/Linux用の非常に便利なツールです。 SSE/AVX命令と組み込み関数を非常にアクセスしやすくします。 –

-2

EDIT:最も近い(と便利)固有_mm_loadr_psある

(以下は、念のためにここでそれを残して、単精度浮動小数点スカラーのためです)。アドレスは16バイト境界に合わせる必要があります。

この組み込み関数は、(MOVAPS +シャッフリング)よりもに変換されますが、

+0

返信ありがとうございますが、この命令は4つの単精度浮動小数点値を逆順にロードします。整数と同じ演算を探していますが、サポートがないと思います。 – Andy

+0

はい整数値について話していたことに気付かなかった(あなたのタイトルを再読したはずです)。ポールRの答えはあなたが必要なものです。 – Trax

+0

はい、ちょっと興味がありますが、同じ操作を短い値で行うことはできますか? – Andy

関連する問題