@@ -31,6 +31,8 @@ InterpreterAssembler::InterpreterAssembler(Isolate* isolate, Zone* zone,
3131 Linkage::GetInterpreterDispatchDescriptor(zone), kMachPtr,
3232 InstructionSelector::SupportedMachineOperatorFlags())),
3333 end_node_(nullptr ),
34+ accumulator_(
35+ raw_assembler_->Parameter (Linkage::kInterpreterAccumulatorParameter )),
3436 code_generated_(false ) {}
3537
3638
@@ -60,70 +62,72 @@ Handle<Code> InterpreterAssembler::GenerateCode() {
6062}
6163
6264
63- Node* InterpreterAssembler::BytecodeArrayPointer () {
64- return raw_assembler_-> Parameter (Linkage:: kInterpreterBytecodeArrayParameter ) ;
65+ Node* InterpreterAssembler::GetAccumulator () {
66+ return accumulator_ ;
6567}
6668
6769
68- Node* InterpreterAssembler::BytecodeOffset () {
69- return raw_assembler_->Parameter (
70- Linkage::kInterpreterBytecodeOffsetParameter );
70+ void InterpreterAssembler::SetAccumulator (Node* value) {
71+ accumulator_ = value;
7172}
7273
7374
74- Node* InterpreterAssembler::DispatchTablePointer () {
75- return raw_assembler_->Parameter (Linkage::kInterpreterDispatchTableParameter );
75+ Node* InterpreterAssembler::RegisterFileRawPointer () {
76+ return raw_assembler_->Parameter (Linkage::kInterpreterRegisterFileParameter );
7677}
7778
7879
79- Node* InterpreterAssembler::FramePointer () {
80- return raw_assembler_->LoadFramePointer ( );
80+ Node* InterpreterAssembler::BytecodeArrayTaggedPointer () {
81+ return raw_assembler_->Parameter (Linkage:: kInterpreterBytecodeArrayParameter );
8182}
8283
8384
84- Node* InterpreterAssembler::RegisterFrameOffset (int index) {
85- DCHECK_LE (index, kMaxRegisterIndex );
86- return Int32Constant (kFirstRegisterOffsetFromFp -
87- (index << kPointerSizeLog2 ));
85+ Node* InterpreterAssembler::BytecodeOffset () {
86+ return raw_assembler_->Parameter (
87+ Linkage::kInterpreterBytecodeOffsetParameter );
8888}
8989
9090
91- Node* InterpreterAssembler::RegisterFrameOffset (Node* index) {
92- return raw_assembler_->IntPtrSub (
93- Int32Constant (kFirstRegisterOffsetFromFp ),
94- raw_assembler_->WordShl (index, Int32Constant (kPointerSizeLog2 )));
91+ Node* InterpreterAssembler::DispatchTableRawPointer () {
92+ return raw_assembler_->Parameter (Linkage::kInterpreterDispatchTableParameter );
9593}
9694
9795
98- Node* InterpreterAssembler::BytecodeOperand (int delta) {
99- DCHECK_LT (delta, interpreter::Bytecodes::NumberOfOperands (bytecode_));
100- return raw_assembler_->Load (
101- kMachUint8 , BytecodeArrayPointer (),
102- raw_assembler_->IntPtrAdd (BytecodeOffset (), Int32Constant (1 + delta)));
96+ Node* InterpreterAssembler::RegisterFrameOffset (Node* index) {
97+ return raw_assembler_->WordShl (index, Int32Constant (kPointerSizeLog2 ));
10398}
10499
105100
106- Node* InterpreterAssembler::LoadRegister (int index ) {
107- return raw_assembler_->Load (kMachPtr , FramePointer (),
108- RegisterFrameOffset (index ));
101+ Node* InterpreterAssembler::LoadRegister (Node* reg_index ) {
102+ return raw_assembler_->Load (kMachPtr , RegisterFileRawPointer (),
103+ RegisterFrameOffset (reg_index ));
109104}
110105
111106
112- Node* InterpreterAssembler::LoadRegister (Node* index ) {
113- return raw_assembler_->Load (kMachPtr , FramePointer (),
114- RegisterFrameOffset (index) );
107+ Node* InterpreterAssembler::StoreRegister (Node* value, Node* reg_index ) {
108+ return raw_assembler_->Store (kMachPtr , RegisterFileRawPointer (),
109+ RegisterFrameOffset (reg_index), value );
115110}
116111
117112
118- Node* InterpreterAssembler::StoreRegister (Node* value, int index) {
119- return raw_assembler_->Store (kMachPtr , FramePointer (),
120- RegisterFrameOffset (index), value);
113+ Node* InterpreterAssembler::BytecodeOperand (int delta) {
114+ DCHECK_LT (delta, interpreter::Bytecodes::NumberOfOperands (bytecode_));
115+ return raw_assembler_->Load (
116+ kMachUint8 , BytecodeArrayTaggedPointer (),
117+ raw_assembler_->IntPtrAdd (BytecodeOffset (), Int32Constant (1 + delta)));
121118}
122119
123120
124- Node* InterpreterAssembler::StoreRegister (Node* value, Node* index) {
125- return raw_assembler_->Store (kMachPtr , FramePointer (),
126- RegisterFrameOffset (index), value);
121+ Node* InterpreterAssembler::BytecodeOperandSignExtended (int delta) {
122+ DCHECK_LT (delta, interpreter::Bytecodes::NumberOfOperands (bytecode_));
123+ Node* load = raw_assembler_->Load (
124+ kMachInt8 , BytecodeArrayTaggedPointer (),
125+ raw_assembler_->IntPtrAdd (BytecodeOffset (), Int32Constant (1 + delta)));
126+ // Ensure that we sign extend to full pointer size
127+ if (kPointerSize == 8 ) {
128+ load = raw_assembler_->ChangeInt32ToInt64 (load);
129+ }
130+ return load;
127131}
128132
129133
@@ -132,14 +136,15 @@ void InterpreterAssembler::Return() {
132136 HeapConstant (Unique<HeapObject>::CreateImmovable (
133137 isolate ()->builtins ()->InterpreterExitTrampoline ()));
134138 // If the order of the parameters you need to change the call signature below.
135- STATIC_ASSERT (0 == Linkage::kInterpreterBytecodeOffsetParameter );
136- STATIC_ASSERT (1 == Linkage::kInterpreterBytecodeArrayParameter );
137- STATIC_ASSERT (2 == Linkage::kInterpreterDispatchTableParameter );
138- Node* tail_call = graph ()->NewNode (
139- common ()->TailCall (call_descriptor ()), exit_trampoline_code_object,
140- BytecodeOffset (), BytecodeArrayPointer (), DispatchTablePointer (),
141- graph ()->start (), graph ()->start ());
142- schedule ()->AddTailCall (raw_assembler_->CurrentBlock (), tail_call);
139+ STATIC_ASSERT (0 == Linkage::kInterpreterAccumulatorParameter );
140+ STATIC_ASSERT (1 == Linkage::kInterpreterRegisterFileParameter );
141+ STATIC_ASSERT (2 == Linkage::kInterpreterBytecodeOffsetParameter );
142+ STATIC_ASSERT (3 == Linkage::kInterpreterBytecodeArrayParameter );
143+ STATIC_ASSERT (4 == Linkage::kInterpreterDispatchTableParameter );
144+ Node* tail_call = raw_assembler_->TailCallInterpreterDispatch (
145+ call_descriptor (), exit_trampoline_code_object, GetAccumulator (),
146+ RegisterFileRawPointer (), BytecodeOffset (), BytecodeArrayTaggedPointer (),
147+ DispatchTableRawPointer ());
143148 // This should always be the end node.
144149 SetEndInput (tail_call);
145150}
@@ -153,24 +158,25 @@ Node* InterpreterAssembler::Advance(int delta) {
153158void InterpreterAssembler::Dispatch () {
154159 Node* new_bytecode_offset = Advance (interpreter::Bytecodes::Size (bytecode_));
155160 Node* target_bytecode = raw_assembler_->Load (
156- kMachUint8 , BytecodeArrayPointer (), new_bytecode_offset);
161+ kMachUint8 , BytecodeArrayTaggedPointer (), new_bytecode_offset);
157162
158163 // TODO(rmcilroy): Create a code target dispatch table to avoid conversion
159164 // from code object on every dispatch.
160165 Node* target_code_object = raw_assembler_->Load (
161- kMachPtr , DispatchTablePointer (),
166+ kMachPtr , DispatchTableRawPointer (),
162167 raw_assembler_->Word32Shl (target_bytecode,
163168 Int32Constant (kPointerSizeLog2 )));
164169
165170 // If the order of the parameters you need to change the call signature below.
166- STATIC_ASSERT (0 == Linkage::kInterpreterBytecodeOffsetParameter );
167- STATIC_ASSERT (1 == Linkage::kInterpreterBytecodeArrayParameter );
168- STATIC_ASSERT (2 == Linkage::kInterpreterDispatchTableParameter );
169- Node* tail_call = graph ()->NewNode (
170- common ()->TailCall (call_descriptor ()), target_code_object,
171- new_bytecode_offset, BytecodeArrayPointer (), DispatchTablePointer (),
172- graph ()->start (), graph ()->start ());
173- schedule ()->AddTailCall (raw_assembler_->CurrentBlock (), tail_call);
171+ STATIC_ASSERT (0 == Linkage::kInterpreterAccumulatorParameter );
172+ STATIC_ASSERT (1 == Linkage::kInterpreterRegisterFileParameter );
173+ STATIC_ASSERT (2 == Linkage::kInterpreterBytecodeOffsetParameter );
174+ STATIC_ASSERT (3 == Linkage::kInterpreterBytecodeArrayParameter );
175+ STATIC_ASSERT (4 == Linkage::kInterpreterDispatchTableParameter );
176+ Node* tail_call = raw_assembler_->TailCallInterpreterDispatch (
177+ call_descriptor (), target_code_object, GetAccumulator (),
178+ RegisterFileRawPointer (), new_bytecode_offset,
179+ BytecodeArrayTaggedPointer (), DispatchTableRawPointer ());
174180 // This should always be the end node.
175181 SetEndInput (tail_call);
176182}
@@ -185,7 +191,7 @@ void InterpreterAssembler::SetEndInput(Node* input) {
185191void InterpreterAssembler::End () {
186192 DCHECK (end_node_);
187193 // TODO(rmcilroy): Support more than 1 end input.
188- Node* end = graph ()->NewNode (common ()->End (1 ), end_node_);
194+ Node* end = graph ()->NewNode (raw_assembler_-> common ()->End (1 ), end_node_);
189195 graph ()->SetEnd (end);
190196}
191197
@@ -207,16 +213,6 @@ Schedule* InterpreterAssembler::schedule() {
207213}
208214
209215
210- MachineOperatorBuilder* InterpreterAssembler::machine () {
211- return raw_assembler_->machine ();
212- }
213-
214-
215- CommonOperatorBuilder* InterpreterAssembler::common () {
216- return raw_assembler_->common ();
217- }
218-
219-
220216Node* InterpreterAssembler::Int32Constant (int value) {
221217 return raw_assembler_->Int32Constant (value);
222218}
@@ -231,7 +227,6 @@ Node* InterpreterAssembler::HeapConstant(Unique<HeapObject> object) {
231227 return raw_assembler_->HeapConstant (object);
232228}
233229
234-
235230} // namespace interpreter
236231} // namespace internal
237232} // namespace v8
0 commit comments