3

我有一个__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。

4

2 回答 2

4

假设您只想要 16 个值中的前 8 个值,并且将忽略其他 8 个(您提供的示例数据有些模棱两可),那么您可以像这样使用 SSE2 执行此操作:

v = _mm_srai_epi16(_mm_unpacklo_epi8(v, v), 8);
于 2012-10-25T13:49:26.900 回答
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);
于 2014-02-05T16:29:02.350 回答