MMX / SSEアセンブラ命令を使用して飽和32ビット符号付きワードを追加する方法を知っていますか?8/16ビットバージョンは見つかりましたが、32ビットバージョンは見つかりませんでした。
2425 次
2 に答える
2
次の手順を実行することで、飽和署名付き追加をエミュレートできます。
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
}
署名なし、さらに簡単です。このスタックオーバーフローの投稿を参照してください
SSE2 では、上記は一連の並列比較および AND/ANDN 演算にマップされます。残念ながら、単一の操作はありません。
于 2011-08-22T10:01:15.973 に答える
1
飽和符号なし減算は簡単です。
asm (
"pmaxud %1, %0\n\t" // a = max (a,b)
"psubd %1, %0" // a -= b
: "+x" (a)
: "xm" (b)
);
SSEで。
符号なし加算を探していましたが、おそらく唯一の方法は、飽和符号なし減算に変換し、それを実行してから元に戻すことです。署名されたバリアントについても同じです。
編集: 署名なしの加算では、min (a, ~b) + b
この方法で取得できますが、これはもちろん機能します。符号付き加算と減算では、2 つの飽和境界があり、複雑になります。
于 2016-11-23T12:26:23.870 に答える