9

逆の順序で、バッファから128 ビットintベクトル レジスタをロードする SSE2 命令はありますか?int

4

2 に答える 2

11

int通常のロード後に 32 ビット要素を反転するのは非常に簡単です。

__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

short16 ビット要素に対して同じことを行うことができますが、より多くの命令が必要です。

__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
于 2013-05-16T10:09:55.167 に答える
-2

編集:(以下は単精度浮動小数点スカラー用で、念のためここに残します)

最も近い (そして便利な) ものは_mm_loadr_ps組み込み型です。アドレスは 16 バイトにアラインされている必要があることに注意してください。

この組み込み関数は命令以上のものに変換されますが( MOVAPS+ シャッフル)。

于 2013-05-16T10:07:57.047 に答える