快速双 - >使用SSE进行短路转换?

时间:2010-06-08 21:25:43

标签: c casting sse

有没有一种快速方法可以将双值转换为短路(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;

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

1 个答案:

答案 0 :(得分:4)

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

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

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

 __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 );

完成工作。使用汇编程序执行它非常相似,但上面肯定会使用Visual Studio提供更好的性能。