Title: [230310] trunk/Source/_javascript_Core
Revision
230310
Author
[email protected]
Date
2018-04-05 12:12:01 -0700 (Thu, 05 Apr 2018)

Log Message

[MIPS] Optimize generated JIT code for branches
https://bugs.webkit.org/show_bug.cgi?id=183130

Patch by Stanislav Ocovaj <[email protected]> on 2018-04-05
Reviewed by Yusuke Suzuki.

The patch https://bugs.webkit.org/show_bug.cgi?id=101328 added two nop instructions to
branchEqual() and branchNotEqual() in order to allow the code generated by branchPtrWithPatch()
to be reverted back to branchPtrWithPatch after replacing it with a 4-instruction jump.
However, this adds a significant overhead for all other types of branches. Since these nop's
protect the code that is generated by branchPtrWithPatch, this function seems like a better
place to add them.

* assembler/MIPSAssembler.h:
(JSC::MIPSAssembler::repatchInt32):
(JSC::MIPSAssembler::revertJumpToMove):
* assembler/MacroAssemblerMIPS.h:
(JSC::MacroAssemblerMIPS::branchAdd32):
(JSC::MacroAssemblerMIPS::branchMul32):
(JSC::MacroAssemblerMIPS::branchSub32):
(JSC::MacroAssemblerMIPS::branchNeg32):
(JSC::MacroAssemblerMIPS::branchPtrWithPatch):
(JSC::MacroAssemblerMIPS::branchEqual):
(JSC::MacroAssemblerMIPS::branchNotEqual):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (230309 => 230310)


--- trunk/Source/_javascript_Core/ChangeLog	2018-04-05 18:50:26 UTC (rev 230309)
+++ trunk/Source/_javascript_Core/ChangeLog	2018-04-05 19:12:01 UTC (rev 230310)
@@ -1,3 +1,29 @@
+2018-04-05  Stanislav Ocovaj  <[email protected]>
+
+        [MIPS] Optimize generated JIT code for branches
+        https://bugs.webkit.org/show_bug.cgi?id=183130
+
+        Reviewed by Yusuke Suzuki.
+
+        The patch https://bugs.webkit.org/show_bug.cgi?id=101328 added two nop instructions to
+        branchEqual() and branchNotEqual() in order to allow the code generated by branchPtrWithPatch()
+        to be reverted back to branchPtrWithPatch after replacing it with a 4-instruction jump.
+        However, this adds a significant overhead for all other types of branches. Since these nop's
+        protect the code that is generated by branchPtrWithPatch, this function seems like a better
+        place to add them.
+
+        * assembler/MIPSAssembler.h:
+        (JSC::MIPSAssembler::repatchInt32):
+        (JSC::MIPSAssembler::revertJumpToMove):
+        * assembler/MacroAssemblerMIPS.h:
+        (JSC::MacroAssemblerMIPS::branchAdd32):
+        (JSC::MacroAssemblerMIPS::branchMul32):
+        (JSC::MacroAssemblerMIPS::branchSub32):
+        (JSC::MacroAssemblerMIPS::branchNeg32):
+        (JSC::MacroAssemblerMIPS::branchPtrWithPatch):
+        (JSC::MacroAssemblerMIPS::branchEqual):
+        (JSC::MacroAssemblerMIPS::branchNotEqual):
+
 2018-04-05  Yusuke Suzuki  <[email protected]>
 
         [WTF] Remove StaticLock

Modified: trunk/Source/_javascript_Core/assembler/MIPSAssembler.h (230309 => 230310)


--- trunk/Source/_javascript_Core/assembler/MIPSAssembler.h	2018-04-05 18:50:26 UTC (rev 230309)
+++ trunk/Source/_javascript_Core/assembler/MIPSAssembler.h	2018-04-05 19:12:01 UTC (rev 230310)
@@ -944,8 +944,7 @@
         insn++;
         ASSERT((*insn & 0xfc000000) == 0x34000000); // ori
         *insn = (*insn & 0xffff0000) | (to & 0xffff);
-        insn--;
-        cacheFlush(insn, 2 * sizeof(MIPSWord));
+        cacheFlush(from, 2 * sizeof(MIPSWord));
     }
 
     static int32_t readInt32(void* from)
@@ -1018,7 +1017,7 @@
             *insn = 0x00000000;
             codeSize += sizeof(MIPSWord);
         }
-        cacheFlush(insn, codeSize);
+        cacheFlush(instructionStart, codeSize);
     }
 
     static void replaceWithJump(void* instructionStart, void* to)

Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerMIPS.h (230309 => 230310)


--- trunk/Source/_javascript_Core/assembler/MacroAssemblerMIPS.h	2018-04-05 18:50:26 UTC (rev 230309)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerMIPS.h	2018-04-05 19:12:01 UTC (rev 230310)
@@ -2002,18 +2002,18 @@
                 nop
                 b       Overflow
                 nop
+                b       No_overflow
                 nop
                 nop
                 nop
-                nop
             No_overflow:
             */
             move(dest, dataTempRegister);
             m_assembler.xorInsn(cmpTempRegister, dataTempRegister, src);
-            m_assembler.bltz(cmpTempRegister, 12);
+            m_assembler.bltz(cmpTempRegister, 10);
             m_assembler.addu(dest, dataTempRegister, src);
             m_assembler.xorInsn(cmpTempRegister, dest, dataTempRegister);
-            m_assembler.bgez(cmpTempRegister, 9);
+            m_assembler.bgez(cmpTempRegister, 7);
             m_assembler.nop();
             return jump();
         }
@@ -2055,18 +2055,18 @@
                 nop
                 b       Overflow
                 nop
+                b       No_overflow
                 nop
                 nop
                 nop
-                nop
             No_overflow:
             */
             move(op1, dataTempRegister);
             m_assembler.xorInsn(cmpTempRegister, dataTempRegister, op2);
-            m_assembler.bltz(cmpTempRegister, 12);
+            m_assembler.bltz(cmpTempRegister, 10);
             m_assembler.addu(dest, dataTempRegister, op2);
             m_assembler.xorInsn(cmpTempRegister, dest, dataTempRegister);
-            m_assembler.bgez(cmpTempRegister, 9);
+            m_assembler.bgez(cmpTempRegister, 7);
             m_assembler.nop();
             return jump();
         }
@@ -2111,14 +2111,14 @@
             ASSERT((cond == Overflow) || (cond == Signed) || (cond == PositiveOrZero) || (cond == Zero) || (cond == NonZero));
             if (cond == Overflow) {
                 if (imm.m_value >= 0) {
-                    m_assembler.bltz(src, 11);
+                    m_assembler.bltz(src, 9);
                     m_assembler.addiu(dest, src, imm.m_value);
-                    m_assembler.bgez(dest, 9);
+                    m_assembler.bgez(dest, 7);
                     m_assembler.nop();
                 } else {
-                    m_assembler.bgez(src, 11);
+                    m_assembler.bgez(src, 9);
                     m_assembler.addiu(dest, src, imm.m_value);
-                    m_assembler.bltz(dest, 9);
+                    m_assembler.bltz(dest, 7);
                     m_assembler.nop();
                 }
                 return jump();
@@ -2162,10 +2162,10 @@
                     nop
                     b       Overflow
                     nop
+                    b       No_overflow
                     nop
                     nop
                     nop
-                    nop
                 No_overflow:
                 */
                 load32(dest.m_ptr, dataTempRegister);
@@ -2173,9 +2173,9 @@
                 m_assembler.xorInsn(cmpTempRegister, dataTempRegister, immTempRegister);
                 m_assembler.addu(dataTempRegister, dataTempRegister, immTempRegister);
                 store32(dataTempRegister, dest.m_ptr);
-                m_assembler.bltz(cmpTempRegister, 11);
+                m_assembler.bltz(cmpTempRegister, 9);
                 m_assembler.xorInsn(cmpTempRegister, dataTempRegister, immTempRegister);
-                m_assembler.bgez(cmpTempRegister, 9);
+                m_assembler.bgez(cmpTempRegister, 7);
                 m_assembler.nop();
             } else {
                 uintptr_t adr = reinterpret_cast<uintptr_t>(dest.m_ptr);
@@ -2184,25 +2184,25 @@
                 if (imm.m_value >= 0 && imm.m_value  <= 32767) {
                     move(dataTempRegister, cmpTempRegister);
                     m_assembler.addiu(dataTempRegister, dataTempRegister, imm.m_value);
-                    m_assembler.bltz(cmpTempRegister, 11);
+                    m_assembler.bltz(cmpTempRegister, 9);
                     m_assembler.sw(dataTempRegister, addrTempRegister, adr & 0xffff);
-                    m_assembler.bgez(dataTempRegister, 9);
+                    m_assembler.bgez(dataTempRegister, 7);
                     m_assembler.nop();
                 } else if (imm.m_value >= -32768 && imm.m_value < 0) {
                     move(dataTempRegister, cmpTempRegister);
                     m_assembler.addiu(dataTempRegister, dataTempRegister, imm.m_value);
-                    m_assembler.bgez(cmpTempRegister, 11);
+                    m_assembler.bgez(cmpTempRegister, 9);
                     m_assembler.sw(dataTempRegister, addrTempRegister, adr & 0xffff);
-                    m_assembler.bltz(cmpTempRegister, 9);
+                    m_assembler.bltz(cmpTempRegister, 7);
                     m_assembler.nop();
                 } else {
                     move(imm, immTempRegister);
                     m_assembler.xorInsn(cmpTempRegister, dataTempRegister, immTempRegister);
                     m_assembler.addu(dataTempRegister, dataTempRegister, immTempRegister);
-                    m_assembler.bltz(cmpTempRegister, 12);
+                    m_assembler.bltz(cmpTempRegister, 10);
                     m_assembler.sw(dataTempRegister, addrTempRegister, adr & 0xffff);
                     m_assembler.xorInsn(cmpTempRegister, dataTempRegister, immTempRegister);
-                    m_assembler.bgez(cmpTempRegister, 9);
+                    m_assembler.bgez(cmpTempRegister, 7);
                     m_assembler.nop();
                 }
             }
@@ -2251,10 +2251,10 @@
                 nop
                 b       Overflow
                 nop
+                b       No_overflow
                 nop
                 nop
                 nop
-                nop
             No_overflow:
             */
             m_assembler.mult(src1, src2);
@@ -2261,7 +2261,7 @@
             m_assembler.mfhi(dataTempRegister);
             m_assembler.mflo(dest);
             m_assembler.sra(addrTempRegister, dest, 31);
-            m_assembler.beq(dataTempRegister, addrTempRegister, 9);
+            m_assembler.beq(dataTempRegister, addrTempRegister, 7);
             m_assembler.nop();
             return jump();
         }
@@ -2296,10 +2296,10 @@
                 nop
                 b       Overflow
                 nop
+                b       No_overflow
                 nop
                 nop
                 nop
-                nop
             No_overflow:
             */
             m_assembler.mult(src, dest);
@@ -2306,7 +2306,7 @@
             m_assembler.mfhi(dataTempRegister);
             m_assembler.mflo(dest);
             m_assembler.sra(addrTempRegister, dest, 31);
-            m_assembler.beq(dataTempRegister, addrTempRegister, 9);
+            m_assembler.beq(dataTempRegister, addrTempRegister, 7);
             m_assembler.nop();
             return jump();
         }
@@ -2348,18 +2348,18 @@
                 nop
                 b       Overflow
                 nop
+                b       No_overflow
                 nop
                 nop
                 nop
-                nop
             No_overflow:
             */
             move(dest, dataTempRegister);
             m_assembler.xorInsn(cmpTempRegister, dataTempRegister, src);
-            m_assembler.bgez(cmpTempRegister, 12);
+            m_assembler.bgez(cmpTempRegister, 10);
             m_assembler.subu(dest, dataTempRegister, src);
             m_assembler.xorInsn(cmpTempRegister, dest, dataTempRegister);
-            m_assembler.bgez(cmpTempRegister, 9);
+            m_assembler.bgez(cmpTempRegister, 7);
             m_assembler.nop();
             return jump();
         }
@@ -2407,18 +2407,18 @@
                 nop
                 b       Overflow
                 nop
+                b       No_overflow
                 nop
                 nop
                 nop
-                nop
             No_overflow:
             */
             move(op1, dataTempRegister);
             m_assembler.xorInsn(cmpTempRegister, dataTempRegister, op2);
-            m_assembler.bgez(cmpTempRegister, 12);
+            m_assembler.bgez(cmpTempRegister, 10);
             m_assembler.subu(dest, dataTempRegister, op2);
             m_assembler.xorInsn(cmpTempRegister, dest, dataTempRegister);
-            m_assembler.bgez(cmpTempRegister, 9);
+            m_assembler.bgez(cmpTempRegister, 7);
             m_assembler.nop();
             return jump();
         }
@@ -2451,10 +2451,10 @@
                 nop
                 b       Overflow
                 nop
+                b       No_overflow
                 nop
                 nop
                 nop
-                nop
             No_overflow:
             */
             m_assembler.bgez(srcDest, 11);
@@ -2678,6 +2678,8 @@
     {
         m_fixedWidth = true;
         dataLabel = moveWithPatch(initialRightValue, immTempRegister);
+        m_assembler.nop();
+        m_assembler.nop();
         Jump temp = branch32(cond, left, immTempRegister);
         m_fixedWidth = false;
         return temp;
@@ -2688,6 +2690,8 @@
         m_fixedWidth = true;
         load32(left, dataTempRegister);
         dataLabel = moveWithPatch(initialRightValue, immTempRegister);
+        m_assembler.nop();
+        m_assembler.nop();
         Jump temp = branch32(cond, dataTempRegister, immTempRegister);
         m_fixedWidth = false;
         return temp;
@@ -3203,8 +3207,6 @@
 
     Jump branchEqual(RegisterID rs, RegisterID rt)
     {
-        m_assembler.nop();
-        m_assembler.nop();
         m_assembler.appendJump();
         m_assembler.beq(rs, rt, 0);
         m_assembler.nop();
@@ -3214,8 +3216,6 @@
 
     Jump branchNotEqual(RegisterID rs, RegisterID rt)
     {
-        m_assembler.nop();
-        m_assembler.nop();
         m_assembler.appendJump();
         m_assembler.bne(rs, rt, 0);
         m_assembler.nop();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to