我有一个__m128i
包含 8 位值的寄存器,内容如下:
{-4,10,10,10,10,10,10,-4,-4,10,10,10,10,10,10,-4}
现在我想将它转换为_m128i
寄存器中的八个 16 位值。它应该看起来像:
{-4,10,10,10,10,10,10,-4}
用尽可能少的指令如何做到这一点?我最多想用SSSE3。
我有一个__m128i
包含 8 位值的寄存器,内容如下:
{-4,10,10,10,10,10,10,-4,-4,10,10,10,10,10,10,-4}
现在我想将它转换为_m128i
寄存器中的八个 16 位值。它应该看起来像:
{-4,10,10,10,10,10,10,-4}
用尽可能少的指令如何做到这一点?我最多想用SSSE3。
假设您只想要 16 个值中的前 8 个值,并且将忽略其他 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);