1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2015 the V8 project authors. All rights reserved.
2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file.
4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifndef V8_COMPILER_INTERPRETER_ASSEMBLER_H_
6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define V8_COMPILER_INTERPRETER_ASSEMBLER_H_
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Clients of this interface shouldn't depend on lots of compiler internals.
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Do not include anything from src/compiler here!
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/allocation.h"
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/base/smart-pointers.h"
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/builtins.h"
13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/frames.h"
14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/interpreter/bytecodes.h"
15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/runtime/runtime.h"
16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 {
18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal {
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass CallInterfaceDescriptor;
21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Isolate;
22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Zone;
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace compiler {
25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass CallDescriptor;
27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Graph;
28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Node;
29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Operator;
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass RawMachineAssembler;
31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Schedule;
32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass InterpreterAssembler {
34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InterpreterAssembler(Isolate* isolate, Zone* zone,
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                       interpreter::Bytecode bytecode);
37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  virtual ~InterpreterAssembler();
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Code> GenerateCode();
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Returns the count immediate for bytecode operand |operand_index| in the
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // current bytecode.
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* BytecodeOperandCount(int operand_index);
44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Returns the index immediate for bytecode operand |operand_index| in the
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // current bytecode.
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* BytecodeOperandIdx(int operand_index);
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Returns the Imm8 immediate for bytecode operand |operand_index| in the
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // current bytecode.
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* BytecodeOperandImm(int operand_index);
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Returns the register index for bytecode operand |operand_index| in the
51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // current bytecode.
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* BytecodeOperandReg(int operand_index);
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Accumulator.
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* GetAccumulator();
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void SetAccumulator(Node* value);
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Context.
59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* GetContext();
60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void SetContext(Node* value);
61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Loads from and stores to the interpreter register file.
63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* LoadRegister(int offset);
64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* LoadRegister(interpreter::Register reg);
65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* LoadRegister(Node* reg_index);
66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* StoreRegister(Node* value, int offset);
67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* StoreRegister(Node* value, interpreter::Register reg);
68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* StoreRegister(Node* value, Node* reg_index);
69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Returns the next consecutive register.
71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* NextRegister(Node* reg_index);
72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Returns the location in memory of the register |reg_index| in the
74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // interpreter register file.
75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* RegisterLocation(Node* reg_index);
76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Constants.
78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* Int32Constant(int value);
79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* IntPtrConstant(intptr_t value);
80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* NumberConstant(double value);
81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* HeapConstant(Handle<HeapObject> object);
82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* BooleanConstant(bool value);
83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Tag and untag Smi values.
85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* SmiTag(Node* value);
86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* SmiUntag(Node* value);
87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Basic arithmetic operations.
89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* IntPtrAdd(Node* a, Node* b);
90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* IntPtrSub(Node* a, Node* b);
91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* WordShl(Node* value, int shift);
92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Load constant at |index| in the constant pool.
94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* LoadConstantPoolEntry(Node* index);
95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Load an element from a fixed array on the heap.
97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* LoadFixedArrayElement(Node* fixed_array, int index);
98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Load a field from an object on the heap.
100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* LoadObjectField(Node* object, int offset);
101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Load |slot_index| from |context|.
103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* LoadContextSlot(Node* context, int slot_index);
104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* LoadContextSlot(Node* context, Node* slot_index);
105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Stores |value| into |slot_index| of |context|.
106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* StoreContextSlot(Node* context, Node* slot_index, Node* value);
107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Load the TypeFeedbackVector for the current function.
109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* LoadTypeFeedbackVector();
110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Project the output value at index |index|
112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* Projection(int index, Node* node);
113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Call constructor |constructor| with |arg_count| arguments (not
115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // including receiver) and the first argument located at
116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // |first_arg|. The |new_target| is the same as the
117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // |constructor| for the new keyword, but differs for the super
118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // keyword.
119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* CallConstruct(Node* new_target, Node* constructor, Node* first_arg,
120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                      Node* arg_count);
121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Call JSFunction or Callable |function| with |arg_count|
123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // arguments (not including receiver) and the first argument
124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // located at |first_arg|.
125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* CallJS(Node* function, Node* first_arg, Node* arg_count);
126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Call an IC code stub.
128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* CallIC(CallInterfaceDescriptor descriptor, Node* target, Node* arg1,
129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch               Node* arg2, Node* arg3);
130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* CallIC(CallInterfaceDescriptor descriptor, Node* target, Node* arg1,
131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch               Node* arg2, Node* arg3, Node* arg4);
132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* CallIC(CallInterfaceDescriptor descriptor, Node* target, Node* arg1,
133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch               Node* arg2, Node* arg3, Node* arg4, Node* arg5);
134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Call runtime function.
136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* CallRuntime(Node* function_id, Node* first_arg, Node* arg_count,
137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                    int return_size = 1);
138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* CallRuntime(Runtime::FunctionId function_id, Node* arg1);
139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* CallRuntime(Runtime::FunctionId function_id, Node* arg1, Node* arg2);
140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* CallRuntime(Runtime::FunctionId function_id, Node* arg1, Node* arg2,
141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                    Node* arg3, Node* arg4);
142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Jump relative to the current bytecode by |jump_offset|.
144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void Jump(Node* jump_offset);
145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Jump relative to the current bytecode by |jump_offset| if the
147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // word values |lhs| and |rhs| are equal.
148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void JumpIfWordEqual(Node* lhs, Node* rhs, Node* jump_offset);
149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Returns from the function.
151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void Return();
152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Dispatch to the bytecode.
154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void Dispatch();
155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Abort with the given bailout reason.
157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void Abort(BailoutReason bailout_reason);
158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch protected:
160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static bool TargetSupportsUnalignedAccess();
161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Protected helpers (for testing) which delegate to RawMachineAssembler.
163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CallDescriptor* call_descriptor() const;
164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Graph* graph();
165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private:
167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Returns a raw pointer to start of the register file on the stack.
168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* RegisterFileRawPointer();
169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Returns a tagged pointer to the current function's BytecodeArray object.
170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* BytecodeArrayTaggedPointer();
171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Returns the offset from the BytecodeArrayPointer of the current bytecode.
172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* BytecodeOffset();
173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Returns a raw pointer to first entry in the interpreter dispatch table.
174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* DispatchTableRawPointer();
175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Saves and restores interpreter bytecode offset to the interpreter stack
177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // frame when performing a call.
178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void CallPrologue();
179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void CallEpilogue();
180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Returns the offset of register |index| relative to RegisterFilePointer().
182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* RegisterFrameOffset(Node* index);
183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* SmiShiftBitsConstant();
185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* BytecodeOperand(int operand_index);
186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* BytecodeOperandSignExtended(int operand_index);
187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* BytecodeOperandShort(int operand_index);
188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* BytecodeOperandShortSignExtended(int operand_index);
189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* CallN(CallDescriptor* descriptor, Node* code_target, Node** args);
191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* CallIC(CallInterfaceDescriptor descriptor, Node* target, Node** args);
192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Returns BytecodeOffset() advanced by delta bytecodes. Note: this does not
194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // update BytecodeOffset() itself.
195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* Advance(int delta);
196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* Advance(Node* delta);
197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Starts next instruction dispatch at |new_bytecode_offset|.
199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void DispatchTo(Node* new_bytecode_offset);
200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Abort operations for debug code.
202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void AbortIfWordNotEqual(Node* lhs, Node* rhs, BailoutReason bailout_reason);
203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Private helpers which delegate to RawMachineAssembler.
205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Isolate* isolate();
206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Zone* zone();
207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  interpreter::Bytecode bytecode_;
209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  base::SmartPointer<RawMachineAssembler> raw_assembler_;
210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* accumulator_;
212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* bytecode_offset_;
213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* context_;
214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool code_generated_;
216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(InterpreterAssembler);
218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace compiler
221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif  // V8_COMPILER_INTERPRETER_ASSEMBLER_H_
225