aboutsummaryrefslogtreecommitdiffstats
path: root/src/3rdparty/masm/assembler
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@me.com>2013-07-24 16:45:20 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-07-30 17:25:12 +0200
commitd68fd71136c58488e620fd8da8f532f1f4bd2ed5 (patch)
treeea1a7c312012ef224c5f980ea036a8808f1f1917 /src/3rdparty/masm/assembler
parentc7068dbacb4b0f063baec0c02b99fc46b15b9c8e (diff)
Added convertUInt32ToDouble for X86(_64)
Change-Id: Ie6c918730d0ece0e9e63254ae97c257ee013f2f4 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/3rdparty/masm/assembler')
-rw-r--r--src/3rdparty/masm/assembler/MacroAssemblerX86.h13
-rw-r--r--src/3rdparty/masm/assembler/MacroAssemblerX86_64.h6
-rw-r--r--src/3rdparty/masm/assembler/X86Assembler.h9
3 files changed, 28 insertions, 0 deletions
diff --git a/src/3rdparty/masm/assembler/MacroAssemblerX86.h b/src/3rdparty/masm/assembler/MacroAssemblerX86.h
index 27a030edfd..471bf173f5 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 c711e6f8da..80aa1dbe1d 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 092e775ab5..a3a480541c 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);