Index: src/compiler/interpreter-assembler.cc |
diff --git a/src/compiler/interpreter-assembler.cc b/src/compiler/interpreter-assembler.cc |
index fbc170559dbea0389401a11499dc554f2c30b741..8cd888a5dc82ca9247cacd338160ae2172a2942a 100644 |
--- a/src/compiler/interpreter-assembler.cc |
+++ b/src/compiler/interpreter-assembler.cc |
@@ -31,6 +31,7 @@ InterpreterAssembler::InterpreterAssembler(Isolate* isolate, Zone* zone, |
Linkage::GetInterpreterDispatchDescriptor(zone), kMachPtr, |
InstructionSelector::SupportedMachineOperatorFlags())), |
end_node_(nullptr), |
+ outgoing_accumulator_(nullptr), |
code_generated_(false) {} |
@@ -60,6 +61,31 @@ Handle<Code> InterpreterAssembler::GenerateCode() { |
} |
+Node* InterpreterAssembler::IncomingAccumulator() { |
+ return raw_assembler_->Parameter(Linkage::kInterpreterAccumulatorParameter); |
+} |
+ |
+ |
+void InterpreterAssembler::StoreAccumulator(Node* value) { |
+ DCHECK(!outgoing_accumulator_); |
+ outgoing_accumulator_ = value; |
+} |
+ |
+ |
+Node* InterpreterAssembler::OutgoingAccumulator() { |
+ if (outgoing_accumulator_) { |
+ return outgoing_accumulator_; |
+ } else { |
+ return IncomingAccumulator(); |
+ } |
+} |
+ |
+ |
+Node* InterpreterAssembler::RegisterFilePointer() { |
+ return raw_assembler_->Parameter(Linkage::kInterpreterRegisterFileParameter); |
+} |
+ |
+ |
Node* InterpreterAssembler::BytecodeArrayPointer() { |
return raw_assembler_->Parameter(Linkage::kInterpreterBytecodeArrayParameter); |
} |
@@ -76,22 +102,20 @@ Node* InterpreterAssembler::DispatchTablePointer() { |
} |
-Node* InterpreterAssembler::FramePointer() { |
- return raw_assembler_->LoadFramePointer(); |
+Node* InterpreterAssembler::RegisterFrameOffset(Node* index) { |
+ return raw_assembler_->WordShl(index, Int32Constant(kPointerSizeLog2)); |
} |
-Node* InterpreterAssembler::RegisterFrameOffset(int index) { |
- DCHECK_LE(index, kMaxRegisterIndex); |
- return Int32Constant(kFirstRegisterOffsetFromFp - |
- (index << kPointerSizeLog2)); |
+Node* InterpreterAssembler::LoadRegister(Node* reg_index) { |
+ return raw_assembler_->Load(kMachPtr, RegisterFilePointer(), |
+ RegisterFrameOffset(reg_index)); |
} |
-Node* InterpreterAssembler::RegisterFrameOffset(Node* index) { |
- return raw_assembler_->IntPtrSub( |
- Int32Constant(kFirstRegisterOffsetFromFp), |
- raw_assembler_->WordShl(index, Int32Constant(kPointerSizeLog2))); |
+Node* InterpreterAssembler::StoreRegister(Node* value, Node* reg_index) { |
+ return raw_assembler_->Store(kMachPtr, RegisterFilePointer(), |
+ RegisterFrameOffset(reg_index), value); |
} |
@@ -103,27 +127,16 @@ Node* InterpreterAssembler::BytecodeOperand(int delta) { |
} |
-Node* InterpreterAssembler::LoadRegister(int index) { |
- return raw_assembler_->Load(kMachPtr, FramePointer(), |
- RegisterFrameOffset(index)); |
-} |
- |
- |
-Node* InterpreterAssembler::LoadRegister(Node* index) { |
- return raw_assembler_->Load(kMachPtr, FramePointer(), |
- RegisterFrameOffset(index)); |
-} |
- |
- |
-Node* InterpreterAssembler::StoreRegister(Node* value, int index) { |
- return raw_assembler_->Store(kMachPtr, FramePointer(), |
- RegisterFrameOffset(index), value); |
-} |
- |
- |
-Node* InterpreterAssembler::StoreRegister(Node* value, Node* index) { |
- return raw_assembler_->Store(kMachPtr, FramePointer(), |
- RegisterFrameOffset(index), value); |
+Node* InterpreterAssembler::BytecodeOperandSignExtended(int delta) { |
+ DCHECK_LT(delta, interpreter::Bytecodes::NumberOfOperands(bytecode_)); |
+ Node* load = raw_assembler_->Load( |
+ kMachInt8, BytecodeArrayPointer(), |
+ raw_assembler_->IntPtrAdd(BytecodeOffset(), Int32Constant(1 + delta))); |
+ // Ensure that we sign extend to full pointer size |
+ if (kPointerSize == 8) { |
+ load = raw_assembler_->ChangeInt32ToInt64(load); |
+ } |
+ return load; |
} |
@@ -132,14 +145,15 @@ void InterpreterAssembler::Return() { |
HeapConstant(Unique<HeapObject>::CreateImmovable( |
isolate()->builtins()->InterpreterExitTrampoline())); |
// If the order of the parameters you need to change the call signature below. |
- STATIC_ASSERT(0 == Linkage::kInterpreterBytecodeOffsetParameter); |
- STATIC_ASSERT(1 == Linkage::kInterpreterBytecodeArrayParameter); |
- STATIC_ASSERT(2 == Linkage::kInterpreterDispatchTableParameter); |
- Node* tail_call = graph()->NewNode( |
- common()->TailCall(call_descriptor()), exit_trampoline_code_object, |
- BytecodeOffset(), BytecodeArrayPointer(), DispatchTablePointer(), |
- graph()->start(), graph()->start()); |
- schedule()->AddTailCall(raw_assembler_->CurrentBlock(), tail_call); |
+ STATIC_ASSERT(0 == Linkage::kInterpreterAccumulatorParameter); |
+ STATIC_ASSERT(1 == Linkage::kInterpreterRegisterFileParameter); |
+ STATIC_ASSERT(2 == Linkage::kInterpreterBytecodeOffsetParameter); |
+ STATIC_ASSERT(3 == Linkage::kInterpreterBytecodeArrayParameter); |
+ STATIC_ASSERT(4 == Linkage::kInterpreterDispatchTableParameter); |
+ Node* tail_call = raw_assembler_->TailCallInterpreterDispatch( |
+ call_descriptor(), exit_trampoline_code_object, OutgoingAccumulator(), |
+ RegisterFilePointer(), BytecodeOffset(), BytecodeArrayPointer(), |
+ DispatchTablePointer()); |
// This should always be the end node. |
SetEndInput(tail_call); |
} |
@@ -163,14 +177,15 @@ void InterpreterAssembler::Dispatch() { |
Int32Constant(kPointerSizeLog2))); |
// If the order of the parameters you need to change the call signature below. |
- STATIC_ASSERT(0 == Linkage::kInterpreterBytecodeOffsetParameter); |
- STATIC_ASSERT(1 == Linkage::kInterpreterBytecodeArrayParameter); |
- STATIC_ASSERT(2 == Linkage::kInterpreterDispatchTableParameter); |
- Node* tail_call = graph()->NewNode( |
- common()->TailCall(call_descriptor()), target_code_object, |
- new_bytecode_offset, BytecodeArrayPointer(), DispatchTablePointer(), |
- graph()->start(), graph()->start()); |
- schedule()->AddTailCall(raw_assembler_->CurrentBlock(), tail_call); |
+ STATIC_ASSERT(0 == Linkage::kInterpreterAccumulatorParameter); |
+ STATIC_ASSERT(1 == Linkage::kInterpreterRegisterFileParameter); |
+ STATIC_ASSERT(2 == Linkage::kInterpreterBytecodeOffsetParameter); |
+ STATIC_ASSERT(3 == Linkage::kInterpreterBytecodeArrayParameter); |
+ STATIC_ASSERT(4 == Linkage::kInterpreterDispatchTableParameter); |
+ Node* tail_call = raw_assembler_->TailCallInterpreterDispatch( |
+ call_descriptor(), target_code_object, OutgoingAccumulator(), |
+ RegisterFilePointer(), new_bytecode_offset, BytecodeArrayPointer(), |
+ DispatchTablePointer()); |
// This should always be the end node. |
SetEndInput(tail_call); |
} |
@@ -185,7 +200,7 @@ void InterpreterAssembler::SetEndInput(Node* input) { |
void InterpreterAssembler::End() { |
DCHECK(end_node_); |
// TODO(rmcilroy): Support more than 1 end input. |
- Node* end = graph()->NewNode(common()->End(1), end_node_); |
+ Node* end = graph()->NewNode(raw_assembler_->common()->End(1), end_node_); |
graph()->SetEnd(end); |
} |
@@ -207,16 +222,6 @@ Schedule* InterpreterAssembler::schedule() { |
} |
-MachineOperatorBuilder* InterpreterAssembler::machine() { |
- return raw_assembler_->machine(); |
-} |
- |
- |
-CommonOperatorBuilder* InterpreterAssembler::common() { |
- return raw_assembler_->common(); |
-} |
- |
- |
Node* InterpreterAssembler::Int32Constant(int value) { |
return raw_assembler_->Int32Constant(value); |
} |
@@ -231,7 +236,6 @@ Node* InterpreterAssembler::HeapConstant(Unique<HeapObject> object) { |
return raw_assembler_->HeapConstant(object); |
} |
- |
} // namespace interpreter |
} // namespace internal |
} // namespace v8 |