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

时间:2013-10-06 19:38:44

标签: c++ sse simd intrinsics

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

我是否可以通过某种方式将其存储在char[4]中,其中每个int值中的较低字符值存储在char值中?

期望的结果:

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

  |
  V

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

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

为了完整起见,使用SSSE3,您只需使用_mm_shuffle_epi8进行一次重排操作即可。见here。你确实消耗了一个寄存器,这取决于对你来说更重要的东西。