9

是否有任何 SSE2 指令以相反的顺序int从缓冲区加载 128 位向量寄存器?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

您可以对 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
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 回答