在sse simd的ceil / floor

时间:2011-03-11 01:33:30

标签: c optimization assembly simd floor

有人能建议使用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来说不是太大?

1 个答案:

答案 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标记,以检测超出范围的值。