| 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
|
|
|