题
有投双值短裤的快捷方式(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更好的性能。
不隶属于 StackOverflow