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
