谁能建议一种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
有没有更有效的方法来检查浮点值是否对于 32 位 int 来说不是太大?