【问题标题】:Add 32-bit words with saturation添加饱和的 32 位字
【发布时间】:2011-10-31 06:44:28
【问题描述】:

您知道使用 MMX/SSE 汇编指令添加饱和 32 位有符号字的任何方法吗?我可以找到 8/16 位版本,但找不到 32 位版本。

【问题讨论】:

  • 请参阅Agner Fog's vectorclass library,了解使用 C++ 内在函数实现加减法。 GPL 源代码is here 的副本,使用 XOR 检查相同/不同的符号,并移位 /PANDN / PADDD 以修复结果。

标签: assembly x86 sse mmx saturation-arithmetic


【解决方案1】:

您可以通过执行以下步骤来模拟饱和签名添加:

int saturated_add(int a, int b)
{
    int sum = a + b;
    if (a >= 0 && b >= 0)
        return sum > 0 ? sum : INT32_MAX;     // catch positive wraparound
    else if (a < 0 && b < 0)
        return sum > 0 ? INT32_MIN : sum;     // catch negative wraparound
    else
        return sum;                           // sum of pos + neg always fits
}

无符号,更简单,见this stackoverflow posting

在 SSE2 中,上述映射到一系列并行比较和 AND/ANDN 操作。不幸的是,没有一次手术。

【讨论】:

    【解决方案2】:

    饱和无符号减法很容易,因为对于`a -= b',我们可以做到

        asm (
            "pmaxud %1, %0\n\t" // a = max (a,b)
            "psubd %1, %0" // a -= b
            : "+x" (a)
            : "xm" (b)
        );
    

    与 SSE。

    我一直在寻找无符号加法,但可能唯一的方法是转换为饱和无符号减法,执行它,然后转换回来。签名变体也是如此。

    编辑:通过无符号加法,您可以通过这种方式获得min (a, ~b) + b,这当然可以。使用带符号的加法和减法,您有两个饱和边界,这使事情变得复杂。

    【讨论】:

      猜你喜欢
      • 2015-06-12
      • 2010-12-11
      • 2011-07-13
      • 1970-01-01
      • 2013-11-25
      • 2011-12-14
      • 2013-10-31
      • 2016-12-18
      • 2013-07-08
      相关资源
      最近更新 更多