@@ -2801,7 +2801,44 @@ void Generate_OSREntry(MacroAssembler* masm, Register entry_address) {
28012801 __ ret (0 );
28022802}
28032803
2804- void OnStackReplacement (MacroAssembler* masm, bool is_interpreter) {
2804+ enum class OsrSourceTier {
2805+ kInterpreter ,
2806+ kBaseline ,
2807+ };
2808+
2809+ void OnStackReplacement (MacroAssembler* masm, OsrSourceTier source,
2810+ Register current_loop_depth,
2811+ Register encoded_current_bytecode_offset,
2812+ Register osr_urgency_and_install_target) {
2813+ static constexpr Register scratch = edi;
2814+ DCHECK (!AreAliased (scratch, current_loop_depth,
2815+ encoded_current_bytecode_offset,
2816+ osr_urgency_and_install_target));
2817+ // OSR based on urgency, i.e. is the OSR urgency greater than the current
2818+ // loop depth?
2819+ Label try_osr;
2820+ STATIC_ASSERT (BytecodeArray::OsrUrgencyBits::kShift == 0 );
2821+ Register urgency = scratch;
2822+ __ Move (urgency, osr_urgency_and_install_target);
2823+ __ and_ (urgency, Immediate (BytecodeArray::OsrUrgencyBits::kMask ));
2824+ __ cmp (urgency, current_loop_depth);
2825+ __ j (above, &try_osr, Label::kNear );
2826+
2827+ // OSR based on the install target offset, i.e. does the current bytecode
2828+ // offset match the install target offset?
2829+ static constexpr int kMask = BytecodeArray::OsrInstallTargetBits::kMask ;
2830+ Register install_target = osr_urgency_and_install_target;
2831+ __ and_ (install_target, Immediate (kMask ));
2832+ __ cmp (install_target, encoded_current_bytecode_offset);
2833+ __ j (equal, &try_osr, Label::kNear );
2834+
2835+ // Neither urgency nor the install target triggered, return to the caller.
2836+ // Note: the return value must be nullptr or a valid Code object.
2837+ __ Move (eax, Immediate (0 ));
2838+ __ ret (0 );
2839+
2840+ __ bind (&try_osr);
2841+
28052842 ASM_CODE_COMMENT (masm);
28062843 {
28072844 FrameScope scope (masm, StackFrame::INTERNAL);
@@ -2816,7 +2853,7 @@ void OnStackReplacement(MacroAssembler* masm, bool is_interpreter) {
28162853
28172854 __ bind (&skip);
28182855
2819- if (is_interpreter ) {
2856+ if (source == OsrSourceTier:: kInterpreter ) {
28202857 // Drop the handler frame that is be sitting on top of the actual
28212858 // JavaScript frame. This is the case then OSR is triggered from bytecode.
28222859 __ leave ();
@@ -2841,13 +2878,24 @@ void OnStackReplacement(MacroAssembler* masm, bool is_interpreter) {
28412878} // namespace
28422879
28432880void Builtins::Generate_InterpreterOnStackReplacement (MacroAssembler* masm) {
2844- return OnStackReplacement (masm, true );
2881+ using D = InterpreterOnStackReplacementDescriptor;
2882+ STATIC_ASSERT (D::kParameterCount == 3 );
2883+ OnStackReplacement (masm, OsrSourceTier::kInterpreter ,
2884+ D::CurrentLoopDepthRegister (),
2885+ D::EncodedCurrentBytecodeOffsetRegister (),
2886+ D::OsrUrgencyAndInstallTargetRegister ());
28452887}
28462888
28472889void Builtins::Generate_BaselineOnStackReplacement (MacroAssembler* masm) {
2890+ using D = BaselineOnStackReplacementDescriptor;
2891+ STATIC_ASSERT (D::kParameterCount == 3 );
2892+
28482893 __ mov (kContextRegister ,
28492894 MemOperand (ebp, BaselineFrameConstants::kContextOffset ));
2850- return OnStackReplacement (masm, false );
2895+ OnStackReplacement (masm, OsrSourceTier::kBaseline ,
2896+ D::CurrentLoopDepthRegister (),
2897+ D::EncodedCurrentBytecodeOffsetRegister (),
2898+ D::OsrUrgencyAndInstallTargetRegister ());
28512899}
28522900
28532901#if V8_ENABLE_WEBASSEMBLY
0 commit comments