C sse simd中的天花板/地板

C sse simd中的天花板/地板,c,optimization,assembly,simd,floor,C,Optimization,Assembly,Simd,Floor,有人能推荐一种使用SSE4.1之前的SIMD快速计算浮动地板/天花板的方法吗?我需要正确处理所有的角情况,例如,当我有一个浮点值时,它不能用32位int表示 目前,我使用的代码与以下代码类似,我使用C intrinsic,为清晰起见转换为asm: ;make many copies of the data movaps xmm0, [float_value] movaps xmm1, xmm0 movaps xmm2, xmm0 ;check i

有人能推荐一种使用SSE4.1之前的SIMD快速计算浮动地板/天花板的方法吗?我需要正确处理所有的角情况,例如,当我有一个浮点值时,它不能用32位int表示

目前,我使用的代码与以下代码类似,我使用C intrinsic,为清晰起见转换为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是否太大?

这里有一些用于单个元素的伪代码,可以直接转换为向量指令:

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标志,以检测超出范围的值