如何截断XMM寄存器中的浮点值

时间:2015-12-04 09:38:38

标签: c++ c assembly sse

如何只获取float的整数部分?所以,我有一个浮点数组:x [4] = {5.0,13.0,25.0,41.0};我把它放在xmm0然后我就制作了它的sqrt。我还需要一个命令来帮助只占用这个sqrt的int部分。例如,5的sqrt将是2.236068,我在答案中只需要2.0 代码:

__asm 
        {
            movups xmm0, x
            sqrtps xmm0, xmm0
            //here need some command
            movups x, xmm0
        }

2 个答案:

答案 0 :(得分:5)

使用roundps是最简单的。舍入模式表位于其他位置,但您需要舍入模式3(朝向零)。

转换为整数并返回仅在输入保证在某个范围内时才起作用(由于平方根,大约为0到4.6e18)。您可以使用cvttps2dqcvtdq2ps执行此操作。这只需要SSE2,roundps需要SSE4.1。只有当舍入模式设置为截断时才能使用cvtps2dq,通常不是这样,因此您必须更改+恢复它。

答案 1 :(得分:3)

有一些SO question的答案解决了这个话题:

还有一个paper讨论了浮点到转换问题,特别提到了第二个答案(没有暗示抄袭)。

主要的Windows编译器(至少)带有可能感兴趣的所谓内在函数(高度优化的内联函数),例如。 MSVCIntel (float to int: p. 42; float floor(float) function and likes: p. 135)

<强>买者

这是一个研究答案。我没有亲自使用引用的技术。