V4 JIT: implement convertUInt32ToDouble on ARMv7.
authorErik Verbruggen <erik.verbruggen@me.com>
Tue, 1 Oct 2013 12:53:05 +0000 (14:53 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Thu, 3 Oct 2013 05:07:14 +0000 (07:07 +0200)
Change-Id: I11caf07a8776bb2c6527639f22d47103f4ca1cef
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
src/3rdparty/masm/assembler/ARMv7Assembler.h
src/3rdparty/masm/assembler/MacroAssemblerARMv7.h
src/qml/compiler/qv4isel_masm.cpp
src/qml/compiler/qv4isel_masm_p.h

index 3a0a435..236d558 100644 (file)
@@ -1795,6 +1795,12 @@ public:
         m_formatter.vfpOp(OP_VCVT_FPIVFP, OP_VCVT_FPIVFPb, true, vcvtOp(true, false, true), rd, rm);
     }
     
+    void vcvt_unsignedToFloatingPoint(FPDoubleRegisterID rd, FPSingleRegisterID rm)
+    {
+        // boolean values are 64bit (toInt, unsigned, roundZero)
+        m_formatter.vfpOp(OP_VCVT_FPIVFP, OP_VCVT_FPIVFPb, true, vcvtOp(false, true, false), rd, rm);
+    }
+
     void vcvt_floatingPointToUnsigned(FPSingleRegisterID rd, FPDoubleRegisterID rm)
     {
         // boolean values are 64bit (toInt, unsigned, roundZero)
index 0c5a5fb..61c13ac 100644 (file)
@@ -1015,6 +1015,12 @@ public:
         m_assembler.vmov(fpTempRegister, dataTempRegister, dataTempRegister);
         m_assembler.vcvt_signedToFloatingPoint(dest, fpTempRegisterAsSingle());
     }
+
+    void convertUInt32ToDouble(RegisterID src, FPRegisterID dest, RegisterID /*scratch*/)
+    {
+        m_assembler.vmov(fpTempRegister, src, src);
+        m_assembler.vcvt_unsignedToFloatingPoint(dest, fpTempRegisterAsSingle());
+    }
     
     void convertFloatToDouble(FPRegisterID src, FPRegisterID dst)
     {
index 5ee5396..020bdb3 100644 (file)
@@ -1935,12 +1935,8 @@ Assembler::Jump InstructionSelection::genTryDoubleConversion(V4IR::Expr *src,
                                   dest);
         return Assembler::Jump();
     case V4IR::UInt32Type:
-#if CPU(X86_64) || CPU(X86)
         _as->convertUInt32ToDouble(_as->toUInt32Register(src, Assembler::ScratchRegister),
                                    dest, Assembler::ReturnValueRegister);
-#else
-        Q_ASSERT(!"Not supported on this platform!");
-#endif
         return Assembler::Jump();
     case V4IR::BoolType:
         // TODO?
index 8235e6e..0ee363f 100644 (file)
@@ -1200,7 +1200,6 @@ public:
     void storeUInt32(RegisterID reg, Pointer addr)
     {
         // The UInt32 representation in QV4::Value is really convoluted. See also toUInt32Register.
-#if CPU(X86_64) | CPU(X86)
         Jump intRange = branch32(GreaterThanOrEqual, reg, TrustedImm32(0));
         convertUInt32ToDouble(reg, FPGpr0, ReturnValueRegister);
         storeDouble(FPGpr0, addr);
@@ -1208,11 +1207,6 @@ public:
         intRange.link(this);
         storeInt32(reg, addr);
         done.link(this);
-#else
-        Q_ASSERT(!"Not tested on this platform!");
-        Q_UNUSED(reg)
-        Q_UNUSED(addr)
-#endif
     }
 
     void storeUInt32(RegisterID reg, V4IR::Temp *target)
@@ -1472,25 +1466,13 @@ private:
     void convertUIntToDouble(V4IR::Temp *source, V4IR::Temp *target)
     {
         if (target->kind == V4IR::Temp::PhysicalRegister) {
-#if CPU(X86_64) || CPU(X86)
             _as->convertUInt32ToDouble(_as->toInt32Register(source, Assembler::ScratchRegister),
                                        (Assembler::FPRegisterID) target->index,
                                        Assembler::ScratchRegister);
-#else
-        Q_ASSERT(!"Not supported on this platform!");
-        Q_UNUSED(source)
-        Q_UNUSED(target)
-#endif
         } else if (target->kind == V4IR::Temp::StackSlot) {
-#if CPU(X86_64) || CPU(X86)
             _as->convertUInt32ToDouble(_as->toUInt32Register(source, Assembler::ScratchRegister),
                                       Assembler::FPGpr0, Assembler::ScratchRegister);
             _as->storeDouble(Assembler::FPGpr0, _as->stackSlotPointer(target));
-#else
-        Q_ASSERT(!"Not supported on this platform!");
-        Q_UNUSED(source)
-        Q_UNUSED(target)
-#endif
         } else {
             Q_UNIMPLEMENTED();
         }