14

xmm在 32 位模式下在 SSE2 寄存器中加载 64 位整数值的最佳/最快方法是什么?

在 64 位模式下,cvtsi2sd可以使用,但在 32 位模式下,它只支持 32 位整数。

到目前为止,我还没有发现太多:

  • 使用fild,fstp堆叠然后movsd注册xmm
  • 加载高 32 位部分,乘以 2^32,加上低 32 位

第一个解决方案很慢,第二个解决方案可能会引入精度损失(编辑:无论如何它很慢,因为必须将低 32 位转换为无符号......)

有更好的方法吗?

4

1 回答 1

9

您的第二个选项可以工作,尽管它有点笨拙。我假设您的 64 位数字最初位于 edx:eax 中。

cvtsi2sd xmm0, edx              // high part * 2**-32
mulsd    xmm0, [2**32 from mem] // high part
movsd    xmm2, [2**52 from mem]
movd     xmm1, eax
orpd     xmm1, xmm2             // (double)(2*52 + low part as unsigned)
subsd    xmm1, xmm2             // (double)(low part as unsigned)
addsd    xmm0, xmm1             // (double)(high part + low part as unsigned)

除了可能的最后一个之外,所有的操作都是精确的,所以这是正确的四舍五入。应该注意的是,-0.0当输入是0并且mxcsr设置为负无穷大时,会产生这种转换。如果它被用于旨在提供 IEEE-754 一致性的编译器的运行时库中,则需要解决此问题,但对于大多数用途而言,这不是问题。

于 2013-03-24T13:08:20.193 回答