将 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 个字符的主要内容,如果未能解决你的问题,请参考以下文章