添加32位饱和字

时间:2011-08-20 16:38:03

标签: assembly sse mmx

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

此致

2 个答案:

答案 0 :(得分: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操作。不幸的是,没有一次手术。

答案 1 :(得分:1)

饱和无符号减法很容易,因为对于'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,这当然有效。使用带符号的加法和减法,您有两个饱和边界,这使事情变得复杂。