xref: /openbsd-src/gnu/llvm/clang/lib/AST/Interp/Opcodes.td (revision 12c855180aad702bbcca06e0398d774beeafb155)
1e5dd7070Spatrick//===--- Opcodes.td - Opcode defitions for the constexpr VM -----*- C++ -*-===//
2e5dd7070Spatrick//
3e5dd7070Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e5dd7070Spatrick// See https://llvm.org/LICENSE.txt for license information.
5e5dd7070Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e5dd7070Spatrick//
7e5dd7070Spatrick//===----------------------------------------------------------------------===//
8e5dd7070Spatrick//
9e5dd7070Spatrick// Helper file used to generate opcodes, the interpreter and the disassembler.
10e5dd7070Spatrick//
11e5dd7070Spatrick//===----------------------------------------------------------------------===//
12e5dd7070Spatrick
13e5dd7070Spatrick
14e5dd7070Spatrick//===----------------------------------------------------------------------===//
15e5dd7070Spatrick// Types evaluated by the interpreter.
16e5dd7070Spatrick//===----------------------------------------------------------------------===//
17e5dd7070Spatrick
18e5dd7070Spatrickclass Type;
19e5dd7070Spatrickdef Bool : Type;
20e5dd7070Spatrickdef Sint8 : Type;
21e5dd7070Spatrickdef Uint8 : Type;
22e5dd7070Spatrickdef Sint16 : Type;
23e5dd7070Spatrickdef Uint16 : Type;
24e5dd7070Spatrickdef Sint32 : Type;
25e5dd7070Spatrickdef Uint32 : Type;
26e5dd7070Spatrickdef Sint64 : Type;
27e5dd7070Spatrickdef Uint64 : Type;
28e5dd7070Spatrickdef Ptr : Type;
29e5dd7070Spatrick
30e5dd7070Spatrick//===----------------------------------------------------------------------===//
31e5dd7070Spatrick// Types transferred to the interpreter.
32e5dd7070Spatrick//===----------------------------------------------------------------------===//
33e5dd7070Spatrick
34e5dd7070Spatrickclass ArgType { string Name = ?; }
35e5dd7070Spatrickdef ArgSint8 : ArgType { let Name = "int8_t"; }
36e5dd7070Spatrickdef ArgUint8 : ArgType { let Name = "uint8_t"; }
37e5dd7070Spatrickdef ArgSint16 : ArgType { let Name = "int16_t"; }
38e5dd7070Spatrickdef ArgUint16 : ArgType { let Name = "uint16_t"; }
39e5dd7070Spatrickdef ArgSint32 : ArgType { let Name = "int32_t"; }
40e5dd7070Spatrickdef ArgUint32 : ArgType { let Name = "uint32_t"; }
41e5dd7070Spatrickdef ArgSint64 : ArgType { let Name = "int64_t"; }
42e5dd7070Spatrickdef ArgUint64 : ArgType { let Name = "uint64_t"; }
43e5dd7070Spatrickdef ArgBool : ArgType { let Name = "bool"; }
44e5dd7070Spatrick
45*12c85518Srobertdef ArgFunction : ArgType { let Name = "const Function *"; }
46e5dd7070Spatrickdef ArgRecordDecl : ArgType { let Name = "const RecordDecl *"; }
47e5dd7070Spatrickdef ArgRecordField : ArgType { let Name = "const Record::Field *"; }
48e5dd7070Spatrick
49e5dd7070Spatrick//===----------------------------------------------------------------------===//
50*12c85518Srobert// Classes of types instructions operate on.
51e5dd7070Spatrick//===----------------------------------------------------------------------===//
52e5dd7070Spatrick
53e5dd7070Spatrickclass TypeClass {
54e5dd7070Spatrick  list<Type> Types;
55e5dd7070Spatrick}
56e5dd7070Spatrick
57*12c85518Srobertdef NumberTypeClass : TypeClass {
58e5dd7070Spatrick  let Types = [Sint8, Uint8, Sint16, Uint16, Sint32,
59*12c85518Srobert               Uint32, Sint64, Uint64];
60*12c85518Srobert}
61*12c85518Srobert
62*12c85518Srobertdef IntegerTypeClass : TypeClass {
63*12c85518Srobert  let Types = [Sint8, Uint8, Sint16, Uint16, Sint32,
64*12c85518Srobert               Uint32, Sint64, Uint64];
65*12c85518Srobert}
66*12c85518Srobert
67*12c85518Srobertdef AluTypeClass : TypeClass {
68*12c85518Srobert  let Types = !listconcat(NumberTypeClass.Types, [Bool]);
69e5dd7070Spatrick}
70e5dd7070Spatrick
71e5dd7070Spatrickdef PtrTypeClass : TypeClass {
72e5dd7070Spatrick  let Types = [Ptr];
73e5dd7070Spatrick}
74e5dd7070Spatrick
75*12c85518Srobertdef BoolTypeClass : TypeClass {
76*12c85518Srobert  let Types = [Bool];
77*12c85518Srobert}
78*12c85518Srobert
79e5dd7070Spatrickdef AllTypeClass : TypeClass {
80e5dd7070Spatrick  let Types = !listconcat(AluTypeClass.Types, PtrTypeClass.Types);
81e5dd7070Spatrick}
82e5dd7070Spatrick
83e5dd7070Spatrickdef ComparableTypeClass : TypeClass {
84e5dd7070Spatrick  let Types = !listconcat(AluTypeClass.Types, [Ptr]);
85e5dd7070Spatrick}
86e5dd7070Spatrick
87e5dd7070Spatrickclass SingletonTypeClass<Type Ty> : TypeClass {
88e5dd7070Spatrick  let Types = [Ty];
89e5dd7070Spatrick}
90e5dd7070Spatrick
91e5dd7070Spatrick//===----------------------------------------------------------------------===//
92e5dd7070Spatrick// Record describing all opcodes.
93e5dd7070Spatrick//===----------------------------------------------------------------------===//
94e5dd7070Spatrick
95e5dd7070Spatrickclass Opcode {
96e5dd7070Spatrick  list<TypeClass> Types = [];
97e5dd7070Spatrick  list<ArgType> Args = [];
98e5dd7070Spatrick  string Name = "";
99e5dd7070Spatrick  bit CanReturn = 0;
100e5dd7070Spatrick  bit ChangesPC = 0;
101e5dd7070Spatrick  bit HasCustomLink = 0;
102e5dd7070Spatrick  bit HasCustomEval = 0;
103e5dd7070Spatrick  bit HasGroup = 0;
104e5dd7070Spatrick}
105e5dd7070Spatrick
106e5dd7070Spatrickclass AluOpcode : Opcode {
107e5dd7070Spatrick  let Types = [AluTypeClass];
108e5dd7070Spatrick  let HasGroup = 1;
109e5dd7070Spatrick}
110e5dd7070Spatrick
111*12c85518Srobertclass IntegerOpcode : Opcode {
112*12c85518Srobert  let Types = [IntegerTypeClass];
113*12c85518Srobert  let HasGroup = 1;
114*12c85518Srobert}
115*12c85518Srobert
116e5dd7070Spatrick//===----------------------------------------------------------------------===//
117e5dd7070Spatrick// Jump opcodes
118e5dd7070Spatrick//===----------------------------------------------------------------------===//
119e5dd7070Spatrick
120e5dd7070Spatrickclass JumpOpcode : Opcode {
121e5dd7070Spatrick  let Args = [ArgSint32];
122e5dd7070Spatrick  let ChangesPC = 1;
123e5dd7070Spatrick  let HasCustomEval = 1;
124e5dd7070Spatrick}
125e5dd7070Spatrick
126e5dd7070Spatrick// [] -> []
127e5dd7070Spatrickdef Jmp : JumpOpcode;
128e5dd7070Spatrick// [Bool] -> [], jumps if true.
129e5dd7070Spatrickdef Jt : JumpOpcode;
130e5dd7070Spatrick// [Bool] -> [], jumps if false.
131e5dd7070Spatrickdef Jf : JumpOpcode;
132e5dd7070Spatrick
133e5dd7070Spatrick//===----------------------------------------------------------------------===//
134e5dd7070Spatrick// Returns
135e5dd7070Spatrick//===----------------------------------------------------------------------===//
136e5dd7070Spatrick
137e5dd7070Spatrick// [Value] -> []
138e5dd7070Spatrickdef Ret : Opcode {
139e5dd7070Spatrick  let Types = [AllTypeClass];
140e5dd7070Spatrick  let ChangesPC = 1;
141e5dd7070Spatrick  let CanReturn = 1;
142e5dd7070Spatrick  let HasGroup = 1;
143e5dd7070Spatrick  let HasCustomEval = 1;
144e5dd7070Spatrick}
145e5dd7070Spatrick// [] -> []
146e5dd7070Spatrickdef RetVoid : Opcode {
147e5dd7070Spatrick  let CanReturn = 1;
148e5dd7070Spatrick  let ChangesPC = 1;
149e5dd7070Spatrick  let HasCustomEval = 1;
150e5dd7070Spatrick}
151e5dd7070Spatrick// [Value] -> []
152e5dd7070Spatrickdef RetValue : Opcode {
153e5dd7070Spatrick  let CanReturn = 1;
154e5dd7070Spatrick  let ChangesPC = 1;
155e5dd7070Spatrick  let HasCustomEval = 1;
156e5dd7070Spatrick}
157e5dd7070Spatrick// [] -> EXIT
158e5dd7070Spatrickdef NoRet : Opcode {}
159e5dd7070Spatrick
160*12c85518Srobert
161*12c85518Srobertdef Call : Opcode {
162*12c85518Srobert  let Args = [ArgFunction];
163*12c85518Srobert  let Types = [];
164*12c85518Srobert  let ChangesPC = 1;
165*12c85518Srobert}
166*12c85518Srobert
167e5dd7070Spatrick//===----------------------------------------------------------------------===//
168e5dd7070Spatrick// Frame management
169e5dd7070Spatrick//===----------------------------------------------------------------------===//
170e5dd7070Spatrick
171e5dd7070Spatrick// [] -> []
172e5dd7070Spatrickdef Destroy : Opcode {
173e5dd7070Spatrick  let Args = [ArgUint32];
174e5dd7070Spatrick  let HasCustomEval = 1;
175e5dd7070Spatrick}
176e5dd7070Spatrick
177e5dd7070Spatrick//===----------------------------------------------------------------------===//
178e5dd7070Spatrick// Constants
179e5dd7070Spatrick//===----------------------------------------------------------------------===//
180e5dd7070Spatrick
181e5dd7070Spatrickclass ConstOpcode<Type Ty, ArgType ArgTy> : Opcode {
182e5dd7070Spatrick  let Types = [SingletonTypeClass<Ty>];
183e5dd7070Spatrick  let Args = [ArgTy];
184e5dd7070Spatrick  let Name = "Const";
185e5dd7070Spatrick}
186e5dd7070Spatrick
187e5dd7070Spatrick// [] -> [Integer]
188e5dd7070Spatrickdef ConstSint8 : ConstOpcode<Sint8, ArgSint8>;
189e5dd7070Spatrickdef ConstUint8 : ConstOpcode<Uint8, ArgUint8>;
190e5dd7070Spatrickdef ConstSint16 : ConstOpcode<Sint16, ArgSint16>;
191e5dd7070Spatrickdef ConstUint16 : ConstOpcode<Uint16, ArgUint16>;
192e5dd7070Spatrickdef ConstSint32 : ConstOpcode<Sint32, ArgSint32>;
193e5dd7070Spatrickdef ConstUint32 : ConstOpcode<Uint32, ArgUint32>;
194e5dd7070Spatrickdef ConstSint64 : ConstOpcode<Sint64, ArgSint64>;
195e5dd7070Spatrickdef ConstUint64 : ConstOpcode<Uint64, ArgUint64>;
196e5dd7070Spatrickdef ConstBool : ConstOpcode<Bool, ArgBool>;
197e5dd7070Spatrick
198e5dd7070Spatrick// [] -> [Integer]
199e5dd7070Spatrickdef Zero : Opcode {
200e5dd7070Spatrick  let Types = [AluTypeClass];
201*12c85518Srobert  let HasGroup = 1;
202e5dd7070Spatrick}
203e5dd7070Spatrick
204e5dd7070Spatrick// [] -> [Pointer]
205e5dd7070Spatrickdef Null : Opcode {
206e5dd7070Spatrick  let Types = [PtrTypeClass];
207e5dd7070Spatrick}
208e5dd7070Spatrick
209e5dd7070Spatrick//===----------------------------------------------------------------------===//
210e5dd7070Spatrick// Pointer generation
211e5dd7070Spatrick//===----------------------------------------------------------------------===//
212e5dd7070Spatrick
213e5dd7070Spatrick// [] -> [Pointer]
214e5dd7070Spatrickdef GetPtrLocal : Opcode {
215e5dd7070Spatrick  // Offset of local.
216e5dd7070Spatrick  let Args = [ArgUint32];
217e5dd7070Spatrick  bit HasCustomEval = 1;
218e5dd7070Spatrick}
219e5dd7070Spatrick// [] -> [Pointer]
220e5dd7070Spatrickdef GetPtrParam : Opcode {
221e5dd7070Spatrick  // Offset of parameter.
222e5dd7070Spatrick  let Args = [ArgUint32];
223e5dd7070Spatrick}
224e5dd7070Spatrick// [] -> [Pointer]
225e5dd7070Spatrickdef GetPtrGlobal : Opcode {
226e5dd7070Spatrick  // Index of global.
227e5dd7070Spatrick  let Args = [ArgUint32];
228e5dd7070Spatrick}
229e5dd7070Spatrick// [Pointer] -> [Pointer]
230e5dd7070Spatrickdef GetPtrField : Opcode {
231e5dd7070Spatrick  // Offset of field.
232e5dd7070Spatrick  let Args = [ArgUint32];
233e5dd7070Spatrick}
234e5dd7070Spatrick// [Pointer] -> [Pointer]
235e5dd7070Spatrickdef GetPtrActiveField : Opcode {
236e5dd7070Spatrick  // Offset of field.
237e5dd7070Spatrick  let Args = [ArgUint32];
238e5dd7070Spatrick}
239e5dd7070Spatrick// [] -> [Pointer]
240e5dd7070Spatrickdef GetPtrActiveThisField : Opcode {
241e5dd7070Spatrick  // Offset of field.
242e5dd7070Spatrick  let Args = [ArgUint32];
243e5dd7070Spatrick}
244e5dd7070Spatrick// [] -> [Pointer]
245e5dd7070Spatrickdef GetPtrThisField : Opcode {
246e5dd7070Spatrick  // Offset of field.
247e5dd7070Spatrick  let Args = [ArgUint32];
248e5dd7070Spatrick}
249e5dd7070Spatrick// [Pointer] -> [Pointer]
250e5dd7070Spatrickdef GetPtrBase : Opcode {
251e5dd7070Spatrick  // Offset of field, which is a base.
252e5dd7070Spatrick  let Args = [ArgUint32];
253e5dd7070Spatrick}
254e5dd7070Spatrick// [Pointer] -> [Pointer]
255e5dd7070Spatrickdef GetPtrVirtBase : Opcode {
256e5dd7070Spatrick  // RecordDecl of base class.
257e5dd7070Spatrick  let Args = [ArgRecordDecl];
258e5dd7070Spatrick}
259e5dd7070Spatrick// [] -> [Pointer]
260e5dd7070Spatrickdef GetPtrThisBase : Opcode {
261e5dd7070Spatrick  // Offset of field, which is a base.
262e5dd7070Spatrick  let Args = [ArgUint32];
263e5dd7070Spatrick}
264e5dd7070Spatrick// [] -> [Pointer]
265e5dd7070Spatrickdef GetPtrThisVirtBase : Opcode {
266e5dd7070Spatrick  // RecordDecl of base class.
267e5dd7070Spatrick  let Args = [ArgRecordDecl];
268e5dd7070Spatrick}
269e5dd7070Spatrick// [] -> [Pointer]
270e5dd7070Spatrickdef This : Opcode;
271e5dd7070Spatrick
272*12c85518Srobert// [] -> [Pointer]
273*12c85518Srobertdef RVOPtr : Opcode;
274*12c85518Srobert
275e5dd7070Spatrick// [Pointer] -> [Pointer]
276e5dd7070Spatrickdef NarrowPtr : Opcode;
277e5dd7070Spatrick// [Pointer] -> [Pointer]
278e5dd7070Spatrickdef ExpandPtr : Opcode;
279e5dd7070Spatrick
280e5dd7070Spatrick//===----------------------------------------------------------------------===//
281e5dd7070Spatrick// Direct field accessors
282e5dd7070Spatrick//===----------------------------------------------------------------------===//
283e5dd7070Spatrick
284e5dd7070Spatrickclass AccessOpcode : Opcode {
285e5dd7070Spatrick  let Types = [AllTypeClass];
286e5dd7070Spatrick  let Args = [ArgUint32];
287e5dd7070Spatrick  let HasGroup = 1;
288e5dd7070Spatrick}
289e5dd7070Spatrick
290e5dd7070Spatrickclass BitFieldOpcode : Opcode {
291e5dd7070Spatrick  let Types = [AluTypeClass];
292e5dd7070Spatrick  let Args = [ArgRecordField];
293e5dd7070Spatrick  let HasGroup = 1;
294e5dd7070Spatrick}
295e5dd7070Spatrick
296e5dd7070Spatrick// [] -> [Pointer]
297e5dd7070Spatrickdef GetLocal : AccessOpcode { let HasCustomEval = 1; }
298e5dd7070Spatrick// [] -> [Pointer]
299e5dd7070Spatrickdef SetLocal : AccessOpcode { let HasCustomEval = 1; }
300e5dd7070Spatrick
301e5dd7070Spatrick// [] -> [Value]
302e5dd7070Spatrickdef GetGlobal : AccessOpcode;
303e5dd7070Spatrick// [Value] -> []
304e5dd7070Spatrickdef InitGlobal : AccessOpcode;
305e5dd7070Spatrick// [Value] -> []
306e5dd7070Spatrickdef SetGlobal : AccessOpcode;
307e5dd7070Spatrick
308e5dd7070Spatrick// [] -> [Value]
309e5dd7070Spatrickdef GetParam : AccessOpcode;
310e5dd7070Spatrick// [Value] -> []
311e5dd7070Spatrickdef SetParam : AccessOpcode;
312e5dd7070Spatrick
313e5dd7070Spatrick// [Pointer] -> [Pointer, Value]
314e5dd7070Spatrickdef GetField : AccessOpcode;
315e5dd7070Spatrick// [Pointer] -> [Value]
316e5dd7070Spatrickdef GetFieldPop : AccessOpcode;
317e5dd7070Spatrick// [] -> [Value]
318e5dd7070Spatrickdef GetThisField : AccessOpcode;
319e5dd7070Spatrick
320e5dd7070Spatrick// [Pointer, Value] -> [Pointer]
321e5dd7070Spatrickdef SetField : AccessOpcode;
322e5dd7070Spatrick// [Value] -> []
323e5dd7070Spatrickdef SetThisField : AccessOpcode;
324e5dd7070Spatrick
325e5dd7070Spatrick// [Value] -> []
326e5dd7070Spatrickdef InitThisField : AccessOpcode;
327e5dd7070Spatrick// [Value] -> []
328e5dd7070Spatrickdef InitThisFieldActive : AccessOpcode;
329e5dd7070Spatrick// [Value] -> []
330e5dd7070Spatrickdef InitThisBitField : BitFieldOpcode;
331e5dd7070Spatrick// [Pointer, Value] -> []
332e5dd7070Spatrickdef InitField : AccessOpcode;
333e5dd7070Spatrick// [Pointer, Value] -> []
334e5dd7070Spatrickdef InitBitField : BitFieldOpcode;
335e5dd7070Spatrick// [Pointer, Value] -> []
336e5dd7070Spatrickdef InitFieldActive : AccessOpcode;
337e5dd7070Spatrick
338e5dd7070Spatrick//===----------------------------------------------------------------------===//
339e5dd7070Spatrick// Pointer access
340e5dd7070Spatrick//===----------------------------------------------------------------------===//
341e5dd7070Spatrick
342e5dd7070Spatrickclass LoadOpcode : Opcode {
343e5dd7070Spatrick  let Types = [AllTypeClass];
344e5dd7070Spatrick  let HasGroup = 1;
345e5dd7070Spatrick}
346e5dd7070Spatrick
347e5dd7070Spatrick// [Pointer] -> [Pointer, Value]
348e5dd7070Spatrickdef Load : LoadOpcode {}
349e5dd7070Spatrick// [Pointer] -> [Value]
350e5dd7070Spatrickdef LoadPop : LoadOpcode {}
351e5dd7070Spatrick
352e5dd7070Spatrickclass StoreOpcode : Opcode {
353e5dd7070Spatrick  let Types = [AllTypeClass];
354e5dd7070Spatrick  let HasGroup = 1;
355e5dd7070Spatrick}
356e5dd7070Spatrick
357e5dd7070Spatrickclass StoreBitFieldOpcode : Opcode {
358e5dd7070Spatrick  let Types = [AluTypeClass];
359e5dd7070Spatrick  let HasGroup = 1;
360e5dd7070Spatrick}
361e5dd7070Spatrick
362e5dd7070Spatrick// [Pointer, Value] -> [Pointer]
363e5dd7070Spatrickdef Store : StoreOpcode {}
364e5dd7070Spatrick// [Pointer, Value] -> []
365e5dd7070Spatrickdef StorePop : StoreOpcode {}
366e5dd7070Spatrick
367e5dd7070Spatrick// [Pointer, Value] -> [Pointer]
368e5dd7070Spatrickdef StoreBitField : StoreBitFieldOpcode {}
369e5dd7070Spatrick// [Pointer, Value] -> []
370e5dd7070Spatrickdef StoreBitFieldPop : StoreBitFieldOpcode {}
371e5dd7070Spatrick
372e5dd7070Spatrick// [Pointer, Value] -> []
373e5dd7070Spatrickdef InitPop : StoreOpcode {}
374e5dd7070Spatrick// [Pointer, Value] -> [Pointer]
375e5dd7070Spatrickdef InitElem : Opcode {
376e5dd7070Spatrick  let Types = [AllTypeClass];
377e5dd7070Spatrick  let Args = [ArgUint32];
378e5dd7070Spatrick  let HasGroup = 1;
379e5dd7070Spatrick}
380e5dd7070Spatrick// [Pointer, Value] -> []
381e5dd7070Spatrickdef InitElemPop : Opcode {
382e5dd7070Spatrick  let Types = [AllTypeClass];
383e5dd7070Spatrick  let Args = [ArgUint32];
384e5dd7070Spatrick  let HasGroup = 1;
385e5dd7070Spatrick}
386e5dd7070Spatrick
387e5dd7070Spatrick//===----------------------------------------------------------------------===//
388e5dd7070Spatrick// Pointer arithmetic.
389e5dd7070Spatrick//===----------------------------------------------------------------------===//
390e5dd7070Spatrick
391e5dd7070Spatrick// [Pointer, Integral] -> [Pointer]
392e5dd7070Spatrickdef AddOffset : AluOpcode;
393e5dd7070Spatrick// [Pointer, Integral] -> [Pointer]
394e5dd7070Spatrickdef SubOffset : AluOpcode;
395e5dd7070Spatrick
396*12c85518Srobert// Pointer, Pointer] - [Integral]
397*12c85518Srobertdef SubPtr : Opcode {
398*12c85518Srobert  let Types = [IntegerTypeClass];
399*12c85518Srobert  let HasGroup = 1;
400*12c85518Srobert}
401*12c85518Srobert
402e5dd7070Spatrick//===----------------------------------------------------------------------===//
403e5dd7070Spatrick// Binary operators.
404e5dd7070Spatrick//===----------------------------------------------------------------------===//
405e5dd7070Spatrick
406e5dd7070Spatrick// [Real, Real] -> [Real]
407e5dd7070Spatrickdef Sub : AluOpcode;
408e5dd7070Spatrickdef Add : AluOpcode;
409e5dd7070Spatrickdef Mul : AluOpcode;
410*12c85518Srobertdef Rem : Opcode {
411*12c85518Srobert  let Types = [NumberTypeClass];
412*12c85518Srobert  let HasGroup = 1;
413*12c85518Srobert}
414*12c85518Srobert
415*12c85518Srobertdef Shl : Opcode {
416*12c85518Srobert  let Types = [IntegerTypeClass, IntegerTypeClass];
417*12c85518Srobert  let HasGroup = 1;
418*12c85518Srobert}
419*12c85518Srobert
420*12c85518Srobertdef Shr : Opcode {
421*12c85518Srobert  let Types = [IntegerTypeClass, IntegerTypeClass];
422*12c85518Srobert  let HasGroup = 1;
423*12c85518Srobert}
424*12c85518Srobert
425*12c85518Srobertdef BitAnd : IntegerOpcode;
426*12c85518Srobertdef BitOr : IntegerOpcode;
427*12c85518Srobertdef Div : Opcode {
428*12c85518Srobert  let Types = [NumberTypeClass];
429*12c85518Srobert  let HasGroup = 1;
430*12c85518Srobert}
431*12c85518Srobertdef BitXor : IntegerOpcode;
432*12c85518Srobert
433*12c85518Srobert//===----------------------------------------------------------------------===//
434*12c85518Srobert// Unary operators.
435*12c85518Srobert//===----------------------------------------------------------------------===//
436*12c85518Srobert
437*12c85518Srobert// [Real] -> [Real]
438*12c85518Srobertdef Inv: Opcode {
439*12c85518Srobert  let Types = [BoolTypeClass];
440*12c85518Srobert  let HasGroup = 1;
441*12c85518Srobert}
442*12c85518Srobert
443*12c85518Srobertdef Inc: IntegerOpcode;
444*12c85518Srobertdef IncPop : IntegerOpcode;
445*12c85518Srobertdef Dec: IntegerOpcode;
446*12c85518Srobertdef DecPop: IntegerOpcode;
447*12c85518Srobert
448*12c85518Srobert// [Real] -> [Real]
449*12c85518Srobertdef Neg: Opcode {
450*12c85518Srobert  let Types = [AluTypeClass];
451*12c85518Srobert  let HasGroup = 1;
452*12c85518Srobert}
453*12c85518Srobert
454*12c85518Srobert// [Real] -> [Real]
455*12c85518Srobertdef Comp: Opcode {
456*12c85518Srobert  let Types = [NumberTypeClass];
457*12c85518Srobert  let HasGroup = 1;
458*12c85518Srobert}
459*12c85518Srobert
460*12c85518Srobert//===----------------------------------------------------------------------===//
461*12c85518Srobert// Cast.
462*12c85518Srobert//===----------------------------------------------------------------------===//
463*12c85518Srobert// TODO: Expand this to handle casts between more types.
464*12c85518Srobert
465*12c85518Srobertdef FromCastTypeClass : TypeClass {
466*12c85518Srobert  let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64, Bool];
467*12c85518Srobert}
468*12c85518Srobert
469*12c85518Srobertdef ToCastTypeClass : TypeClass {
470*12c85518Srobert  let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64, Bool];
471*12c85518Srobert}
472*12c85518Srobert
473*12c85518Srobertdef Cast: Opcode {
474*12c85518Srobert  let Types = [FromCastTypeClass, ToCastTypeClass];
475*12c85518Srobert  let HasGroup = 1;
476*12c85518Srobert}
477e5dd7070Spatrick
478e5dd7070Spatrick//===----------------------------------------------------------------------===//
479e5dd7070Spatrick// Comparison opcodes.
480e5dd7070Spatrick//===----------------------------------------------------------------------===//
481e5dd7070Spatrick
482e5dd7070Spatrickclass EqualityOpcode : Opcode {
483e5dd7070Spatrick  let Types = [AllTypeClass];
484e5dd7070Spatrick  let HasGroup = 1;
485e5dd7070Spatrick}
486e5dd7070Spatrick
487e5dd7070Spatrickdef EQ : EqualityOpcode;
488e5dd7070Spatrickdef NE : EqualityOpcode;
489e5dd7070Spatrick
490e5dd7070Spatrickclass ComparisonOpcode : Opcode {
491e5dd7070Spatrick  let Types = [ComparableTypeClass];
492e5dd7070Spatrick  let HasGroup = 1;
493e5dd7070Spatrick}
494e5dd7070Spatrick
495e5dd7070Spatrickdef LT : ComparisonOpcode;
496e5dd7070Spatrickdef LE : ComparisonOpcode;
497e5dd7070Spatrickdef GT : ComparisonOpcode;
498e5dd7070Spatrickdef GE : ComparisonOpcode;
499e5dd7070Spatrick
500e5dd7070Spatrick//===----------------------------------------------------------------------===//
501e5dd7070Spatrick// Stack management.
502e5dd7070Spatrick//===----------------------------------------------------------------------===//
503e5dd7070Spatrick
504e5dd7070Spatrick// [Value] -> []
505e5dd7070Spatrickdef Pop : Opcode {
506e5dd7070Spatrick  let Types = [AllTypeClass];
507e5dd7070Spatrick  let HasGroup = 1;
508e5dd7070Spatrick}
509e5dd7070Spatrick
510e5dd7070Spatrick// [Value] -> [Value, Value]
511e5dd7070Spatrickdef Dup : Opcode {
512e5dd7070Spatrick  let Types = [AllTypeClass];
513e5dd7070Spatrick  let HasGroup = 1;
514e5dd7070Spatrick}
515