xmm
在 32 位模式下在 SSE2 寄存器中加载 64 位整数值的最佳/最快方法是什么?
在 64 位模式下,cvtsi2sd
可以使用,但在 32 位模式下,它只支持 32 位整数。
到目前为止,我还没有发现太多:
- 使用
fild
,fstp
堆叠然后movsd
注册xmm
- 加载高 32 位部分,乘以 2^32,加上低 32 位
第一个解决方案很慢,第二个解决方案可能会引入精度损失(编辑:无论如何它很慢,因为必须将低 32 位转换为无符号......)
有更好的方法吗?
您的第二个选项可以工作,尽管它有点笨拙。我假设您的 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 一致性的编译器的运行时库中,则需要解决此问题,但对于大多数用途而言,这不是问题。