Assembly 添加32位饱和字

Assembly 添加32位饱和字,assembly,x86,sse,mmx,saturation-arithmetic,Assembly,X86,Sse,Mmx,Saturation Arithmetic,您知道使用MMX/SSE汇编指令添加32位有符号字的方法吗?我可以找到8/16位版本,但没有32位版本。您可以通过执行以下步骤模拟饱和有符号加法: int\u添加(int a,int b) { 整数和=a+b; 如果(a>=0&&b>=0) 返回和>0?和:INT32_MAX;//捕获正环绕 else if(a

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

您可以通过执行以下步骤模拟饱和有符号加法:

int\u添加(int a,int b)
{
整数和=a+b;
如果(a>=0&&b>=0)
返回和>0?和:INT32_MAX;//捕获正环绕
else if(a<0&&b<0)
返回sum>0?INT32_MIN:sum;//捕获负环绕
其他的
return sum;//pos+neg的和总是合适的
}
未签名,更简单,请参见


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

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

参见用C++内含函数实现加减法。GPLed源的副本,使用XOR检查相同/不同的符号,并移动/PANDN/padd以修复结果。