Index: src/compiler/interpreter-assembler.cc |
diff --git a/src/compiler/interpreter-assembler.cc b/src/compiler/interpreter-assembler.cc |
index 8d8c0269119601e69cb083a5d969378a4ae23127..1f5c0a26a5c8f16560cb124e384563c800972c92 100644 |
--- a/src/compiler/interpreter-assembler.cc |
+++ b/src/compiler/interpreter-assembler.cc |
@@ -32,7 +32,7 @@ InterpreterAssembler::InterpreterAssembler(Isolate* isolate, Zone* zone, |
isolate, new (zone) Graph(zone), |
Linkage::GetInterpreterDispatchDescriptor(zone), kMachPtr, |
InstructionSelector::SupportedMachineOperatorFlags())), |
- end_node_(nullptr), |
+ end_nodes_(zone), |
accumulator_( |
raw_assembler_->Parameter(Linkage::kInterpreterAccumulatorParameter)), |
code_generated_(false) {} |
@@ -193,6 +193,11 @@ Node* InterpreterAssembler::HeapConstant(Handle<HeapObject> object) { |
} |
+Node* InterpreterAssembler::BooleanConstant(bool value) { |
+ return raw_assembler_->BooleanConstant(value); |
+} |
+ |
+ |
Node* InterpreterAssembler::SmiShiftBitsConstant() { |
return Int32Constant(kSmiShiftSize + kSmiTagSize); |
} |
@@ -348,7 +353,7 @@ void InterpreterAssembler::Return() { |
Node* tail_call = raw_assembler_->TailCallN( |
call_descriptor(), exit_trampoline_code_object, args); |
// This should always be the end node. |
- SetEndInput(tail_call); |
+ AddEndInput(tail_call); |
} |
@@ -357,8 +362,31 @@ Node* InterpreterAssembler::Advance(int delta) { |
} |
+Node* InterpreterAssembler::Advance(Node* delta) { |
+ return raw_assembler_->IntPtrAdd(BytecodeOffset(), delta); |
+} |
+ |
+ |
+void InterpreterAssembler::Jump(Node* delta) { DispatchTo(Advance(delta)); } |
+ |
+ |
+void InterpreterAssembler::JumpIfWordEqual(Node* lhs, Node* rhs, Node* delta) { |
+ RawMachineAssembler::Label match, no_match; |
+ Node* condition = raw_assembler_->WordEqual(lhs, rhs); |
+ raw_assembler_->Branch(condition, &match, &no_match); |
+ raw_assembler_->Bind(&match); |
+ DispatchTo(Advance(delta)); |
+ raw_assembler_->Bind(&no_match); |
+ Dispatch(); |
+} |
+ |
+ |
void InterpreterAssembler::Dispatch() { |
- Node* new_bytecode_offset = Advance(interpreter::Bytecodes::Size(bytecode_)); |
+ DispatchTo(Advance(interpreter::Bytecodes::Size(bytecode_))); |
+} |
+ |
+ |
+void InterpreterAssembler::DispatchTo(Node* new_bytecode_offset) { |
Node* target_bytecode = raw_assembler_->Load( |
kMachUint8, BytecodeArrayTaggedPointer(), new_bytecode_offset); |
@@ -385,20 +413,21 @@ void InterpreterAssembler::Dispatch() { |
Node* tail_call = |
raw_assembler_->TailCallN(call_descriptor(), target_code_object, args); |
// This should always be the end node. |
- SetEndInput(tail_call); |
+ AddEndInput(tail_call); |
} |
-void InterpreterAssembler::SetEndInput(Node* input) { |
- DCHECK(!end_node_); |
- end_node_ = input; |
+void InterpreterAssembler::AddEndInput(Node* input) { |
+ DCHECK_NOT_NULL(input); |
+ end_nodes_.push_back(input); |
} |
void InterpreterAssembler::End() { |
- DCHECK(end_node_); |
- // TODO(rmcilroy): Support more than 1 end input. |
- Node* end = graph()->NewNode(raw_assembler_->common()->End(1), end_node_); |
+ DCHECK(!end_nodes_.empty()); |
+ int end_count = static_cast<int>(end_nodes_.size()); |
+ Node* end = graph()->NewNode(raw_assembler_->common()->End(end_count), |
+ end_count, &end_nodes_[0]); |
graph()->SetEnd(end); |
} |