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

How to truncate float values in XMM register

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

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

有一个 SO question 的一些答案涉及主题:

  • fmodf (fp modulo) function;
  • float to int(也提到内在函数,见下文);

还有一个paper讨论了float转int的问题,特别提到了第二个答案(没有抄袭)。

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

警告

这是经过研究的答案。我没有亲自使用参考技术。

使用roundps是最简单的。舍入模式 table 在其他地方,但您需要舍入模式 3(接近零)。

仅当输入保证在某个范围内(大约 0 到 4.6e18,因为平方根)时,转换为整数并返回才有效。您可以使用 cvttps2dqcvtdq2ps 来完成此操作。那将只需要 SSE2,roundps 需要 SSE4.1。仅当舍入模式设置为截断时才可以使用 cvtps2dq,而通常情况下并非如此,因此您必须更改并恢复它。