From 35ed1695f06aca61a86f7f47360f048a40180add Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Thu, 15 Aug 2013 13:49:40 +0200 Subject: Change convertUInt32ToDouble to use an int scratch register. Only on X86, and still untested. Change-Id: I746daa47ed019ce0017a67a228a719983b1ebaa6 Reviewed-by: Simon Hausmann --- src/3rdparty/masm/assembler/MacroAssemblerX86.h | 20 +++++++++++--------- src/3rdparty/masm/assembler/MacroAssemblerX86_64.h | 2 +- 2 files changed, 12 insertions(+), 10 deletions(-) (limited to 'src/3rdparty/masm') diff --git a/src/3rdparty/masm/assembler/MacroAssemblerX86.h b/src/3rdparty/masm/assembler/MacroAssemblerX86.h index 471bf173f5..eb0702d464 100644 --- a/src/3rdparty/masm/assembler/MacroAssemblerX86.h +++ b/src/3rdparty/masm/assembler/MacroAssemblerX86.h @@ -124,15 +124,17 @@ public: } #if 0 // FIXME: UNTESTED! - void convertUInt32ToDouble(RegisterID src, FPRegisterID dest, FPRegisterID scratch) - { - // compare this with what the Clang compiler with -O3 generates for: - // double f(unsigned u) { return (double) u; } - static const double magic = 4.503600e+15; // 0x4330000000000000 - m_assembler.loadDouble(&magic, scratch); - m_assembler.movd_rr(src, dst); - m_assembler.orpd_rr(scratch, dest); - m_assembler.subsd(scratch, dest); + void convertUInt32ToDouble(RegisterID src, FPRegisterID dest, RegisterID scratch) + { + Jump intRange = branch32(GreaterThanOrEqual, src, TrustedImm32(0)); + and32(TrustedImm32(INT_MAX), src, scratch); + convertInt32ToDouble(scratch, dst); + static const double magic = INT_MAX + 1; + addDouble(&magic, dst); + Jump done = jump(); + intRange.link(this); + convertInt32ToDouble(src, dst); + done.link(this); } #endif diff --git a/src/3rdparty/masm/assembler/MacroAssemblerX86_64.h b/src/3rdparty/masm/assembler/MacroAssemblerX86_64.h index 80aa1dbe1d..3aaa0fd1bc 100644 --- a/src/3rdparty/masm/assembler/MacroAssemblerX86_64.h +++ b/src/3rdparty/masm/assembler/MacroAssemblerX86_64.h @@ -110,7 +110,7 @@ public: m_assembler.cvtsi2sd_rr(scratchRegister, dest); } - void convertUInt32ToDouble(RegisterID src, FPRegisterID dest, FPRegisterID /*scratch*/) + void convertUInt32ToDouble(RegisterID src, FPRegisterID dest, RegisterID /*scratch*/) { zeroExtend32ToPtr(src, src); m_assembler.cvtsiq2sd_rr(src, dest); -- cgit v1.2.3