您是否知道使用MMX / SSE汇编程序指令添加饱和32位带符号字的方法?我可以找到8/16位版本,但没有32位版本。
此致
答案 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
,这当然有效。使用带符号的加法和减法,您有两个饱和边界,这使事情变得复杂。