有投双值短裤的快捷方式(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,这将是显著更有效。

有帮助吗?

解决方案

查找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更好的性能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top