1

我正在寻找做shl(mult(var1,var2),1)运算,其中mult乘法var1var2(都是 16 位有符号整数)并shl在算术上左移乘法结果。结果必须是饱和的,即 int32 max 或 int32 min 如果发生上溢或下溢并且mult(-32768,-32768)=2147483647

我需要以我认为使用 MMX/SSE 指令集的有效方式对多个值进行此操作。我虽然关于制作mult(sign_extesion(var1)shl(sign_extension(var2)))但我刚刚发现不mult()存在 MMX 饱和版本。你知道有什么其他方法可以得到吗?

4

1 回答 1

3

我认为以下内容应该适合您。只有一个潜在的溢出情况 ( SHRT_MIN * SHRT_MIN),它会明确地处理这个问题:

#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 回答