有没有一种快速方法可以将双值转换为短路(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有一种快速的方法可以提高效率。
答案 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提供更好的性能。