| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/interpreter-assembler.h" | 5 #include "src/compiler/interpreter-assembler.h" |
| 6 | 6 |
| 7 #include <ostream> | 7 #include <ostream> |
| 8 | 8 |
| 9 #include "src/compiler/graph.h" | 9 #include "src/compiler/graph.h" |
| 10 #include "src/compiler/instruction-selector.h" | 10 #include "src/compiler/instruction-selector.h" |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 53 code->Disassemble(interpreter::Bytecodes::ToString(bytecode_), os); | 53 code->Disassemble(interpreter::Bytecodes::ToString(bytecode_), os); |
| 54 os << std::flush; | 54 os << std::flush; |
| 55 } | 55 } |
| 56 #endif | 56 #endif |
| 57 | 57 |
| 58 code_generated_ = true; | 58 code_generated_ = true; |
| 59 return code; | 59 return code; |
| 60 } | 60 } |
| 61 | 61 |
| 62 | 62 |
| 63 Node* InterpreterAssembler::BytecodePointer() { | 63 Node* InterpreterAssembler::BytecodeArrayPointer() { |
| 64 return raw_assembler_->Parameter(Linkage::kInterpreterBytecodeParameter); | 64 return raw_assembler_->Parameter(Linkage::kInterpreterBytecodeArrayParameter); |
| 65 } | 65 } |
| 66 | 66 |
| 67 | 67 |
| 68 Node* InterpreterAssembler::BytecodeOffset() { |
| 69 return raw_assembler_->Parameter( |
| 70 Linkage::kInterpreterBytecodeOffsetParameter); |
| 71 } |
| 72 |
| 73 |
| 68 Node* InterpreterAssembler::DispatchTablePointer() { | 74 Node* InterpreterAssembler::DispatchTablePointer() { |
| 69 return raw_assembler_->Parameter(Linkage::kInterpreterDispatchTableParameter); | 75 return raw_assembler_->Parameter(Linkage::kInterpreterDispatchTableParameter); |
| 70 } | 76 } |
| 71 | 77 |
| 72 | 78 |
| 73 Node* InterpreterAssembler::FramePointer() { | 79 Node* InterpreterAssembler::FramePointer() { |
| 74 return raw_assembler_->LoadFramePointer(); | 80 return raw_assembler_->LoadFramePointer(); |
| 75 } | 81 } |
| 76 | 82 |
| 77 | 83 |
| 78 Node* InterpreterAssembler::RegisterFrameOffset(int index) { | 84 Node* InterpreterAssembler::RegisterFrameOffset(int index) { |
| 79 DCHECK_LE(index, kMaxRegisterIndex); | 85 DCHECK_LE(index, kMaxRegisterIndex); |
| 80 return Int32Constant(kFirstRegisterOffsetFromFp - | 86 return Int32Constant(kFirstRegisterOffsetFromFp - |
| 81 (index << kPointerSizeLog2)); | 87 (index << kPointerSizeLog2)); |
| 82 } | 88 } |
| 83 | 89 |
| 84 | 90 |
| 85 Node* InterpreterAssembler::RegisterFrameOffset(Node* index) { | 91 Node* InterpreterAssembler::RegisterFrameOffset(Node* index) { |
| 86 return raw_assembler_->Int32Sub( | 92 return raw_assembler_->Int32Sub( |
| 87 Int32Constant(kFirstRegisterOffsetFromFp), | 93 Int32Constant(kFirstRegisterOffsetFromFp), |
| 88 raw_assembler_->Word32Shl(index, Int32Constant(kPointerSizeLog2))); | 94 raw_assembler_->Word32Shl(index, Int32Constant(kPointerSizeLog2))); |
| 89 } | 95 } |
| 90 | 96 |
| 91 | 97 |
| 92 Node* InterpreterAssembler::BytecodeArg(int delta) { | 98 Node* InterpreterAssembler::BytecodeArg(int delta) { |
| 93 DCHECK_LT(delta, interpreter::Bytecodes::NumberOfArguments(bytecode_)); | 99 DCHECK_LT(delta, interpreter::Bytecodes::NumberOfArguments(bytecode_)); |
| 94 return raw_assembler_->Load(kMachUint8, BytecodePointer(), | 100 return raw_assembler_->Load( |
| 95 Int32Constant(1 + delta)); | 101 kMachUint8, BytecodeArrayPointer(), |
| 102 raw_assembler_->IntPtrAdd(BytecodeOffset(), Int32Constant(1 + delta))); |
| 96 } | 103 } |
| 97 | 104 |
| 98 | 105 |
| 99 Node* InterpreterAssembler::LoadRegister(int index) { | 106 Node* InterpreterAssembler::LoadRegister(int index) { |
| 100 return raw_assembler_->Load(kMachPtr, FramePointer(), | 107 return raw_assembler_->Load(kMachPtr, FramePointer(), |
| 101 RegisterFrameOffset(index)); | 108 RegisterFrameOffset(index)); |
| 102 } | 109 } |
| 103 | 110 |
| 104 | 111 |
| 105 Node* InterpreterAssembler::LoadRegister(Node* index) { | 112 Node* InterpreterAssembler::LoadRegister(Node* index) { |
| 106 return raw_assembler_->Load(kMachPtr, FramePointer(), | 113 return raw_assembler_->Load(kMachPtr, FramePointer(), |
| 107 RegisterFrameOffset(index)); | 114 RegisterFrameOffset(index)); |
| 108 } | 115 } |
| 109 | 116 |
| 110 | 117 |
| 111 Node* InterpreterAssembler::StoreRegister(Node* value, int index) { | 118 Node* InterpreterAssembler::StoreRegister(Node* value, int index) { |
| 112 return raw_assembler_->Store(kMachPtr, FramePointer(), | 119 return raw_assembler_->Store(kMachPtr, FramePointer(), |
| 113 RegisterFrameOffset(index), value); | 120 RegisterFrameOffset(index), value); |
| 114 } | 121 } |
| 115 | 122 |
| 116 | 123 |
| 117 Node* InterpreterAssembler::StoreRegister(Node* value, Node* index) { | 124 Node* InterpreterAssembler::StoreRegister(Node* value, Node* index) { |
| 118 return raw_assembler_->Store(kMachPtr, FramePointer(), | 125 return raw_assembler_->Store(kMachPtr, FramePointer(), |
| 119 RegisterFrameOffset(index), value); | 126 RegisterFrameOffset(index), value); |
| 120 } | 127 } |
| 121 | 128 |
| 122 | 129 |
| 123 Node* InterpreterAssembler::Advance(int delta) { | 130 Node* InterpreterAssembler::Advance(int delta) { |
| 124 return raw_assembler_->IntPtrAdd(BytecodePointer(), Int32Constant(delta)); | 131 return raw_assembler_->IntPtrAdd(BytecodeOffset(), Int32Constant(delta)); |
| 125 } | 132 } |
| 126 | 133 |
| 127 | 134 |
| 128 void InterpreterAssembler::Dispatch() { | 135 void InterpreterAssembler::Dispatch() { |
| 129 Node* new_bytecode_pointer = Advance(interpreter::Bytecodes::Size(bytecode_)); | 136 Node* new_bytecode_offset = Advance(interpreter::Bytecodes::Size(bytecode_)); |
| 130 Node* target_bytecode = | 137 Node* target_bytecode = raw_assembler_->Load( |
| 131 raw_assembler_->Load(kMachUint8, new_bytecode_pointer); | 138 kMachUint8, BytecodeArrayPointer(), new_bytecode_offset); |
| 132 | 139 |
| 133 // TODO(rmcilroy): Create a code target dispatch table to avoid conversion | 140 // TODO(rmcilroy): Create a code target dispatch table to avoid conversion |
| 134 // from code object on every dispatch. | 141 // from code object on every dispatch. |
| 135 Node* target_code_object = raw_assembler_->Load( | 142 Node* target_code_object = raw_assembler_->Load( |
| 136 kMachPtr, DispatchTablePointer(), | 143 kMachPtr, DispatchTablePointer(), |
| 137 raw_assembler_->Word32Shl(target_bytecode, | 144 raw_assembler_->Word32Shl(target_bytecode, |
| 138 Int32Constant(kPointerSizeLog2))); | 145 Int32Constant(kPointerSizeLog2))); |
| 139 | 146 |
| 140 // If the order of the parameters you need to change the call signature below. | 147 // If the order of the parameters you need to change the call signature below. |
| 141 STATIC_ASSERT(0 == Linkage::kInterpreterBytecodeParameter); | 148 STATIC_ASSERT(0 == Linkage::kInterpreterBytecodeOffsetParameter); |
| 142 STATIC_ASSERT(1 == Linkage::kInterpreterDispatchTableParameter); | 149 STATIC_ASSERT(1 == Linkage::kInterpreterBytecodeArrayParameter); |
| 143 Node* tail_call = graph()->NewNode(common()->TailCall(call_descriptor()), | 150 STATIC_ASSERT(2 == Linkage::kInterpreterDispatchTableParameter); |
| 144 target_code_object, new_bytecode_pointer, | 151 Node* tail_call = graph()->NewNode( |
| 145 DispatchTablePointer(), graph()->start(), | 152 common()->TailCall(call_descriptor()), target_code_object, |
| 146 graph()->start()); | 153 new_bytecode_offset, BytecodeArrayPointer(), DispatchTablePointer(), |
| 154 graph()->start(), graph()->start()); |
| 147 schedule()->AddTailCall(raw_assembler_->CurrentBlock(), tail_call); | 155 schedule()->AddTailCall(raw_assembler_->CurrentBlock(), tail_call); |
| 148 | 156 |
| 149 // This should always be the end node. | 157 // This should always be the end node. |
| 150 SetEndInput(tail_call); | 158 SetEndInput(tail_call); |
| 151 } | 159 } |
| 152 | 160 |
| 153 | 161 |
| 154 void InterpreterAssembler::SetEndInput(Node* input) { | 162 void InterpreterAssembler::SetEndInput(Node* input) { |
| 155 DCHECK(!end_node_); | 163 DCHECK(!end_node_); |
| 156 end_node_ = input; | 164 end_node_ = input; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 | 206 |
| 199 | 207 |
| 200 Node* InterpreterAssembler::NumberConstant(double value) { | 208 Node* InterpreterAssembler::NumberConstant(double value) { |
| 201 return raw_assembler_->NumberConstant(value); | 209 return raw_assembler_->NumberConstant(value); |
| 202 } | 210 } |
| 203 | 211 |
| 204 | 212 |
| 205 } // namespace interpreter | 213 } // namespace interpreter |
| 206 } // namespace internal | 214 } // namespace internal |
| 207 } // namespace v8 | 215 } // namespace v8 |
| OLD | NEW |