aboutsummaryrefslogtreecommitdiff
path: root/deps/v8/src/interpreter/interpreter-assembler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/interpreter/interpreter-assembler.cc')
-rw-r--r--deps/v8/src/interpreter/interpreter-assembler.cc78
1 files changed, 42 insertions, 36 deletions
diff --git a/deps/v8/src/interpreter/interpreter-assembler.cc b/deps/v8/src/interpreter/interpreter-assembler.cc
index cc8dfb1a30..dadfaa8783 100644
--- a/deps/v8/src/interpreter/interpreter-assembler.cc
+++ b/deps/v8/src/interpreter/interpreter-assembler.cc
@@ -13,7 +13,6 @@
#include "src/interpreter/bytecodes.h"
#include "src/interpreter/interpreter.h"
#include "src/machine-type.h"
-#include "src/macro-assembler.h"
#include "src/objects-inl.h"
#include "src/zone/zone.h"
@@ -233,7 +232,7 @@ Node* InterpreterAssembler::RegisterLocation(Register reg) {
}
Node* InterpreterAssembler::RegisterFrameOffset(Node* index) {
- return TimesPointerSize(index);
+ return TimesSystemPointerSize(index);
}
Node* InterpreterAssembler::LoadRegister(Node* reg_index) {
@@ -243,12 +242,12 @@ Node* InterpreterAssembler::LoadRegister(Node* reg_index) {
Node* InterpreterAssembler::LoadRegister(Register reg) {
return Load(MachineType::AnyTagged(), GetInterpretedFramePointer(),
- IntPtrConstant(reg.ToOperand() << kPointerSizeLog2));
+ IntPtrConstant(reg.ToOperand() << kSystemPointerSizeLog2));
}
Node* InterpreterAssembler::LoadAndUntagRegister(Register reg) {
- return LoadAndUntagSmi(GetInterpretedFramePointer(), reg.ToOperand()
- << kPointerSizeLog2);
+ return LoadAndUntagSmi(GetInterpretedFramePointer(),
+ reg.ToOperand() << kSystemPointerSizeLog2);
}
Node* InterpreterAssembler::LoadRegisterAtOperandIndex(int operand_index) {
@@ -299,7 +298,7 @@ Node* InterpreterAssembler::RegisterLocationInRegisterList(
void InterpreterAssembler::StoreRegister(Node* value, Register reg) {
StoreNoWriteBarrier(
MachineRepresentation::kTagged, GetInterpretedFramePointer(),
- IntPtrConstant(reg.ToOperand() << kPointerSizeLog2), value);
+ IntPtrConstant(reg.ToOperand() << kSystemPointerSizeLog2), value);
}
void InterpreterAssembler::StoreRegister(Node* value, Node* reg_index) {
@@ -309,7 +308,7 @@ void InterpreterAssembler::StoreRegister(Node* value, Node* reg_index) {
}
void InterpreterAssembler::StoreAndTagRegister(Node* value, Register reg) {
- int offset = reg.ToOperand() << kPointerSizeLog2;
+ int offset = reg.ToOperand() << kSystemPointerSizeLog2;
StoreAndTagSmi(GetInterpretedFramePointer(), offset, value);
}
@@ -674,6 +673,11 @@ TNode<FeedbackVector> InterpreterAssembler::LoadFeedbackVector() {
return CodeStubAssembler::LoadFeedbackVector(function);
}
+Node* InterpreterAssembler::LoadFeedbackVectorUnchecked() {
+ TNode<JSFunction> function = CAST(LoadRegister(Register::function_closure()));
+ return CodeStubAssembler::LoadFeedbackVectorUnchecked(function);
+}
+
void InterpreterAssembler::CallPrologue() {
if (!Bytecodes::MakesCallAlongCriticalPath(bytecode_)) {
// Bytecodes that make a call along the critical path save the bytecode
@@ -706,7 +710,7 @@ void InterpreterAssembler::IncrementCallCount(Node* feedback_vector,
Node* slot_id) {
Comment("increment call count");
TNode<Smi> call_count =
- CAST(LoadFeedbackVectorSlot(feedback_vector, slot_id, kPointerSize));
+ CAST(LoadFeedbackVectorSlot(feedback_vector, slot_id, kTaggedSize));
// The lowest {FeedbackNexus::CallCountField::kShift} bits of the call
// count are used as flags. To increment the call count by 1 we hence
// have to increment by 1 << {FeedbackNexus::CallCountField::kShift}.
@@ -714,7 +718,7 @@ void InterpreterAssembler::IncrementCallCount(Node* feedback_vector,
call_count, SmiConstant(1 << FeedbackNexus::CallCountField::kShift));
// Count is Smi, so we don't need a write barrier.
StoreFeedbackVectorSlot(feedback_vector, slot_id, new_count,
- SKIP_WRITE_BARRIER, kPointerSize);
+ SKIP_WRITE_BARRIER, kTaggedSize);
}
void InterpreterAssembler::CollectCallableFeedback(Node* target, Node* context,
@@ -803,7 +807,7 @@ void InterpreterAssembler::CollectCallableFeedback(Node* target, Node* context,
// MegamorphicSentinel is an immortal immovable object so
// write-barrier is not needed.
Comment("transition to megamorphic");
- DCHECK(Heap::RootIsImmortalImmovable(RootIndex::kmegamorphic_symbol));
+ DCHECK(RootsTable::IsImmortalImmovable(RootIndex::kmegamorphic_symbol));
StoreFeedbackVectorSlot(
feedback_vector, slot_id,
HeapConstant(FeedbackVector::MegamorphicSentinel(isolate())),
@@ -818,13 +822,22 @@ void InterpreterAssembler::CollectCallableFeedback(Node* target, Node* context,
}
void InterpreterAssembler::CollectCallFeedback(Node* target, Node* context,
- Node* feedback_vector,
+ Node* maybe_feedback_vector,
Node* slot_id) {
+ Label feedback_done(this);
+ // If feedback_vector is not valid, then nothing to do.
+ GotoIf(IsUndefined(maybe_feedback_vector), &feedback_done);
+
+ CSA_SLOW_ASSERT(this, IsFeedbackVector(maybe_feedback_vector));
+
// Increment the call count.
- IncrementCallCount(feedback_vector, slot_id);
+ IncrementCallCount(maybe_feedback_vector, slot_id);
// Collect the callable {target} feedback.
- CollectCallableFeedback(target, context, feedback_vector, slot_id);
+ CollectCallableFeedback(target, context, maybe_feedback_vector, slot_id);
+ Goto(&feedback_done);
+
+ BIND(&feedback_done);
}
void InterpreterAssembler::CallJSAndDispatch(
@@ -898,10 +911,10 @@ template V8_EXPORT_PRIVATE void InterpreterAssembler::CallJSAndDispatch(
void InterpreterAssembler::CallJSWithSpreadAndDispatch(
Node* function, Node* context, const RegListNodePair& args, Node* slot_id,
- Node* feedback_vector) {
+ Node* maybe_feedback_vector) {
DCHECK(Bytecodes::MakesCallAlongCriticalPath(bytecode_));
DCHECK_EQ(Bytecodes::GetReceiverMode(bytecode_), ConvertReceiverMode::kAny);
- CollectCallFeedback(function, context, feedback_vector, slot_id);
+ CollectCallFeedback(function, context, maybe_feedback_vector, slot_id);
Comment("call using CallWithSpread builtin");
Callable callable = CodeFactory::InterpreterPushArgsThenCall(
isolate(), ConvertReceiverMode::kAny,
@@ -926,6 +939,7 @@ Node* InterpreterAssembler::Construct(Node* target, Node* context,
VARIABLE(var_site, MachineRepresentation::kTagged);
Label extra_checks(this, Label::kDeferred), return_result(this, &var_result),
construct(this), construct_array(this, &var_site);
+ GotoIf(IsUndefined(feedback_vector), &construct);
// Increment the call count.
IncrementCallCount(feedback_vector, slot_id);
@@ -1054,7 +1068,7 @@ Node* InterpreterAssembler::Construct(Node* target, Node* context,
// MegamorphicSentinel is an immortal immovable object so
// write-barrier is not needed.
Comment("transition to megamorphic");
- DCHECK(Heap::RootIsImmortalImmovable(RootIndex::kmegamorphic_symbol));
+ DCHECK(RootsTable::IsImmortalImmovable(RootIndex::kmegamorphic_symbol));
StoreFeedbackVectorSlot(
feedback_vector, slot_id,
HeapConstant(FeedbackVector::MegamorphicSentinel(isolate())),
@@ -1106,6 +1120,7 @@ Node* InterpreterAssembler::ConstructWithSpread(Node* target, Node* context,
// constructor _and_ spread the last argument at the same time.
DCHECK(Bytecodes::MakesCallAlongCriticalPath(bytecode_));
Label extra_checks(this, Label::kDeferred), construct(this);
+ GotoIf(IsUndefined(feedback_vector), &construct);
// Increment the call count.
IncrementCallCount(feedback_vector, slot_id);
@@ -1195,7 +1210,7 @@ Node* InterpreterAssembler::ConstructWithSpread(Node* target, Node* context,
// MegamorphicSentinel is an immortal immovable object so
// write-barrier is not needed.
Comment("transition to megamorphic");
- DCHECK(Heap::RootIsImmortalImmovable(RootIndex::kmegamorphic_symbol));
+ DCHECK(RootsTable::IsImmortalImmovable(RootIndex::kmegamorphic_symbol));
StoreFeedbackVectorSlot(
feedback_vector, slot_id,
HeapConstant(FeedbackVector::MegamorphicSentinel(isolate())),
@@ -1235,8 +1250,9 @@ Node* InterpreterAssembler::CallRuntimeN(Node* function_id, Node* context,
Load(MachineType::Pointer(), function,
IntPtrConstant(offsetof(Runtime::Function, entry)));
- return CallStubR(callable.descriptor(), result_size, code_target, context,
- args.reg_count(), args.base_reg_location(), function_entry);
+ return CallStubR(StubCallMode::kCallCodeObject, callable.descriptor(),
+ result_size, code_target, context, args.reg_count(),
+ args.base_reg_location(), function_entry);
}
void InterpreterAssembler::UpdateInterruptBudget(Node* weight, bool backward) {
@@ -1403,7 +1419,7 @@ Node* InterpreterAssembler::DispatchToBytecode(Node* target_bytecode,
Node* target_code_entry =
Load(MachineType::Pointer(), DispatchTableRawPointer(),
- TimesPointerSize(target_bytecode));
+ TimesSystemPointerSize(target_bytecode));
return DispatchToBytecodeHandlerEntry(target_code_entry, new_bytecode_offset,
target_bytecode);
@@ -1460,7 +1476,7 @@ void InterpreterAssembler::DispatchWide(OperandScale operand_scale) {
Node* target_index = IntPtrAdd(base_index, next_bytecode);
Node* target_code_entry =
Load(MachineType::Pointer(), DispatchTableRawPointer(),
- TimesPointerSize(target_index));
+ TimesSystemPointerSize(target_index));
DispatchToBytecodeHandlerEntry(target_code_entry, next_bytecode_offset,
next_bytecode);
@@ -1547,8 +1563,8 @@ void InterpreterAssembler::TraceBytecodeDispatch(Node* target_bytecode) {
Node* source_bytecode_table_index = IntPtrConstant(
static_cast<int>(bytecode_) * (static_cast<int>(Bytecode::kLast) + 1));
- Node* counter_offset =
- TimesPointerSize(IntPtrAdd(source_bytecode_table_index, target_bytecode));
+ Node* counter_offset = TimesSystemPointerSize(
+ IntPtrAdd(source_bytecode_table_index, target_bytecode));
Node* old_counter =
Load(MachineType::IntPtr(), counters_table, counter_offset);
@@ -1771,24 +1787,14 @@ void InterpreterAssembler::ToNumberOrNumeric(Object::Conversion mode) {
// Record the type feedback collected for {object}.
Node* slot_index = BytecodeOperandIdx(0);
- Node* feedback_vector = LoadFeedbackVector();
- UpdateFeedback(var_type_feedback.value(), feedback_vector, slot_index);
+ Node* maybe_feedback_vector = LoadFeedbackVectorUnchecked();
+
+ UpdateFeedback(var_type_feedback.value(), maybe_feedback_vector, slot_index);
SetAccumulator(var_result.value());
Dispatch();
}
-void InterpreterAssembler::DeserializeLazyAndDispatch() {
- Node* context = GetContext();
- Node* bytecode_offset = BytecodeOffset();
- Node* bytecode = LoadBytecode(bytecode_offset);
-
- Node* target_handler =
- CallRuntime(Runtime::kInterpreterDeserializeLazy, context,
- SmiTag(bytecode), SmiConstant(operand_scale()));
- DispatchToBytecodeHandler(target_handler, bytecode_offset, bytecode);
-}
-
} // namespace interpreter
} // namespace internal
} // namespace v8