Ответ 1
Второй вариант можно сделать для работы, хотя он немного громоздкий. Я предполагаю, что ваш 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, но это не является проблемой для большинства видов использования.