Commit c575e8ae authored by Milad Fa's avatar Milad Fa Committed by V8 LUCI CQ

PPC/S390: Reland "[osr] Use the new OSR cache"

Port 91453880

Original Commit Message:

  This is a reland of commit 91da3883

  Original change's description:
  > Fixed: Use an X register for JumpIfCodeTIsMarkedForDeoptimization
  > on arm64.
  > Bug: v8:12161

Change-Id: I6e63bd5995340bac32654ef12c52d25b496140e3
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3607997Reviewed-by: 's avatarJunliang Yan <junyan@redhat.com>
Commit-Queue: Milad Farazmand <mfarazma@redhat.com>
Cr-Commit-Position: refs/heads/main@{#80194}
parent cd427d98
...@@ -532,6 +532,32 @@ void BaselineAssembler::StoreTaggedFieldNoWriteBarrier(Register target, ...@@ -532,6 +532,32 @@ void BaselineAssembler::StoreTaggedFieldNoWriteBarrier(Register target,
__ StoreTaggedField(value, FieldMemOperand(target, offset), r0); __ StoreTaggedField(value, FieldMemOperand(target, offset), r0);
} }
void BaselineAssembler::TryLoadOptimizedOsrCode(Register scratch_and_result,
Register feedback_vector,
FeedbackSlot slot,
Label* on_result,
Label::Distance) {
Label fallthrough;
LoadTaggedPointerField(scratch_and_result, feedback_vector,
FeedbackVector::OffsetOfElementAt(slot.ToInt()));
__ LoadWeakValue(scratch_and_result, scratch_and_result, &fallthrough);
// Is it marked_for_deoptimization? If yes, clear the slot.
{
ScratchRegisterScope temps(this);
Register scratch = temps.AcquireScratch();
__ TestCodeTIsMarkedForDeoptimization(scratch_and_result, scratch, r0);
__ beq(on_result, cr0);
__ mov(scratch, __ ClearedValue());
StoreTaggedFieldNoWriteBarrier(
feedback_vector, FeedbackVector::OffsetOfElementAt(slot.ToInt()),
scratch);
}
__ bind(&fallthrough);
Move(scratch_and_result, 0);
}
void BaselineAssembler::AddToInterruptBudgetAndJumpIfNotExceeded( void BaselineAssembler::AddToInterruptBudgetAndJumpIfNotExceeded(
int32_t weight, Label* skip_interrupt_label) { int32_t weight, Label* skip_interrupt_label) {
ASM_CODE_COMMENT(masm_); ASM_CODE_COMMENT(masm_);
......
...@@ -530,6 +530,32 @@ void BaselineAssembler::StoreTaggedFieldNoWriteBarrier(Register target, ...@@ -530,6 +530,32 @@ void BaselineAssembler::StoreTaggedFieldNoWriteBarrier(Register target,
__ StoreTaggedField(value, FieldMemOperand(target, offset), r0); __ StoreTaggedField(value, FieldMemOperand(target, offset), r0);
} }
void BaselineAssembler::TryLoadOptimizedOsrCode(Register scratch_and_result,
Register feedback_vector,
FeedbackSlot slot,
Label* on_result,
Label::Distance) {
Label fallthrough;
LoadTaggedPointerField(scratch_and_result, feedback_vector,
FeedbackVector::OffsetOfElementAt(slot.ToInt()));
__ LoadWeakValue(scratch_and_result, scratch_and_result, &fallthrough);
// Is it marked_for_deoptimization? If yes, clear the slot.
{
ScratchRegisterScope temps(this);
Register scratch = temps.AcquireScratch();
__ TestCodeTIsMarkedForDeoptimization(scratch_and_result, scratch);
__ beq(on_result);
__ mov(scratch, __ ClearedValue());
StoreTaggedFieldNoWriteBarrier(
feedback_vector, FeedbackVector::OffsetOfElementAt(slot.ToInt()),
scratch);
}
__ bind(&fallthrough);
Move(scratch_and_result, 0);
}
void BaselineAssembler::AddToInterruptBudgetAndJumpIfNotExceeded( void BaselineAssembler::AddToInterruptBudgetAndJumpIfNotExceeded(
int32_t weight, Label* skip_interrupt_label) { int32_t weight, Label* skip_interrupt_label) {
ASM_CODE_COMMENT(masm_); ASM_CODE_COMMENT(masm_);
......
...@@ -79,16 +79,28 @@ void Generate_OSREntry(MacroAssembler* masm, Register entry_address, ...@@ -79,16 +79,28 @@ void Generate_OSREntry(MacroAssembler* masm, Register entry_address,
__ Ret(); __ Ret();
} }
void ResetBytecodeAgeAndOsrState(MacroAssembler* masm, Register bytecode_array, void ResetBytecodeAge(MacroAssembler* masm, Register bytecode_array,
Register scratch) { Register scratch) {
// Reset the bytecode age and OSR state (optimized to a single write).
static_assert(BytecodeArray::kOsrStateAndBytecodeAgeAreContiguous32Bits);
STATIC_ASSERT(BytecodeArray::kNoAgeBytecodeAge == 0); STATIC_ASSERT(BytecodeArray::kNoAgeBytecodeAge == 0);
DCHECK(!AreAliased(bytecode_array, scratch));
__ mov(scratch, Operand(0)); __ mov(scratch, Operand(0));
__ StoreU32(scratch, __ StoreU16(
FieldMemOperand(bytecode_array, scratch,
BytecodeArray::kOsrUrgencyAndInstallTargetOffset), FieldMemOperand(bytecode_array, BytecodeArray::kBytecodeAgeOffset), r0);
r0); }
void ResetFeedbackVectorOsrUrgency(MacroAssembler* masm,
Register feedback_vector, Register scratch1,
Register scratch2) {
DCHECK(!AreAliased(feedback_vector, scratch1));
__ LoadU8(scratch1,
FieldMemOperand(feedback_vector, FeedbackVector::kOsrStateOffset),
scratch2);
__ andi(scratch1, scratch1,
Operand(FeedbackVector::MaybeHasOptimizedOsrCodeBit::kMask));
__ StoreU8(scratch1,
FieldMemOperand(feedback_vector, FeedbackVector::kOsrStateOffset),
scratch2);
} }
// Restarts execution either at the current or next (in execution order) // Restarts execution either at the current or next (in execution order)
...@@ -216,8 +228,7 @@ void Generate_BaselineOrInterpreterEntry(MacroAssembler* masm, ...@@ -216,8 +228,7 @@ void Generate_BaselineOrInterpreterEntry(MacroAssembler* masm,
if (is_osr) { if (is_osr) {
Register scratch = ip; Register scratch = ip;
ResetBytecodeAgeAndOsrState(masm, kInterpreterBytecodeArrayRegister, ResetBytecodeAge(masm, kInterpreterBytecodeArrayRegister, scratch);
scratch);
Generate_OSREntry(masm, code_obj, Code::kHeaderSize - kHeapObjectTag); Generate_OSREntry(masm, code_obj, Code::kHeaderSize - kHeapObjectTag);
} else { } else {
__ AddS64(code_obj, code_obj, Operand(Code::kHeaderSize - kHeapObjectTag)); __ AddS64(code_obj, code_obj, Operand(Code::kHeaderSize - kHeapObjectTag));
...@@ -391,37 +402,15 @@ enum class OsrSourceTier { ...@@ -391,37 +402,15 @@ enum class OsrSourceTier {
}; };
void OnStackReplacement(MacroAssembler* masm, OsrSourceTier source, void OnStackReplacement(MacroAssembler* masm, OsrSourceTier source,
Register current_loop_depth, Register maybe_target_code) {
Register encoded_current_bytecode_offset, Label jump_to_optimized_code;
Register osr_urgency_and_install_target) { {
static constexpr Register scratch = r6; // If maybe_target_code is not null, no need to call into runtime. A
DCHECK(!AreAliased(scratch, current_loop_depth, // precondition here is: if maybe_target_code is a Code object, it must NOT
encoded_current_bytecode_offset, // be marked_for_deoptimization (callers must ensure this).
osr_urgency_and_install_target)); __ CmpSmiLiteral(maybe_target_code, Smi::zero(), r0);
// OSR based on urgency, i.e. is the OSR urgency greater than the current __ bne(&jump_to_optimized_code);
// loop depth? }
Label try_osr;
STATIC_ASSERT(BytecodeArray::OsrUrgencyBits::kShift == 0);
Register urgency = scratch;
__ andi(urgency, osr_urgency_and_install_target,
Operand(BytecodeArray::OsrUrgencyBits::kMask));
__ CmpU64(urgency, current_loop_depth);
__ bgt(&try_osr);
// OSR based on the install target offset, i.e. does the current bytecode
// offset match the install target offset?
static constexpr int kMask = BytecodeArray::OsrInstallTargetBits::kMask;
Register install_target = osr_urgency_and_install_target;
__ andi(install_target, osr_urgency_and_install_target, Operand(kMask));
__ CmpU64(install_target, encoded_current_bytecode_offset);
__ beq(&try_osr);
// Neither urgency nor the install target triggered, return to the caller.
// Note: the return value must be nullptr or a valid Code object.
__ mov(r3, Operand(0));
__ Ret(0);
__ bind(&try_osr);
ASM_CODE_COMMENT(masm); ASM_CODE_COMMENT(masm);
{ {
...@@ -430,12 +419,12 @@ void OnStackReplacement(MacroAssembler* masm, OsrSourceTier source, ...@@ -430,12 +419,12 @@ void OnStackReplacement(MacroAssembler* masm, OsrSourceTier source,
} }
// If the code object is null, just return to the caller. // If the code object is null, just return to the caller.
Label skip;
__ CmpSmiLiteral(r3, Smi::zero(), r0); __ CmpSmiLiteral(r3, Smi::zero(), r0);
__ bne(&skip); __ bne(&jump_to_optimized_code);
__ Ret(); __ Ret();
__ bind(&skip); __ bind(&jump_to_optimized_code);
DCHECK_EQ(maybe_target_code, r3); // Already in the right spot.
if (source == OsrSourceTier::kInterpreter) { if (source == OsrSourceTier::kInterpreter) {
// Drop the handler frame that is be sitting on top of the actual // Drop the handler frame that is be sitting on top of the actual
...@@ -1192,16 +1181,12 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm, ...@@ -1192,16 +1181,12 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm,
// Check if the optimized code is marked for deopt. If it is, call the // Check if the optimized code is marked for deopt. If it is, call the
// runtime to clear it. // runtime to clear it.
__ LoadTaggedPointerField( {
scratch, UseScratchRegisterScope temps(masm);
FieldMemOperand(optimized_code_entry, Code::kCodeDataContainerOffset), __ TestCodeTIsMarkedForDeoptimization(optimized_code_entry, temps.Acquire(),
r0); scratch);
__ LoadS32(
scratch,
FieldMemOperand(scratch, CodeDataContainer::kKindSpecificFlagsOffset),
r0);
__ TestBit(scratch, Code::kMarkedForDeoptimizationBit, r0);
__ bne(&heal_optimized_code_slot, cr0); __ bne(&heal_optimized_code_slot, cr0);
}
// Optimized code is good, get it into the closure and link the closure // Optimized code is good, get it into the closure and link the closure
// into the optimized functions list, then tail call the optimized code. // into the optimized functions list, then tail call the optimized code.
...@@ -1394,6 +1379,8 @@ void Builtins::Generate_BaselineOutOfLinePrologue(MacroAssembler* masm) { ...@@ -1394,6 +1379,8 @@ void Builtins::Generate_BaselineOutOfLinePrologue(MacroAssembler* masm) {
&has_optimized_code_or_state); &has_optimized_code_or_state);
} }
{ ResetFeedbackVectorOsrUrgency(masm, feedback_vector, r11, r0); }
// Increment invocation count for the function. // Increment invocation count for the function.
{ {
Register invocation_count = r13; Register invocation_count = r13;
...@@ -1429,7 +1416,7 @@ void Builtins::Generate_BaselineOutOfLinePrologue(MacroAssembler* masm) { ...@@ -1429,7 +1416,7 @@ void Builtins::Generate_BaselineOutOfLinePrologue(MacroAssembler* masm) {
// the frame, so load it into a register. // the frame, so load it into a register.
Register bytecodeArray = descriptor.GetRegisterParameter( Register bytecodeArray = descriptor.GetRegisterParameter(
BaselineOutOfLinePrologueDescriptor::kInterpreterBytecodeArray); BaselineOutOfLinePrologueDescriptor::kInterpreterBytecodeArray);
ResetBytecodeAgeAndOsrState(masm, bytecodeArray, r13); ResetBytecodeAge(masm, bytecodeArray, r13);
__ Push(argc, bytecodeArray); __ Push(argc, bytecodeArray);
...@@ -1555,6 +1542,11 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { ...@@ -1555,6 +1542,11 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
LoadTieringStateAndJumpIfNeedsProcessing( LoadTieringStateAndJumpIfNeedsProcessing(
masm, optimization_state, feedback_vector, &has_optimized_code_or_state); masm, optimization_state, feedback_vector, &has_optimized_code_or_state);
{
UseScratchRegisterScope temps(masm);
ResetFeedbackVectorOsrUrgency(masm, feedback_vector, ip, r0);
}
Label not_optimized; Label not_optimized;
__ bind(&not_optimized); __ bind(&not_optimized);
...@@ -1578,7 +1570,7 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { ...@@ -1578,7 +1570,7 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
FrameScope frame_scope(masm, StackFrame::MANUAL); FrameScope frame_scope(masm, StackFrame::MANUAL);
__ PushStandardFrame(closure); __ PushStandardFrame(closure);
ResetBytecodeAgeAndOsrState(masm, kInterpreterBytecodeArrayRegister, r8); ResetBytecodeAge(masm, kInterpreterBytecodeArrayRegister, r8);
// Load initial bytecode offset. // Load initial bytecode offset.
__ mov(kInterpreterBytecodeOffsetRegister, __ mov(kInterpreterBytecodeOffsetRegister,
...@@ -2072,24 +2064,20 @@ void Builtins::Generate_NotifyDeoptimized(MacroAssembler* masm) { ...@@ -2072,24 +2064,20 @@ void Builtins::Generate_NotifyDeoptimized(MacroAssembler* masm) {
void Builtins::Generate_InterpreterOnStackReplacement(MacroAssembler* masm) { void Builtins::Generate_InterpreterOnStackReplacement(MacroAssembler* masm) {
using D = InterpreterOnStackReplacementDescriptor; using D = InterpreterOnStackReplacementDescriptor;
STATIC_ASSERT(D::kParameterCount == 3); STATIC_ASSERT(D::kParameterCount == 1);
OnStackReplacement(masm, OsrSourceTier::kInterpreter, OnStackReplacement(masm, OsrSourceTier::kInterpreter,
D::CurrentLoopDepthRegister(), D::MaybeTargetCodeRegister());
D::EncodedCurrentBytecodeOffsetRegister(),
D::OsrUrgencyAndInstallTargetRegister());
} }
#if ENABLE_SPARKPLUG #if ENABLE_SPARKPLUG
void Builtins::Generate_BaselineOnStackReplacement(MacroAssembler* masm) { void Builtins::Generate_BaselineOnStackReplacement(MacroAssembler* masm) {
using D = BaselineOnStackReplacementDescriptor; using D = BaselineOnStackReplacementDescriptor;
STATIC_ASSERT(D::kParameterCount == 3); STATIC_ASSERT(D::kParameterCount == 1);
__ LoadU64(kContextRegister, __ LoadU64(kContextRegister,
MemOperand(fp, BaselineFrameConstants::kContextOffset), r0); MemOperand(fp, BaselineFrameConstants::kContextOffset), r0);
OnStackReplacement(masm, OsrSourceTier::kBaseline, OnStackReplacement(masm, OsrSourceTier::kBaseline,
D::CurrentLoopDepthRegister(), D::MaybeTargetCodeRegister());
D::EncodedCurrentBytecodeOffsetRegister(),
D::OsrUrgencyAndInstallTargetRegister());
} }
#endif #endif
......
...@@ -83,18 +83,27 @@ void Generate_OSREntry(MacroAssembler* masm, Register entry_address, ...@@ -83,18 +83,27 @@ void Generate_OSREntry(MacroAssembler* masm, Register entry_address,
__ Ret(); __ Ret();
} }
void ResetBytecodeAgeAndOsrState(MacroAssembler* masm, Register bytecode_array, void ResetBytecodeAge(MacroAssembler* masm, Register bytecode_array,
Register scratch) { Register scratch) {
// Reset the bytecode age and OSR state (optimized to a single write).
static_assert(BytecodeArray::kOsrStateAndBytecodeAgeAreContiguous32Bits);
STATIC_ASSERT(BytecodeArray::kNoAgeBytecodeAge == 0); STATIC_ASSERT(BytecodeArray::kNoAgeBytecodeAge == 0);
DCHECK(!AreAliased(bytecode_array, scratch));
__ mov(r0, Operand(0)); __ mov(r0, Operand(0));
__ StoreU32(r0, __ StoreU16(
FieldMemOperand(bytecode_array, r0, FieldMemOperand(bytecode_array, BytecodeArray::kBytecodeAgeOffset),
BytecodeArray::kOsrUrgencyAndInstallTargetOffset),
scratch); scratch);
} }
void ResetFeedbackVectorOsrUrgency(MacroAssembler* masm,
Register feedback_vector, Register scratch) {
DCHECK(!AreAliased(feedback_vector, scratch));
__ LoadU8(scratch,
FieldMemOperand(feedback_vector, FeedbackVector::kOsrStateOffset));
__ AndP(scratch, scratch,
Operand(FeedbackVector::MaybeHasOptimizedOsrCodeBit::kMask));
__ StoreU8(scratch,
FieldMemOperand(feedback_vector, FeedbackVector::kOsrStateOffset));
}
// Restarts execution either at the current or next (in execution order) // Restarts execution either at the current or next (in execution order)
// bytecode. If there is baseline code on the shared function info, converts an // bytecode. If there is baseline code on the shared function info, converts an
// interpreter frame into a baseline frame and continues execution in baseline // interpreter frame into a baseline frame and continues execution in baseline
...@@ -218,7 +227,7 @@ void Generate_BaselineOrInterpreterEntry(MacroAssembler* masm, ...@@ -218,7 +227,7 @@ void Generate_BaselineOrInterpreterEntry(MacroAssembler* masm,
if (is_osr) { if (is_osr) {
// TODO(pthier): Separate baseline Sparkplug from TF arming and don't // TODO(pthier): Separate baseline Sparkplug from TF arming and don't
// disarm Sparkplug here. // disarm Sparkplug here.
ResetBytecodeAgeAndOsrState(masm, kInterpreterBytecodeArrayRegister, r1); ResetBytecodeAge(masm, kInterpreterBytecodeArrayRegister, r1);
Generate_OSREntry(masm, code_obj, Code::kHeaderSize - kHeapObjectTag); Generate_OSREntry(masm, code_obj, Code::kHeaderSize - kHeapObjectTag);
} else { } else {
__ AddS64(code_obj, code_obj, Operand(Code::kHeaderSize - kHeapObjectTag)); __ AddS64(code_obj, code_obj, Operand(Code::kHeaderSize - kHeapObjectTag));
...@@ -256,37 +265,15 @@ enum class OsrSourceTier { ...@@ -256,37 +265,15 @@ enum class OsrSourceTier {
}; };
void OnStackReplacement(MacroAssembler* masm, OsrSourceTier source, void OnStackReplacement(MacroAssembler* masm, OsrSourceTier source,
Register current_loop_depth, Register maybe_target_code) {
Register encoded_current_bytecode_offset, Label jump_to_optimized_code;
Register osr_urgency_and_install_target) { {
static constexpr Register scratch = r5; // If maybe_target_code is not null, no need to call into runtime. A
DCHECK(!AreAliased(scratch, current_loop_depth, // precondition here is: if maybe_target_code is a Code object, it must NOT
encoded_current_bytecode_offset, // be marked_for_deoptimization (callers must ensure this).
osr_urgency_and_install_target)); __ CmpSmiLiteral(maybe_target_code, Smi::zero(), r0);
// OSR based on urgency, i.e. is the OSR urgency greater than the current __ bne(&jump_to_optimized_code);
// loop depth? }
Label try_osr;
STATIC_ASSERT(BytecodeArray::OsrUrgencyBits::kShift == 0);
Register urgency = scratch;
__ AndP(urgency, osr_urgency_and_install_target,
Operand(BytecodeArray::OsrUrgencyBits::kMask));
__ CmpU64(urgency, current_loop_depth);
__ bgt(&try_osr);
// OSR based on the install target offset, i.e. does the current bytecode
// offset match the install target offset?
static constexpr int kMask = BytecodeArray::OsrInstallTargetBits::kMask;
Register install_target = osr_urgency_and_install_target;
__ AndP(install_target, osr_urgency_and_install_target, Operand(kMask));
__ CmpU64(install_target, encoded_current_bytecode_offset);
__ beq(&try_osr);
// Neither urgency nor the install target triggered, return to the caller.
// Note: the return value must be nullptr or a valid Code object.
__ mov(r2, Operand(0));
__ Ret(0);
__ bind(&try_osr);
ASM_CODE_COMMENT(masm); ASM_CODE_COMMENT(masm);
{ {
...@@ -295,12 +282,12 @@ void OnStackReplacement(MacroAssembler* masm, OsrSourceTier source, ...@@ -295,12 +282,12 @@ void OnStackReplacement(MacroAssembler* masm, OsrSourceTier source,
} }
// If the code object is null, just return to the caller. // If the code object is null, just return to the caller.
Label jump_to_returned_code;
__ CmpSmiLiteral(r2, Smi::zero(), r0); __ CmpSmiLiteral(r2, Smi::zero(), r0);
__ bne(&jump_to_returned_code); __ bne(&jump_to_optimized_code);
__ Ret(); __ Ret();
__ bind(&jump_to_returned_code); __ bind(&jump_to_optimized_code);
DCHECK_EQ(maybe_target_code, r2); // Already in the right spot.
if (source == OsrSourceTier::kInterpreter) { if (source == OsrSourceTier::kInterpreter) {
// Drop the handler frame that is be sitting on top of the actual // Drop the handler frame that is be sitting on top of the actual
...@@ -1223,13 +1210,10 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm, ...@@ -1223,13 +1210,10 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm,
// Check if the optimized code is marked for deopt. If it is, call the // Check if the optimized code is marked for deopt. If it is, call the
// runtime to clear it. // runtime to clear it.
__ LoadTaggedPointerField( {
scratch, __ TestCodeTIsMarkedForDeoptimization(optimized_code_entry, scratch);
FieldMemOperand(optimized_code_entry, Code::kCodeDataContainerOffset));
__ LoadS32(scratch, FieldMemOperand(
scratch, CodeDataContainer::kKindSpecificFlagsOffset));
__ TestBit(scratch, Code::kMarkedForDeoptimizationBit, r0);
__ bne(&heal_optimized_code_slot); __ bne(&heal_optimized_code_slot);
}
// Optimized code is good, get it into the closure and link the closure // Optimized code is good, get it into the closure and link the closure
// into the optimized functions list, then tail call the optimized code. // into the optimized functions list, then tail call the optimized code.
...@@ -1423,6 +1407,11 @@ void Builtins::Generate_BaselineOutOfLinePrologue(MacroAssembler* masm) { ...@@ -1423,6 +1407,11 @@ void Builtins::Generate_BaselineOutOfLinePrologue(MacroAssembler* masm) {
&has_optimized_code_or_state); &has_optimized_code_or_state);
} }
{
UseScratchRegisterScope temps(masm);
ResetFeedbackVectorOsrUrgency(masm, feedback_vector, r1);
}
// Increment invocation count for the function. // Increment invocation count for the function.
{ {
Register invocation_count = r1; Register invocation_count = r1;
...@@ -1456,7 +1445,7 @@ void Builtins::Generate_BaselineOutOfLinePrologue(MacroAssembler* masm) { ...@@ -1456,7 +1445,7 @@ void Builtins::Generate_BaselineOutOfLinePrologue(MacroAssembler* masm) {
// the frame, so load it into a register. // the frame, so load it into a register.
Register bytecodeArray = descriptor.GetRegisterParameter( Register bytecodeArray = descriptor.GetRegisterParameter(
BaselineOutOfLinePrologueDescriptor::kInterpreterBytecodeArray); BaselineOutOfLinePrologueDescriptor::kInterpreterBytecodeArray);
ResetBytecodeAgeAndOsrState(masm, bytecodeArray, r1); ResetBytecodeAge(masm, bytecodeArray, r1);
__ Push(argc, bytecodeArray); __ Push(argc, bytecodeArray);
...@@ -1583,6 +1572,11 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { ...@@ -1583,6 +1572,11 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
LoadTieringStateAndJumpIfNeedsProcessing( LoadTieringStateAndJumpIfNeedsProcessing(
masm, optimization_state, feedback_vector, &has_optimized_code_or_state); masm, optimization_state, feedback_vector, &has_optimized_code_or_state);
{
UseScratchRegisterScope temps(masm);
ResetFeedbackVectorOsrUrgency(masm, feedback_vector, r1);
}
Label not_optimized; Label not_optimized;
__ bind(&not_optimized); __ bind(&not_optimized);
...@@ -1600,7 +1594,7 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { ...@@ -1600,7 +1594,7 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
FrameScope frame_scope(masm, StackFrame::MANUAL); FrameScope frame_scope(masm, StackFrame::MANUAL);
__ PushStandardFrame(closure); __ PushStandardFrame(closure);
ResetBytecodeAgeAndOsrState(masm, kInterpreterBytecodeArrayRegister, r1); ResetBytecodeAge(masm, kInterpreterBytecodeArrayRegister, r1);
// Load the initial bytecode offset. // Load the initial bytecode offset.
__ mov(kInterpreterBytecodeOffsetRegister, __ mov(kInterpreterBytecodeOffsetRegister,
...@@ -3861,24 +3855,20 @@ void Builtins::Generate_DeoptimizationEntry_Lazy(MacroAssembler* masm) { ...@@ -3861,24 +3855,20 @@ void Builtins::Generate_DeoptimizationEntry_Lazy(MacroAssembler* masm) {
void Builtins::Generate_InterpreterOnStackReplacement(MacroAssembler* masm) { void Builtins::Generate_InterpreterOnStackReplacement(MacroAssembler* masm) {
using D = InterpreterOnStackReplacementDescriptor; using D = InterpreterOnStackReplacementDescriptor;
STATIC_ASSERT(D::kParameterCount == 3); STATIC_ASSERT(D::kParameterCount == 1);
OnStackReplacement(masm, OsrSourceTier::kInterpreter, OnStackReplacement(masm, OsrSourceTier::kInterpreter,
D::CurrentLoopDepthRegister(), D::MaybeTargetCodeRegister());
D::EncodedCurrentBytecodeOffsetRegister(),
D::OsrUrgencyAndInstallTargetRegister());
} }
#if ENABLE_SPARKPLUG #if ENABLE_SPARKPLUG
void Builtins::Generate_BaselineOnStackReplacement(MacroAssembler* masm) { void Builtins::Generate_BaselineOnStackReplacement(MacroAssembler* masm) {
using D = BaselineOnStackReplacementDescriptor; using D = BaselineOnStackReplacementDescriptor;
STATIC_ASSERT(D::kParameterCount == 3); STATIC_ASSERT(D::kParameterCount == 1);
__ LoadU64(kContextRegister, __ LoadU64(kContextRegister,
MemOperand(fp, BaselineFrameConstants::kContextOffset)); MemOperand(fp, BaselineFrameConstants::kContextOffset));
OnStackReplacement(masm, OsrSourceTier::kBaseline, OnStackReplacement(masm, OsrSourceTier::kBaseline,
D::CurrentLoopDepthRegister(), D::MaybeTargetCodeRegister());
D::EncodedCurrentBytecodeOffsetRegister(),
D::OsrUrgencyAndInstallTargetRegister());
} }
#endif #endif
......
...@@ -297,6 +297,24 @@ void TurboAssembler::Drop(Register count, Register scratch) { ...@@ -297,6 +297,24 @@ void TurboAssembler::Drop(Register count, Register scratch) {
add(sp, sp, scratch); add(sp, sp, scratch);
} }
void MacroAssembler::TestCodeTIsMarkedForDeoptimization(Register codet,
Register scratch1,
Register scratch2) {
LoadTaggedPointerField(scratch1,
FieldMemOperand(codet, Code::kCodeDataContainerOffset),
scratch2);
LoadS32(
scratch1,
FieldMemOperand(scratch1, CodeDataContainer::kKindSpecificFlagsOffset),
scratch2);
TestBit(scratch1, Code::kMarkedForDeoptimizationBit, scratch2);
}
Operand MacroAssembler::ClearedValue() const {
return Operand(
static_cast<int32_t>(HeapObjectReference::ClearedValue(isolate()).ptr()));
}
void TurboAssembler::Call(Label* target) { b(target, SetLK); } void TurboAssembler::Call(Label* target) { b(target, SetLK); }
void TurboAssembler::Push(Handle<HeapObject> handle) { void TurboAssembler::Push(Handle<HeapObject> handle) {
......
...@@ -1361,6 +1361,10 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler { ...@@ -1361,6 +1361,10 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler {
DecodeField<Field>(reg, reg, rc); DecodeField<Field>(reg, reg, rc);
} }
void TestCodeTIsMarkedForDeoptimization(Register codet, Register scratch1,
Register scratch2);
Operand ClearedValue() const;
private: private:
static const int kSmiShift = kSmiTagSize + kSmiShiftSize; static const int kSmiShift = kSmiTagSize + kSmiShiftSize;
......
...@@ -495,6 +495,20 @@ void TurboAssembler::Drop(Register count, Register scratch) { ...@@ -495,6 +495,20 @@ void TurboAssembler::Drop(Register count, Register scratch) {
AddS64(sp, sp, scratch); AddS64(sp, sp, scratch);
} }
void MacroAssembler::TestCodeTIsMarkedForDeoptimization(Register codet,
Register scratch) {
LoadTaggedPointerField(
scratch, FieldMemOperand(codet, Code::kCodeDataContainerOffset));
LoadS32(scratch, FieldMemOperand(
scratch, CodeDataContainer::kKindSpecificFlagsOffset));
TestBit(scratch, Code::kMarkedForDeoptimizationBit, scratch);
}
Operand MacroAssembler::ClearedValue() const {
return Operand(
static_cast<int32_t>(HeapObjectReference::ClearedValue(isolate()).ptr()));
}
void TurboAssembler::Call(Label* target) { b(r14, target); } void TurboAssembler::Call(Label* target) { b(r14, target); }
void TurboAssembler::Push(Handle<HeapObject> handle) { void TurboAssembler::Push(Handle<HeapObject> handle) {
......
...@@ -1773,6 +1773,9 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler { ...@@ -1773,6 +1773,9 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler {
RememberedSetAction remembered_set_action = RememberedSetAction::kEmit, RememberedSetAction remembered_set_action = RememberedSetAction::kEmit,
SmiCheck smi_check = SmiCheck::kInline); SmiCheck smi_check = SmiCheck::kInline);
void TestCodeTIsMarkedForDeoptimization(Register codet, Register scratch);
Operand ClearedValue() const;
private: private:
static const int kSmiShift = kSmiTagSize + kSmiShiftSize; static const int kSmiShift = kSmiTagSize + kSmiShiftSize;
// Helper functions for generating invokes. // Helper functions for generating invokes.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment