Changeset 199792 in webkit
- Timestamp:
- Apr 20, 2016 3:24:32 PM (8 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 1 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r199787 r199792 1 2016-04-20 Benjamin Poulain <bpoulain@apple.com> 2 3 [JSC] Add register reuse for ArithAdd of an Int32 and constant in DFG 4 https://bugs.webkit.org/show_bug.cgi?id=155164 5 6 Reviewed by Mark Lam. 7 8 Every "inc" in loop was looking like this: 9 move rX, rY 10 inc rY 11 jo 0x230f4a200580 12 13 This patch add register Reuse to that case to remove 14 the extra "move". 15 16 * dfg/DFGOSRExit.h: 17 (JSC::DFG::SpeculationRecovery::SpeculationRecovery): 18 (JSC::DFG::SpeculationRecovery::immediate): 19 * dfg/DFGOSRExitCompiler32_64.cpp: 20 (JSC::DFG::OSRExitCompiler::compileExit): 21 * dfg/DFGOSRExitCompiler64.cpp: 22 (JSC::DFG::OSRExitCompiler::compileExit): 23 * dfg/DFGSpeculativeJIT.cpp: 24 (JSC::DFG::SpeculativeJIT::compileArithAdd): 25 * tests/stress/arith-add-with-constant-overflow.js: Added. 26 (opaqueAdd): 27 1 28 2016-04-20 Saam barati <sbarati@apple.com> 2 29 -
trunk/Source/JavaScriptCore/assembler/MacroAssembler.h
r197655 r199792 1695 1695 Jump branchAdd32(ResultCondition cond, RegisterID src, Imm32 imm, RegisterID dest) 1696 1696 { 1697 if (src == dest)1698 ASSERT(haveScratchRegisterForBlinding());1699 1700 1697 if (shouldBlind(imm)) { 1701 if (src == dest) { 1702 move(src, scratchRegisterForBlinding()); 1703 src = scratchRegisterForBlinding(); 1698 if (src != dest || haveScratchRegisterForBlinding()) { 1699 if (src == dest) { 1700 move(src, scratchRegisterForBlinding()); 1701 src = scratchRegisterForBlinding(); 1702 } 1703 loadXorBlindedConstant(xorBlindConstant(imm), dest); 1704 return branchAdd32(cond, src, dest); 1704 1705 } 1705 loadXorBlindedConstant(xorBlindConstant(imm), dest); 1706 return branchAdd32(cond, src, dest); 1706 // If we don't have a scratch register available for use, we'll just 1707 // place a random number of nops. 1708 uint32_t nopCount = random() & 3; 1709 while (nopCount--) 1710 nop(); 1707 1711 } 1708 1712 return branchAdd32(cond, src, imm.asTrustedImm32(), dest); -
trunk/Source/JavaScriptCore/dfg/DFGOSRExit.h
r198024 r199792 49 49 // This enum describes the types of additional recovery that 50 50 // may need be performed should a speculation check fail. 51 enum SpeculationRecoveryType {51 enum SpeculationRecoveryType : uint8_t { 52 52 SpeculativeAdd, 53 SpeculativeAddImmediate, 53 54 BooleanSpeculationCheck 54 55 }; … … 61 62 public: 62 63 SpeculationRecovery(SpeculationRecoveryType type, GPRReg dest, GPRReg src) 63 : m_ type(type)64 : m_src(src) 64 65 , m_dest(dest) 65 , m_ src(src)66 , m_type(type) 66 67 { 68 ASSERT(m_type == SpeculativeAdd || m_type == BooleanSpeculationCheck); 69 } 70 71 SpeculationRecovery(SpeculationRecoveryType type, GPRReg dest, int32_t immediate) 72 : m_immediate(immediate) 73 , m_dest(dest) 74 , m_type(type) 75 { 76 ASSERT(m_type == SpeculativeAddImmediate); 67 77 } 68 78 … … 70 80 GPRReg dest() { return m_dest; } 71 81 GPRReg src() { return m_src; } 82 int32_t immediate() { return m_immediate; } 72 83 73 84 private: 85 // different recovery types may required different additional information here. 86 union { 87 GPRReg m_src; 88 int32_t m_immediate; 89 }; 90 GPRReg m_dest; 91 74 92 // Indicates the type of additional recovery to be performed. 75 93 SpeculationRecoveryType m_type; 76 // different recovery types may required different additional information here.77 GPRReg m_dest;78 GPRReg m_src;79 94 }; 80 95 -
trunk/Source/JavaScriptCore/dfg/DFGOSRExitCompiler32_64.cpp
r198024 r199792 56 56 case SpeculativeAdd: 57 57 m_jit.sub32(recovery->src(), recovery->dest()); 58 break; 59 60 case SpeculativeAddImmediate: 61 m_jit.sub32(AssemblyHelpers::Imm32(recovery->immediate()), recovery->dest()); 58 62 break; 59 63 -
trunk/Source/JavaScriptCore/dfg/DFGOSRExitCompiler64.cpp
r198024 r199792 60 60 case SpeculativeAdd: 61 61 m_jit.sub32(recovery->src(), recovery->dest()); 62 m_jit.or64(GPRInfo::tagTypeNumberRegister, recovery->dest()); 63 break; 64 65 case SpeculativeAddImmediate: 66 m_jit.sub32(AssemblyHelpers::Imm32(recovery->immediate()), recovery->dest()); 62 67 m_jit.or64(GPRInfo::tagTypeNumberRegister, recovery->dest()); 63 68 break; -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
r199748 r199792 3497 3497 if (node->child2()->isInt32Constant()) { 3498 3498 SpeculateInt32Operand op1(this, node->child1()); 3499 GPRTemporary result(this, Reuse, op1); 3500 3501 GPRReg gpr1 = op1.gpr(); 3499 3502 int32_t imm2 = node->child2()->asInt32(); 3503 GPRReg gprResult = result.gpr(); 3500 3504 3501 3505 if (!shouldCheckOverflow(node->arithMode())) { 3502 GPRTemporary result(this, Reuse, op1); 3503 m_jit.add32(Imm32(imm2), op1.gpr(), result.gpr()); 3504 int32Result(result.gpr(), node); 3506 m_jit.add32(Imm32(imm2), gpr1, gprResult); 3507 int32Result(gprResult, node); 3505 3508 return; 3506 3509 } 3507 3510 3508 GPRTemporary result(this); 3509 speculationCheck(Overflow, JSValueRegs(), 0, m_jit.branchAdd32(MacroAssembler::Overflow, op1.gpr(), Imm32(imm2), result.gpr())); 3510 3511 int32Result(result.gpr(), node); 3511 MacroAssembler::Jump check = m_jit.branchAdd32(MacroAssembler::Overflow, gpr1, Imm32(imm2), gprResult); 3512 if (gpr1 == gprResult) { 3513 speculationCheck(Overflow, JSValueRegs(), 0, check, 3514 SpeculationRecovery(SpeculativeAddImmediate, gpr1, imm2)); 3515 } else 3516 speculationCheck(Overflow, JSValueRegs(), 0, check); 3517 3518 int32Result(gprResult, node); 3512 3519 return; 3513 3520 }
Note: See TracChangeset
for help on using the changeset viewer.