Mult plus shift使用MMX汇编程序指令左操作

时间:2011-07-27 19:15:18

标签: assembly mmx

我正在寻找做shl(mult(var1,var2),1)操作,其中'mult'乘以var1和var2(都是16位有符号整数)和'shl'向左移动aritmetically multiplication结果。如果发生上溢或下溢,则结果必须饱和,即int32 max或int32 min,并且mult(-32768,-32768)= 2147483647。我需要以有效的方式为多个值设置此操作,我认为使用MMX / SSE指令集。我虽然关于制作mult(sign_extesion(var1),shl(sign_extension(var2)))但我刚刚发现没有MMX mult()饱和度版本存在。你知道其他任何方法吗?

1 个答案:

答案 0 :(得分: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;
}