1 // 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 
8 #include <iosfwd>
9 
10 // Opcodes for control operators.
11 #define CONTROL_OP_LIST(V) \
12   V(Start)                 \
13   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)                 \
30   V(End)
31 
32 // 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)         \
40   V(HeapConstant)
41 
42 #define INNER_OP_LIST(V) \
43   V(Select)              \
44   V(Phi)                 \
45   V(EffectSet)           \
46   V(EffectPhi)           \
47   V(Guard)               \
48   V(BeginRegion)         \
49   V(FinishRegion)        \
50   V(FrameState)          \
51   V(StateValues)         \
52   V(TypedStateValues)    \
53   V(ObjectState)         \
54   V(Call)                \
55   V(Parameter)           \
56   V(OsrValue)            \
57   V(Projection)
58 
59 #define COMMON_OP_LIST(V) \
60   CONSTANT_OP_LIST(V)     \
61   INNER_OP_LIST(V)        \
62   V(Dead)
63 
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 
95 #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) \
106   JS_CONVERSION_UNOP_LIST(V)   \
107   JS_OTHER_UNOP_LIST(V)
108 
109 #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)            \
126   V(JSInstanceOf)
127 
128 #define JS_CONTEXT_OP_LIST(V) \
129   V(JSLoadContext)            \
130   V(JSStoreContext)           \
131   V(JSLoadDynamic)            \
132   V(JSCreateFunctionContext)  \
133   V(JSCreateCatchContext)     \
134   V(JSCreateWithContext)      \
135   V(JSCreateBlockContext)     \
136   V(JSCreateModuleContext)    \
137   V(JSCreateScriptContext)
138 
139 #define JS_OTHER_OP_LIST(V) \
140   V(JSCallConstruct)        \
141   V(JSCallFunction)         \
142   V(JSCallRuntime)          \
143   V(JSConvertReceiver)      \
144   V(JSForInDone)            \
145   V(JSForInNext)            \
146   V(JSForInPrepare)         \
147   V(JSForInStep)            \
148   V(JSLoadMessage)          \
149   V(JSStoreMessage)         \
150   V(JSYield)                \
151   V(JSStackCheck)
152 
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.
161 #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)
206 
207 // Opcodes for Machine-level operators.
208 #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)                \
325   V(CheckedStore)
326 
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 
338 namespace v8 {
339 namespace internal {
340 namespace compiler {
341 
342 // Declare an enumeration with all the opcodes at all levels so that they
343 // can be globally, uniquely numbered.
344 class 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.
357   static char const* Mnemonic(Value value);
358 
359   // Returns true if opcode for common operator.
IsCommonOpcode(Value value)360   static bool IsCommonOpcode(Value value) {
361     return kStart <= value && value <= kDead;
362   }
363 
364   // Returns true if opcode for control operator.
IsControlOpcode(Value value)365   static bool IsControlOpcode(Value value) {
366     return kStart <= value && value <= kEnd;
367   }
368 
369   // Returns true if opcode for JavaScript operator.
IsJsOpcode(Value value)370   static bool IsJsOpcode(Value value) {
371     return kJSEqual <= value && value <= kJSStackCheck;
372   }
373 
374   // Returns true if opcode for constant operator.
IsConstantOpcode(Value value)375   static bool IsConstantOpcode(Value value) {
376     return kInt32Constant <= value && value <= kHeapConstant;
377   }
378 
IsPhiOpcode(Value value)379   static bool IsPhiOpcode(Value value) {
380     return value == kPhi || value == kEffectPhi;
381   }
382 
IsMergeOpcode(Value value)383   static bool IsMergeOpcode(Value value) {
384     return value == kMerge || value == kLoop;
385   }
386 
IsIfProjectionOpcode(Value value)387   static bool IsIfProjectionOpcode(Value value) {
388     return kIfTrue <= value && value <= kIfDefault;
389   }
390 
391   // Returns true if opcode can be inlined.
IsInlineeOpcode(Value value)392   static bool IsInlineeOpcode(Value value) {
393     return value == kJSCallConstruct || value == kJSCallFunction;
394   }
395 
396   // Returns true if opcode for comparison operator.
IsComparisonOpcode(Value value)397   static bool IsComparisonOpcode(Value value) {
398     return (kJSEqual <= value && value <= kJSGreaterThanOrEqual) ||
399            (kNumberEqual <= value && value <= kStringLessThanOrEqual) ||
400            (kWord32Equal <= value && value <= kFloat64LessThanOrEqual);
401   }
402 };
403 
404 std::ostream& operator<<(std::ostream&, IrOpcode::Value);
405 
406 }  // namespace compiler
407 }  // namespace internal
408 }  // namespace v8
409 
410 #endif  // V8_COMPILER_OPCODES_H_
411