Added convertUInt32ToDouble for X86(_64)
authorErik Verbruggen <erik.verbruggen@me.com>
Wed, 24 Jul 2013 14:45:20 +0000 (16:45 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Tue, 30 Jul 2013 15:25:12 +0000 (17:25 +0200)
Change-Id: Ie6c918730d0ece0e9e63254ae97c257ee013f2f4
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
src/3rdparty/masm/assembler/MacroAssemblerX86.h
src/3rdparty/masm/assembler/MacroAssemblerX86_64.h
src/3rdparty/masm/assembler/X86Assembler.h

index 27a030e..471bf17 100644 (file)
@@ -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);
index c711e6f..80aa1db 100644 (file)
@@ -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);
index 092e775..a3a4805 100644 (file)
@@ -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);