2012-10-25 65 views
3

我有一個__m128i寄存器與內容8個值:轉換8位SSE寄存器,以16個短褲

{-4,10,10,10,10,10,10,-4,-4,10,10,10,10,10,10,-4} 

現在我想將其轉換爲8個16位值在_m128i寄存器。它應該看起來像:

{-4,10,10,10,10,10,10,-4} 

這怎麼可能與儘可能少的指令數量? 我想最多使用SSSE3。

回答

4

假設你只是想前8個值超出了16的,打算忽略其他8(比如你給的是有些模棱兩可的數據),那麼你可以用SSE2像這樣做:

v = _mm_srai_epi16(_mm_unpacklo_epi8(v, v), 8); 
+0

工作完美。 SSSE3有更高效的版本嗎?謝謝! –

+2

@ martins不,沒有任何幫助。不過,在SSE4.1中你會有'pmovsxbw'。對於無符號轉換,你可以使用一個'pshufb',但是在不支持SSE4.1的所有(afaik)處理器上,這並不比解壓縮和psrlw,unpack和pand都好。 。 – harold

2

你可以用一個SSE2指令這樣做(忽略初始化)

__m128i const zero = _mm_setzero_si128(); // (if you're in a loop pull this out) 
__m128i  v; 

v = _mm_unpacklo_epi8(v, zero); 
+1

請注意,此方法不適用於帶符號的8位整數。 – Rufflewind

+0

這是正確的,這隻適用於無符號的8位整數。好點子。 – Apriori