你的第二个选择可以起作用,虽然它有点笨拙.我假设您的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)
Run Code Online (Sandbox Code Playgroud)
除了可能的最后一个操作之外的所有操作都是精确的,因此这是正确舍入的.应该注意的是,-0.0当输入是0并且mxcsr被设置为舍入到无穷大时,该转换产生.如果它在运行时库中用于旨在提供IEEE-754一致性的编译器,则需要解决这个问题,但对于大多数用法来说不是问题.