diff options
Diffstat (limited to 'deps/v8/src/interpreter/interpreter-assembler.cc')
-rw-r--r-- | deps/v8/src/interpreter/interpreter-assembler.cc | 78 |
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 |