Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(75)

Side by Side Diff: src/interpreter/interpreter-assembler.cc

Issue 1887493004: [Interpreter] No longer require context machine register in bytecode handlers (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@int_dispatch
Patch Set: Fix x87 Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/interpreter/interpreter-assembler.h ('k') | src/mips/builtins-mips.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 15 matching lines...) Expand all
26 Bytecode bytecode, 26 Bytecode bytecode,
27 OperandScale operand_scale) 27 OperandScale operand_scale)
28 : compiler::CodeStubAssembler(isolate, zone, 28 : compiler::CodeStubAssembler(isolate, zone,
29 InterpreterDispatchDescriptor(isolate), 29 InterpreterDispatchDescriptor(isolate),
30 Code::ComputeFlags(Code::BYTECODE_HANDLER), 30 Code::ComputeFlags(Code::BYTECODE_HANDLER),
31 Bytecodes::ToString(bytecode), 0), 31 Bytecodes::ToString(bytecode), 0),
32 bytecode_(bytecode), 32 bytecode_(bytecode),
33 operand_scale_(operand_scale), 33 operand_scale_(operand_scale),
34 accumulator_(this, MachineRepresentation::kTagged), 34 accumulator_(this, MachineRepresentation::kTagged),
35 accumulator_use_(AccumulatorUse::kNone), 35 accumulator_use_(AccumulatorUse::kNone),
36 context_(this, MachineRepresentation::kTagged),
37 bytecode_array_(this, MachineRepresentation::kTagged), 36 bytecode_array_(this, MachineRepresentation::kTagged),
38 disable_stack_check_across_call_(false), 37 disable_stack_check_across_call_(false),
39 stack_pointer_before_call_(nullptr) { 38 stack_pointer_before_call_(nullptr) {
40 accumulator_.Bind( 39 accumulator_.Bind(
41 Parameter(InterpreterDispatchDescriptor::kAccumulatorParameter)); 40 Parameter(InterpreterDispatchDescriptor::kAccumulatorParameter));
42 context_.Bind(Parameter(InterpreterDispatchDescriptor::kContextParameter));
43 bytecode_array_.Bind( 41 bytecode_array_.Bind(
44 Parameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter)); 42 Parameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter));
45 if (FLAG_trace_ignition) { 43 if (FLAG_trace_ignition) {
46 TraceBytecode(Runtime::kInterpreterTraceBytecodeEntry); 44 TraceBytecode(Runtime::kInterpreterTraceBytecodeEntry);
47 } 45 }
48 } 46 }
49 47
50 InterpreterAssembler::~InterpreterAssembler() { 48 InterpreterAssembler::~InterpreterAssembler() {
51 // If the following check fails the handler does not use the 49 // If the following check fails the handler does not use the
52 // accumulator in the way described in the bytecode definitions in 50 // accumulator in the way described in the bytecode definitions in
(...skipping 10 matching lines...) Expand all
63 accumulator_use_ = accumulator_use_ | AccumulatorUse::kRead; 61 accumulator_use_ = accumulator_use_ | AccumulatorUse::kRead;
64 return GetAccumulatorUnchecked(); 62 return GetAccumulatorUnchecked();
65 } 63 }
66 64
67 void InterpreterAssembler::SetAccumulator(Node* value) { 65 void InterpreterAssembler::SetAccumulator(Node* value) {
68 DCHECK(Bytecodes::WritesAccumulator(bytecode_)); 66 DCHECK(Bytecodes::WritesAccumulator(bytecode_));
69 accumulator_use_ = accumulator_use_ | AccumulatorUse::kWrite; 67 accumulator_use_ = accumulator_use_ | AccumulatorUse::kWrite;
70 accumulator_.Bind(value); 68 accumulator_.Bind(value);
71 } 69 }
72 70
73 Node* InterpreterAssembler::GetContext() { return context_.value(); } 71 Node* InterpreterAssembler::GetContext() {
72 return LoadRegister(Register::current_context());
73 }
74 74
75 void InterpreterAssembler::SetContext(Node* value) { 75 void InterpreterAssembler::SetContext(Node* value) {
76 StoreRegister(value, Register::current_context()); 76 StoreRegister(value, Register::current_context());
77 context_.Bind(value);
78 } 77 }
79 78
80 Node* InterpreterAssembler::BytecodeOffset() { 79 Node* InterpreterAssembler::BytecodeOffset() {
81 return Parameter(InterpreterDispatchDescriptor::kBytecodeOffsetParameter); 80 return Parameter(InterpreterDispatchDescriptor::kBytecodeOffsetParameter);
82 } 81 }
83 82
84 Node* InterpreterAssembler::RegisterFileRawPointer() { 83 Node* InterpreterAssembler::RegisterFileRawPointer() {
85 return Parameter(InterpreterDispatchDescriptor::kRegisterFileParameter); 84 return Parameter(InterpreterDispatchDescriptor::kRegisterFileParameter);
86 } 85 }
87 86
88 Node* InterpreterAssembler::BytecodeArrayTaggedPointer() { 87 Node* InterpreterAssembler::BytecodeArrayTaggedPointer() {
89 return bytecode_array_.value(); 88 return bytecode_array_.value();
90 } 89 }
91 90
92 Node* InterpreterAssembler::DispatchTableRawPointer() { 91 Node* InterpreterAssembler::DispatchTableRawPointer() {
93 return Parameter(InterpreterDispatchDescriptor::kDispatchTableParameter); 92 return Parameter(InterpreterDispatchDescriptor::kDispatchTableParameter);
94 } 93 }
95 94
96 Node* InterpreterAssembler::RegisterLocation(Node* reg_index) { 95 Node* InterpreterAssembler::RegisterLocation(Node* reg_index) {
97 return IntPtrAdd(RegisterFileRawPointer(), RegisterFrameOffset(reg_index)); 96 return IntPtrAdd(RegisterFileRawPointer(), RegisterFrameOffset(reg_index));
98 } 97 }
99 98
100 Node* InterpreterAssembler::LoadRegister(int offset) { 99 Node* InterpreterAssembler::LoadRegister(int offset) {
101 return Load(MachineType::AnyTagged(), RegisterFileRawPointer(), 100 return Load(MachineType::AnyTagged(), RegisterFileRawPointer(),
102 IntPtrConstant(offset)); 101 IntPtrConstant(offset));
103 } 102 }
104 103
105 Node* InterpreterAssembler::LoadRegister(Register reg) { 104 Node* InterpreterAssembler::LoadRegister(Register reg) {
106 return LoadRegister(IntPtrConstant(-reg.index())); 105 return LoadRegister(-reg.index() << kPointerSizeLog2);
107 } 106 }
108 107
109 Node* InterpreterAssembler::RegisterFrameOffset(Node* index) { 108 Node* InterpreterAssembler::RegisterFrameOffset(Node* index) {
110 return WordShl(index, kPointerSizeLog2); 109 return WordShl(index, kPointerSizeLog2);
111 } 110 }
112 111
113 Node* InterpreterAssembler::LoadRegister(Node* reg_index) { 112 Node* InterpreterAssembler::LoadRegister(Node* reg_index) {
114 return Load(MachineType::AnyTagged(), RegisterFileRawPointer(), 113 return Load(MachineType::AnyTagged(), RegisterFileRawPointer(),
115 RegisterFrameOffset(reg_index)); 114 RegisterFrameOffset(reg_index));
116 } 115 }
(...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after
574 } 573 }
575 574
576 void InterpreterAssembler::DispatchToBytecodeHandlerEntry( 575 void InterpreterAssembler::DispatchToBytecodeHandlerEntry(
577 Node* handler_entry, Node* bytecode_offset) { 576 Node* handler_entry, Node* bytecode_offset) {
578 if (FLAG_trace_ignition) { 577 if (FLAG_trace_ignition) {
579 TraceBytecode(Runtime::kInterpreterTraceBytecodeExit); 578 TraceBytecode(Runtime::kInterpreterTraceBytecodeExit);
580 } 579 }
581 580
582 InterpreterDispatchDescriptor descriptor(isolate()); 581 InterpreterDispatchDescriptor descriptor(isolate());
583 Node* args[] = {GetAccumulatorUnchecked(), RegisterFileRawPointer(), 582 Node* args[] = {GetAccumulatorUnchecked(), RegisterFileRawPointer(),
584 bytecode_offset, BytecodeArrayTaggedPointer(), 583 bytecode_offset, BytecodeArrayTaggedPointer(),
585 DispatchTableRawPointer(), GetContext()}; 584 DispatchTableRawPointer()};
586 TailCallBytecodeDispatch(descriptor, handler_entry, args); 585 TailCallBytecodeDispatch(descriptor, handler_entry, args);
587 } 586 }
588 587
589 void InterpreterAssembler::DispatchWide(OperandScale operand_scale) { 588 void InterpreterAssembler::DispatchWide(OperandScale operand_scale) {
590 // Dispatching a wide bytecode requires treating the prefix 589 // Dispatching a wide bytecode requires treating the prefix
591 // bytecode a base pointer into the dispatch table and dispatching 590 // bytecode a base pointer into the dispatch table and dispatching
592 // the bytecode that follows relative to this base. 591 // the bytecode that follows relative to this base.
593 // 592 //
594 // Indices 0-255 correspond to bytecodes with operand_scale == 0 593 // Indices 0-255 correspond to bytecodes with operand_scale == 0
595 // Indices 256-511 correspond to bytecodes with operand_scale == 1 594 // Indices 256-511 correspond to bytecodes with operand_scale == 1
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
727 V8_TARGET_ARCH_S390 726 V8_TARGET_ARCH_S390
728 return true; 727 return true;
729 #else 728 #else
730 #error "Unknown Architecture" 729 #error "Unknown Architecture"
731 #endif 730 #endif
732 } 731 }
733 732
734 } // namespace interpreter 733 } // namespace interpreter
735 } // namespace internal 734 } // namespace internal
736 } // namespace v8 735 } // namespace v8
OLDNEW
« no previous file with comments | « src/interpreter/interpreter-assembler.h ('k') | src/mips/builtins-mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698