1

乗算と(両方とも16ビットの符号付き整数)および乗算結果を算術的に左にシフトする演算shl(mult(var1,var2),1)を実行することを探しています。結果は飽和している必要があります。つまり、オーバーフローまたはアンダーフローが発生した場合はint32maxまたはint32minであり、。multvar1var2shlmult(-32768,-32768)=2147483647

MMX / SSE命令セットを使用すると思われる効率的な方法で、複数の値に対してこの操作を行う必要があります。私は作ることについては考えましたがmult(sign_extesion(var1)shl(sign_extension(var2)))MMXmult()飽和バージョンが存在しないことを発見しました。あなたはそれを手に入れる他の方法を知っていますか?

4

1 に答える 1

3

次のことがあなたのために働くはずだと思います。潜在的なオーバーフローケース(SHRT_MIN * SHRT_MIN)は1つだけであり、これを明示的に処理します。

#include <limits.h>
#include <mmintrin.h>

int main(void)
{        
    __m64 v1 = _mm_set_pi16(0, SHRT_MAX, 0, SHRT_MIN);
    __m64 v2 = _mm_set_pi16(0, SHRT_MIN, 0, SHRT_MIN);
    __m64 v = _mm_madd_pi16(v1, v2); // 16 x 16 signed multiply
    v = _mm_slli_pi32(v, 1);         // shift left by 1 bit to get full range
    __m64 vcmp = _mm_cmpeq_pi32(v, _mm_set1_pi32(INT_MIN));
                                     // test for SHRT_MIN * SHRT_MIN overflow
    v = _mm_add_pi32(v, vcmp);       // and correct if needed

    return 0;
}
于 2011-07-27T19:37:01.177 に答える