@@ -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