3

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

4

2 回答 2

2

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

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
}

无符号,更简单,看这个stackoverflow帖子

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

于 2011-08-22T10:01:15.973 回答
1

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

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

与上证所。

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

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

于 2016-11-23T12:26:23.870 回答