@@ -2801,7 +2801,44 @@ void Generate_OSREntry(MacroAssembler* masm, Register entry_address) {
2801
2801
__ ret(0);
2802
2802
}
2803
2803
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
+
2805
2842
ASM_CODE_COMMENT(masm);
2806
2843
{
2807
2844
FrameScope scope(masm, StackFrame::INTERNAL);
@@ -2816,7 +2853,7 @@ void OnStackReplacement(MacroAssembler* masm, bool is_interpreter) {
2816
2853
2817
2854
__ bind(&skip);
2818
2855
2819
- if (is_interpreter ) {
2856
+ if (source == OsrSourceTier::kInterpreter ) {
2820
2857
// Drop the handler frame that is be sitting on top of the actual
2821
2858
// JavaScript frame. This is the case then OSR is triggered from bytecode.
2822
2859
__ leave();
@@ -2841,13 +2878,24 @@ void OnStackReplacement(MacroAssembler* masm, bool is_interpreter) {
2841
2878
} // namespace
2842
2879
2843
2880
void 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());
2845
2887
}
2846
2888
2847
2889
void Builtins::Generate_BaselineOnStackReplacement(MacroAssembler* masm) {
2890
+ using D = BaselineOnStackReplacementDescriptor;
2891
+ STATIC_ASSERT(D::kParameterCount == 3);
2892
+
2848
2893
__ mov(kContextRegister,
2849
2894
MemOperand(ebp, BaselineFrameConstants::kContextOffset));
2850
- return OnStackReplacement(masm, false);
2895
+ OnStackReplacement(masm, OsrSourceTier::kBaseline,
2896
+ D::CurrentLoopDepthRegister(),
2897
+ D::EncodedCurrentBytecodeOffsetRegister(),
2898
+ D::OsrUrgencyAndInstallTargetRegister());
2851
2899
}
2852
2900
2853
2901
#if V8_ENABLE_WEBASSEMBLY
0 commit comments