有人能建议使用pre-SSE4.1 SIMD快速计算float
floor / ceil吗?我需要正确处理所有角落情况,例如:当我有float
值时,32位int无法表示。
目前我使用类似于以下代码(我使用C intrinsics,为了清晰起见转换为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来说不是太大?
答案 0 :(得分:0)
以下是单个元素的一些伪代码,应该可以直接转换为向量指令:
float f;
int i = (int)f; /* 0x80000000 if out of range (as from cvtps2dq) */
if (i == 0x80000000)
return f;
else
return (float)i;
您可以使用舍入模式在第二行中转换为int
。您还可以在IE
中测试MXCSR
标记,以检测超出范围的值。