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

C++ 将4个SSE整数提取为4个字符,c++,sse,simd,intrinsics,C++,Sse,Simd,Intrinsics,假设我有一个包含4个32位整数值的\uuu m128i 是否有某种方法可以将其存储在char[4]中,其中每个int值的较低字符存储在char值中 预期结果: r1 r2 r3 r4 __m128i 0x00000012 0x00000034 0x00000056 0x00000078 | V char[4] 0x12 0x34 0x56 0x78

假设我有一个包含4个32位整数值的
\uuu m128i

是否有某种方法可以将其存储在
char[4]
中,其中每个
int
值的较低字符存储在
char
值中

预期结果:

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

  |
  V

char[4]    0x12        0x34        0x56        0x78     
首选SSE2及以下版本。
在MSVC++上编译。

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

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

为了完整起见,使用SSSE3,您只需使用一个洗牌操作即可完成。看见不过,您确实要多使用一个寄存器,这取决于什么对您更重要。

不应该说
*(int*)
而不是只说
(int*)
?不幸的是,OP希望这在SSE2上起作用,但是的,使用SSSE3要容易得多。@PaulR是的,我应该指出的是SSSE3,我错过了OP的那句话。谢谢!