C++ 将4个SSE整数提取为4个字符
假设我有一个包含4个32位整数值的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
\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的那句话。谢谢!