将64位整数加载到双精度SSE2寄存器的最佳方法是什么?

时间:2013-03-22 11:16:57

标签: assembly double sse sse2 int64

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

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

到目前为止,我还没有找到更多:

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

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

有更好的方法吗?

1 个答案:

答案 0 :(得分: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.00设置为舍入到无穷大时,此转换会生成mxcsr。如果它在运行时库中用于旨在提供IEEE-754一致性的编译器,则需要解决这个问题,但对于大多数用途来说不是问题。