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

Posted

技术标签:

【中文标题】将 4 个 SSE 整数提取为 4 个字符【英文标题】:Extract 4 SSE integers to 4 chars 【发布时间】:2013-10-06 19:38:43 【问题描述】:

假设我有一个包含 4 个 32 位整数值的 __m128i

有什么方法可以将它存储在char[4] 中,每个int 值中的较低字符存储在char 值中?

想要的结果:

           r1          r2          r3          r4
__m128i    0x00000012  0x00000034  0x00000056  0x00000078

  |
  V

char[4]    0x12        0x34        0x56        0x78     

SSE2 及以下是首选。 在 MSVC++ 上编译。

【问题讨论】:

【参考方案1】:

使用 SSE2,您可以使用以下代码:

char[4] array;
x = _mm_packs_epi32(x, x);
x = _mm_packus_epi16(x, x);
*((int*)array) = _mm_cvtsi128_si32(x);

【讨论】:

不应该说*(int*) 而只是(int*)【参考方案2】:

为了完整起见,使用 SSSE3,您只需使用 _mm_shuffle_epi8 进行一次改组操作即可完成此操作。见here。不过,您确实会多消耗一个寄存器,这取决于对您来说更重要的是什么。

【讨论】:

不幸的是,OP 希望它在 SSE2 上工作,但是是的,使用 SSSE3 会容易得多。 @PaulR 是的,我应该指出那是 SSSE3,我错过了 OP 的那一行。谢谢!

以上是关于将 4 个 SSE 整数提取为 4 个字符的主要内容,如果未能解决你的问题,请参考以下文章

SSE图像算法优化系列三十一:Base64编码和解码算法的指令集优化(C#自带函数的3到4倍速度)。

从键盘输入n个整数,求它们的最小公倍数

SSE 添加的字符

C++——如何将一个字符串转换为多个整数?

字符串处理排序(洛谷1012 拼数)

文件控制字符编码