| 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 <ostream> | 7 #include <ostream> |
| 8 | 8 |
| 9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
| 10 #include "src/frames.h" | 10 #include "src/frames.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 using compiler::Node; | 21 using compiler::Node; |
| 22 | 22 |
| 23 InterpreterAssembler::InterpreterAssembler(Isolate* isolate, Zone* zone, | 23 InterpreterAssembler::InterpreterAssembler(Isolate* isolate, Zone* zone, |
| 24 Bytecode bytecode) | 24 Bytecode bytecode) |
| 25 : compiler::CodeStubAssembler( | 25 : compiler::CodeStubAssembler( |
| 26 isolate, zone, InterpreterDispatchDescriptor(isolate), | 26 isolate, zone, InterpreterDispatchDescriptor(isolate), |
| 27 Code::ComputeFlags(Code::STUB), Bytecodes::ToString(bytecode), 0), | 27 Code::ComputeFlags(Code::STUB), Bytecodes::ToString(bytecode), 0), |
| 28 bytecode_(bytecode), | 28 bytecode_(bytecode), |
| 29 accumulator_(this, MachineRepresentation::kTagged), | 29 accumulator_(this, MachineRepresentation::kTagged), |
| 30 context_(this, MachineRepresentation::kTagged), | 30 context_(this, MachineRepresentation::kTagged), |
| 31 dispatch_table_(this, MachineType::PointerRepresentation()), | 31 bytecode_array_(this, MachineRepresentation::kTagged), |
| 32 disable_stack_check_across_call_(false), | 32 disable_stack_check_across_call_(false), |
| 33 stack_pointer_before_call_(nullptr) { | 33 stack_pointer_before_call_(nullptr) { |
| 34 accumulator_.Bind( | 34 accumulator_.Bind( |
| 35 Parameter(InterpreterDispatchDescriptor::kAccumulatorParameter)); | 35 Parameter(InterpreterDispatchDescriptor::kAccumulatorParameter)); |
| 36 context_.Bind(Parameter(InterpreterDispatchDescriptor::kContextParameter)); | 36 context_.Bind(Parameter(InterpreterDispatchDescriptor::kContextParameter)); |
| 37 dispatch_table_.Bind( | 37 bytecode_array_.Bind( |
| 38 Parameter(InterpreterDispatchDescriptor::kDispatchTableParameter)); | 38 Parameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter)); |
| 39 if (FLAG_trace_ignition) { | 39 if (FLAG_trace_ignition) { |
| 40 TraceBytecode(Runtime::kInterpreterTraceBytecodeEntry); | 40 TraceBytecode(Runtime::kInterpreterTraceBytecodeEntry); |
| 41 } | 41 } |
| 42 } | 42 } |
| 43 | 43 |
| 44 InterpreterAssembler::~InterpreterAssembler() {} | 44 InterpreterAssembler::~InterpreterAssembler() {} |
| 45 | 45 |
| 46 Node* InterpreterAssembler::GetAccumulator() { return accumulator_.value(); } | 46 Node* InterpreterAssembler::GetAccumulator() { return accumulator_.value(); } |
| 47 | 47 |
| 48 void InterpreterAssembler::SetAccumulator(Node* value) { | 48 void InterpreterAssembler::SetAccumulator(Node* value) { |
| 49 accumulator_.Bind(value); | 49 accumulator_.Bind(value); |
| 50 } | 50 } |
| 51 | 51 |
| 52 Node* InterpreterAssembler::GetContext() { return context_.value(); } | 52 Node* InterpreterAssembler::GetContext() { return context_.value(); } |
| 53 | 53 |
| 54 void InterpreterAssembler::SetContext(Node* value) { | 54 void InterpreterAssembler::SetContext(Node* value) { |
| 55 StoreRegister(value, Register::current_context()); | 55 StoreRegister(value, Register::current_context()); |
| 56 context_.Bind(value); | 56 context_.Bind(value); |
| 57 } | 57 } |
| 58 | 58 |
| 59 Node* InterpreterAssembler::BytecodeOffset() { | 59 Node* InterpreterAssembler::BytecodeOffset() { |
| 60 return Parameter(InterpreterDispatchDescriptor::kBytecodeOffsetParameter); | 60 return Parameter(InterpreterDispatchDescriptor::kBytecodeOffsetParameter); |
| 61 } | 61 } |
| 62 | 62 |
| 63 Node* InterpreterAssembler::RegisterFileRawPointer() { | 63 Node* InterpreterAssembler::RegisterFileRawPointer() { |
| 64 return Parameter(InterpreterDispatchDescriptor::kRegisterFileParameter); | 64 return Parameter(InterpreterDispatchDescriptor::kRegisterFileParameter); |
| 65 } | 65 } |
| 66 | 66 |
| 67 Node* InterpreterAssembler::BytecodeArrayTaggedPointer() { | 67 Node* InterpreterAssembler::BytecodeArrayTaggedPointer() { |
| 68 return Parameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter); | 68 return bytecode_array_.value(); |
| 69 } | 69 } |
| 70 | 70 |
| 71 Node* InterpreterAssembler::DispatchTableRawPointer() { | 71 Node* InterpreterAssembler::DispatchTableRawPointer() { |
| 72 return dispatch_table_.value(); | 72 return Parameter(InterpreterDispatchDescriptor::kDispatchTableParameter); |
| 73 } | 73 } |
| 74 | 74 |
| 75 Node* InterpreterAssembler::RegisterLocation(Node* reg_index) { | 75 Node* InterpreterAssembler::RegisterLocation(Node* reg_index) { |
| 76 return IntPtrAdd(RegisterFileRawPointer(), RegisterFrameOffset(reg_index)); | 76 return IntPtrAdd(RegisterFileRawPointer(), RegisterFrameOffset(reg_index)); |
| 77 } | 77 } |
| 78 | 78 |
| 79 Node* InterpreterAssembler::LoadRegister(int offset) { | 79 Node* InterpreterAssembler::LoadRegister(int offset) { |
| 80 return Load(MachineType::AnyTagged(), RegisterFileRawPointer(), | 80 return Load(MachineType::AnyTagged(), RegisterFileRawPointer(), |
| 81 Int32Constant(offset)); | 81 Int32Constant(offset)); |
| 82 } | 82 } |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 303 Node* shared_info = | 303 Node* shared_info = |
| 304 LoadObjectField(function, JSFunction::kSharedFunctionInfoOffset); | 304 LoadObjectField(function, JSFunction::kSharedFunctionInfoOffset); |
| 305 Node* vector = | 305 Node* vector = |
| 306 LoadObjectField(shared_info, SharedFunctionInfo::kFeedbackVectorOffset); | 306 LoadObjectField(shared_info, SharedFunctionInfo::kFeedbackVectorOffset); |
| 307 return vector; | 307 return vector; |
| 308 } | 308 } |
| 309 | 309 |
| 310 void InterpreterAssembler::CallPrologue() { | 310 void InterpreterAssembler::CallPrologue() { |
| 311 StoreRegister(SmiTag(BytecodeOffset()), | 311 StoreRegister(SmiTag(BytecodeOffset()), |
| 312 InterpreterFrameConstants::kBytecodeOffsetFromRegisterPointer); | 312 InterpreterFrameConstants::kBytecodeOffsetFromRegisterPointer); |
| 313 StoreRegister(DispatchTableRawPointer(), | 313 StoreRegister(BytecodeArrayTaggedPointer(), |
| 314 InterpreterFrameConstants::kDispatchTableFromRegisterPointer); | 314 InterpreterFrameConstants::kBytecodeArrayFromRegisterPointer); |
| 315 | 315 |
| 316 if (FLAG_debug_code && !disable_stack_check_across_call_) { | 316 if (FLAG_debug_code && !disable_stack_check_across_call_) { |
| 317 DCHECK(stack_pointer_before_call_ == nullptr); | 317 DCHECK(stack_pointer_before_call_ == nullptr); |
| 318 stack_pointer_before_call_ = LoadStackPointer(); | 318 stack_pointer_before_call_ = LoadStackPointer(); |
| 319 } | 319 } |
| 320 } | 320 } |
| 321 | 321 |
| 322 void InterpreterAssembler::CallEpilogue() { | 322 void InterpreterAssembler::CallEpilogue() { |
| 323 if (FLAG_debug_code && !disable_stack_check_across_call_) { | 323 if (FLAG_debug_code && !disable_stack_check_across_call_) { |
| 324 Node* stack_pointer_after_call = LoadStackPointer(); | 324 Node* stack_pointer_after_call = LoadStackPointer(); |
| 325 Node* stack_pointer_before_call = stack_pointer_before_call_; | 325 Node* stack_pointer_before_call = stack_pointer_before_call_; |
| 326 stack_pointer_before_call_ = nullptr; | 326 stack_pointer_before_call_ = nullptr; |
| 327 AbortIfWordNotEqual(stack_pointer_before_call, stack_pointer_after_call, | 327 AbortIfWordNotEqual(stack_pointer_before_call, stack_pointer_after_call, |
| 328 kUnexpectedStackPointer); | 328 kUnexpectedStackPointer); |
| 329 } | 329 } |
| 330 | 330 |
| 331 // Restore dispatch table from stack frame in case the debugger has swapped us | 331 // Restore bytecode array from stack frame in case the debugger has swapped us |
| 332 // to the debugger dispatch table. | 332 // to the patched debugger bytecode array. |
| 333 dispatch_table_.Bind(LoadRegister( | 333 bytecode_array_.Bind(LoadRegister( |
| 334 InterpreterFrameConstants::kDispatchTableFromRegisterPointer)); | 334 InterpreterFrameConstants::kBytecodeArrayFromRegisterPointer)); |
| 335 } | 335 } |
| 336 | 336 |
| 337 Node* InterpreterAssembler::CallJS(Node* function, Node* context, | 337 Node* InterpreterAssembler::CallJS(Node* function, Node* context, |
| 338 Node* first_arg, Node* arg_count) { | 338 Node* first_arg, Node* arg_count) { |
| 339 Callable callable = CodeFactory::InterpreterPushArgsAndCall(isolate()); | 339 Callable callable = CodeFactory::InterpreterPushArgsAndCall(isolate()); |
| 340 Node* code_target = HeapConstant(callable.code()); | 340 Node* code_target = HeapConstant(callable.code()); |
| 341 return CallStub(callable.descriptor(), code_target, context, arg_count, | 341 return CallStub(callable.descriptor(), code_target, context, arg_count, |
| 342 first_arg, function); | 342 first_arg, function); |
| 343 } | 343 } |
| 344 | 344 |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 492 #elif V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_X87 | 492 #elif V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_X87 |
| 493 return true; | 493 return true; |
| 494 #else | 494 #else |
| 495 #error "Unknown Architecture" | 495 #error "Unknown Architecture" |
| 496 #endif | 496 #endif |
| 497 } | 497 } |
| 498 | 498 |
| 499 } // namespace interpreter | 499 } // namespace interpreter |
| 500 } // namespace internal | 500 } // namespace internal |
| 501 } // namespace v8 | 501 } // namespace v8 |
| OLD | NEW |