【问题标题】:Convert 8 bit sse register to 16 bit shorts将 8 位 sse 寄存器转换为 16 位短路
【发布时间】:2012-10-15 17:14:45
【问题描述】:

我有一个带有 8 位值的 __m128i 寄存器,其内容为:

{-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。

【问题讨论】:

    标签: c optimization sse


    【解决方案1】:

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

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

    【讨论】:

    • 完美运行。 SSSE3 是否有更高效的版本?谢谢!
    • @martins 不,这些都没有帮助。不过,在 SSE4.1 中,您将拥有 pmovsxbw。对于未签名的转换,您可以使用单个 pshufb,但是,在所有不支持 SSE4.1 的 (afaik) 处理器上,这并不比 unpack 和 psrlw 或 unpack 和 pand 更好.
    【解决方案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);
    

    【讨论】:

    • 请注意,此方法不适用于有符号的 8 位整数。
    • 没错,这只适用于无符号的 8 位整数。好点子。
    猜你喜欢
    • 2017-07-12
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 2012-07-01
    • 2011-01-15
    • 1970-01-01
    相关资源
    最近更新 更多