Ignore:
Timestamp:
Apr 22, 2013, 10:37:29 AM (12 years ago)
Author:
[email protected]
Message:

Change baseline JIT watchdog timer check to use the proper fast slow path
infrastructure.
https://bugs.webkit.org/show_bug.cgi?id=114963.

Reviewed by Oliver Hunt.

SH4 parts contributed by Julien Brianceau.

  • assembler/ARMAssembler.h:
  • assembler/MacroAssemblerARM.h:
  • assembler/MacroAssemblerARMv7.h:
  • assembler/MacroAssemblerMIPS.h:

(JSC::MacroAssemblerMIPS::branchAdd32):

  • assembler/MacroAssemblerSH4.h:

(JSC::MacroAssemblerSH4::branchAdd32):

  • assembler/MacroAssemblerX86Common.h:
  • assembler/SH4Assembler.h:
  • jit/JIT.cpp:

(JSC::JIT::emitEnterOptimizationCheck):
(JSC::JIT::privateCompileSlowCases):

  • jit/JIT.h:

(JSC::JIT::emitEnterOptimizationCheck):

  • jit/JITOpcodes.cpp:

(JSC::JIT::emit_op_loop_hint):
(JSC::JIT::emitSlow_op_loop_hint):
(JSC::JIT::emit_op_enter):

  • jit/JITOpcodes32_64.cpp:

(JSC::JIT::emit_op_enter):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/jit/JITOpcodes.cpp

    r148711 r148893  
    482482}
    483483
     484void JIT::emit_op_loop_hint(Instruction*)
     485{
     486    // Emit the watchdog timer check:
     487    if (m_vm->watchdog.isEnabled())
     488        addSlowCase(branchTest8(NonZero, AbsoluteAddress(m_vm->watchdog.timerDidFireAddress())));
     489
     490    // Emit the JIT optimization check:
     491    if (canBeOptimized())
     492        addSlowCase(branchAdd32(PositiveOrZero, TrustedImm32(Options::executionCounterIncrementForLoop()),
     493            AbsoluteAddress(m_codeBlock->addressOfJITExecuteCounter())));
     494}
     495
     496void JIT::emitSlow_op_loop_hint(Instruction*, Vector<SlowCaseEntry>::iterator& iter)
     497{
     498    // Emit the slow path of the watchdog timer check:
     499    if (m_vm->watchdog.isEnabled()) {
     500        linkSlowCase(iter);
     501
     502        JITStubCall stubCall(this, cti_handle_watchdog_timer);
     503        stubCall.call();
     504
     505#if ENABLE(DFG_JIT)
     506        if (canBeOptimized()) {
     507            Jump doOptimize = branchAdd32(PositiveOrZero, TrustedImm32(Options::executionCounterIncrementForLoop()),
     508                AbsoluteAddress(m_codeBlock->addressOfJITExecuteCounter()));
     509            emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_loop_hint));
     510            doOptimize.link(this);
     511        } else
     512#endif
     513            emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_loop_hint));
     514    }
     515
     516#if ENABLE(DFG_JIT)
     517    // Emit the slow path for the JIT optimization check:
     518    if (canBeOptimized()) {
     519        linkSlowCase(iter);
     520
     521        JITStubCall stubCall(this, cti_optimize);
     522        stubCall.addArgument(TrustedImm32(m_bytecodeOffset));
     523        stubCall.call();
     524
     525        emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_loop_hint));
     526    }
     527#endif
     528}
     529
    484530void JIT::emit_op_neq(Instruction* currentInstruction)
    485531{
     
    864910void JIT::emit_op_enter(Instruction*)
    865911{
    866     emitOptimizationCheck(EnterOptimizationCheck);
     912    emitEnterOptimizationCheck();
    867913   
    868914    // Even though CTI doesn't use them, we initialize our constant
Note: See TracChangeset for help on using the changeset viewer.