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

Posted

技术标签:

【中文标题】如何从 16 x 8 位 __m128i 值中提取 32 x 4 位整数【英文标题】:How do I extract 32 x 4-bit integer from 16 x 8-bit __m128i value 【发布时间】:2012-10-09 08:01:41 【问题描述】:

假设我有这行代码,它使用 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】:

您需要遮盖下部并将上部移动到正确的位置。由于没有字节移位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);

【讨论】:

以上是关于如何从 16 x 8 位 __m128i 值中提取 32 x 4 位整数的主要内容,如果未能解决你的问题,请参考以下文章

如何将 16 字节的内存加载到 Rust __m128i 中?

将 4 个 SSE 整数提取为 4 个字符

将 16 位值的 __m256i 打包(饱和)到 8 位值的 __m128i?

调用 always_inline '__m128i _mm_cvtepu8_epi32(__m128i)' 时内联失败:目标特定选项不匹配 _mm_cvtepu8_epi32 (__m128i __X

通过引用内联函数传递 __m128i 对象会导致这些对象移动到堆栈吗?

如何在 gcc 中静态初始化 __m128i 数组?