Changeset 230310 in webkit
- Timestamp:
- Apr 5, 2018 12:12:01 PM (6 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r230303 r230310 1 2018-04-05 Stanislav Ocovaj <stanislav.ocovaj@rt-rk.com> 2 3 [MIPS] Optimize generated JIT code for branches 4 https://bugs.webkit.org/show_bug.cgi?id=183130 5 6 Reviewed by Yusuke Suzuki. 7 8 The patch https://bugs.webkit.org/show_bug.cgi?id=101328 added two nop instructions to 9 branchEqual() and branchNotEqual() in order to allow the code generated by branchPtrWithPatch() 10 to be reverted back to branchPtrWithPatch after replacing it with a 4-instruction jump. 11 However, this adds a significant overhead for all other types of branches. Since these nop's 12 protect the code that is generated by branchPtrWithPatch, this function seems like a better 13 place to add them. 14 15 * assembler/MIPSAssembler.h: 16 (JSC::MIPSAssembler::repatchInt32): 17 (JSC::MIPSAssembler::revertJumpToMove): 18 * assembler/MacroAssemblerMIPS.h: 19 (JSC::MacroAssemblerMIPS::branchAdd32): 20 (JSC::MacroAssemblerMIPS::branchMul32): 21 (JSC::MacroAssemblerMIPS::branchSub32): 22 (JSC::MacroAssemblerMIPS::branchNeg32): 23 (JSC::MacroAssemblerMIPS::branchPtrWithPatch): 24 (JSC::MacroAssemblerMIPS::branchEqual): 25 (JSC::MacroAssemblerMIPS::branchNotEqual): 26 1 27 2018-04-05 Yusuke Suzuki <utatane.tea@gmail.com> 2 28 -
trunk/Source/JavaScriptCore/assembler/MIPSAssembler.h
r230164 r230310 945 945 ASSERT((*insn & 0xfc000000) == 0x34000000); // ori 946 946 *insn = (*insn & 0xffff0000) | (to & 0xffff); 947 insn--; 948 cacheFlush(insn, 2 * sizeof(MIPSWord)); 947 cacheFlush(from, 2 * sizeof(MIPSWord)); 949 948 } 950 949 … … 1019 1018 codeSize += sizeof(MIPSWord); 1020 1019 } 1021 cacheFlush(ins n, codeSize);1020 cacheFlush(instructionStart, codeSize); 1022 1021 } 1023 1022 -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
r230164 r230310 2003 2003 b Overflow 2004 2004 nop 2005 nop2005 b No_overflow 2006 2006 nop 2007 2007 nop … … 2011 2011 move(dest, dataTempRegister); 2012 2012 m_assembler.xorInsn(cmpTempRegister, dataTempRegister, src); 2013 m_assembler.bltz(cmpTempRegister, 1 2);2013 m_assembler.bltz(cmpTempRegister, 10); 2014 2014 m_assembler.addu(dest, dataTempRegister, src); 2015 2015 m_assembler.xorInsn(cmpTempRegister, dest, dataTempRegister); 2016 m_assembler.bgez(cmpTempRegister, 9);2016 m_assembler.bgez(cmpTempRegister, 7); 2017 2017 m_assembler.nop(); 2018 2018 return jump(); … … 2056 2056 b Overflow 2057 2057 nop 2058 nop2058 b No_overflow 2059 2059 nop 2060 2060 nop … … 2064 2064 move(op1, dataTempRegister); 2065 2065 m_assembler.xorInsn(cmpTempRegister, dataTempRegister, op2); 2066 m_assembler.bltz(cmpTempRegister, 1 2);2066 m_assembler.bltz(cmpTempRegister, 10); 2067 2067 m_assembler.addu(dest, dataTempRegister, op2); 2068 2068 m_assembler.xorInsn(cmpTempRegister, dest, dataTempRegister); 2069 m_assembler.bgez(cmpTempRegister, 9);2069 m_assembler.bgez(cmpTempRegister, 7); 2070 2070 m_assembler.nop(); 2071 2071 return jump(); … … 2112 2112 if (cond == Overflow) { 2113 2113 if (imm.m_value >= 0) { 2114 m_assembler.bltz(src, 11);2114 m_assembler.bltz(src, 9); 2115 2115 m_assembler.addiu(dest, src, imm.m_value); 2116 m_assembler.bgez(dest, 9);2116 m_assembler.bgez(dest, 7); 2117 2117 m_assembler.nop(); 2118 2118 } else { 2119 m_assembler.bgez(src, 11);2119 m_assembler.bgez(src, 9); 2120 2120 m_assembler.addiu(dest, src, imm.m_value); 2121 m_assembler.bltz(dest, 9);2121 m_assembler.bltz(dest, 7); 2122 2122 m_assembler.nop(); 2123 2123 } … … 2163 2163 b Overflow 2164 2164 nop 2165 nop2165 b No_overflow 2166 2166 nop 2167 2167 nop … … 2174 2174 m_assembler.addu(dataTempRegister, dataTempRegister, immTempRegister); 2175 2175 store32(dataTempRegister, dest.m_ptr); 2176 m_assembler.bltz(cmpTempRegister, 11);2176 m_assembler.bltz(cmpTempRegister, 9); 2177 2177 m_assembler.xorInsn(cmpTempRegister, dataTempRegister, immTempRegister); 2178 m_assembler.bgez(cmpTempRegister, 9);2178 m_assembler.bgez(cmpTempRegister, 7); 2179 2179 m_assembler.nop(); 2180 2180 } else { … … 2185 2185 move(dataTempRegister, cmpTempRegister); 2186 2186 m_assembler.addiu(dataTempRegister, dataTempRegister, imm.m_value); 2187 m_assembler.bltz(cmpTempRegister, 11);2187 m_assembler.bltz(cmpTempRegister, 9); 2188 2188 m_assembler.sw(dataTempRegister, addrTempRegister, adr & 0xffff); 2189 m_assembler.bgez(dataTempRegister, 9);2189 m_assembler.bgez(dataTempRegister, 7); 2190 2190 m_assembler.nop(); 2191 2191 } else if (imm.m_value >= -32768 && imm.m_value < 0) { 2192 2192 move(dataTempRegister, cmpTempRegister); 2193 2193 m_assembler.addiu(dataTempRegister, dataTempRegister, imm.m_value); 2194 m_assembler.bgez(cmpTempRegister, 11);2194 m_assembler.bgez(cmpTempRegister, 9); 2195 2195 m_assembler.sw(dataTempRegister, addrTempRegister, adr & 0xffff); 2196 m_assembler.bltz(cmpTempRegister, 9);2196 m_assembler.bltz(cmpTempRegister, 7); 2197 2197 m_assembler.nop(); 2198 2198 } else { … … 2200 2200 m_assembler.xorInsn(cmpTempRegister, dataTempRegister, immTempRegister); 2201 2201 m_assembler.addu(dataTempRegister, dataTempRegister, immTempRegister); 2202 m_assembler.bltz(cmpTempRegister, 1 2);2202 m_assembler.bltz(cmpTempRegister, 10); 2203 2203 m_assembler.sw(dataTempRegister, addrTempRegister, adr & 0xffff); 2204 2204 m_assembler.xorInsn(cmpTempRegister, dataTempRegister, immTempRegister); 2205 m_assembler.bgez(cmpTempRegister, 9);2205 m_assembler.bgez(cmpTempRegister, 7); 2206 2206 m_assembler.nop(); 2207 2207 } … … 2252 2252 b Overflow 2253 2253 nop 2254 nop2254 b No_overflow 2255 2255 nop 2256 2256 nop … … 2262 2262 m_assembler.mflo(dest); 2263 2263 m_assembler.sra(addrTempRegister, dest, 31); 2264 m_assembler.beq(dataTempRegister, addrTempRegister, 9);2264 m_assembler.beq(dataTempRegister, addrTempRegister, 7); 2265 2265 m_assembler.nop(); 2266 2266 return jump(); … … 2297 2297 b Overflow 2298 2298 nop 2299 nop2299 b No_overflow 2300 2300 nop 2301 2301 nop … … 2307 2307 m_assembler.mflo(dest); 2308 2308 m_assembler.sra(addrTempRegister, dest, 31); 2309 m_assembler.beq(dataTempRegister, addrTempRegister, 9);2309 m_assembler.beq(dataTempRegister, addrTempRegister, 7); 2310 2310 m_assembler.nop(); 2311 2311 return jump(); … … 2349 2349 b Overflow 2350 2350 nop 2351 nop2351 b No_overflow 2352 2352 nop 2353 2353 nop … … 2357 2357 move(dest, dataTempRegister); 2358 2358 m_assembler.xorInsn(cmpTempRegister, dataTempRegister, src); 2359 m_assembler.bgez(cmpTempRegister, 1 2);2359 m_assembler.bgez(cmpTempRegister, 10); 2360 2360 m_assembler.subu(dest, dataTempRegister, src); 2361 2361 m_assembler.xorInsn(cmpTempRegister, dest, dataTempRegister); 2362 m_assembler.bgez(cmpTempRegister, 9);2362 m_assembler.bgez(cmpTempRegister, 7); 2363 2363 m_assembler.nop(); 2364 2364 return jump(); … … 2408 2408 b Overflow 2409 2409 nop 2410 nop2410 b No_overflow 2411 2411 nop 2412 2412 nop … … 2416 2416 move(op1, dataTempRegister); 2417 2417 m_assembler.xorInsn(cmpTempRegister, dataTempRegister, op2); 2418 m_assembler.bgez(cmpTempRegister, 1 2);2418 m_assembler.bgez(cmpTempRegister, 10); 2419 2419 m_assembler.subu(dest, dataTempRegister, op2); 2420 2420 m_assembler.xorInsn(cmpTempRegister, dest, dataTempRegister); 2421 m_assembler.bgez(cmpTempRegister, 9);2421 m_assembler.bgez(cmpTempRegister, 7); 2422 2422 m_assembler.nop(); 2423 2423 return jump(); … … 2452 2452 b Overflow 2453 2453 nop 2454 nop2454 b No_overflow 2455 2455 nop 2456 2456 nop … … 2679 2679 m_fixedWidth = true; 2680 2680 dataLabel = moveWithPatch(initialRightValue, immTempRegister); 2681 m_assembler.nop(); 2682 m_assembler.nop(); 2681 2683 Jump temp = branch32(cond, left, immTempRegister); 2682 2684 m_fixedWidth = false; … … 2689 2691 load32(left, dataTempRegister); 2690 2692 dataLabel = moveWithPatch(initialRightValue, immTempRegister); 2693 m_assembler.nop(); 2694 m_assembler.nop(); 2691 2695 Jump temp = branch32(cond, dataTempRegister, immTempRegister); 2692 2696 m_fixedWidth = false; … … 3204 3208 Jump branchEqual(RegisterID rs, RegisterID rt) 3205 3209 { 3206 m_assembler.nop();3207 m_assembler.nop();3208 3210 m_assembler.appendJump(); 3209 3211 m_assembler.beq(rs, rt, 0); … … 3215 3217 Jump branchNotEqual(RegisterID rs, RegisterID rt) 3216 3218 { 3217 m_assembler.nop();3218 m_assembler.nop();3219 3219 m_assembler.appendJump(); 3220 3220 m_assembler.bne(rs, rt, 0);
Note: See TracChangeset
for help on using the changeset viewer.