2013-10-06 30 views
2

假設我有一個包含4個32位整數值的__m128i將4個SSE整數提取爲4個字符

有沒有什麼辦法可以將它存儲在char[4]裏面,其中每個int值的低位字符存儲在char的值中?

期望的結果:

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

    | 
    V 

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

SSE2及以下是優選的。 在MSVC++上編譯。

回答

4

隨着SSE2,你可以使用下面的代碼:

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

應該不是說'*(int *)'而不是'(int *)'? – us2012

+0

是的,謝謝!我使用此修補程序更新了帖子。 –

2

只是爲了保持完整性,與SSSE3你只能與一個使用_mm_shuffle_epi8互換操作做到這一點。見here。儘管如此,你還是會消費更多的註冊,這取決於對你來說更重要的東西。

+1

不幸的是,OP希望這能夠在SSE2上工作,但是,對於SSSE3來說,它更容易。 –

+0

@PaulR是的,我應該指出這是SSSE3,我錯過了OP的那條線。謝謝! – Antonio

相關問題