我有一個__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。
我有一個__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。
假設你只是想前8個值超出了16的,打算忽略其他8(比如你給的是有些模棱兩可的數據),那麼你可以用SSE2像這樣做:
v = _mm_srai_epi16(_mm_unpacklo_epi8(v, v), 8);
你可以用一個SSE2指令這樣做(忽略初始化)
__m128i const zero = _mm_setzero_si128(); // (if you're in a loop pull this out)
__m128i v;
v = _mm_unpacklo_epi8(v, zero);
請注意,此方法不適用於帶符號的8位整數。 – Rufflewind
這是正確的,這隻適用於無符號的8位整數。好點子。 – Apriori
工作完美。 SSSE3有更高效的版本嗎?謝謝! –
@ martins不,沒有任何幫助。不過,在SSE4.1中你會有'pmovsxbw'。對於無符號轉換,你可以使用一個'pshufb',但是在不支持SSE4.1的所有(afaik)處理器上,這並不比解壓縮和psrlw,unpack和pand都好。 。 – harold