我正在寻找做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()饱和度版本存在。你知道其他任何方法吗?
答案 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;
}