【问题标题】:Add 32-bit words with saturation添加饱和的 32 位字
【发布时间】:2011-10-31 06:44:28
【问题描述】:
您知道使用 MMX/SSE 汇编指令添加饱和 32 位有符号字的任何方法吗?我可以找到 8/16 位版本,但找不到 32 位版本。
【问题讨论】:
标签:
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,这当然可以。使用带符号的加法和减法,您有两个饱和边界,这使事情变得复杂。