Title: [281326] trunk/Source/_javascript_Core
Revision
281326
Author
[email protected]
Date
2021-08-20 11:09:48 -0700 (Fri, 20 Aug 2021)

Log Message

[JSC] Remove unnecessary moves in Yarr's sub32 / add32 related code
https://bugs.webkit.org/show_bug.cgi?id=228813

Reviewed by Mark Lam.

This patch adds three operand sub32 to X64 masm so that we can use it in all masms.
We use add32 and sub32 in YarrJIT to remove unnecessary mov instructions in ARM64.

* assembler/MacroAssembler.h:
(JSC::MacroAssembler::sub32):
* assembler/MacroAssemblerARMv7.h:
(JSC::MacroAssemblerARMv7::sub32):
* assembler/MacroAssemblerX86Common.h:
(JSC::MacroAssemblerX86Common::sub32):
* assembler/testmasm.cpp:
(JSC::testSub32ArgImm):
* yarr/YarrJIT.cpp:

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (281325 => 281326)


--- trunk/Source/_javascript_Core/ChangeLog	2021-08-20 17:50:51 UTC (rev 281325)
+++ trunk/Source/_javascript_Core/ChangeLog	2021-08-20 18:09:48 UTC (rev 281326)
@@ -1,5 +1,25 @@
 2021-08-20  Yusuke Suzuki  <[email protected]>
 
+        [JSC] Remove unnecessary moves in Yarr's sub32 / add32 related code
+        https://bugs.webkit.org/show_bug.cgi?id=228813
+
+        Reviewed by Mark Lam.
+
+        This patch adds three operand sub32 to X64 masm so that we can use it in all masms.
+        We use add32 and sub32 in YarrJIT to remove unnecessary mov instructions in ARM64.
+
+        * assembler/MacroAssembler.h:
+        (JSC::MacroAssembler::sub32):
+        * assembler/MacroAssemblerARMv7.h:
+        (JSC::MacroAssemblerARMv7::sub32):
+        * assembler/MacroAssemblerX86Common.h:
+        (JSC::MacroAssemblerX86Common::sub32):
+        * assembler/testmasm.cpp:
+        (JSC::testSub32ArgImm):
+        * yarr/YarrJIT.cpp:
+
+2021-08-20  Yusuke Suzuki  <[email protected]>
+
         [JSC] Remove MacroAssemblerX86
         https://bugs.webkit.org/show_bug.cgi?id=229331
 

Modified: trunk/Source/_javascript_Core/assembler/MacroAssembler.h (281325 => 281326)


--- trunk/Source/_javascript_Core/assembler/MacroAssembler.h	2021-08-20 17:50:51 UTC (rev 281325)
+++ trunk/Source/_javascript_Core/assembler/MacroAssembler.h	2021-08-20 18:09:48 UTC (rev 281326)
@@ -1757,6 +1757,16 @@
         } else
             sub32(imm.asTrustedImm32(), dest);
     }
+
+    void sub32(RegisterID src, Imm32 imm, RegisterID dest)
+    {
+        if (shouldBlind(imm)) {
+            BlindedImm32 key = additionBlindedConstant(imm);
+            sub32(src, key.value1, dest);
+            sub32(key.value2, dest);
+        } else
+            sub32(src, imm.asTrustedImm32(), dest);
+    }
     
     void subPtr(Imm32 imm, RegisterID dest)
     {

Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h (281325 => 281326)


--- trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h	2021-08-20 17:50:51 UTC (rev 281325)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h	2021-08-20 18:09:48 UTC (rev 281326)
@@ -540,6 +540,17 @@
         m_assembler.sub(dest, left, right);
     }
 
+    void sub32(RegisterID left, TrustedImm32 right, RegisterID dest)
+    {
+        ARMThumbImmediate armImm = ARMThumbImmediate::makeUInt12OrEncodedImm(right.m_value);
+        if (armImm.isValid())
+            m_assembler.sub(dest, left, armImm);
+        else {
+            move(right, dataTempRegister);
+            m_assembler.sub(dest, left, dataTempRegister);
+        }
+    }
+
     void sub32(TrustedImm32 imm, RegisterID dest)
     {
         ARMThumbImmediate armImm = ARMThumbImmediate::makeUInt12OrEncodedImm(imm.m_value);

Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h (281325 => 281326)


--- trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h	2021-08-20 17:50:51 UTC (rev 281325)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h	2021-08-20 18:09:48 UTC (rev 281326)
@@ -837,6 +837,12 @@
         sub32(right, dest);
     }
 
+    void sub32(RegisterID left, TrustedImm32 right, RegisterID dest)
+    {
+        move(left, dest);
+        sub32(right, dest);
+    }
+
     void sub32(TrustedImm32 imm, RegisterID dest)
     {
         if (imm.m_value == 1)

Modified: trunk/Source/_javascript_Core/assembler/testmasm.cpp (281325 => 281326)


--- trunk/Source/_javascript_Core/assembler/testmasm.cpp	2021-08-20 17:50:51 UTC (rev 281325)
+++ trunk/Source/_javascript_Core/assembler/testmasm.cpp	2021-08-20 18:09:48 UTC (rev 281326)
@@ -1025,23 +1025,6 @@
     }
 }
 
-void testSub32ArgImm()
-{
-    for (auto immediate : int32Operands()) {
-        auto sub = compile([=] (CCallHelpers& jit) {
-            emitFunctionPrologue(jit);
-
-            jit.sub32(GPRInfo::argumentGPR0, CCallHelpers::TrustedImm32(immediate), GPRInfo::returnValueGPR);
-
-            emitFunctionEpilogue(jit);
-            jit.ret();
-        });
-
-        for (auto value : int32Operands())
-            CHECK_EQ(invoke<uint32_t>(sub, value), static_cast<uint32_t>(value - immediate));
-    }
-}
-
 void testSub64Imm32()
 {
     for (auto immediate : int64Operands()) {
@@ -3963,6 +3946,23 @@
     CHECK_EQ(buffer[9], initialValue + 9);
 }
 
+void testSub32ArgImm()
+{
+    for (auto immediate : int32Operands()) {
+        auto sub = compile([=] (CCallHelpers& jit) {
+            emitFunctionPrologue(jit);
+
+            jit.sub32(GPRInfo::argumentGPR0, CCallHelpers::TrustedImm32(immediate), GPRInfo::returnValueGPR);
+
+            emitFunctionEpilogue(jit);
+            jit.ret();
+        });
+
+        for (auto value : int32Operands())
+            CHECK_EQ(invoke<uint32_t>(sub, value), static_cast<uint32_t>(value - immediate));
+    }
+}
+
 #if CPU(ARM64)
 void testLoadStorePair64Int64()
 {
@@ -5645,6 +5645,7 @@
 
     RUN(testMul32WithImmediates());
     RUN(testLoadStorePair32());
+    RUN(testSub32ArgImm());
 
 #if CPU(X86_64)
     RUN(testBranchTestBit32RegReg());
@@ -5673,7 +5674,6 @@
 
     RUN(testSub32Args());
     RUN(testSub32Imm());
-    RUN(testSub32ArgImm());
     RUN(testSub64Imm32());
     RUN(testSub64ArgImm32());
     RUN(testSub64Imm64());

Modified: trunk/Source/_javascript_Core/yarr/YarrJIT.cpp (281325 => 281326)


--- trunk/Source/_javascript_Core/yarr/YarrJIT.cpp	2021-08-20 17:50:51 UTC (rev 281325)
+++ trunk/Source/_javascript_Core/yarr/YarrJIT.cpp	2021-08-20 18:09:48 UTC (rev 281326)
@@ -1704,10 +1704,9 @@
         if (m_decodeSurrogatePairs)
             op.m_jumps.append(jumpIfNoAvailableInput());
 
-        move(index, countRegister);
         Checked<unsigned> scaledMaxCount = term->quantityMaxCount;
         scaledMaxCount *= U_IS_BMP(ch) ? 1 : 2;
-        sub32(Imm32(scaledMaxCount), countRegister);
+        sub32(index, Imm32(scaledMaxCount), countRegister);
 
         Label loop(this);
         readCharacter(m_checkedOffset - term->inputPosition - scaledMaxCount, character, countRegister);
@@ -1911,15 +1910,12 @@
         if (m_decodeSurrogatePairs)
             op.m_jumps.append(jumpIfNoAvailableInput());
 
-        move(index, countRegister);
-
         Checked<unsigned> scaledMaxCount = term->quantityMaxCount;
-
 #if ENABLE(YARR_JIT_UNICODE_EXPRESSIONS)
         if (m_decodeSurrogatePairs && term->characterClass->hasOnlyNonBMPCharacters() && !term->invert())
             scaledMaxCount *= 2;
 #endif
-        sub32(Imm32(scaledMaxCount), countRegister);
+        sub32(index, Imm32(scaledMaxCount), countRegister);
 
         Label loop(this);
         JumpList matchDest;
@@ -2485,8 +2481,7 @@
                         if (!m_pattern.m_body->m_hasFixedSize) {
                             outOfLengthFailure.link(this);
                             if (alternative->m_minimumSize) {
-                                move(index, regT0);
-                                sub32(Imm32(alternative->m_minimumSize), regT0);
+                                sub32(index, Imm32(alternative->m_minimumSize), regT0);
                                 setMatchStart(regT0);
                             } else
                                 setMatchStart(index);
@@ -2500,8 +2495,7 @@
                         // by BoyerMoore search.
                         if (!m_pattern.m_body->m_hasFixedSize) {
                             if (alternative->m_minimumSize) {
-                                move(index, regT0);
-                                sub32(Imm32(alternative->m_minimumSize), regT0);
+                                sub32(index, Imm32(alternative->m_minimumSize), regT0);
                                 setMatchStart(regT0);
                             } else
                                 setMatchStart(index);
@@ -2525,9 +2519,10 @@
                 // not have yet set the value in the first 
                 ASSERT(index != returnRegister);
                 if (m_pattern.m_body->m_hasFixedSize) {
-                    move(index, returnRegister);
                     if (priorAlternative->m_minimumSize)
-                        sub32(Imm32(priorAlternative->m_minimumSize), returnRegister);
+                        sub32(index, Imm32(priorAlternative->m_minimumSize), returnRegister);
+                    else
+                        move(index, returnRegister);
                     if (m_compileMode == JITCompileMode::IncludeSubpatterns)
                         storePair32(returnRegister, index, output, TrustedImm32(0));
                 } else {
@@ -2718,8 +2713,7 @@
                     if (term->quantityType == QuantifierType::FixedCount)
                         inputOffset += term->parentheses.disjunction->m_minimumSize;
                     if (inputOffset) {
-                        move(index, indexTemporary);
-                        sub32(Imm32(inputOffset), indexTemporary);
+                        sub32(index, Imm32(inputOffset), indexTemporary);
                         setSubpatternStart(indexTemporary, term->parentheses.subpatternId);
                     } else
                         setSubpatternStart(index, term->parentheses.subpatternId);
@@ -2746,8 +2740,7 @@
                 if (term->capture() && m_compileMode == JITCompileMode::IncludeSubpatterns) {
                     unsigned inputOffset = m_checkedOffset - term->inputPosition;
                     if (inputOffset) {
-                        move(index, indexTemporary);
-                        sub32(Imm32(inputOffset), indexTemporary);
+                        sub32(index, Imm32(inputOffset), indexTemporary);
                         setSubpatternEnd(indexTemporary, term->parentheses.subpatternId);
                     } else
                         setSubpatternEnd(index, term->parentheses.subpatternId);
@@ -2855,8 +2848,7 @@
                     if (term->quantityType == QuantifierType::FixedCount)
                         inputOffset += term->parentheses.disjunction->m_minimumSize;
                     if (inputOffset) {
-                        move(index, indexTemporary);
-                        sub32(Imm32(inputOffset), indexTemporary);
+                        sub32(index, Imm32(inputOffset), indexTemporary);
                         setSubpatternStart(indexTemporary, term->parentheses.subpatternId);
                     } else
                         setSubpatternStart(index, term->parentheses.subpatternId);
@@ -2895,8 +2887,7 @@
                     
                     unsigned inputOffset = m_checkedOffset - term->inputPosition;
                     if (inputOffset) {
-                        move(index, indexTemporary);
-                        sub32(Imm32(inputOffset), indexTemporary);
+                        sub32(index, Imm32(inputOffset), indexTemporary);
                         setSubpatternEnd(indexTemporary, term->parentheses.subpatternId);
                     } else
                         setSubpatternEnd(index, term->parentheses.subpatternId);
@@ -3070,11 +3061,10 @@
                             if (alternative->m_minimumSize == 1)
                                 setMatchStart(index);
                             else {
-                                move(index, regT0);
                                 if (alternative->m_minimumSize)
-                                    sub32(Imm32(alternative->m_minimumSize - 1), regT0);
+                                    sub32(index, Imm32(alternative->m_minimumSize - 1), regT0);
                                 else
-                                    add32(TrustedImm32(1), regT0);
+                                    add32(TrustedImm32(1), index, regT0);
                                 setMatchStart(regT0);
                             }
                         }
@@ -3188,8 +3178,7 @@
                         if (!m_pattern.m_body->m_minimumSize)
                             setMatchStart(index);
                         else {
-                            move(index, regT0);
-                            sub32(Imm32(m_pattern.m_body->m_minimumSize), regT0);
+                            sub32(index, Imm32(m_pattern.m_body->m_minimumSize), regT0);
                             setMatchStart(regT0);
                         }
                     }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to