Title: [291521] trunk/Source/_javascript_Core
Revision
291521
Author
[email protected]
Date
2022-03-18 20:46:14 -0700 (Fri, 18 Mar 2022)

Log Message

[JSC] Further reduce # of registers used in RegExpTestInline
https://bugs.webkit.org/show_bug.cgi?id=238105

Reviewed by Saam Barati.

This patch further reduces # of registers used in RegExpTestInline.
After flushRegisters(), we can use baseGPR for any purpose.
We also remove x64 hack since we have enough registers for x64 even
if we use one callee-save register in unlinked DFG.

* dfg/DFGSpeculativeJIT64.cpp:
(JSC::DFG::SpeculativeJIT::compileRegExpTestInline):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (291520 => 291521)


--- trunk/Source/_javascript_Core/ChangeLog	2022-03-19 03:30:12 UTC (rev 291520)
+++ trunk/Source/_javascript_Core/ChangeLog	2022-03-19 03:46:14 UTC (rev 291521)
@@ -1,3 +1,18 @@
+2022-03-18  Yusuke Suzuki  <[email protected]>
+
+        [JSC] Further reduce # of registers used in RegExpTestInline
+        https://bugs.webkit.org/show_bug.cgi?id=238105
+
+        Reviewed by Saam Barati.
+
+        This patch further reduces # of registers used in RegExpTestInline.
+        After flushRegisters(), we can use baseGPR for any purpose.
+        We also remove x64 hack since we have enough registers for x64 even
+        if we use one callee-save register in unlinked DFG.
+
+        * dfg/DFGSpeculativeJIT64.cpp:
+        (JSC::DFG::SpeculativeJIT::compileRegExpTestInline):
+
 2022-03-18  Devin Rousso  <[email protected]>
 
         Web Inspector: REGRESSION(?): Emulate User Gesture doesn't work

Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT64.cpp (291520 => 291521)


--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT64.cpp	2022-03-19 03:30:12 UTC (rev 291520)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT64.cpp	2022-03-19 03:46:14 UTC (rev 291521)
@@ -2699,6 +2699,10 @@
 {
     RegExp* regExp = jsCast<RegExp*>(node->cellOperand2()->value());
 
+    auto jitCodeBlock = regExp->getRegExpJITCodeBlock();
+    ASSERT(jitCodeBlock);
+    auto inlineCodeStats8Bit = jitCodeBlock->get8BitInlineStats();
+
     ASSERT(!regExp->globalOrSticky());
 
     SpeculateCellOperand globalObject(this, node->child1());
@@ -2709,8 +2713,7 @@
     GPRTemporary strLength(this);
     GPRTemporary output(this);
     GPRTemporary temp0(this);
-    GPRTemporary temp1(this);
-    std::optional<GPRTemporary> temp2;
+    std::optional<GPRTemporary> temp1;
 
     GPRReg globalObjectGPR = globalObject.gpr();
     GPRReg baseGPR = base.gpr();
@@ -2719,19 +2722,12 @@
     GPRReg outputGPR = output.gpr();
     GPRReg strLengthGPR = strLength.gpr();
     GPRReg temp0GPR = temp0.gpr();
-    GPRReg temp1GPR = temp1.gpr();
-    GPRReg temp2GPR = InvalidGPRReg;
+    GPRReg temp1GPR = InvalidGPRReg;
 
-    auto jitCodeBlock = regExp->getRegExpJITCodeBlock();
-    ASSERT(jitCodeBlock);
-    auto inlineCodeStats8Bit = jitCodeBlock->get8BitInlineStats();
-
-#if !CPU(X86_64)
     if (inlineCodeStats8Bit.needsTemp2()) {
-        temp2.emplace(this);
-        temp2GPR = temp2->gpr();
+        temp1.emplace(this);
+        temp1GPR = temp1->gpr();
     }
-#endif
 
     speculateRegExpObject(node->child2(), baseGPR);
 
@@ -2750,6 +2746,7 @@
         m_jit.load32(MacroAssembler::Address(stringImplGPR, StringImpl::lengthMemoryOffset()), strLengthGPR);
 
         // Clobbering input registers is OK since we already called flushRegisters.
+        // slowCases jumps are already done. So we can modify baseGPR etc.
         Yarr::YarrJITRegisters yarrRegisters;
         yarrRegisters.input = stringDataGPR;
         yarrRegisters.index = stringImplGPR;
@@ -2756,12 +2753,9 @@
         yarrRegisters.length = strLengthGPR;
         yarrRegisters.output = outputGPR;
         yarrRegisters.regT0 = temp0GPR;
-        yarrRegisters.regT1 = temp1GPR;
-#if CPU(X86_64)
-        temp2GPR = globalObjectGPR;
-#endif
+        yarrRegisters.regT1 = baseGPR;
         if (inlineCodeStats8Bit.needsTemp2())
-            yarrRegisters.regT2 = temp2GPR;
+            yarrRegisters.regT2 = temp1GPR;
 
         yarrRegisters.returnRegister = temp0GPR;
         yarrRegisters.returnRegister2 = stringDataGPR;
@@ -2773,13 +2767,6 @@
         auto failedMatch = m_jit.branch32(MacroAssembler::LessThan, yarrRegisters.returnRegister, TrustedImm32(0));
 
         //  Saved cached result
-#if CPU(X86_64)
-        if (inlineCodeStats8Bit.needsTemp2()) {
-            // Since we reused globalObjectGPR for temp2, let's restore the global object.
-            m_jit.move(TrustedImmPtr::weakPointer(m_graph, jsCast<JSGlobalObject*>(node->cellOperand()->value())), globalObjectGPR);
-        }
-#endif
-
         ptrdiff_t offset = JSGlobalObject::regExpGlobalDataOffset() + RegExpGlobalData::offsetOfCachedResult();
 
         m_jit.storePtr(TrustedImmPtr::weakPointer(m_graph, regExp), JITCompiler::Address(globalObjectGPR, offset + RegExpCachedResult::offsetOfLastRegExp()));
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to