From d68fd71136c58488e620fd8da8f532f1f4bd2ed5 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Wed, 24 Jul 2013 16:45:20 +0200 Subject: [PATCH] Added convertUInt32ToDouble for X86(_64) Change-Id: Ie6c918730d0ece0e9e63254ae97c257ee013f2f4 Reviewed-by: Simon Hausmann --- src/3rdparty/masm/assembler/MacroAssemblerX86.h | 13 +++++++++++++ src/3rdparty/masm/assembler/MacroAssemblerX86_64.h | 6 ++++++ src/3rdparty/masm/assembler/X86Assembler.h | 9 +++++++++ 3 files changed, 28 insertions(+) diff --git a/src/3rdparty/masm/assembler/MacroAssemblerX86.h b/src/3rdparty/masm/assembler/MacroAssemblerX86.h index 27a030e..471bf17 100644 --- a/src/3rdparty/masm/assembler/MacroAssemblerX86.h +++ b/src/3rdparty/masm/assembler/MacroAssemblerX86.h @@ -123,6 +123,19 @@ public: m_assembler.cvtsi2sd_mr(src.m_ptr, dest); } +#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); + } +#endif + void store32(TrustedImm32 imm, void* address) { m_assembler.movl_i32m(imm.m_value, address); diff --git a/src/3rdparty/masm/assembler/MacroAssemblerX86_64.h b/src/3rdparty/masm/assembler/MacroAssemblerX86_64.h index c711e6f..80aa1db 100644 --- a/src/3rdparty/masm/assembler/MacroAssemblerX86_64.h +++ b/src/3rdparty/masm/assembler/MacroAssemblerX86_64.h @@ -110,6 +110,12 @@ public: m_assembler.cvtsi2sd_rr(scratchRegister, dest); } + void convertUInt32ToDouble(RegisterID src, FPRegisterID dest, FPRegisterID /*scratch*/) + { + zeroExtend32ToPtr(src, src); + m_assembler.cvtsiq2sd_rr(src, dest); + } + void store32(TrustedImm32 imm, void* address) { move(TrustedImmPtr(address), scratchRegister); diff --git a/src/3rdparty/masm/assembler/X86Assembler.h b/src/3rdparty/masm/assembler/X86Assembler.h index 092e775..a3a4805 100644 --- a/src/3rdparty/masm/assembler/X86Assembler.h +++ b/src/3rdparty/masm/assembler/X86Assembler.h @@ -1541,6 +1541,15 @@ public: } #endif +#if CPU(X86_64) + void cvtsiq2sd_rr(RegisterID src, FPRegisterID dst) + { + m_formatter.prefix(PRE_SSE_F2); + m_formatter.twoByteOp64(OP2_CVTSI2SD_VsdEd, (RegisterID)dst, src); + } + +#endif + void cvttsd2si_rr(XMMRegisterID src, RegisterID dst) { m_formatter.prefix(PRE_SSE_F2); -- 2.7.4