将8位sse寄存器转换为16位短路

时间:2012-10-25 13:43:21

标签: c optimization sse

我有一个__m128i寄存器,其中包含8位值,内容为:

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

现在我想将它转换为_m128i寄存器中的8个16位值。它应该看起来像:

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

如何尽可能少地使用指令? 我想最多使用SSSE3。

2 个答案:

答案 0 :(得分:4)

假设您只想要16个中的前8个值并且忽略其他8个(您给出的示例数据有些含糊不清),那么您可以使用SSE2这样做:

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

答案 1 :(得分: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);