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