如何从16 x 8位__m128i值中提取32 x 4位整数

时间:2012-10-09 08:01:42

标签: x86 bit-manipulation sse simd

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

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

我想将b中的每个8位无符号整数(总共16个)分成4位高和4位低位。我怎么能这样做?

1 个答案:

答案 0 :(得分: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);