Title: [194388] trunk/Source/_javascript_Core
Revision
194388
Author
[email protected]
Date
2015-12-23 03:52:39 -0800 (Wed, 23 Dec 2015)

Log Message

[JSC] Get the _javascript_Core framework to build on ARM64 with B3 enabled
https://bugs.webkit.org/show_bug.cgi?id=152503

Patch by Benjamin Poulain <[email protected]> on 2015-12-23
Reviewed by Filip Pizlo.

It is not working but it builds.

* assembler/ARM64Assembler.h:
(JSC::ARM64Assembler::vand):
(JSC::ARM64Assembler::vectorDataProcessing2Source):
* assembler/MacroAssemblerARM64.h:
(JSC::MacroAssemblerARM64::add32):
(JSC::MacroAssemblerARM64::add64):
(JSC::MacroAssemblerARM64::countLeadingZeros64):
(JSC::MacroAssemblerARM64::not32):
(JSC::MacroAssemblerARM64::not64):
(JSC::MacroAssemblerARM64::zeroExtend16To32):
(JSC::MacroAssemblerARM64::signExtend16To32):
(JSC::MacroAssemblerARM64::zeroExtend8To32):
(JSC::MacroAssemblerARM64::signExtend8To32):
(JSC::MacroAssemblerARM64::addFloat):
(JSC::MacroAssemblerARM64::ceilFloat):
(JSC::MacroAssemblerARM64::branchDouble):
(JSC::MacroAssemblerARM64::branchFloat):
(JSC::MacroAssemblerARM64::divFloat):
(JSC::MacroAssemblerARM64::moveZeroToDouble):
(JSC::MacroAssemblerARM64::moveFloatTo32):
(JSC::MacroAssemblerARM64::move32ToFloat):
(JSC::MacroAssemblerARM64::moveConditionallyDouble):
(JSC::MacroAssemblerARM64::moveConditionallyFloat):
(JSC::MacroAssemblerARM64::moveConditionallyAfterFloatingPointCompare):
(JSC::MacroAssemblerARM64::mulFloat):
(JSC::MacroAssemblerARM64::andDouble):
(JSC::MacroAssemblerARM64::andFloat):
(JSC::MacroAssemblerARM64::sqrtFloat):
(JSC::MacroAssemblerARM64::subFloat):
(JSC::MacroAssemblerARM64::signExtend32ToPtr):
(JSC::MacroAssemblerARM64::moveConditionally32):
(JSC::MacroAssemblerARM64::moveConditionally64):
(JSC::MacroAssemblerARM64::moveConditionallyTest32):
(JSC::MacroAssemblerARM64::moveConditionallyTest64):
(JSC::MacroAssemblerARM64::test32):
(JSC::MacroAssemblerARM64::setCarry):
(JSC::MacroAssemblerARM64::jumpAfterFloatingPointCompare):
* assembler/MacroAssemblerX86.h:
(JSC::MacroAssemblerX86::moveDoubleToInts):
(JSC::MacroAssemblerX86::moveIntsToDouble):
* assembler/MacroAssemblerX86Common.h:
(JSC::MacroAssemblerX86Common::move32ToFloat):
(JSC::MacroAssemblerX86Common::moveFloatTo32):
(JSC::MacroAssemblerX86Common::moveInt32ToPacked): Deleted.
(JSC::MacroAssemblerX86Common::movePackedToInt32): Deleted.
* b3/B3LowerToAir.cpp:
(JSC::B3::Air::LowerToAir::appendShift):
(JSC::B3::Air::LowerToAir::lower):
* b3/air/AirInstInlines.h:
(JSC::B3::Air::isX86DivHelperValid):
* b3/air/AirOpcode.opcodes:
* jit/AssemblyHelpers.h:
(JSC::AssemblyHelpers::emitFunctionEpilogueWithEmptyFrame):
(JSC::AssemblyHelpers::emitFunctionEpilogue):
* jit/FPRInfo.h:
(JSC::FPRInfo::toArgumentRegister):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (194387 => 194388)


--- trunk/Source/_javascript_Core/ChangeLog	2015-12-23 10:48:26 UTC (rev 194387)
+++ trunk/Source/_javascript_Core/ChangeLog	2015-12-23 11:52:39 UTC (rev 194388)
@@ -1,3 +1,69 @@
+2015-12-23  Benjamin Poulain  <[email protected]>
+
+        [JSC] Get the _javascript_Core framework to build on ARM64 with B3 enabled
+        https://bugs.webkit.org/show_bug.cgi?id=152503
+
+        Reviewed by Filip Pizlo.
+
+        It is not working but it builds.
+
+        * assembler/ARM64Assembler.h:
+        (JSC::ARM64Assembler::vand):
+        (JSC::ARM64Assembler::vectorDataProcessing2Source):
+        * assembler/MacroAssemblerARM64.h:
+        (JSC::MacroAssemblerARM64::add32):
+        (JSC::MacroAssemblerARM64::add64):
+        (JSC::MacroAssemblerARM64::countLeadingZeros64):
+        (JSC::MacroAssemblerARM64::not32):
+        (JSC::MacroAssemblerARM64::not64):
+        (JSC::MacroAssemblerARM64::zeroExtend16To32):
+        (JSC::MacroAssemblerARM64::signExtend16To32):
+        (JSC::MacroAssemblerARM64::zeroExtend8To32):
+        (JSC::MacroAssemblerARM64::signExtend8To32):
+        (JSC::MacroAssemblerARM64::addFloat):
+        (JSC::MacroAssemblerARM64::ceilFloat):
+        (JSC::MacroAssemblerARM64::branchDouble):
+        (JSC::MacroAssemblerARM64::branchFloat):
+        (JSC::MacroAssemblerARM64::divFloat):
+        (JSC::MacroAssemblerARM64::moveZeroToDouble):
+        (JSC::MacroAssemblerARM64::moveFloatTo32):
+        (JSC::MacroAssemblerARM64::move32ToFloat):
+        (JSC::MacroAssemblerARM64::moveConditionallyDouble):
+        (JSC::MacroAssemblerARM64::moveConditionallyFloat):
+        (JSC::MacroAssemblerARM64::moveConditionallyAfterFloatingPointCompare):
+        (JSC::MacroAssemblerARM64::mulFloat):
+        (JSC::MacroAssemblerARM64::andDouble):
+        (JSC::MacroAssemblerARM64::andFloat):
+        (JSC::MacroAssemblerARM64::sqrtFloat):
+        (JSC::MacroAssemblerARM64::subFloat):
+        (JSC::MacroAssemblerARM64::signExtend32ToPtr):
+        (JSC::MacroAssemblerARM64::moveConditionally32):
+        (JSC::MacroAssemblerARM64::moveConditionally64):
+        (JSC::MacroAssemblerARM64::moveConditionallyTest32):
+        (JSC::MacroAssemblerARM64::moveConditionallyTest64):
+        (JSC::MacroAssemblerARM64::test32):
+        (JSC::MacroAssemblerARM64::setCarry):
+        (JSC::MacroAssemblerARM64::jumpAfterFloatingPointCompare):
+        * assembler/MacroAssemblerX86.h:
+        (JSC::MacroAssemblerX86::moveDoubleToInts):
+        (JSC::MacroAssemblerX86::moveIntsToDouble):
+        * assembler/MacroAssemblerX86Common.h:
+        (JSC::MacroAssemblerX86Common::move32ToFloat):
+        (JSC::MacroAssemblerX86Common::moveFloatTo32):
+        (JSC::MacroAssemblerX86Common::moveInt32ToPacked): Deleted.
+        (JSC::MacroAssemblerX86Common::movePackedToInt32): Deleted.
+        * b3/B3LowerToAir.cpp:
+        (JSC::B3::Air::LowerToAir::appendShift):
+        (JSC::B3::Air::LowerToAir::lower):
+        * b3/air/AirInstInlines.h:
+        (JSC::B3::Air::isX86DivHelperValid):
+        * b3/air/AirOpcode.opcodes:
+        * jit/AssemblyHelpers.h:
+        (JSC::AssemblyHelpers::emitFunctionEpilogueWithEmptyFrame):
+        (JSC::AssemblyHelpers::emitFunctionEpilogue):
+        * jit/FPRInfo.h:
+        (JSC::FPRInfo::toArgumentRegister):
+
 2015-12-23  Andy VanWagoner  <[email protected]>
 
         [INTL] Implement Intl.DateTimeFormat.prototype.resolvedOptions ()

Modified: trunk/Source/_javascript_Core/assembler/ARM64Assembler.h (194387 => 194388)


--- trunk/Source/_javascript_Core/assembler/ARM64Assembler.h	2015-12-23 10:48:26 UTC (rev 194387)
+++ trunk/Source/_javascript_Core/assembler/ARM64Assembler.h	2015-12-23 11:52:39 UTC (rev 194388)
@@ -38,6 +38,7 @@
 #define DATASIZE_OF(datasize) ((datasize == 64) ? Datasize_64 : Datasize_32)
 #define MEMOPSIZE_OF(datasize) ((datasize == 8 || datasize == 128) ? MemOpSize_8_or_128 : (datasize == 16) ? MemOpSize_16 : (datasize == 32) ? MemOpSize_32 : MemOpSize_64)
 #define CHECK_DATASIZE() CHECK_DATASIZE_OF(datasize)
+#define CHECK_VECTOR_DATASIZE() ASSERT(datasize == 64 || datasize == 128)
 #define DATASIZE DATASIZE_OF(datasize)
 #define MEMOPSIZE MEMOPSIZE_OF(datasize)
 #define CHECK_FP_MEMOP_DATASIZE() ASSERT(datasize == 8 || datasize == 16 || datasize == 32 || datasize == 64 || datasize == 128)
@@ -861,6 +862,10 @@
         FPDataOp_FNMUL
     };
 
+    enum SIMD3Same {
+        SIMD_LogicalOp_AND = 0x03
+    };
+
     enum FPIntConvOp {
         FPIntConvOp_FCVTNS = 0x00,
         FPIntConvOp_FCVTNU = 0x01,
@@ -2418,6 +2423,13 @@
     }
 
     template<int datasize>
+    ALWAYS_INLINE void vand(FPRegisterID vd, FPRegisterID vn, FPRegisterID vm)
+    {
+        CHECK_VECTOR_DATASIZE();
+        insn(vectorDataProcessing2Source(SIMD_LogicalOp_AND, vm, vn, vd));
+    }
+
+    template<int datasize>
     ALWAYS_INLINE void frinta(FPRegisterID vd, FPRegisterID vn)
     {
         CHECK_DATASIZE();
@@ -3473,6 +3485,18 @@
         return (0x1e200800 | M << 31 | S << 29 | type << 22 | rm << 16 | opcode << 12 | rn << 5 | rd);
     }
 
+    ALWAYS_INLINE static int vectorDataProcessing2Source(SIMD3Same opcode, unsigned size, FPRegisterID vm, FPRegisterID vn, FPRegisterID vd)
+    {
+        const int Q = 0;
+        return (0xe201c00 | Q << 30 | size << 22 | vm << 16 | opcode << 11 | vn << 5 | vd);
+    }
+
+    ALWAYS_INLINE static int vectorDataProcessing2Source(SIMD3Same opcode, FPRegisterID vm, FPRegisterID vn, FPRegisterID vd)
+    {
+        return vectorDataProcessing2Source(opcode, 0, vm, vn, vd);
+    }
+
+
     // 'o1' means negate
     ALWAYS_INLINE static int floatingPointDataProcessing3Source(Datasize type, bool o1, FPRegisterID rm, AddOp o2, FPRegisterID ra, FPRegisterID rn, FPRegisterID rd)
     {

Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h (194387 => 194388)


--- trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h	2015-12-23 10:48:26 UTC (rev 194387)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h	2015-12-23 11:52:39 UTC (rev 194388)
@@ -134,6 +134,12 @@
 
     // Integer operations:
 
+    void add32(RegisterID a, RegisterID b, RegisterID dest)
+    {
+        ASSERT(a != ARM64Registers::sp && b != ARM64Registers::sp);
+        m_assembler.add<32>(dest, a, b);
+    }
+
     void add32(RegisterID src, RegisterID dest)
     {
         m_assembler.add<32>(dest, dest, src);
@@ -213,6 +219,14 @@
         add32(dataTempRegister, dest);
     }
 
+    void add64(RegisterID a, RegisterID b, RegisterID dest)
+    {
+        ASSERT(a != ARM64Registers::sp || b != ARM64Registers::sp);
+        if (b == ARM64Registers::sp)
+            std::swap(a, b);
+        m_assembler.add<64>(dest, a, b);
+    }
+
     void add64(RegisterID src, RegisterID dest)
     {
         if (src == ARM64Registers::sp)
@@ -408,6 +422,11 @@
         m_assembler.clz<32>(dest, src);
     }
 
+    void countLeadingZeros64(RegisterID src, RegisterID dest)
+    {
+        m_assembler.clz<64>(dest, src);
+    }
+
     void lshift32(RegisterID src, RegisterID shiftAmount, RegisterID dest)
     {
         m_assembler.lsl<32>(dest, src, shiftAmount);
@@ -813,7 +832,16 @@
         }
     }
 
+    void not32(RegisterID src, RegisterID dest)
+    {
+        m_assembler.mvn<32>(dest, src);
+    }
 
+    void not64(RegisterID src, RegisterID dest)
+    {
+        m_assembler.mvn<64>(dest, src);
+    }
+
     // Memory access operations:
 
     void load64(ImplicitAddress address, RegisterID dest)
@@ -963,6 +991,16 @@
         m_assembler.ldrsh<32>(dest, address.base, memoryTempRegister);
     }
 
+    void zeroExtend16To32(RegisterID src, RegisterID dest)
+    {
+        m_assembler.uxth<64>(dest, src);
+    }
+
+    void signExtend16To32(RegisterID src, RegisterID dest)
+    {
+        m_assembler.sxth<64>(dest, src);
+    }
+
     void load8(ImplicitAddress address, RegisterID dest)
     {
         if (tryLoadWithOffset<8>(dest, address.base, address.offset))
@@ -1004,6 +1042,16 @@
         m_assembler.ldrsb<32>(dest, address.base, memoryTempRegister);
     }
 
+    void zeroExtend8To32(RegisterID src, RegisterID dest)
+    {
+        m_assembler.uxtb<64>(dest, src);
+    }
+
+    void signExtend8To32(RegisterID src, RegisterID dest)
+    {
+        m_assembler.sxtb<64>(dest, src);
+    }
+
     void store64(RegisterID src, ImplicitAddress address)
     {
         if (tryStoreWithOffset<64>(src, address.base, address.offset))
@@ -1230,11 +1278,21 @@
         addDouble(fpTempRegister, dest);
     }
 
+    void addFloat(FPRegisterID op1, FPRegisterID op2, FPRegisterID dest)
+    {
+        m_assembler.fadd<32>(dest, op1, op2);
+    }
+
     void ceilDouble(FPRegisterID src, FPRegisterID dest)
     {
         m_assembler.frintp<64>(dest, src);
     }
 
+    void ceilFloat(FPRegisterID src, FPRegisterID dest)
+    {
+        m_assembler.frintp<32>(dest, src);
+    }
+
     void floorDouble(FPRegisterID src, FPRegisterID dest)
     {
         m_assembler.frintm<64>(dest, src);
@@ -1265,24 +1323,13 @@
     Jump branchDouble(DoubleCondition cond, FPRegisterID left, FPRegisterID right)
     {
         m_assembler.fcmp<64>(left, right);
+        return jumpAfterFloatingPointCompare(cond);
+    }
 
-        if (cond == DoubleNotEqual) {
-            // ConditionNE jumps if NotEqual *or* unordered - force the unordered cases not to jump.
-            Jump unordered = makeBranch(ARM64Assembler::ConditionVS);
-            Jump result = makeBranch(ARM64Assembler::ConditionNE);
-            unordered.link(this);
-            return result;
-        }
-        if (cond == DoubleEqualOrUnordered) {
-            Jump unordered = makeBranch(ARM64Assembler::ConditionVS);
-            Jump notEqual = makeBranch(ARM64Assembler::ConditionNE);
-            unordered.link(this);
-            // We get here if either unordered or equal.
-            Jump result = jump();
-            notEqual.link(this);
-            return result;
-        }
-        return makeBranch(cond);
+    Jump branchFloat(DoubleCondition cond, FPRegisterID left, FPRegisterID right)
+    {
+        m_assembler.fcmp<32>(left, right);
+        return jumpAfterFloatingPointCompare(cond);
     }
 
     Jump branchDoubleNonZero(FPRegisterID reg, FPRegisterID)
@@ -1364,6 +1411,11 @@
         m_assembler.fdiv<64>(dest, op1, op2);
     }
 
+    void divFloat(FPRegisterID op1, FPRegisterID op2, FPRegisterID dest)
+    {
+        m_assembler.fdiv<32>(dest, op1, op2);
+    }
+
     void loadDouble(ImplicitAddress address, FPRegisterID dest)
     {
         if (tryLoadWithOffset<64>(dest, address.base, address.offset))
@@ -1408,16 +1460,64 @@
         m_assembler.fmov<64>(dest, src);
     }
 
+    void moveZeroToDouble(FPRegisterID reg)
+    {
+        m_assembler.fmov<64>(reg, ARM64Registers::zr);
+    }
+
     void moveDoubleTo64(FPRegisterID src, RegisterID dest)
     {
         m_assembler.fmov<64>(dest, src);
     }
 
+    void moveFloatTo32(FPRegisterID src, RegisterID dest)
+    {
+        m_assembler.fmov<32>(dest, src);
+    }
+
     void move64ToDouble(RegisterID src, FPRegisterID dest)
     {
         m_assembler.fmov<64>(dest, src);
     }
 
+    void move32ToFloat(RegisterID src, FPRegisterID dest)
+    {
+        m_assembler.fmov<32>(dest, src);
+    }
+
+    void moveConditionallyDouble(DoubleCondition cond, FPRegisterID left, FPRegisterID right, RegisterID src, RegisterID dest)
+    {
+        m_assembler.fcmp<64>(left, right);
+        moveConditionallyAfterFloatingPointCompare<64>(cond, src, dest);
+    }
+
+    void moveConditionallyFloat(DoubleCondition cond, FPRegisterID left, FPRegisterID right, RegisterID src, RegisterID dest)
+    {
+        m_assembler.fcmp<32>(left, right);
+        moveConditionallyAfterFloatingPointCompare<64>(cond, src, dest);
+    }
+
+    template<int datasize>
+    void moveConditionallyAfterFloatingPointCompare(DoubleCondition cond, RegisterID src, RegisterID dest)
+    {
+        if (cond == DoubleNotEqual) {
+            Jump unordered = makeBranch(ARM64Assembler::ConditionVS);
+            m_assembler.csel<datasize>(dest, src, dest, ARM64Assembler::ConditionNE);
+            unordered.link(this);
+            return;
+        }
+        if (cond == DoubleEqualOrUnordered) {
+            // If the compare is unordered, src is copied to dest and the
+            // next csel has all arguments equal to src.
+            // If the compare is ordered, dest is unchanged and EQ decides
+            // what value to set.
+            m_assembler.csel<datasize>(dest, src, dest, ARM64Assembler::ConditionVS);
+            m_assembler.csel<datasize>(dest, src, dest, ARM64Assembler::ConditionEQ);
+            return;
+        }
+        m_assembler.csel<datasize>(dest, src, dest, ARM64Condition(cond));
+    }
+
     void mulDouble(FPRegisterID src, FPRegisterID dest)
     {
         mulDouble(dest, src, dest);
@@ -1434,6 +1534,21 @@
         mulDouble(fpTempRegister, dest);
     }
 
+    void mulFloat(FPRegisterID op1, FPRegisterID op2, FPRegisterID dest)
+    {
+        m_assembler.fmul<32>(dest, op1, op2);
+    }
+
+    void andDouble(FPRegisterID op1, FPRegisterID op2, FPRegisterID dest)
+    {
+        m_assembler.vand<64>(dest, op1, op2);
+    }
+
+    void andFloat(FPRegisterID op1, FPRegisterID op2, FPRegisterID dest)
+    {
+        andDouble(op1, op2, dest);
+    }
+
     void negateDouble(FPRegisterID src, FPRegisterID dest)
     {
         m_assembler.fneg<64>(dest, src);
@@ -1444,6 +1559,11 @@
         m_assembler.fsqrt<64>(dest, src);
     }
 
+    void sqrtFloat(FPRegisterID src, FPRegisterID dest)
+    {
+        m_assembler.fsqrt<32>(dest, src);
+    }
+
     void storeDouble(FPRegisterID src, ImplicitAddress address)
     {
         if (tryStoreWithOffset<64>(src, address.base, address.offset))
@@ -1499,6 +1619,11 @@
         subDouble(fpTempRegister, dest);
     }
 
+    void subFloat(FPRegisterID op1, FPRegisterID op2, FPRegisterID dest)
+    {
+        m_assembler.fsub<32>(dest, op1, op2);
+    }
+
     // Result is undefined if the value is outside of the integer range.
     void truncateDoubleToInt32(FPRegisterID src, RegisterID dest)
     {
@@ -1628,6 +1753,11 @@
         move(reg2, reg1);
         move(dataTempRegister, reg2);
     }
+
+    void signExtend32ToPtr(TrustedImm32 imm, RegisterID dest)
+    {
+        move(TrustedImmPtr(reinterpret_cast<void*>(static_cast<intptr_t>(imm.m_value))), dest);
+    }
     
     void signExtend32ToPtr(RegisterID src, RegisterID dest)
     {
@@ -1639,7 +1769,30 @@
         m_assembler.uxtw(dest, src);
     }
 
+    void moveConditionally32(RelationalCondition cond, RegisterID left, RegisterID right, RegisterID src, RegisterID dest)
+    {
+        m_assembler.cmp<32>(left, right);
+        m_assembler.csel<32>(dest, src, dest, ARM64Condition(cond));
+    }
 
+    void moveConditionally64(RelationalCondition cond, RegisterID left, RegisterID right, RegisterID src, RegisterID dest)
+    {
+        m_assembler.cmp<64>(left, right);
+        m_assembler.csel<64>(dest, src, dest, ARM64Condition(cond));
+    }
+
+    void moveConditionallyTest32(ResultCondition cond, RegisterID testReg, RegisterID mask, RegisterID src, RegisterID dest)
+    {
+        m_assembler.tst<32>(testReg, mask);
+        m_assembler.csel<32>(dest, src, dest, ARM64Condition(cond));
+    }
+
+    void moveConditionallyTest64(ResultCondition cond, RegisterID testReg, RegisterID mask, RegisterID src, RegisterID dest)
+    {
+        m_assembler.tst<64>(testReg, mask);
+        m_assembler.csel<64>(dest, src, dest, ARM64Condition(cond));
+    }
+
     // Forwards / external control flow operations:
     //
     // This set of jump and conditional branch operations return a Jump
@@ -2314,7 +2467,13 @@
         move(right, getCachedDataTempRegisterIDAndInvalidate());
         compare32(cond, memoryTempRegister, dataTempRegister, dest);
     }
-    
+
+    void test32(ResultCondition cond, RegisterID src, RegisterID mask, RegisterID dest)
+    {
+        m_assembler.tst<32>(src, mask);
+        m_assembler.cset<32>(dest, ARM64Condition(cond));
+    }
+
     void test32(ResultCondition cond, RegisterID src, TrustedImm32 mask, RegisterID dest)
     {
         if (mask.m_value == -1)
@@ -2355,6 +2514,10 @@
         m_assembler.cset<32>(dest, ARM64Condition(cond));
     }
 
+    void setCarry(RegisterID dest)
+    {
+        m_assembler.cset<32>(dest, ARM64Assembler::ConditionCS);
+    }
 
     // Patchable operations
 
@@ -2742,11 +2905,6 @@
         }
     }
 
-    void signExtend32ToPtr(TrustedImm32 imm, RegisterID dest)
-    {
-        move(TrustedImmPtr(reinterpret_cast<void*>(static_cast<intptr_t>(imm.m_value))), dest);
-    }
-
     template<int datasize>
     ALWAYS_INLINE void load(const void* address, RegisterID dest)
     {
@@ -2933,6 +3091,27 @@
         return false;
     }
 
+    Jump jumpAfterFloatingPointCompare(DoubleCondition cond)
+    {
+        if (cond == DoubleNotEqual) {
+            // ConditionNE jumps if NotEqual *or* unordered - force the unordered cases not to jump.
+            Jump unordered = makeBranch(ARM64Assembler::ConditionVS);
+            Jump result = makeBranch(ARM64Assembler::ConditionNE);
+            unordered.link(this);
+            return result;
+        }
+        if (cond == DoubleEqualOrUnordered) {
+            Jump unordered = makeBranch(ARM64Assembler::ConditionVS);
+            Jump notEqual = makeBranch(ARM64Assembler::ConditionNE);
+            unordered.link(this);
+            // We get here if either unordered or equal.
+            Jump result = jump();
+            notEqual.link(this);
+            return result;
+        }
+        return makeBranch(cond);
+    }
+
     friend class LinkBuffer;
 
     static void linkCall(void* code, Call call, FunctionPtr function)

Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerX86.h (194387 => 194388)


--- trunk/Source/_javascript_Core/assembler/MacroAssemblerX86.h	2015-12-23 10:48:26 UTC (rev 194387)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerX86.h	2015-12-23 11:52:39 UTC (rev 194388)
@@ -179,13 +179,13 @@
         m_assembler.pextrw_irr(2, src, dest2);
         lshift32(TrustedImm32(16), dest1);
         or32(dest1, dest2);
-        movePackedToInt32(src, dest1);
+        moveFloatTo32(src, dest1);
     }
 
     void moveIntsToDouble(RegisterID src1, RegisterID src2, FPRegisterID dest, FPRegisterID scratch)
     {
-        moveInt32ToPacked(src1, dest);
-        moveInt32ToPacked(src2, scratch);
+        move32ToFloat(src1, dest);
+        move32ToFloat(src2, scratch);
         lshiftPacked(TrustedImm32(32), scratch);
         orPacked(scratch, dest);
     }

Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h (194387 => 194388)


--- trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h	2015-12-23 10:48:26 UTC (rev 194387)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h	2015-12-23 11:52:39 UTC (rev 194388)
@@ -1208,13 +1208,13 @@
         m_assembler.por_rr(src, dst);
     }
 
-    void moveInt32ToPacked(RegisterID src, XMMRegisterID dst)
+    void move32ToFloat(RegisterID src, XMMRegisterID dst)
     {
         ASSERT(isSSE2Present());
         m_assembler.movd_rr(src, dst);
     }
 
-    void movePackedToInt32(XMMRegisterID src, RegisterID dst)
+    void moveFloatTo32(XMMRegisterID src, RegisterID dst)
     {
         ASSERT(isSSE2Present());
         m_assembler.movd_rr(src, dst);

Modified: trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp (194387 => 194388)


--- trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp	2015-12-23 10:48:26 UTC (rev 194387)
+++ trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp	2015-12-23 11:52:39 UTC (rev 194388)
@@ -644,14 +644,27 @@
         Air::Opcode opcode = opcodeForType(opcode32, opcode64, value->type());
         
         if (imm(amount)) {
-            append(Move, tmp(value), tmp(m_value));
-            append(opcode, imm(amount), tmp(m_value));
+            if (isValidForm(opcode, Arg::Tmp, Arg::Imm, Arg::Tmp)) {
+                append(opcode, tmp(value), imm(amount), tmp(m_value));
+                return;
+            }
+            if (isValidForm(opcode, Arg::Imm, Arg::Tmp)) {
+                append(Move, tmp(value), tmp(m_value));
+                append(opcode, imm(amount), tmp(m_value));
+                return;
+            }
+        }
+
+        if (isValidForm(opcode, Arg::Tmp, Arg::Tmp, Arg::Tmp)) {
+            append(opcode, tmp(value), tmp(amount), tmp(m_value));
             return;
         }
 
+#if CPU(X86)
         append(Move, tmp(value), tmp(m_value));
         append(Move, tmp(amount), Tmp(X86Registers::ecx));
         append(opcode, Tmp(X86Registers::ecx), tmp(m_value));
+#endif
     }
 
     template<Air::Opcode opcode32, Air::Opcode opcode64>
@@ -1585,8 +1598,10 @@
 
         case Div: {
             if (isInt(m_value->type())) {
+#if CPU(X86)
                 lowerX86Div();
                 append(Move, Tmp(X86Registers::eax), tmp(m_value));
+#endif
                 return;
             }
             ASSERT(isFloat(m_value->type()));
@@ -1596,8 +1611,10 @@
         }
 
         case Mod: {
+#if CPU(X86)
             lowerX86Div();
             append(Move, Tmp(X86Registers::edx), tmp(m_value));
+#endif
             return;
         }
 
@@ -1677,7 +1694,7 @@
         }
 
         case BitwiseCast: {
-            appendUnOp<MoveInt32ToPacked, Move64ToDouble, MoveDoubleTo64, MovePackedToInt32>(m_value->child(0));
+            appendUnOp<Move32ToFloat, Move64ToDouble, MoveDoubleTo64, MoveFloatTo32>(m_value->child(0));
             return;
         }
 
@@ -2151,6 +2168,7 @@
         RELEASE_ASSERT_NOT_REACHED();
     }
 
+#if CPU(X86)
     void lowerX86Div()
     {
         Tmp eax = Tmp(X86Registers::eax);
@@ -2176,7 +2194,8 @@
         append(convertToDoubleWord, eax, edx);
         append(div, eax, edx, tmp(m_value->child(1)));
     }
-    
+#endif
+
     IndexSet<Value> m_locked; // These are values that will have no Tmp in Air.
     IndexMap<Value, Tmp> m_valueToTmp; // These are values that must have a Tmp in Air. We say that a Value* with a non-null Tmp is "pinned".
     IndexMap<B3::BasicBlock, Air::BasicBlock*> m_blockToBlock;

Modified: trunk/Source/_javascript_Core/b3/air/AirInstInlines.h (194387 => 194388)


--- trunk/Source/_javascript_Core/b3/air/AirInstInlines.h	2015-12-23 10:48:26 UTC (rev 194387)
+++ trunk/Source/_javascript_Core/b3/air/AirInstInlines.h	2015-12-23 11:52:39 UTC (rev 194388)
@@ -167,6 +167,7 @@
     return inst.args[0] == Tmp(X86Registers::eax)
         && inst.args[1] == Tmp(X86Registers::edx);
 #else
+    UNUSED_PARAM(inst);
     return false;
 #endif
 }

Modified: trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes (194387 => 194388)


--- trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes	2015-12-23 10:48:26 UTC (rev 194387)
+++ trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes	2015-12-23 11:52:39 UTC (rev 194388)
@@ -128,13 +128,19 @@
     Imm, Tmp, Tmp
     Tmp, Tmp, Tmp
 
-AddDouble U:F:64, UD:F:64
+arm64: AddDouble U:F:64, U:F:64, D:F:64
+    Tmp, Tmp, Tmp
+
+x86: AddDouble U:F:64, UD:F:64
     Tmp, Tmp
-    x86: Addr, Tmp
+    Addr, Tmp
 
-AddFloat U:F:32, UD:F:32
+arm64: AddFloat U:F:32, U:F:32, D:F:32
+    Tmp, Tmp, Tmp
+
+x86: AddFloat U:F:32, UD:F:32
     Tmp, Tmp
-    x86: Addr, Tmp
+    Addr, Tmp
 
 Sub32 U:G:32, UZD:G:32
     Tmp, Tmp
@@ -150,17 +156,23 @@
     x86: Addr, Tmp
     x86: Tmp, Addr
 
-SubDouble U:F:64, UD:F:64
+arm64: SubDouble U:F:64, U:F:64, D:F:64
+    Tmp, Tmp, Tmp
+
+x86: SubDouble U:F:64, UD:F:64
     Tmp, Tmp
-    x86: Addr, Tmp
+    Addr, Tmp
 
-SubFloat U:F:32, UD:F:32
+arm64: SubFloat U:F:32, U:F:32, D:F:32
+    Tmp, Tmp, Tmp
+
+x86: SubFloat U:F:32, UD:F:32
     Tmp, Tmp
-    x86: Addr, Tmp
+    Addr, Tmp
 
 Neg32 UZD:G:32
     Tmp
-    Addr
+    x86: Addr
 
 64: Neg64 UD:G:64
     Tmp
@@ -175,21 +187,33 @@
 64: Mul64 U:G:64, UD:G:64
     Tmp, Tmp
 
-MulDouble U:F:64, UD:F:64
+arm64: MulDouble U:F:64, U:F:64, D:F:64
+    Tmp, Tmp, Tmp
+
+x86: MulDouble U:F:64, UD:F:64
     Tmp, Tmp
-    x86: Addr, Tmp
+    Addr, Tmp
 
-MulFloat U:F:32, UD:F:32
+arm64: MulFloat U:F:32, U:F:32, D:F:32
+    Tmp, Tmp, Tmp
+
+x86: MulFloat U:F:32, UD:F:32
     Tmp, Tmp
-    x86: Addr, Tmp
+    Addr, Tmp
 
-DivDouble U:F:32, UD:F:32
+arm64: DivDouble U:F:32, U:F:32, D:F:32
+    Tmp, Tmp, Tmp
+
+x86: DivDouble U:F:32, UD:F:32
     Tmp, Tmp
-    x86: Addr, Tmp
+    Addr, Tmp
 
-DivFloat U:F:32, UD:F:32
+arm64: DivFloat U:F:32, U:F:32, D:F:32
+    Tmp, Tmp, Tmp
+
+x86: DivFloat U:F:32, UD:F:32
     Tmp, Tmp
-    x86: Addr, Tmp
+    Addr, Tmp
 
 x86: X86ConvertToDoubleWord32 U:G:32, ZD:G:32
     Tmp*, Tmp*
@@ -203,7 +227,7 @@
 x86_64: X86Div64 UZD:G:64, UZD:G:64, U:G:64
     Tmp*, Tmp*, Tmp
 
-Lea UA:G:Ptr, D:G:Ptr
+x86: Lea UA:G:Ptr, D:G:Ptr
     Addr, Tmp
 
 And32 U:G:32, UZD:G:32
@@ -217,33 +241,63 @@
     Tmp, Tmp
     Imm, Tmp
 
-AndDouble U:F:64, UD:F:64
+arm64: AndDouble U:F:64, U:F:64, D:F:64
+    Tmp, Tmp, Tmp
+
+x86: AndDouble U:F:64, UD:F:64
     Tmp, Tmp
 
-AndFloat U:F:32, UD:F:32
+arm64: AndFloat U:F:32, U:F:32, D:F:32
+    Tmp, Tmp, Tmp
+
+x86: AndFloat U:F:32, UD:F:32
     Tmp, Tmp
 
-Lshift32 U:G:32, UZD:G:32
+arm64: Lshift32 U:G:32, U:G:32, ZD:G:32
+    Tmp, Tmp, Tmp
+    Tmp, Imm, Tmp
+
+x86:Lshift32 U:G:32, UZD:G:32
     Tmp*, Tmp
     Imm, Tmp
 
-64: Lshift64 U:G:64, UD:G:64
+arm64: Lshift64 U:G:64, U:G:64, ZD:G:64
+    Tmp, Tmp, Tmp
+    Tmp, Imm, Tmp
+
+x86_64: Lshift64 U:G:64, UD:G:64
     Tmp*, Tmp
     Imm, Tmp
 
-Rshift32 U:G:32, UZD:G:32
+arm64: Rshift32 U:G:32, U:G:32, ZD:G:32
+    Tmp, Tmp, Tmp
+    Tmp, Imm, Tmp
+
+x86: Rshift32 U:G:32, UZD:G:32
     Tmp*, Tmp
     Imm, Tmp
 
-64: Rshift64 U:G:64, UD:G:64
+arm64: Rshift64 U:G:64, U:G:64, ZD:G:64
+    Tmp, Tmp, Tmp
+    Tmp, Imm, Tmp
+
+x86_64: Rshift64 U:G:64, UD:G:64
     Tmp*, Tmp
     Imm, Tmp
 
-Urshift32 U:G:32, UZD:G:32
+arm64: urshift32 U:G:32, U:G:32, ZD:G:32
+    Tmp, Tmp, Tmp
+    Tmp, Imm, Tmp
+
+x86: Urshift32 U:G:32, UZD:G:32
     Tmp*, Tmp
     Imm, Tmp
 
-64: Urshift64 U:G:64, UD:G:64
+arm64: Urshift64 U:G:64, U:G:64, ZD:G:64
+    Tmp, Tmp, Tmp
+    Tmp, Imm, Tmp
+
+x86_64: Urshift64 U:G:64, UD:G:64
     Tmp*, Tmp
     Imm, Tmp
 
@@ -270,21 +324,27 @@
     x86: Tmp, Addr
     Imm, Tmp
 
-Not32 UZD:G:32
+arm64: Not32 U:G:32, ZD:G:32
+    Tmp, Tmp
+
+x86: Not32 UZD:G:32
     Tmp
-    x86: Addr
+    Addr
 
-64: Not64 UD:G:64
+arm64: Not64 U:G:64, D:G:64
+    Tmp, Tmp
+
+x86: Not64 UD:G:64
     Tmp
-    x86: Addr
+    Addr
 
 CeilDouble U:F:64, UD:F:64
     Tmp, Tmp
-    Addr, Tmp
+    x86: Addr, Tmp
 
 CeilFloat U:F:32, UD:F:32
     Tmp, Tmp
-    Addr, Tmp
+    x86: Addr, Tmp
 
 SqrtDouble U:F:64, UD:F:64
     Tmp, Tmp
@@ -325,27 +385,27 @@
     Tmp, Tmp
     Imm, Tmp as signExtend32ToPtr
     Imm64, Tmp
-    Addr, Tmp as loadPtr # This means that "Move Addr, Tmp" is code-generated as "load" not "move".
+    x86: Addr, Tmp as loadPtr # This means that "Move Addr, Tmp" is code-generated as "load" not "move".
     Index, Tmp as loadPtr
-    Tmp, Addr as storePtr
+    x86: Tmp, Addr as storePtr
     Tmp, Index as storePtr
-    Imm, Addr as storePtr
+    x86: Imm, Addr as storePtr
 
 Move32 U:G:32, ZD:G:32
     Tmp, Tmp as zeroExtend32ToPtr
-    Addr, Tmp as load32
+    x86: Addr, Tmp as load32
     Index, Tmp as load32
-    Tmp, Addr as store32
+    x86: Tmp, Addr as store32
     Tmp, Index as store32
-    Imm, Addr as store32
-    Imm, Index as store32
+    x86: Imm, Addr as store32
+    x86: Imm, Index as store32
 
 SignExtend32ToPtr U:G:32, D:G:Ptr
     Tmp, Tmp
 
 ZeroExtend8To32 U:G:8, ZD:G:32
     Tmp, Tmp
-    Addr, Tmp as load8
+    x86: Addr, Tmp as load8
     Index, Tmp as load8
 
 SignExtend8To32 U:G:8, ZD:G:32
@@ -355,26 +415,26 @@
 
 ZeroExtend16To32 U:G:16, ZD:G:32
     Tmp, Tmp
-    Addr, Tmp as load16
+    x86: Addr, Tmp as load16
     Index, Tmp as load16
 
 SignExtend16To32 U:G:16, ZD:G:32
     Tmp, Tmp
-    Addr, Tmp as load16SignedExtendTo32
+    x86: Addr, Tmp as load16SignedExtendTo32
     Index, Tmp as load16SignedExtendTo32
 
 MoveFloat U:F:32, D:F:32
     Tmp, Tmp as moveDouble
-    Addr, Tmp as loadFloat
+    x86: Addr, Tmp as loadFloat
     Index, Tmp as loadFloat
-    Tmp, Addr as storeFloat
+    x86: Tmp, Addr as storeFloat
     Tmp, Index as storeFloat
 
 MoveDouble U:F:64, D:F:64
     Tmp, Tmp
-    Addr, Tmp as loadDouble
+    x86: Addr, Tmp as loadDouble
     Index, Tmp as loadDouble
-    Tmp, Addr as storeDouble
+    x86: Tmp, Addr as storeDouble
     Tmp, Index as storeDouble
 
 MoveZeroToDouble D:F:64
@@ -382,44 +442,44 @@
 
 64: Move64ToDouble U:G:64, D:F:64
     Tmp, Tmp
-    Addr, Tmp as loadDouble
+    x86: Addr, Tmp as loadDouble
     Index, Tmp as loadDouble
 
-MoveInt32ToPacked U:G:32, D:F:32
+Move32ToFloat U:G:32, D:F:32
     Tmp, Tmp
-    Addr, Tmp as loadFloat
+    x86: Addr, Tmp as loadFloat
     Index, Tmp as loadFloat
 
 64: MoveDoubleTo64 U:F:64, D:G:64
     Tmp, Tmp
-    Addr, Tmp as load64
+    x86: Addr, Tmp as load64
     Index, Tmp as load64
 
-MovePackedToInt32 U:F:32, D:G:32
+MoveFloatTo32 U:F:32, D:G:32
     Tmp, Tmp
-    Addr, Tmp as load32
+    x86: Addr, Tmp as load32
     Index, Tmp as load32
 
 Load8 U:G:8, ZD:G:32
-    Addr, Tmp
+    x86: Addr, Tmp
     Index, Tmp
 
 Store8 U:G:8, D:G:8
     Tmp, Index
-    Tmp, Addr
-    Imm, Index
-    Imm, Addr
+    x86: Tmp, Addr
+    x86: Imm, Index
+    x86: Imm, Addr
 
 Load8SignedExtendTo32 U:G:8, ZD:G:32
-    Addr, Tmp
+    x86: Addr, Tmp
     Index, Tmp
 
 Load16 U:G:16, ZD:G:32
-    Addr, Tmp
+    x86: Addr, Tmp
     Index, Tmp
 
 Load16SignedExtendTo32 U:G:16, ZD:G:32
-    Addr, Tmp
+    x86: Addr, Tmp
     Index, Tmp
 
 Store16 U:G:16, D:G:16
@@ -540,11 +600,11 @@
 
 MoveConditionallyTest32 U:G:32, U:G:32, U:G:32, U:G:Ptr, UD:G:Ptr
     ResCond, Tmp, Tmp, Tmp, Tmp
-    ResCond, Tmp, Imm, Tmp, Tmp
+    x86: ResCond, Tmp, Imm, Tmp, Tmp
 
 64: MoveConditionallyTest64 U:G:32, U:G:64, U:G:64, U:G:Ptr, UD:G:Ptr
     ResCond, Tmp, Tmp, Tmp, Tmp
-    ResCond, Tmp, Imm, Tmp, Tmp
+    x86: ResCond, Tmp, Imm, Tmp, Tmp
 
 MoveConditionallyDouble U:G:32, U:F:64, U:F:64, U:G:Ptr, UD:G:Ptr
     DoubleCond, Tmp, Tmp, Tmp, Tmp

Modified: trunk/Source/_javascript_Core/jit/AssemblyHelpers.h (194387 => 194388)


--- trunk/Source/_javascript_Core/jit/AssemblyHelpers.h	2015-12-23 10:48:26 UTC (rev 194387)
+++ trunk/Source/_javascript_Core/jit/AssemblyHelpers.h	2015-12-23 11:52:39 UTC (rev 194388)
@@ -436,10 +436,15 @@
         move(stackPointerRegister, framePointerRegister);
     }
 
+    void emitFunctionEpilogueWithEmptyFrame()
+    {
+        popPair(framePointerRegister, linkRegister);
+    }
+
     void emitFunctionEpilogue()
     {
         move(framePointerRegister, stackPointerRegister);
-        popPair(framePointerRegister, linkRegister);
+        emitFunctionEpilogueWithEmptyFrame();
     }
 
     ALWAYS_INLINE void preserveReturnAddressAfterCall(RegisterID reg)

Modified: trunk/Source/_javascript_Core/jit/FPRInfo.h (194387 => 194388)


--- trunk/Source/_javascript_Core/jit/FPRInfo.h	2015-12-23 10:48:26 UTC (rev 194387)
+++ trunk/Source/_javascript_Core/jit/FPRInfo.h	2015-12-23 11:52:39 UTC (rev 194388)
@@ -187,6 +187,7 @@
 public:
     typedef FPRReg RegisterType;
     static const unsigned numberOfRegisters = 23;
+    static const unsigned numberOfArgumentRegisters = 8;
 
     // Temporary registers.
     // q8-q15 are callee saved, q31 is use by the MacroAssembler as fpTempRegister.
@@ -258,6 +259,12 @@
         return result;
     }
 
+    static FPRReg toArgumentRegister(unsigned index)
+    {
+        ASSERT(index < 8);
+        return static_cast<FPRReg>(index);
+    }
+
     static const char* debugName(FPRReg reg)
     {
         ASSERT(reg != InvalidFPRReg);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to