在32位模式下在xmm
SSE2寄存器中加载64位整数值的最佳/最快方法是什么?
在64位模式下,可以使用cvtsi2sd
,但在32位模式下,它仅支持32位整数。
到目前为止,我还没有找到更多:
fild
,fstp
然后将movsd
堆叠到xmm
注册第一个解决方案很慢,第二个解决方案可能会引入精度损失(编辑:,无论如何它都很慢,因为低32位必须转换为无符号......)
有更好的方法吗?
答案 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.0
且0
设置为舍入到无穷大时,此转换会生成mxcsr
。如果它在运行时库中用于旨在提供IEEE-754一致性的编译器,则需要解决这个问题,但对于大多数用途来说不是问题。