blob: b10ae2e451792112089780e3e5bbc79c12bb6095 [file] [log] [blame]
Ben Murdoch014dc512016-03-22 12:00:34 +00001// 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_INTERPRETER_INTERPRETER_H_
6#define V8_INTERPRETER_INTERPRETER_H_
7
Ben Murdochf91f0612016-11-29 16:50:11 +00008#include <memory>
9
Ben Murdoch014dc512016-03-22 12:00:34 +000010// Clients of this interface shouldn't depend on lots of interpreter internals.
11// Do not include anything from src/interpreter other than
12// src/interpreter/bytecodes.h here!
13#include "src/base/macros.h"
Ben Murdochf91f0612016-11-29 16:50:11 +000014#include "src/builtins/builtins.h"
Ben Murdoch014dc512016-03-22 12:00:34 +000015#include "src/interpreter/bytecodes.h"
16#include "src/parsing/token.h"
17#include "src/runtime/runtime.h"
18
19namespace v8 {
20namespace internal {
21
22class Isolate;
23class Callable;
24class CompilationInfo;
Ben Murdochf3b273f2017-01-17 12:11:28 +000025class CompilationJob;
Ben Murdoch014dc512016-03-22 12:00:34 +000026
Ben Murdochbcf72ee2016-08-08 18:44:38 +010027namespace compiler {
28class Node;
29} // namespace compiler
30
Ben Murdochf2e39942016-05-18 10:25:55 +000031namespace interpreter {
Ben Murdoch83897452016-05-17 11:12:09 +010032
Ben Murdoch109988c2016-05-18 11:27:45 +010033class InterpreterAssembler;
34
Ben Murdoch014dc512016-03-22 12:00:34 +000035class Interpreter {
36 public:
37 explicit Interpreter(Isolate* isolate);
38 virtual ~Interpreter() {}
39
Ben Murdoch109988c2016-05-18 11:27:45 +010040 // Initializes the interpreter dispatch table.
Ben Murdochf2e39942016-05-18 10:25:55 +000041 void Initialize();
Ben Murdoch83897452016-05-17 11:12:09 +010042
Ben Murdoch109988c2016-05-18 11:27:45 +010043 // Returns the interrupt budget which should be used for the profiler counter.
44 static int InterruptBudget();
45
Ben Murdochf3b273f2017-01-17 12:11:28 +000046 // Creates a compilation job which will generate bytecode for |info|.
47 static CompilationJob* NewCompilationJob(CompilationInfo* info);
Ben Murdoch014dc512016-03-22 12:00:34 +000048
Ben Murdoch109988c2016-05-18 11:27:45 +010049 // Return bytecode handler for |bytecode|.
Ben Murdoch3b9bc312016-06-02 14:46:10 +010050 Code* GetBytecodeHandler(Bytecode bytecode, OperandScale operand_scale);
Ben Murdoch109988c2016-05-18 11:27:45 +010051
52 // GC support.
53 void IterateDispatchTable(ObjectVisitor* v);
54
Ben Murdoch3b9bc312016-06-02 14:46:10 +010055 // Disassembler support (only useful with ENABLE_DISASSEMBLER defined).
56 void TraceCodegen(Handle<Code> code);
57 const char* LookupNameOfBytecodeHandler(Code* code);
Ben Murdoch109988c2016-05-18 11:27:45 +010058
Ben Murdochf3b273f2017-01-17 12:11:28 +000059 V8_EXPORT_PRIVATE Local<v8::Object> GetDispatchCountersObject();
Ben Murdochbcf72ee2016-08-08 18:44:38 +010060
Ben Murdoch109988c2016-05-18 11:27:45 +010061 Address dispatch_table_address() {
62 return reinterpret_cast<Address>(&dispatch_table_[0]);
63 }
64
Ben Murdochbcf72ee2016-08-08 18:44:38 +010065 Address bytecode_dispatch_counters_table() {
66 return reinterpret_cast<Address>(bytecode_dispatch_counters_table_.get());
67 }
68
Ben Murdochf91f0612016-11-29 16:50:11 +000069 // TODO(ignition): Tune code size multiplier.
70 static const int kCodeSizeMultiplier = 32;
71
Ben Murdoch014dc512016-03-22 12:00:34 +000072 private:
73// Bytecode handler generator functions.
74#define DECLARE_BYTECODE_HANDLER_GENERATOR(Name, ...) \
Ben Murdoch109988c2016-05-18 11:27:45 +010075 void Do##Name(InterpreterAssembler* assembler);
Ben Murdoch014dc512016-03-22 12:00:34 +000076 BYTECODE_LIST(DECLARE_BYTECODE_HANDLER_GENERATOR)
77#undef DECLARE_BYTECODE_HANDLER_GENERATOR
78
Ben Murdochbcf72ee2016-08-08 18:44:38 +010079 // Generates code to perform the binary operation via |Generator|.
80 template <class Generator>
Ben Murdochf91f0612016-11-29 16:50:11 +000081 void DoBinaryOpWithFeedback(InterpreterAssembler* assembler);
82
Ben Murdochf3b273f2017-01-17 12:11:28 +000083 // Generates code to perform the comparison via |Generator| while gathering
84 // type feedback.
Ben Murdochc8c1d9e2017-03-08 14:04:23 +000085 void DoCompareOpWithFeedback(Token::Value compare_op,
86 InterpreterAssembler* assembler);
Ben Murdochf3b273f2017-01-17 12:11:28 +000087
Ben Murdochf91f0612016-11-29 16:50:11 +000088 // Generates code to perform the bitwise binary operation corresponding to
89 // |bitwise_op| while gathering type feedback.
90 void DoBitwiseBinaryOp(Token::Value bitwise_op,
91 InterpreterAssembler* assembler);
92
93 // Generates code to perform the binary operation via |Generator| using
94 // an immediate value rather the accumulator as the rhs operand.
95 template <class Generator>
96 void DoBinaryOpWithImmediate(InterpreterAssembler* assembler);
Ben Murdoch13e2dad2016-09-16 13:49:30 +010097
Ben Murdochf91f0612016-11-29 16:50:11 +000098 // Generates code to perform the unary operation via |Generator| while
99 // gatering type feedback.
100 template <class Generator>
101 void DoUnaryOpWithFeedback(InterpreterAssembler* assembler);
102
Ben Murdoch014dc512016-03-22 12:00:34 +0000103 // Generates code to perform the comparison operation associated with
104 // |compare_op|.
Ben Murdoch109988c2016-05-18 11:27:45 +0100105 void DoCompareOp(Token::Value compare_op, InterpreterAssembler* assembler);
Ben Murdoch014dc512016-03-22 12:00:34 +0000106
Ben Murdoch014dc512016-03-22 12:00:34 +0000107 // Generates code to perform a global store via |ic|.
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100108 void DoStaGlobal(Callable ic, InterpreterAssembler* assembler);
Ben Murdoch014dc512016-03-22 12:00:34 +0000109
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100110 // Generates code to perform a named property store via |ic|.
Ben Murdoch109988c2016-05-18 11:27:45 +0100111 void DoStoreIC(Callable ic, InterpreterAssembler* assembler);
Ben Murdoch014dc512016-03-22 12:00:34 +0000112
113 // Generates code to perform a keyed property store via |ic|.
Ben Murdoch109988c2016-05-18 11:27:45 +0100114 void DoKeyedStoreIC(Callable ic, InterpreterAssembler* assembler);
Ben Murdoch014dc512016-03-22 12:00:34 +0000115
Ben Murdochf91f0612016-11-29 16:50:11 +0000116 // Generates code to perform a JS call that collects type feedback.
Ben Murdoch109988c2016-05-18 11:27:45 +0100117 void DoJSCall(InterpreterAssembler* assembler, TailCallMode tail_call_mode);
118
Ben Murdoch014dc512016-03-22 12:00:34 +0000119 // Generates code to perform delete via function_id.
120 void DoDelete(Runtime::FunctionId function_id,
Ben Murdoch109988c2016-05-18 11:27:45 +0100121 InterpreterAssembler* assembler);
Ben Murdoch014dc512016-03-22 12:00:34 +0000122
123 // Generates code to perform a lookup slot load via |function_id|.
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100124 void DoLdaLookupSlot(Runtime::FunctionId function_id,
125 InterpreterAssembler* assembler);
Ben Murdoch014dc512016-03-22 12:00:34 +0000126
Ben Murdochf3b273f2017-01-17 12:11:28 +0000127 // Generates code to perform a lookup slot load via |function_id| that can
128 // fast path to a context slot load.
129 void DoLdaLookupContextSlot(Runtime::FunctionId function_id,
130 InterpreterAssembler* assembler);
131
132 // Generates code to perform a lookup slot load via |function_id| that can
133 // fast path to a global load.
134 void DoLdaLookupGlobalSlot(Runtime::FunctionId function_id,
135 InterpreterAssembler* assembler);
136
137 // Generates code to perform a lookup slot store depending on
138 // |language_mode|.
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100139 void DoStaLookupSlot(LanguageMode language_mode,
140 InterpreterAssembler* assembler);
141
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100142 // Generates code to load a global.
Ben Murdochf3b273f2017-01-17 12:11:28 +0000143 compiler::Node* BuildLoadGlobal(Callable ic, compiler::Node* context,
144 compiler::Node* feedback_slot,
145 InterpreterAssembler* assembler);
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100146
Ben Murdochf91f0612016-11-29 16:50:11 +0000147 // Generates code to prepare the result for ForInPrepare. Cache data
148 // are placed into the consecutive series of registers starting at
149 // |output_register|.
150 void BuildForInPrepareResult(compiler::Node* output_register,
151 compiler::Node* cache_type,
152 compiler::Node* cache_array,
153 compiler::Node* cache_length,
154 InterpreterAssembler* assembler);
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100155
Ben Murdochf91f0612016-11-29 16:50:11 +0000156 // Generates code to perform the unary operation via |callable|.
157 compiler::Node* BuildUnaryOp(Callable callable,
158 InterpreterAssembler* assembler);
Ben Murdoch014dc512016-03-22 12:00:34 +0000159
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100160 uintptr_t GetDispatchCounter(Bytecode from, Bytecode to) const;
161
Ben Murdoch3b9bc312016-06-02 14:46:10 +0100162 // Get dispatch table index of bytecode.
163 static size_t GetDispatchTableIndex(Bytecode bytecode,
164 OperandScale operand_scale);
165
Ben Murdoch109988c2016-05-18 11:27:45 +0100166 bool IsDispatchTableInitialized();
Ben Murdochc8c1d9e2017-03-08 14:04:23 +0000167 bool ShouldInitializeDispatchTable();
Ben Murdoch109988c2016-05-18 11:27:45 +0100168
Ben Murdoch3b9bc312016-06-02 14:46:10 +0100169 static const int kNumberOfWideVariants = 3;
170 static const int kDispatchTableSize = kNumberOfWideVariants * (kMaxUInt8 + 1);
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100171 static const int kNumberOfBytecodes = static_cast<int>(Bytecode::kLast) + 1;
Ben Murdoch014dc512016-03-22 12:00:34 +0000172
173 Isolate* isolate_;
Ben Murdochbcf72ee2016-08-08 18:44:38 +0100174 Address dispatch_table_[kDispatchTableSize];
Ben Murdochf91f0612016-11-29 16:50:11 +0000175 std::unique_ptr<uintptr_t[]> bytecode_dispatch_counters_table_;
Ben Murdoch014dc512016-03-22 12:00:34 +0000176
177 DISALLOW_COPY_AND_ASSIGN(Interpreter);
178};
179
180} // namespace interpreter
181} // namespace internal
182} // namespace v8
183
184#endif // V8_INTERPRETER_INTERPRETER_H_