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 // Opcodes for control operators.
9 #define INNER_CONTROL_OP_LIST(V) \
10   V(Dead)                  \
11   V(Loop)                  \
12   V(Branch)                \
13   V(IfTrue)                \
14   V(IfFalse)               \
15   V(Merge)                 \
16   V(Return)                \
17   V(Throw)
18 
19 #define CONTROL_OP_LIST(V) \
20   INNER_CONTROL_OP_LIST(V) \
21   V(Start)                 \
22   V(End)
23 
24 // Opcodes for common operators.
25 #define LEAF_OP_LIST(V) \
26   V(Int32Constant)      \
27   V(Int64Constant)      \
28   V(Float32Constant)    \
29   V(Float64Constant)    \
30   V(ExternalConstant)   \
31   V(NumberConstant)     \
32   V(HeapConstant)
33 
34 #define INNER_OP_LIST(V) \
35   V(Phi)                 \
36   V(EffectPhi)           \
37   V(ControlEffect)       \
38   V(ValueEffect)         \
39   V(Finish)              \
40   V(FrameState)          \
41   V(StateValues)         \
42   V(Call)                \
43   V(Parameter)           \
44   V(Projection)
45 
46 #define COMMON_OP_LIST(V) \
47   LEAF_OP_LIST(V)         \
48   INNER_OP_LIST(V)
49 
50 // Opcodes for JavaScript operators.
51 #define JS_COMPARE_BINOP_LIST(V) \
52   V(JSEqual)                     \
53   V(JSNotEqual)                  \
54   V(JSStrictEqual)               \
55   V(JSStrictNotEqual)            \
56   V(JSLessThan)                  \
57   V(JSGreaterThan)               \
58   V(JSLessThanOrEqual)           \
59   V(JSGreaterThanOrEqual)
60 
61 #define JS_BITWISE_BINOP_LIST(V) \
62   V(JSBitwiseOr)                 \
63   V(JSBitwiseXor)                \
64   V(JSBitwiseAnd)                \
65   V(JSShiftLeft)                 \
66   V(JSShiftRight)                \
67   V(JSShiftRightLogical)
68 
69 #define JS_ARITH_BINOP_LIST(V) \
70   V(JSAdd)                     \
71   V(JSSubtract)                \
72   V(JSMultiply)                \
73   V(JSDivide)                  \
74   V(JSModulus)
75 
76 #define JS_SIMPLE_BINOP_LIST(V) \
77   JS_COMPARE_BINOP_LIST(V)      \
78   JS_BITWISE_BINOP_LIST(V)      \
79   JS_ARITH_BINOP_LIST(V)
80 
81 #define JS_LOGIC_UNOP_LIST(V) V(JSUnaryNot)
82 
83 #define JS_CONVERSION_UNOP_LIST(V) \
84   V(JSToBoolean)                   \
85   V(JSToNumber)                    \
86   V(JSToString)                    \
87   V(JSToName)                      \
88   V(JSToObject)
89 
90 #define JS_OTHER_UNOP_LIST(V) \
91   V(JSTypeOf)
92 
93 #define JS_SIMPLE_UNOP_LIST(V) \
94   JS_LOGIC_UNOP_LIST(V)        \
95   JS_CONVERSION_UNOP_LIST(V)   \
96   JS_OTHER_UNOP_LIST(V)
97 
98 #define JS_OBJECT_OP_LIST(V) \
99   V(JSCreate)                \
100   V(JSLoadProperty)          \
101   V(JSLoadNamed)             \
102   V(JSStoreProperty)         \
103   V(JSStoreNamed)            \
104   V(JSDeleteProperty)        \
105   V(JSHasProperty)           \
106   V(JSInstanceOf)
107 
108 #define JS_CONTEXT_OP_LIST(V) \
109   V(JSLoadContext)            \
110   V(JSStoreContext)           \
111   V(JSCreateFunctionContext)  \
112   V(JSCreateCatchContext)     \
113   V(JSCreateWithContext)      \
114   V(JSCreateBlockContext)     \
115   V(JSCreateModuleContext)    \
116   V(JSCreateGlobalContext)
117 
118 #define JS_OTHER_OP_LIST(V) \
119   V(JSCallConstruct)        \
120   V(JSCallFunction)         \
121   V(JSCallRuntime)          \
122   V(JSYield)                \
123   V(JSDebugger)
124 
125 #define JS_OP_LIST(V)     \
126   JS_SIMPLE_BINOP_LIST(V) \
127   JS_SIMPLE_UNOP_LIST(V)  \
128   JS_OBJECT_OP_LIST(V)    \
129   JS_CONTEXT_OP_LIST(V)   \
130   JS_OTHER_OP_LIST(V)
131 
132 // Opcodes for VirtuaMachine-level operators.
133 #define SIMPLIFIED_OP_LIST(V) \
134   V(BooleanNot)               \
135   V(BooleanToNumber)          \
136   V(NumberEqual)              \
137   V(NumberLessThan)           \
138   V(NumberLessThanOrEqual)    \
139   V(NumberAdd)                \
140   V(NumberSubtract)           \
141   V(NumberMultiply)           \
142   V(NumberDivide)             \
143   V(NumberModulus)            \
144   V(NumberToInt32)            \
145   V(NumberToUint32)           \
146   V(ReferenceEqual)           \
147   V(StringEqual)              \
148   V(StringLessThan)           \
149   V(StringLessThanOrEqual)    \
150   V(StringAdd)                \
151   V(ChangeTaggedToInt32)      \
152   V(ChangeTaggedToUint32)     \
153   V(ChangeTaggedToFloat64)    \
154   V(ChangeInt32ToTagged)      \
155   V(ChangeUint32ToTagged)     \
156   V(ChangeFloat64ToTagged)    \
157   V(ChangeBoolToBit)          \
158   V(ChangeBitToBool)          \
159   V(LoadField)                \
160   V(LoadElement)              \
161   V(StoreField)               \
162   V(StoreElement)
163 
164 // Opcodes for Machine-level operators.
165 #define MACHINE_OP_LIST(V)    \
166   V(Load)                     \
167   V(Store)                    \
168   V(Word32And)                \
169   V(Word32Or)                 \
170   V(Word32Xor)                \
171   V(Word32Shl)                \
172   V(Word32Shr)                \
173   V(Word32Sar)                \
174   V(Word32Ror)                \
175   V(Word32Equal)              \
176   V(Word64And)                \
177   V(Word64Or)                 \
178   V(Word64Xor)                \
179   V(Word64Shl)                \
180   V(Word64Shr)                \
181   V(Word64Sar)                \
182   V(Word64Ror)                \
183   V(Word64Equal)              \
184   V(Int32Add)                 \
185   V(Int32AddWithOverflow)     \
186   V(Int32Sub)                 \
187   V(Int32SubWithOverflow)     \
188   V(Int32Mul)                 \
189   V(Int32Div)                 \
190   V(Int32UDiv)                \
191   V(Int32Mod)                 \
192   V(Int32UMod)                \
193   V(Int32LessThan)            \
194   V(Int32LessThanOrEqual)     \
195   V(Uint32LessThan)           \
196   V(Uint32LessThanOrEqual)    \
197   V(Int64Add)                 \
198   V(Int64Sub)                 \
199   V(Int64Mul)                 \
200   V(Int64Div)                 \
201   V(Int64UDiv)                \
202   V(Int64Mod)                 \
203   V(Int64UMod)                \
204   V(Int64LessThan)            \
205   V(Int64LessThanOrEqual)     \
206   V(ChangeFloat32ToFloat64)   \
207   V(ChangeFloat64ToInt32)     \
208   V(ChangeFloat64ToUint32)    \
209   V(ChangeInt32ToFloat64)     \
210   V(ChangeInt32ToInt64)       \
211   V(ChangeUint32ToFloat64)    \
212   V(ChangeUint32ToUint64)     \
213   V(TruncateFloat64ToFloat32) \
214   V(TruncateFloat64ToInt32)   \
215   V(TruncateInt64ToInt32)     \
216   V(Float64Add)               \
217   V(Float64Sub)               \
218   V(Float64Mul)               \
219   V(Float64Div)               \
220   V(Float64Mod)               \
221   V(Float64Sqrt)              \
222   V(Float64Equal)             \
223   V(Float64LessThan)          \
224   V(Float64LessThanOrEqual)
225 
226 #define VALUE_OP_LIST(V) \
227   COMMON_OP_LIST(V)      \
228   SIMPLIFIED_OP_LIST(V)  \
229   MACHINE_OP_LIST(V)     \
230   JS_OP_LIST(V)
231 
232 // The combination of all operators at all levels and the common operators.
233 #define ALL_OP_LIST(V) \
234   CONTROL_OP_LIST(V)   \
235   VALUE_OP_LIST(V)
236 
237 namespace v8 {
238 namespace internal {
239 namespace compiler {
240 
241 // Declare an enumeration with all the opcodes at all levels so that they
242 // can be globally, uniquely numbered.
243 class IrOpcode {
244  public:
245   enum Value {
246 #define DECLARE_OPCODE(x) k##x,
247     ALL_OP_LIST(DECLARE_OPCODE)
248 #undef DECLARE_OPCODE
249     kLast = -1
250 #define COUNT_OPCODE(x) +1
251             ALL_OP_LIST(COUNT_OPCODE)
252 #undef COUNT_OPCODE
253   };
254 
255   // Returns the mnemonic name of an opcode.
Mnemonic(Value val)256   static const char* Mnemonic(Value val) {
257     switch (val) {
258 #define RETURN_NAME(x) \
259   case k##x:           \
260     return #x;
261       ALL_OP_LIST(RETURN_NAME)
262 #undef RETURN_NAME
263       default:
264         return "UnknownOpcode";
265     }
266   }
267 
IsJsOpcode(Value val)268   static bool IsJsOpcode(Value val) {
269     switch (val) {
270 #define RETURN_NAME(x) \
271   case k##x:           \
272     return true;
273       JS_OP_LIST(RETURN_NAME)
274 #undef RETURN_NAME
275       default:
276         return false;
277     }
278   }
279 
IsControlOpcode(Value val)280   static bool IsControlOpcode(Value val) {
281     switch (val) {
282 #define RETURN_NAME(x) \
283   case k##x:           \
284     return true;
285       CONTROL_OP_LIST(RETURN_NAME)
286 #undef RETURN_NAME
287       default:
288         return false;
289     }
290   }
291 
IsCommonOpcode(Value val)292   static bool IsCommonOpcode(Value val) {
293     switch (val) {
294 #define RETURN_NAME(x) \
295   case k##x:           \
296     return true;
297       CONTROL_OP_LIST(RETURN_NAME)
298       COMMON_OP_LIST(RETURN_NAME)
299 #undef RETURN_NAME
300       default:
301         return false;
302     }
303   }
304 };
305 
306 }  // namespace compiler
307 }  // namespace internal
308 }  // namespace v8
309 
310 #endif  // V8_COMPILER_OPCODES_H_
311