2010-06-08 22 views
2

有一個快速的方法來投雙值短褲(16位有符號),目前我在做這樣的事情:通過使用SSE進行鉗位的快​​速雙轉換>

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,這將是顯著更高效。

回答

4

查找minsd,maxsd和cvtsd2si,或者如果您想並行執行2,則使用minpd,maxpd和cvtpd2dq。

使用第一種方法的唯一真正好處是您可以保存分支。生成的SSE2代碼幾乎和使用編譯爲SSE2的代碼一樣快2倍......真正的勝利來自於同時執行其中的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中有更好的性能。

+0

谷歌搜索出現了這個主題:http://www.gamedev.net/community/forums/topic.asp?topic_id=256880 – zdav 2010-06-08 21:30:10

+0

更新使用VS Intrinsics。 – Goz 2010-06-08 21:37:45

+0

非常好,謝謝! – 2010-06-08 21:39:29