[英]Efficient SSE FP `floor()` / `ceil()` / `round()` Rounding Functions Without SSE4.1?
[英]ceil/floor in sse simd
任何人都可以提出一個快速的方法來計算float
使用預SSE4.1 SIMD樓/小區? 我需要正確處理所有極端情況,例如,當我有一個float
值時,該值不能用32位int表示。
目前我使用類似於下面的代碼(我用C內部函數,轉換成ASM存儲清晰度):
;make many copies of the data
movaps xmm0, [float_value]
movaps xmm1, xmm0
movaps xmm2, xmm0
;check if the value is not too large in magnitude
andps xmm1, [exp_mask]
pcmpgtd xmm1, [max_exp]
;calculate the floor()
cvttps2dq xmm3, xmm2
psrld xmm2, 31
psubd xmm3, xmm2
cvtsq2ps xmm2, xmm3
;combine the results
andps xmm0, xmm1
andnps xmm1, xmm2
orps xmm0, xmm1
有沒有更有效的方法來檢查float值對於32bit int是否太大?
這是單個元素的一些偽代碼,應該可以直接轉換為矢量指令:
float f;
int i = (int)f; /* 0x80000000 if out of range (as from cvtps2dq) */
if (i == 0x80000000)
return f;
else
return (float)i;
您將在第二行中使用舍入模式將演員表轉換為int
。 您還可以在MXCSR
測試IE
標志,以檢測超出范圍的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.