3

MMX / SSEアセンブラ命令を使用して飽和32ビット符号付きワードを追加する方法を知っていますか?8/16ビットバージョンは見つかりましたが、32ビットバージョンは見つかりませんでした。

4

2 に答える 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 に答える