| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef V8_COMPILER_INTERPRETER_ASSEMBLER_H_ | |
| 6 #define V8_COMPILER_INTERPRETER_ASSEMBLER_H_ | |
| 7 | |
| 8 // Clients of this interface shouldn't depend on lots of compiler internals. | |
| 9 // Do not include anything from src/compiler here! | |
| 10 #include "src/allocation.h" | |
| 11 #include "src/base/smart-pointers.h" | |
| 12 #include "src/builtins.h" | |
| 13 #include "src/frames.h" | |
| 14 #include "src/interpreter/bytecodes.h" | |
| 15 #include "src/runtime/runtime.h" | |
| 16 | |
| 17 namespace v8 { | |
| 18 namespace internal { | |
| 19 | |
| 20 class CallInterfaceDescriptor; | |
| 21 class Isolate; | |
| 22 class Zone; | |
| 23 | |
| 24 namespace compiler { | |
| 25 | |
| 26 class CallDescriptor; | |
| 27 class Graph; | |
| 28 class Node; | |
| 29 class Operator; | |
| 30 class RawMachineAssembler; | |
| 31 class Schedule; | |
| 32 | |
| 33 class InterpreterAssembler { | |
| 34 public: | |
| 35 InterpreterAssembler(Isolate* isolate, Zone* zone, | |
| 36 interpreter::Bytecode bytecode); | |
| 37 virtual ~InterpreterAssembler(); | |
| 38 | |
| 39 Handle<Code> GenerateCode(); | |
| 40 | |
| 41 // Returns the count immediate for bytecode operand |operand_index| in the | |
| 42 // current bytecode. | |
| 43 Node* BytecodeOperandCount(int operand_index); | |
| 44 // Returns the index immediate for bytecode operand |operand_index| in the | |
| 45 // current bytecode. | |
| 46 Node* BytecodeOperandIdx(int operand_index); | |
| 47 // Returns the Imm8 immediate for bytecode operand |operand_index| in the | |
| 48 // current bytecode. | |
| 49 Node* BytecodeOperandImm(int operand_index); | |
| 50 // Returns the register index for bytecode operand |operand_index| in the | |
| 51 // current bytecode. | |
| 52 Node* BytecodeOperandReg(int operand_index); | |
| 53 | |
| 54 // Accumulator. | |
| 55 Node* GetAccumulator(); | |
| 56 void SetAccumulator(Node* value); | |
| 57 | |
| 58 // Context. | |
| 59 Node* GetContext(); | |
| 60 void SetContext(Node* value); | |
| 61 | |
| 62 // Loads from and stores to the interpreter register file. | |
| 63 Node* LoadRegister(int offset); | |
| 64 Node* LoadRegister(interpreter::Register reg); | |
| 65 Node* LoadRegister(Node* reg_index); | |
| 66 Node* StoreRegister(Node* value, int offset); | |
| 67 Node* StoreRegister(Node* value, interpreter::Register reg); | |
| 68 Node* StoreRegister(Node* value, Node* reg_index); | |
| 69 | |
| 70 // Returns the next consecutive register. | |
| 71 Node* NextRegister(Node* reg_index); | |
| 72 | |
| 73 // Returns the location in memory of the register |reg_index| in the | |
| 74 // interpreter register file. | |
| 75 Node* RegisterLocation(Node* reg_index); | |
| 76 | |
| 77 // Constants. | |
| 78 Node* Int32Constant(int value); | |
| 79 Node* IntPtrConstant(intptr_t value); | |
| 80 Node* NumberConstant(double value); | |
| 81 Node* HeapConstant(Handle<HeapObject> object); | |
| 82 Node* BooleanConstant(bool value); | |
| 83 | |
| 84 // Tag and untag Smi values. | |
| 85 Node* SmiTag(Node* value); | |
| 86 Node* SmiUntag(Node* value); | |
| 87 | |
| 88 // Basic arithmetic operations. | |
| 89 Node* IntPtrAdd(Node* a, Node* b); | |
| 90 Node* IntPtrSub(Node* a, Node* b); | |
| 91 Node* Int32Sub(Node* a, Node* b); | |
| 92 Node* WordShl(Node* value, int shift); | |
| 93 | |
| 94 // Load constant at |index| in the constant pool. | |
| 95 Node* LoadConstantPoolEntry(Node* index); | |
| 96 | |
| 97 // Load an element from a fixed array on the heap. | |
| 98 Node* LoadFixedArrayElement(Node* fixed_array, int index); | |
| 99 | |
| 100 // Load a field from an object on the heap. | |
| 101 Node* LoadObjectField(Node* object, int offset); | |
| 102 | |
| 103 // Load |slot_index| from |context|. | |
| 104 Node* LoadContextSlot(Node* context, int slot_index); | |
| 105 Node* LoadContextSlot(Node* context, Node* slot_index); | |
| 106 // Stores |value| into |slot_index| of |context|. | |
| 107 Node* StoreContextSlot(Node* context, Node* slot_index, Node* value); | |
| 108 | |
| 109 // Load the TypeFeedbackVector for the current function. | |
| 110 Node* LoadTypeFeedbackVector(); | |
| 111 | |
| 112 // Project the output value at index |index| | |
| 113 Node* Projection(int index, Node* node); | |
| 114 | |
| 115 // Call constructor |constructor| with |arg_count| arguments (not | |
| 116 // including receiver) and the first argument located at | |
| 117 // |first_arg|. The |new_target| is the same as the | |
| 118 // |constructor| for the new keyword, but differs for the super | |
| 119 // keyword. | |
| 120 Node* CallConstruct(Node* new_target, Node* constructor, Node* first_arg, | |
| 121 Node* arg_count); | |
| 122 | |
| 123 // Call JSFunction or Callable |function| with |arg_count| | |
| 124 // arguments (not including receiver) and the first argument | |
| 125 // located at |first_arg|. | |
| 126 Node* CallJS(Node* function, Node* first_arg, Node* arg_count); | |
| 127 | |
| 128 // Call an IC code stub. | |
| 129 Node* CallIC(CallInterfaceDescriptor descriptor, Node* target, Node* arg1, | |
| 130 Node* arg2, Node* arg3); | |
| 131 Node* CallIC(CallInterfaceDescriptor descriptor, Node* target, Node* arg1, | |
| 132 Node* arg2, Node* arg3, Node* arg4); | |
| 133 Node* CallIC(CallInterfaceDescriptor descriptor, Node* target, Node* arg1, | |
| 134 Node* arg2, Node* arg3, Node* arg4, Node* arg5); | |
| 135 | |
| 136 // Call runtime function. | |
| 137 Node* CallRuntime(Node* function_id, Node* first_arg, Node* arg_count, | |
| 138 int return_size = 1); | |
| 139 Node* CallRuntime(Runtime::FunctionId function_id); | |
| 140 Node* CallRuntime(Runtime::FunctionId function_id, Node* arg1); | |
| 141 Node* CallRuntime(Runtime::FunctionId function_id, Node* arg1, Node* arg2); | |
| 142 Node* CallRuntime(Runtime::FunctionId function_id, Node* arg1, Node* arg2, | |
| 143 Node* arg3); | |
| 144 Node* CallRuntime(Runtime::FunctionId function_id, Node* arg1, Node* arg2, | |
| 145 Node* arg3, Node* arg4); | |
| 146 | |
| 147 // Jump relative to the current bytecode by |jump_offset|. | |
| 148 void Jump(Node* jump_offset); | |
| 149 | |
| 150 // Jump relative to the current bytecode by |jump_offset| if the | |
| 151 // |condition| is true. Helper function for JumpIfWordEqual and | |
| 152 // JumpIfWordNotEqual. | |
| 153 void JumpConditional(Node* condition, Node* jump_offset); | |
| 154 | |
| 155 // Jump relative to the current bytecode by |jump_offset| if the | |
| 156 // word values |lhs| and |rhs| are equal. | |
| 157 void JumpIfWordEqual(Node* lhs, Node* rhs, Node* jump_offset); | |
| 158 | |
| 159 // Jump relative to the current bytecode by |jump_offset| if the | |
| 160 // word values |lhs| and |rhs| are not equal. | |
| 161 void JumpIfWordNotEqual(Node* lhs, Node* rhs, Node* jump_offset); | |
| 162 | |
| 163 // Perform a stack guard check. | |
| 164 void StackCheck(); | |
| 165 | |
| 166 // Returns from the function. | |
| 167 void Return(); | |
| 168 | |
| 169 // Dispatch to the bytecode. | |
| 170 void Dispatch(); | |
| 171 | |
| 172 // Abort with the given bailout reason. | |
| 173 void Abort(BailoutReason bailout_reason); | |
| 174 | |
| 175 protected: | |
| 176 static bool TargetSupportsUnalignedAccess(); | |
| 177 | |
| 178 // Protected helpers (for testing) which delegate to RawMachineAssembler. | |
| 179 CallDescriptor* call_descriptor() const; | |
| 180 Graph* graph(); | |
| 181 | |
| 182 private: | |
| 183 // Returns a raw pointer to start of the register file on the stack. | |
| 184 Node* RegisterFileRawPointer(); | |
| 185 // Returns a tagged pointer to the current function's BytecodeArray object. | |
| 186 Node* BytecodeArrayTaggedPointer(); | |
| 187 // Returns the offset from the BytecodeArrayPointer of the current bytecode. | |
| 188 Node* BytecodeOffset(); | |
| 189 // Returns a raw pointer to first entry in the interpreter dispatch table. | |
| 190 Node* DispatchTableRawPointer(); | |
| 191 | |
| 192 // Saves and restores interpreter bytecode offset to the interpreter stack | |
| 193 // frame when performing a call. | |
| 194 void CallPrologue(); | |
| 195 | |
| 196 // Traces the current bytecode by calling |function_id|. | |
| 197 void TraceBytecode(Runtime::FunctionId function_id); | |
| 198 | |
| 199 // Returns the offset of register |index| relative to RegisterFilePointer(). | |
| 200 Node* RegisterFrameOffset(Node* index); | |
| 201 | |
| 202 Node* SmiShiftBitsConstant(); | |
| 203 Node* BytecodeOperand(int operand_index); | |
| 204 Node* BytecodeOperandSignExtended(int operand_index); | |
| 205 Node* BytecodeOperandShort(int operand_index); | |
| 206 Node* BytecodeOperandShortSignExtended(int operand_index); | |
| 207 | |
| 208 Node* CallN(CallDescriptor* descriptor, Node* code_target, Node** args); | |
| 209 Node* CallIC(CallInterfaceDescriptor descriptor, Node* target, Node** args); | |
| 210 | |
| 211 // Returns BytecodeOffset() advanced by delta bytecodes. Note: this does not | |
| 212 // update BytecodeOffset() itself. | |
| 213 Node* Advance(int delta); | |
| 214 Node* Advance(Node* delta); | |
| 215 | |
| 216 // Starts next instruction dispatch at |new_bytecode_offset|. | |
| 217 void DispatchTo(Node* new_bytecode_offset); | |
| 218 | |
| 219 // Abort operations for debug code. | |
| 220 void AbortIfWordNotEqual(Node* lhs, Node* rhs, BailoutReason bailout_reason); | |
| 221 | |
| 222 // Private helpers which delegate to RawMachineAssembler. | |
| 223 Isolate* isolate(); | |
| 224 Zone* zone(); | |
| 225 | |
| 226 interpreter::Bytecode bytecode_; | |
| 227 base::SmartPointer<RawMachineAssembler> raw_assembler_; | |
| 228 | |
| 229 Node* accumulator_; | |
| 230 Node* context_; | |
| 231 | |
| 232 bool code_generated_; | |
| 233 | |
| 234 DISALLOW_COPY_AND_ASSIGN(InterpreterAssembler); | |
| 235 }; | |
| 236 | |
| 237 } // namespace compiler | |
| 238 } // namespace internal | |
| 239 } // namespace v8 | |
| 240 | |
| 241 #endif // V8_COMPILER_INTERPRETER_ASSEMBLER_H_ | |
| OLD | NEW |