我有一个__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。
答案 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);