assembly 添加饱和的32位字

j9per5c4  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(169)

你知道用MMX/SSE汇编指令加饱和32位有符号字的方法吗?我能找到8/16位的版本,但没有32位的。

dy2hfwbg

dy2hfwbg1#

您可以执行下列步骤来仿真饱和的带负数号加:

int saturated_add(int a, int b)
{
    int sum = a + (unsigned)b;                // avoid signed-overflow UB
    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
在SSE 2中,上述操作Map为一系列并行比较和AND/ANDN操作。不幸的是,硬件中没有单一的操作可用。

oalqel3c

oalqel3c2#

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

相关问题