Title: [225952] trunk/Source/_javascript_Core
Revision
225952
Author
utatane....@gmail.com
Date
2017-12-14 17:45:28 -0800 (Thu, 14 Dec 2017)

Log Message

[DFG] Reduce register pressure of WeakMapGet to be used for 32bit
https://bugs.webkit.org/show_bug.cgi?id=180804

Reviewed by Saam Barati.

This fixes 32bit failures of JSC by reducing register pressure of WeakMapGet.

* dfg/DFGRegisterBank.h:
(JSC::DFG::RegisterBank::lockedCount const):
* dfg/DFGSpeculativeJIT.cpp:
(JSC::DFG::SpeculativeJIT::compileWeakMapGet):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (225951 => 225952)


--- trunk/Source/_javascript_Core/ChangeLog	2017-12-15 01:39:29 UTC (rev 225951)
+++ trunk/Source/_javascript_Core/ChangeLog	2017-12-15 01:45:28 UTC (rev 225952)
@@ -1,3 +1,17 @@
+2017-12-14  Yusuke Suzuki  <utatane....@gmail.com>
+
+        [DFG] Reduce register pressure of WeakMapGet to be used for 32bit
+        https://bugs.webkit.org/show_bug.cgi?id=180804
+
+        Reviewed by Saam Barati.
+
+        This fixes 32bit failures of JSC by reducing register pressure of WeakMapGet.
+
+        * dfg/DFGRegisterBank.h:
+        (JSC::DFG::RegisterBank::lockedCount const):
+        * dfg/DFGSpeculativeJIT.cpp:
+        (JSC::DFG::SpeculativeJIT::compileWeakMapGet):
+
 2017-12-14  Keith Miller  <keith_mil...@apple.com>
 
         Unreviewed, forgot to add { }

Modified: trunk/Source/_javascript_Core/dfg/DFGRegisterBank.h (225951 => 225952)


--- trunk/Source/_javascript_Core/dfg/DFGRegisterBank.h	2017-12-15 01:39:29 UTC (rev 225951)
+++ trunk/Source/_javascript_Core/dfg/DFGRegisterBank.h	2017-12-15 01:45:28 UTC (rev 225952)
@@ -139,6 +139,16 @@
         return allocateInternal(currentLowest, spillMe);
     }
 
+    uint32_t lockedCount() const
+    {
+        uint32_t count = 0;
+        for (uint32_t i = 0 ; i < NUM_REGS; ++i) {
+            if (m_data[i].lockCount)
+                ++count;
+        }
+        return count;
+    }
+
     // Allocates the given register, even if this will force a spill.
     VirtualRegister allocateSpecific(RegID reg)
     {

Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp (225951 => 225952)


--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp	2017-12-15 01:39:29 UTC (rev 225951)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp	2017-12-15 01:45:28 UTC (rev 225952)
@@ -10983,41 +10983,52 @@
 
 void SpeculativeJIT::compileWeakMapGet(Node* node)
 {
-    SpeculateCellOperand weakMap(this, node->child1());
-    SpeculateCellOperand key(this, node->child2());
-    SpeculateInt32Operand hash(this, node->child3());
-    JSValueRegsTemporary result(this);
-
     GPRTemporary mask(this);
-    GPRTemporary index(this);
     GPRTemporary buffer(this);
-    GPRTemporary bucket(this);
+    JSValueRegsTemporary result(this);
 
-    GPRReg weakMapGPR = weakMap.gpr();
-    GPRReg keyGPR = key.gpr();
-    GPRReg hashGPR = hash.gpr();
-
     GPRReg maskGPR = mask.gpr();
-    GPRReg indexGPR = index.gpr();
     GPRReg bufferGPR = buffer.gpr();
-    GPRReg bucketGPR = bucket.gpr();
     JSValueRegs resultRegs = result.regs();
 
-    if (node->child1().useKind() == WeakMapObjectUse)
-        speculateWeakMapObject(node->child1(), weakMapGPR);
-    else
-        speculateWeakSetObject(node->child1(), weakMapGPR);
+    GPRTemporary index;
+    GPRReg indexGPR { InvalidGPRReg };
+    {
+        SpeculateInt32Operand hash(this, node->child3());
+        GPRReg hashGPR = hash.gpr();
+        index = GPRTemporary(this, Reuse, hash);
+        indexGPR = index.gpr();
+        m_jit.move(hashGPR, indexGPR);
+    }
+
+    {
+        SpeculateCellOperand weakMap(this, node->child1());
+        GPRReg weakMapGPR = weakMap.gpr();
+        if (node->child1().useKind() == WeakMapObjectUse)
+            speculateWeakMapObject(node->child1(), weakMapGPR);
+        else
+            speculateWeakSetObject(node->child1(), weakMapGPR);
+
+        ASSERT(WeakMapImpl<WeakMapBucket<WeakMapBucketDataKey>>::offsetOfCapacity() == WeakMapImpl<WeakMapBucket<WeakMapBucketDataKeyValue>>::offsetOfCapacity());
+        ASSERT(WeakMapImpl<WeakMapBucket<WeakMapBucketDataKey>>::offsetOfBuffer() == WeakMapImpl<WeakMapBucket<WeakMapBucketDataKeyValue>>::offsetOfBuffer());
+        m_jit.load32(MacroAssembler::Address(weakMapGPR, WeakMapImpl<WeakMapBucket<WeakMapBucketDataKey>>::offsetOfCapacity()), maskGPR);
+        m_jit.loadPtr(MacroAssembler::Address(weakMapGPR, WeakMapImpl<WeakMapBucket<WeakMapBucketDataKey>>::offsetOfBuffer()), bufferGPR);
+    }
+
+    SpeculateCellOperand key(this, node->child2());
+    GPRReg keyGPR = key.gpr();
     speculateObject(node->child2(), keyGPR);
 
-    ASSERT(WeakMapImpl<WeakMapBucket<WeakMapBucketDataKey>>::offsetOfCapacity() == WeakMapImpl<WeakMapBucket<WeakMapBucketDataKeyValue>>::offsetOfCapacity());
-    ASSERT(WeakMapImpl<WeakMapBucket<WeakMapBucketDataKey>>::offsetOfBuffer() == WeakMapImpl<WeakMapBucket<WeakMapBucketDataKeyValue>>::offsetOfBuffer());
-    m_jit.load32(MacroAssembler::Address(weakMapGPR, WeakMapImpl<WeakMapBucket<WeakMapBucketDataKey>>::offsetOfCapacity()), maskGPR);
-    m_jit.loadPtr(MacroAssembler::Address(weakMapGPR, WeakMapImpl<WeakMapBucket<WeakMapBucketDataKey>>::offsetOfBuffer()), bufferGPR);
+#if USE(JSVALUE32_64)
+    GPRReg bucketGPR = resultRegs.tagGPR();
+#else
+    GPRTemporary bucket(this);
+    GPRReg bucketGPR = bucket.gpr();
+#endif
+
     m_jit.sub32(TrustedImm32(1), maskGPR);
-    m_jit.move(hashGPR, indexGPR);
 
     MacroAssembler::Label loop = m_jit.label();
-
     m_jit.and32(maskGPR, indexGPR);
     if (node->child1().useKind() == WeakSetObjectUse) {
         static_assert(sizeof(WeakMapBucket<WeakMapBucketDataKey>) == sizeof(void*), "");
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to