blob: a97fdfa54b3a0db9a390b2582e12e5fbd4eab011 [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// Copyright 2013 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_OPCODES_H_
6#define V8_COMPILER_OPCODES_H_
7
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00008#include <iosfwd>
Ben Murdochb8a8cc12014-11-26 15:28:44 +00009
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000010// Opcodes for control operators.
Ben Murdochb8a8cc12014-11-26 15:28:44 +000011#define CONTROL_OP_LIST(V) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000012 V(Start) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000013 V(Loop) \
14 V(Branch) \
15 V(Switch) \
16 V(IfTrue) \
17 V(IfFalse) \
18 V(IfSuccess) \
19 V(IfException) \
20 V(IfValue) \
21 V(IfDefault) \
22 V(Merge) \
23 V(Deoptimize) \
24 V(Return) \
25 V(TailCall) \
26 V(Terminate) \
27 V(OsrNormalEntry) \
28 V(OsrLoopEntry) \
29 V(Throw) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000030 V(End)
31
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000032// Opcodes for constant operators.
33#define CONSTANT_OP_LIST(V) \
34 V(Int32Constant) \
35 V(Int64Constant) \
36 V(Float32Constant) \
37 V(Float64Constant) \
38 V(ExternalConstant) \
39 V(NumberConstant) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000040 V(HeapConstant)
41
42#define INNER_OP_LIST(V) \
Emily Bernierd0a1eb72015-03-24 16:35:39 -040043 V(Select) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000044 V(Phi) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000045 V(EffectSet) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000046 V(EffectPhi) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000047 V(Guard) \
48 V(BeginRegion) \
49 V(FinishRegion) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000050 V(FrameState) \
51 V(StateValues) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000052 V(TypedStateValues) \
53 V(ObjectState) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000054 V(Call) \
55 V(Parameter) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000056 V(OsrValue) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000057 V(Projection)
58
59#define COMMON_OP_LIST(V) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000060 CONSTANT_OP_LIST(V) \
61 INNER_OP_LIST(V) \
62 V(Dead)
Ben Murdochb8a8cc12014-11-26 15:28:44 +000063
64// Opcodes for JavaScript operators.
65#define JS_COMPARE_BINOP_LIST(V) \
66 V(JSEqual) \
67 V(JSNotEqual) \
68 V(JSStrictEqual) \
69 V(JSStrictNotEqual) \
70 V(JSLessThan) \
71 V(JSGreaterThan) \
72 V(JSLessThanOrEqual) \
73 V(JSGreaterThanOrEqual)
74
75#define JS_BITWISE_BINOP_LIST(V) \
76 V(JSBitwiseOr) \
77 V(JSBitwiseXor) \
78 V(JSBitwiseAnd) \
79 V(JSShiftLeft) \
80 V(JSShiftRight) \
81 V(JSShiftRightLogical)
82
83#define JS_ARITH_BINOP_LIST(V) \
84 V(JSAdd) \
85 V(JSSubtract) \
86 V(JSMultiply) \
87 V(JSDivide) \
88 V(JSModulus)
89
90#define JS_SIMPLE_BINOP_LIST(V) \
91 JS_COMPARE_BINOP_LIST(V) \
92 JS_BITWISE_BINOP_LIST(V) \
93 JS_ARITH_BINOP_LIST(V)
94
Ben Murdochb8a8cc12014-11-26 15:28:44 +000095#define JS_CONVERSION_UNOP_LIST(V) \
96 V(JSToBoolean) \
97 V(JSToNumber) \
98 V(JSToString) \
99 V(JSToName) \
100 V(JSToObject)
101
102#define JS_OTHER_UNOP_LIST(V) \
103 V(JSTypeOf)
104
105#define JS_SIMPLE_UNOP_LIST(V) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000106 JS_CONVERSION_UNOP_LIST(V) \
107 JS_OTHER_UNOP_LIST(V)
108
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000109#define JS_OBJECT_OP_LIST(V) \
110 V(JSCreate) \
111 V(JSCreateArguments) \
112 V(JSCreateArray) \
113 V(JSCreateClosure) \
114 V(JSCreateIterResultObject) \
115 V(JSCreateLiteralArray) \
116 V(JSCreateLiteralObject) \
117 V(JSCreateLiteralRegExp) \
118 V(JSLoadProperty) \
119 V(JSLoadNamed) \
120 V(JSLoadGlobal) \
121 V(JSStoreProperty) \
122 V(JSStoreNamed) \
123 V(JSStoreGlobal) \
124 V(JSDeleteProperty) \
125 V(JSHasProperty) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000126 V(JSInstanceOf)
127
128#define JS_CONTEXT_OP_LIST(V) \
129 V(JSLoadContext) \
130 V(JSStoreContext) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000131 V(JSLoadDynamic) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000132 V(JSCreateFunctionContext) \
133 V(JSCreateCatchContext) \
134 V(JSCreateWithContext) \
135 V(JSCreateBlockContext) \
136 V(JSCreateModuleContext) \
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400137 V(JSCreateScriptContext)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000138
139#define JS_OTHER_OP_LIST(V) \
140 V(JSCallConstruct) \
141 V(JSCallFunction) \
142 V(JSCallRuntime) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000143 V(JSConvertReceiver) \
144 V(JSForInDone) \
145 V(JSForInNext) \
146 V(JSForInPrepare) \
147 V(JSForInStep) \
148 V(JSLoadMessage) \
149 V(JSStoreMessage) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000150 V(JSYield) \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000151 V(JSStackCheck)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000152
153#define JS_OP_LIST(V) \
154 JS_SIMPLE_BINOP_LIST(V) \
155 JS_SIMPLE_UNOP_LIST(V) \
156 JS_OBJECT_OP_LIST(V) \
157 JS_CONTEXT_OP_LIST(V) \
158 JS_OTHER_OP_LIST(V)
159
160// Opcodes for VirtuaMachine-level operators.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000161#define SIMPLIFIED_COMPARE_BINOP_LIST(V) \
162 V(NumberEqual) \
163 V(NumberLessThan) \
164 V(NumberLessThanOrEqual) \
165 V(ReferenceEqual) \
166 V(StringEqual) \
167 V(StringLessThan) \
168 V(StringLessThanOrEqual)
169
170#define SIMPLIFIED_OP_LIST(V) \
171 SIMPLIFIED_COMPARE_BINOP_LIST(V) \
172 V(BooleanNot) \
173 V(BooleanToNumber) \
174 V(NumberAdd) \
175 V(NumberSubtract) \
176 V(NumberMultiply) \
177 V(NumberDivide) \
178 V(NumberModulus) \
179 V(NumberBitwiseOr) \
180 V(NumberBitwiseXor) \
181 V(NumberBitwiseAnd) \
182 V(NumberShiftLeft) \
183 V(NumberShiftRight) \
184 V(NumberShiftRightLogical) \
185 V(NumberToInt32) \
186 V(NumberToUint32) \
187 V(NumberIsHoleNaN) \
188 V(PlainPrimitiveToNumber) \
189 V(ChangeTaggedToInt32) \
190 V(ChangeTaggedToUint32) \
191 V(ChangeTaggedToFloat64) \
192 V(ChangeInt32ToTagged) \
193 V(ChangeUint32ToTagged) \
194 V(ChangeFloat64ToTagged) \
195 V(ChangeBoolToBit) \
196 V(ChangeBitToBool) \
197 V(Allocate) \
198 V(LoadField) \
199 V(LoadBuffer) \
200 V(LoadElement) \
201 V(StoreField) \
202 V(StoreBuffer) \
203 V(StoreElement) \
204 V(ObjectIsNumber) \
205 V(ObjectIsSmi)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000206
207// Opcodes for Machine-level operators.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000208#define MACHINE_COMPARE_BINOP_LIST(V) \
209 V(Word32Equal) \
210 V(Word64Equal) \
211 V(Int32LessThan) \
212 V(Int32LessThanOrEqual) \
213 V(Uint32LessThan) \
214 V(Uint32LessThanOrEqual) \
215 V(Int64LessThan) \
216 V(Int64LessThanOrEqual) \
217 V(Uint64LessThan) \
218 V(Uint64LessThanOrEqual) \
219 V(Float32Equal) \
220 V(Float32LessThan) \
221 V(Float32LessThanOrEqual) \
222 V(Float64Equal) \
223 V(Float64LessThan) \
224 V(Float64LessThanOrEqual)
225
226#define MACHINE_OP_LIST(V) \
227 MACHINE_COMPARE_BINOP_LIST(V) \
228 V(Load) \
229 V(Store) \
230 V(Word32And) \
231 V(Word32Or) \
232 V(Word32Xor) \
233 V(Word32Shl) \
234 V(Word32Shr) \
235 V(Word32Sar) \
236 V(Word32Ror) \
237 V(Word32Clz) \
238 V(Word32Ctz) \
239 V(Word32Popcnt) \
240 V(Word64Popcnt) \
241 V(Word64And) \
242 V(Word64Or) \
243 V(Word64Xor) \
244 V(Word64Shl) \
245 V(Word64Shr) \
246 V(Word64Sar) \
247 V(Word64Ror) \
248 V(Word64Clz) \
249 V(Word64Ctz) \
250 V(Int32Add) \
251 V(Int32AddWithOverflow) \
252 V(Int32Sub) \
253 V(Int32SubWithOverflow) \
254 V(Int32Mul) \
255 V(Int32MulHigh) \
256 V(Int32Div) \
257 V(Int32Mod) \
258 V(Uint32Div) \
259 V(Uint32Mod) \
260 V(Uint32MulHigh) \
261 V(Int64Add) \
262 V(Int64AddWithOverflow) \
263 V(Int64Sub) \
264 V(Int64SubWithOverflow) \
265 V(Int64Mul) \
266 V(Int64Div) \
267 V(Int64Mod) \
268 V(Uint64Div) \
269 V(Uint64Mod) \
270 V(ChangeFloat32ToFloat64) \
271 V(ChangeFloat64ToInt32) \
272 V(ChangeFloat64ToUint32) \
273 V(TryTruncateFloat32ToInt64) \
274 V(TryTruncateFloat64ToInt64) \
275 V(TryTruncateFloat32ToUint64) \
276 V(TryTruncateFloat64ToUint64) \
277 V(ChangeInt32ToFloat64) \
278 V(ChangeInt32ToInt64) \
279 V(ChangeUint32ToFloat64) \
280 V(ChangeUint32ToUint64) \
281 V(TruncateFloat64ToFloat32) \
282 V(TruncateFloat64ToInt32) \
283 V(TruncateInt64ToInt32) \
284 V(RoundInt64ToFloat32) \
285 V(RoundInt64ToFloat64) \
286 V(RoundUint64ToFloat32) \
287 V(RoundUint64ToFloat64) \
288 V(BitcastFloat32ToInt32) \
289 V(BitcastFloat64ToInt64) \
290 V(BitcastInt32ToFloat32) \
291 V(BitcastInt64ToFloat64) \
292 V(Float32Add) \
293 V(Float32Sub) \
294 V(Float32Mul) \
295 V(Float32Div) \
296 V(Float32Max) \
297 V(Float32Min) \
298 V(Float32Abs) \
299 V(Float32Sqrt) \
300 V(Float32RoundDown) \
301 V(Float64Add) \
302 V(Float64Sub) \
303 V(Float64Mul) \
304 V(Float64Div) \
305 V(Float64Mod) \
306 V(Float64Max) \
307 V(Float64Min) \
308 V(Float64Abs) \
309 V(Float64Sqrt) \
310 V(Float64RoundDown) \
311 V(Float32RoundUp) \
312 V(Float64RoundUp) \
313 V(Float32RoundTruncate) \
314 V(Float64RoundTruncate) \
315 V(Float64RoundTiesAway) \
316 V(Float32RoundTiesEven) \
317 V(Float64RoundTiesEven) \
318 V(Float64ExtractLowWord32) \
319 V(Float64ExtractHighWord32) \
320 V(Float64InsertLowWord32) \
321 V(Float64InsertHighWord32) \
322 V(LoadStackPointer) \
323 V(LoadFramePointer) \
324 V(CheckedLoad) \
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400325 V(CheckedStore)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000326
327#define VALUE_OP_LIST(V) \
328 COMMON_OP_LIST(V) \
329 SIMPLIFIED_OP_LIST(V) \
330 MACHINE_OP_LIST(V) \
331 JS_OP_LIST(V)
332
333// The combination of all operators at all levels and the common operators.
334#define ALL_OP_LIST(V) \
335 CONTROL_OP_LIST(V) \
336 VALUE_OP_LIST(V)
337
338namespace v8 {
339namespace internal {
340namespace compiler {
341
342// Declare an enumeration with all the opcodes at all levels so that they
343// can be globally, uniquely numbered.
344class IrOpcode {
345 public:
346 enum Value {
347#define DECLARE_OPCODE(x) k##x,
348 ALL_OP_LIST(DECLARE_OPCODE)
349#undef DECLARE_OPCODE
350 kLast = -1
351#define COUNT_OPCODE(x) +1
352 ALL_OP_LIST(COUNT_OPCODE)
353#undef COUNT_OPCODE
354 };
355
356 // Returns the mnemonic name of an opcode.
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400357 static char const* Mnemonic(Value value);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000358
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000359 // Returns true if opcode for common operator.
360 static bool IsCommonOpcode(Value value) {
361 return kStart <= value && value <= kDead;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000362 }
363
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000364 // Returns true if opcode for control operator.
365 static bool IsControlOpcode(Value value) {
366 return kStart <= value && value <= kEnd;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000367 }
368
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000369 // Returns true if opcode for JavaScript operator.
370 static bool IsJsOpcode(Value value) {
371 return kJSEqual <= value && value <= kJSStackCheck;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400372 }
373
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000374 // Returns true if opcode for constant operator.
375 static bool IsConstantOpcode(Value value) {
376 return kInt32Constant <= value && value <= kHeapConstant;
377 }
378
379 static bool IsPhiOpcode(Value value) {
380 return value == kPhi || value == kEffectPhi;
381 }
382
383 static bool IsMergeOpcode(Value value) {
384 return value == kMerge || value == kLoop;
385 }
386
387 static bool IsIfProjectionOpcode(Value value) {
388 return kIfTrue <= value && value <= kIfDefault;
389 }
390
391 // Returns true if opcode can be inlined.
392 static bool IsInlineeOpcode(Value value) {
393 return value == kJSCallConstruct || value == kJSCallFunction;
394 }
395
396 // Returns true if opcode for comparison operator.
397 static bool IsComparisonOpcode(Value value) {
398 return (kJSEqual <= value && value <= kJSGreaterThanOrEqual) ||
399 (kNumberEqual <= value && value <= kStringLessThanOrEqual) ||
400 (kWord32Equal <= value && value <= kFloat64LessThanOrEqual);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000401 }
402};
403
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000404std::ostream& operator<<(std::ostream&, IrOpcode::Value);
405
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000406} // namespace compiler
407} // namespace internal
408} // namespace v8
409
410#endif // V8_COMPILER_OPCODES_H_