C 快速双刀->;使用SSE夹紧的短转换?

C 快速双刀->;使用SSE夹紧的短转换?,c,casting,sse,C,Casting,Sse,有没有一种快速的方法可以将双值转换为short(16位有符号),目前我正在做这样的事情: double dval = <sum junk> int16_t sval; if (val > int16_max) { sval = int16_max; } else if (val < int16_min) { sval = int16_min; } else sval = (int16_t)val; double-dval= int16_t sva

有没有一种快速的方法可以将双值转换为short(16位有符号),目前我正在做这样的事情:

double  dval = <sum junk>
int16_t sval;
if (val > int16_max) { 
   sval = int16_max;
} else if (val < int16_min) {
   sval = int16_min;
} else 
   sval = (int16_t)val;
double-dval=
int16_t sval;
如果(val>int16_max){
sval=int16_最大值;
}否则如果(val

我怀疑有一种使用SSE的快速方法可以显著提高效率。

查找minsd、maxsd和cvtsd2si,或者如果您想并行执行2,则使用minpd、maxpd和cvtpd2dq

使用第一种方法的唯一真正好处是保存分支。生成SSE2代码的速度几乎与编译到SSE2的代码的速度一样快。。。真正的胜利来自于一次做两个

编辑:如果您想使用Visual Studio intrinsics进行编辑,那么我相信代码如下所示:

 __m128d sseDbl = _mm_set_sd( dbl );
 sseDbl         = _mm_min_sd( dbl, _mm_set_sd( 32767.0 ) );
 sseDbl         = _mm_max_sd( dbl, _mm_set_sd( -32768.0 ) );
 short shrtVal  = (short)_mm_cvtsd_si32( sseDbl );

工作完成了。使用assembler也很相似,但上面的内容肯定会让您在Visual Studio中获得更好的性能。

google search找到了以下线索: