5

假设我有这行代码,它使用 SSE2 加载 16 x 8 位无符号整数

// ptr is a pointer to uint8_t array
__m128i b = _mm_load_si128((const __m128i*) ptr);

我想将每个 8 位无符号整数b(总共 16 个)拆分为 4 位高和 4 位低部分。我怎样才能做到这一点?

4

1 回答 1

3

您需要遮盖下部并将上部移动到正确的位置。因为没有字节移位 SSE 指令,所以移位后的上半部分也需要屏蔽。

__m128i b =  _mm_load_si128((const __m128i*) ptr);
__m128i mask = _mm_set1_epi8(0xf);
__m128i lower = _mm_and_si128(b, mask);
__m128i upper = _mm_and_si128(_mm_srli_epi16(b, 4), mask);
于 2012-10-09T09:58:06.920 回答