Chromium Code Reviews| Index: src/interpreter/interpreter-assembler.cc |
| diff --git a/src/interpreter/interpreter-assembler.cc b/src/interpreter/interpreter-assembler.cc |
| index ee5f8be27981f19b63ddf8eb3029729cb147a7fa..5e9df23183fb5566b75ce79eb257cb996d4742a8 100644 |
| --- a/src/interpreter/interpreter-assembler.cc |
| +++ b/src/interpreter/interpreter-assembler.cc |
| @@ -31,6 +31,7 @@ InterpreterAssembler::InterpreterAssembler(Isolate* isolate, Zone* zone, |
| Bytecodes::ReturnCount(bytecode)), |
| bytecode_(bytecode), |
| operand_scale_(operand_scale), |
| + bytecode_offset_(this, MachineType::PointerRepresentation()), |
| interpreted_frame_pointer_(this, MachineType::PointerRepresentation()), |
| accumulator_(this, MachineRepresentation::kTagged), |
| accumulator_use_(AccumulatorUse::kNone), |
| @@ -39,6 +40,8 @@ InterpreterAssembler::InterpreterAssembler(Isolate* isolate, Zone* zone, |
| stack_pointer_before_call_(nullptr) { |
| accumulator_.Bind( |
| Parameter(InterpreterDispatchDescriptor::kAccumulatorParameter)); |
| + bytecode_offset_.Bind( |
| + Parameter(InterpreterDispatchDescriptor::kBytecodeOffsetParameter)); |
| if (FLAG_trace_ignition) { |
| TraceBytecode(Runtime::kInterpreterTraceBytecodeEntry); |
| } |
| @@ -83,7 +86,7 @@ void InterpreterAssembler::SetContext(Node* value) { |
| } |
| Node* InterpreterAssembler::BytecodeOffset() { |
| - return Parameter(InterpreterDispatchDescriptor::kBytecodeOffsetParameter); |
| + return bytecode_offset_.value(); |
| } |
| Node* InterpreterAssembler::BytecodeArrayTaggedPointer() { |
| @@ -506,17 +509,30 @@ void InterpreterAssembler::UpdateInterruptBudget(Node* weight) { |
| new_budget.value()); |
| } |
| +Node* InterpreterAssembler::Advance() { |
| + return Advance(Bytecodes::Size(bytecode_, operand_scale_)); |
| +} |
| + |
| Node* InterpreterAssembler::Advance(int delta) { |
| - return IntPtrAdd(BytecodeOffset(), IntPtrConstant(delta)); |
| + return Advance(IntPtrConstant(delta)); |
| } |
| Node* InterpreterAssembler::Advance(Node* delta) { |
| - return IntPtrAdd(BytecodeOffset(), delta); |
| + if (FLAG_trace_ignition) { |
| + TraceBytecode(Runtime::kInterpreterTraceBytecodeExit); |
| + } |
| + Node* next_offset = IntPtrAdd(BytecodeOffset(), delta); |
| + bytecode_offset_.Bind(next_offset); |
| + return next_offset; |
| } |
| Node* InterpreterAssembler::Jump(Node* delta) { |
| + DCHECK(!Bytecodes::IsStarLookahead(bytecode_, operand_scale_)); |
| + |
| UpdateInterruptBudget(delta); |
| - return DispatchTo(Advance(delta)); |
| + Node* new_bytecode_offset = Advance(delta); |
| + Node* target_bytecode = LoadBytecode(new_bytecode_offset); |
| + return DispatchToBytecode(target_bytecode, new_bytecode_offset); |
|
klaasb
2016/07/20 11:22:55
The DCHECK was in DispatchTo, which was only calle
rmcilroy
2016/07/20 11:36:25
Works for me, thanks.
|
| } |
| void InterpreterAssembler::JumpConditional(Node* condition, Node* delta) { |
| @@ -538,17 +554,66 @@ void InterpreterAssembler::JumpIfWordNotEqual(Node* lhs, Node* rhs, |
| JumpConditional(WordNotEqual(lhs, rhs), delta); |
| } |
| -Node* InterpreterAssembler::Dispatch() { |
| - return DispatchTo(Advance(Bytecodes::Size(bytecode_, operand_scale_))); |
| +Node* InterpreterAssembler::LoadBytecode(compiler::Node* bytecode_offset) { |
| + Node* bytecode = |
| + Load(MachineType::Uint8(), BytecodeArrayTaggedPointer(), bytecode_offset); |
| + if (kPointerSize == 8) { |
| + bytecode = ChangeUint32ToUint64(bytecode); |
| + } |
| + return bytecode; |
| } |
| -Node* InterpreterAssembler::DispatchTo(Node* new_bytecode_offset) { |
| - Node* target_bytecode = Load( |
| - MachineType::Uint8(), BytecodeArrayTaggedPointer(), new_bytecode_offset); |
| - if (kPointerSize == 8) { |
| - target_bytecode = ChangeUint32ToUint64(target_bytecode); |
| +Node* InterpreterAssembler::StarDispatchLookahead(Node* target_bytecode) { |
| + Label do_inline_star(this), done(this); |
| + |
| + Variable var_bytecode(this, MachineRepresentation::kWord8); |
| + var_bytecode.Bind(target_bytecode); |
| + |
| + Node* star_bytecode = IntPtrConstant(static_cast<int>(Bytecode::kStar)); |
| + Node* is_star = WordEqual(target_bytecode, star_bytecode); |
| + BranchIf(is_star, &do_inline_star, &done); |
| + |
| + Bind(&do_inline_star); |
| + { |
| + InlineStar(); |
| + var_bytecode.Bind(LoadBytecode(BytecodeOffset())); |
| + Goto(&done); |
| + } |
| + Bind(&done); |
| + return var_bytecode.value(); |
| +} |
| + |
| +void InterpreterAssembler::InlineStar() { |
| + Bytecode previous_bytecode = bytecode_; |
| + AccumulatorUse previous_acc_use = accumulator_use_; |
| + |
| + bytecode_ = Bytecode::kStar; |
| + accumulator_use_ = AccumulatorUse::kNone; |
| + |
| + if (FLAG_trace_ignition) { |
| + TraceBytecode(Runtime::kInterpreterTraceBytecodeEntry); |
| + } |
| + StoreRegister(GetAccumulator(), BytecodeOperandReg(0)); |
| + |
| + DCHECK_EQ(accumulator_use_, Bytecodes::GetAccumulatorUse(bytecode_)); |
| + |
| + Advance(); |
| + bytecode_ = previous_bytecode; |
| + accumulator_use_ = previous_acc_use; |
| +} |
| + |
| +Node* InterpreterAssembler::Dispatch() { |
| + Node* target_offset = Advance(); |
| + Node* target_bytecode = LoadBytecode(target_offset); |
| + |
| + if (Bytecodes::IsStarLookahead(bytecode_, operand_scale_)) { |
| + target_bytecode = StarDispatchLookahead(target_bytecode); |
| } |
| + return DispatchToBytecode(target_bytecode, BytecodeOffset()); |
| +} |
| +Node* InterpreterAssembler::DispatchToBytecode(Node* target_bytecode, |
| + Node* new_bytecode_offset) { |
| if (FLAG_trace_ignition_dispatches) { |
| TraceBytecodeDispatch(target_bytecode); |
| } |
| @@ -569,10 +634,6 @@ Node* InterpreterAssembler::DispatchToBytecodeHandler(Node* handler, |
| Node* InterpreterAssembler::DispatchToBytecodeHandlerEntry( |
| Node* handler_entry, Node* bytecode_offset) { |
| - if (FLAG_trace_ignition) { |
| - TraceBytecode(Runtime::kInterpreterTraceBytecodeExit); |
| - } |
| - |
| InterpreterDispatchDescriptor descriptor(isolate()); |
| Node* args[] = {GetAccumulatorUnchecked(), bytecode_offset, |
| BytecodeArrayTaggedPointer(), DispatchTableRawPointer()}; |
| @@ -588,11 +649,7 @@ void InterpreterAssembler::DispatchWide(OperandScale operand_scale) { |
| // Indices 256-511 correspond to bytecodes with operand_scale == 1 |
| // Indices 512-767 correspond to bytecodes with operand_scale == 2 |
| Node* next_bytecode_offset = Advance(1); |
| - Node* next_bytecode = Load(MachineType::Uint8(), BytecodeArrayTaggedPointer(), |
| - next_bytecode_offset); |
| - if (kPointerSize == 8) { |
| - next_bytecode = ChangeUint32ToUint64(next_bytecode); |
| - } |
| + Node* next_bytecode = LoadBytecode(next_bytecode_offset); |
| if (FLAG_trace_ignition_dispatches) { |
| TraceBytecodeDispatch(next_bytecode); |