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/interpreter/interpreter-assembler.h" | 5 #include "src/interpreter/interpreter-assembler.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 #include <ostream> | 8 #include <ostream> |
9 | 9 |
10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
(...skipping 14 matching lines...) Expand all Loading... |
25 InterpreterAssembler::InterpreterAssembler(Isolate* isolate, Zone* zone, | 25 InterpreterAssembler::InterpreterAssembler(Isolate* isolate, Zone* zone, |
26 Bytecode bytecode, | 26 Bytecode bytecode, |
27 OperandScale operand_scale) | 27 OperandScale operand_scale) |
28 : CodeStubAssembler(isolate, zone, InterpreterDispatchDescriptor(isolate), | 28 : CodeStubAssembler(isolate, zone, InterpreterDispatchDescriptor(isolate), |
29 Code::ComputeFlags(Code::BYTECODE_HANDLER), | 29 Code::ComputeFlags(Code::BYTECODE_HANDLER), |
30 Bytecodes::ToString(bytecode), | 30 Bytecodes::ToString(bytecode), |
31 Bytecodes::ReturnCount(bytecode)), | 31 Bytecodes::ReturnCount(bytecode)), |
32 bytecode_(bytecode), | 32 bytecode_(bytecode), |
33 operand_scale_(operand_scale), | 33 operand_scale_(operand_scale), |
34 interpreted_frame_pointer_(this, MachineType::PointerRepresentation()), | 34 interpreted_frame_pointer_(this, MachineType::PointerRepresentation()), |
| 35 bytecode_inner_pointer_(this, MachineType::PointerRepresentation()), |
35 accumulator_(this, MachineRepresentation::kTagged), | 36 accumulator_(this, MachineRepresentation::kTagged), |
36 accumulator_use_(AccumulatorUse::kNone), | 37 accumulator_use_(AccumulatorUse::kNone), |
37 made_call_(false), | 38 made_call_(false), |
38 disable_stack_check_across_call_(false), | 39 disable_stack_check_across_call_(false), |
39 stack_pointer_before_call_(nullptr) { | 40 stack_pointer_before_call_(nullptr) { |
40 accumulator_.Bind( | 41 accumulator_.Bind( |
41 Parameter(InterpreterDispatchDescriptor::kAccumulatorParameter)); | 42 Parameter(InterpreterDispatchDescriptor::kAccumulatorParameter)); |
42 if (FLAG_trace_ignition) { | 43 if (FLAG_trace_ignition) { |
43 TraceBytecode(Runtime::kInterpreterTraceBytecodeEntry); | 44 TraceBytecode(Runtime::kInterpreterTraceBytecodeEntry); |
44 } | 45 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 Node* InterpreterAssembler::BytecodeArrayTaggedPointer() { | 90 Node* InterpreterAssembler::BytecodeArrayTaggedPointer() { |
90 if (made_call_) { | 91 if (made_call_) { |
91 // If we have made a call, restore bytecode array from stack frame in case | 92 // If we have made a call, restore bytecode array from stack frame in case |
92 // the debugger has swapped us to the patched debugger bytecode array. | 93 // the debugger has swapped us to the patched debugger bytecode array. |
93 return LoadRegister(Register::bytecode_array()); | 94 return LoadRegister(Register::bytecode_array()); |
94 } else { | 95 } else { |
95 return Parameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter); | 96 return Parameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter); |
96 } | 97 } |
97 } | 98 } |
98 | 99 |
| 100 Node* InterpreterAssembler::BytecodeInnerPointer() { |
| 101 if (!bytecode_inner_pointer_.IsBound() || made_call_) { |
| 102 bytecode_inner_pointer_.Bind( |
| 103 IntPtrAdd(BytecodeArrayTaggedPointer(), BytecodeOffset())); |
| 104 } |
| 105 return bytecode_inner_pointer_.value(); |
| 106 } |
| 107 |
99 Node* InterpreterAssembler::DispatchTableRawPointer() { | 108 Node* InterpreterAssembler::DispatchTableRawPointer() { |
100 return Parameter(InterpreterDispatchDescriptor::kDispatchTableParameter); | 109 return Parameter(InterpreterDispatchDescriptor::kDispatchTableParameter); |
101 } | 110 } |
102 | 111 |
103 Node* InterpreterAssembler::RegisterLocation(Node* reg_index) { | 112 Node* InterpreterAssembler::RegisterLocation(Node* reg_index) { |
104 return IntPtrAdd(GetInterpretedFramePointer(), | 113 return IntPtrAdd(GetInterpretedFramePointer(), |
105 RegisterFrameOffset(reg_index)); | 114 RegisterFrameOffset(reg_index)); |
106 } | 115 } |
107 | 116 |
108 Node* InterpreterAssembler::RegisterFrameOffset(Node* index) { | 117 Node* InterpreterAssembler::RegisterFrameOffset(Node* index) { |
(...skipping 30 matching lines...) Expand all Loading... |
139 Node* InterpreterAssembler::OperandOffset(int operand_index) { | 148 Node* InterpreterAssembler::OperandOffset(int operand_index) { |
140 return IntPtrConstant( | 149 return IntPtrConstant( |
141 Bytecodes::GetOperandOffset(bytecode_, operand_index, operand_scale())); | 150 Bytecodes::GetOperandOffset(bytecode_, operand_index, operand_scale())); |
142 } | 151 } |
143 | 152 |
144 Node* InterpreterAssembler::BytecodeOperandUnsignedByte(int operand_index) { | 153 Node* InterpreterAssembler::BytecodeOperandUnsignedByte(int operand_index) { |
145 DCHECK_LT(operand_index, Bytecodes::NumberOfOperands(bytecode_)); | 154 DCHECK_LT(operand_index, Bytecodes::NumberOfOperands(bytecode_)); |
146 DCHECK_EQ(OperandSize::kByte, Bytecodes::GetOperandSize( | 155 DCHECK_EQ(OperandSize::kByte, Bytecodes::GetOperandSize( |
147 bytecode_, operand_index, operand_scale())); | 156 bytecode_, operand_index, operand_scale())); |
148 Node* operand_offset = OperandOffset(operand_index); | 157 Node* operand_offset = OperandOffset(operand_index); |
149 return Load(MachineType::Uint8(), BytecodeArrayTaggedPointer(), | 158 return Load(MachineType::Uint8(), BytecodeInnerPointer(), operand_offset); |
150 IntPtrAdd(BytecodeOffset(), operand_offset)); | |
151 } | 159 } |
152 | 160 |
153 Node* InterpreterAssembler::BytecodeOperandSignedByte(int operand_index) { | 161 Node* InterpreterAssembler::BytecodeOperandSignedByte(int operand_index) { |
154 DCHECK_LT(operand_index, Bytecodes::NumberOfOperands(bytecode_)); | 162 DCHECK_LT(operand_index, Bytecodes::NumberOfOperands(bytecode_)); |
155 DCHECK_EQ(OperandSize::kByte, Bytecodes::GetOperandSize( | 163 DCHECK_EQ(OperandSize::kByte, Bytecodes::GetOperandSize( |
156 bytecode_, operand_index, operand_scale())); | 164 bytecode_, operand_index, operand_scale())); |
157 Node* operand_offset = OperandOffset(operand_index); | 165 Node* operand_offset = OperandOffset(operand_index); |
158 Node* load = Load(MachineType::Int8(), BytecodeArrayTaggedPointer(), | 166 Node* load = |
159 IntPtrAdd(BytecodeOffset(), operand_offset)); | 167 Load(MachineType::Int8(), BytecodeInnerPointer(), operand_offset); |
160 | 168 |
161 // Ensure that we sign extend to full pointer size | 169 // Ensure that we sign extend to full pointer size |
162 if (kPointerSize == 8) { | 170 if (kPointerSize == 8) { |
163 load = ChangeInt32ToInt64(load); | 171 load = ChangeInt32ToInt64(load); |
164 } | 172 } |
165 return load; | 173 return load; |
166 } | 174 } |
167 | 175 |
168 compiler::Node* InterpreterAssembler::BytecodeOperandReadUnaligned( | 176 compiler::Node* InterpreterAssembler::BytecodeOperandReadUnaligned( |
169 int relative_offset, MachineType result_type) { | 177 int relative_offset, MachineType result_type) { |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 } | 225 } |
218 | 226 |
219 Node* InterpreterAssembler::BytecodeOperandUnsignedShort(int operand_index) { | 227 Node* InterpreterAssembler::BytecodeOperandUnsignedShort(int operand_index) { |
220 DCHECK_LT(operand_index, Bytecodes::NumberOfOperands(bytecode_)); | 228 DCHECK_LT(operand_index, Bytecodes::NumberOfOperands(bytecode_)); |
221 DCHECK_EQ( | 229 DCHECK_EQ( |
222 OperandSize::kShort, | 230 OperandSize::kShort, |
223 Bytecodes::GetOperandSize(bytecode_, operand_index, operand_scale())); | 231 Bytecodes::GetOperandSize(bytecode_, operand_index, operand_scale())); |
224 int operand_offset = | 232 int operand_offset = |
225 Bytecodes::GetOperandOffset(bytecode_, operand_index, operand_scale()); | 233 Bytecodes::GetOperandOffset(bytecode_, operand_index, operand_scale()); |
226 if (TargetSupportsUnalignedAccess()) { | 234 if (TargetSupportsUnalignedAccess()) { |
227 return Load(MachineType::Uint16(), BytecodeArrayTaggedPointer(), | 235 return Load(MachineType::Uint16(), BytecodeInnerPointer(), |
228 IntPtrAdd(BytecodeOffset(), IntPtrConstant(operand_offset))); | 236 IntPtrConstant(operand_offset)); |
229 } else { | 237 } else { |
230 return BytecodeOperandReadUnaligned(operand_offset, MachineType::Uint16()); | 238 return BytecodeOperandReadUnaligned(operand_offset, MachineType::Uint16()); |
231 } | 239 } |
232 } | 240 } |
233 | 241 |
234 Node* InterpreterAssembler::BytecodeOperandSignedShort(int operand_index) { | 242 Node* InterpreterAssembler::BytecodeOperandSignedShort(int operand_index) { |
235 DCHECK_LT(operand_index, Bytecodes::NumberOfOperands(bytecode_)); | 243 DCHECK_LT(operand_index, Bytecodes::NumberOfOperands(bytecode_)); |
236 DCHECK_EQ( | 244 DCHECK_EQ( |
237 OperandSize::kShort, | 245 OperandSize::kShort, |
238 Bytecodes::GetOperandSize(bytecode_, operand_index, operand_scale())); | 246 Bytecodes::GetOperandSize(bytecode_, operand_index, operand_scale())); |
239 int operand_offset = | 247 int operand_offset = |
240 Bytecodes::GetOperandOffset(bytecode_, operand_index, operand_scale()); | 248 Bytecodes::GetOperandOffset(bytecode_, operand_index, operand_scale()); |
241 Node* load; | 249 Node* load; |
242 if (TargetSupportsUnalignedAccess()) { | 250 if (TargetSupportsUnalignedAccess()) { |
243 load = Load(MachineType::Int16(), BytecodeArrayTaggedPointer(), | 251 load = Load(MachineType::Int16(), BytecodeInnerPointer(), |
244 IntPtrAdd(BytecodeOffset(), IntPtrConstant(operand_offset))); | 252 IntPtrConstant(operand_offset)); |
245 } else { | 253 } else { |
246 load = BytecodeOperandReadUnaligned(operand_offset, MachineType::Int16()); | 254 load = BytecodeOperandReadUnaligned(operand_offset, MachineType::Int16()); |
247 } | 255 } |
248 | 256 |
249 // Ensure that we sign extend to full pointer size | 257 // Ensure that we sign extend to full pointer size |
250 if (kPointerSize == 8) { | 258 if (kPointerSize == 8) { |
251 load = ChangeInt32ToInt64(load); | 259 load = ChangeInt32ToInt64(load); |
252 } | 260 } |
253 return load; | 261 return load; |
254 } | 262 } |
255 | 263 |
256 Node* InterpreterAssembler::BytecodeOperandUnsignedQuad(int operand_index) { | 264 Node* InterpreterAssembler::BytecodeOperandUnsignedQuad(int operand_index) { |
257 DCHECK_LT(operand_index, Bytecodes::NumberOfOperands(bytecode_)); | 265 DCHECK_LT(operand_index, Bytecodes::NumberOfOperands(bytecode_)); |
258 DCHECK_EQ(OperandSize::kQuad, Bytecodes::GetOperandSize( | 266 DCHECK_EQ(OperandSize::kQuad, Bytecodes::GetOperandSize( |
259 bytecode_, operand_index, operand_scale())); | 267 bytecode_, operand_index, operand_scale())); |
260 int operand_offset = | 268 int operand_offset = |
261 Bytecodes::GetOperandOffset(bytecode_, operand_index, operand_scale()); | 269 Bytecodes::GetOperandOffset(bytecode_, operand_index, operand_scale()); |
262 if (TargetSupportsUnalignedAccess()) { | 270 if (TargetSupportsUnalignedAccess()) { |
263 return Load(MachineType::Uint32(), BytecodeArrayTaggedPointer(), | 271 return Load(MachineType::Uint32(), BytecodeInnerPointer(), |
264 IntPtrAdd(BytecodeOffset(), IntPtrConstant(operand_offset))); | 272 IntPtrConstant(operand_offset)); |
265 } else { | 273 } else { |
266 return BytecodeOperandReadUnaligned(operand_offset, MachineType::Uint32()); | 274 return BytecodeOperandReadUnaligned(operand_offset, MachineType::Uint32()); |
267 } | 275 } |
268 } | 276 } |
269 | 277 |
270 Node* InterpreterAssembler::BytecodeOperandSignedQuad(int operand_index) { | 278 Node* InterpreterAssembler::BytecodeOperandSignedQuad(int operand_index) { |
271 DCHECK_LT(operand_index, Bytecodes::NumberOfOperands(bytecode_)); | 279 DCHECK_LT(operand_index, Bytecodes::NumberOfOperands(bytecode_)); |
272 DCHECK_EQ(OperandSize::kQuad, Bytecodes::GetOperandSize( | 280 DCHECK_EQ(OperandSize::kQuad, Bytecodes::GetOperandSize( |
273 bytecode_, operand_index, operand_scale())); | 281 bytecode_, operand_index, operand_scale())); |
274 int operand_offset = | 282 int operand_offset = |
275 Bytecodes::GetOperandOffset(bytecode_, operand_index, operand_scale()); | 283 Bytecodes::GetOperandOffset(bytecode_, operand_index, operand_scale()); |
276 Node* load; | 284 Node* load; |
277 if (TargetSupportsUnalignedAccess()) { | 285 if (TargetSupportsUnalignedAccess()) { |
278 load = Load(MachineType::Int32(), BytecodeArrayTaggedPointer(), | 286 load = Load(MachineType::Int32(), BytecodeInnerPointer(), |
279 IntPtrAdd(BytecodeOffset(), IntPtrConstant(operand_offset))); | 287 IntPtrConstant(operand_offset)); |
280 } else { | 288 } else { |
281 load = BytecodeOperandReadUnaligned(operand_offset, MachineType::Int32()); | 289 load = BytecodeOperandReadUnaligned(operand_offset, MachineType::Int32()); |
282 } | 290 } |
283 | 291 |
284 // Ensure that we sign extend to full pointer size | 292 // Ensure that we sign extend to full pointer size |
285 if (kPointerSize == 8) { | 293 if (kPointerSize == 8) { |
286 load = ChangeInt32ToInt64(load); | 294 load = ChangeInt32ToInt64(load); |
287 } | 295 } |
288 return load; | 296 return load; |
289 } | 297 } |
(...skipping 489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
779 Goto(&loop); | 787 Goto(&loop); |
780 } | 788 } |
781 Bind(&done_loop); | 789 Bind(&done_loop); |
782 | 790 |
783 return array; | 791 return array; |
784 } | 792 } |
785 | 793 |
786 } // namespace interpreter | 794 } // namespace interpreter |
787 } // namespace internal | 795 } // namespace internal |
788 } // namespace v8 | 796 } // namespace v8 |
OLD | NEW |