xref: /freebsd/contrib/llvm-project/clang/lib/AST/Interp/Opcodes.td (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
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;
28*5f757f3fSDimitry Andricdef IntAP : Type;
29*5f757f3fSDimitry Andricdef IntAPS : Type;
3006c3fb27SDimitry Andricdef Float : Type;
31a7dea167SDimitry Andricdef Ptr : Type;
3206c3fb27SDimitry Andricdef FnPtr : Type;
33a7dea167SDimitry Andric
34a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
35a7dea167SDimitry Andric// Types transferred to the interpreter.
36a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
37a7dea167SDimitry Andric
38a7dea167SDimitry Andricclass ArgType { string Name = ?; }
39a7dea167SDimitry Andricdef ArgSint8 : ArgType { let Name = "int8_t"; }
40a7dea167SDimitry Andricdef ArgUint8 : ArgType { let Name = "uint8_t"; }
41a7dea167SDimitry Andricdef ArgSint16 : ArgType { let Name = "int16_t"; }
42a7dea167SDimitry Andricdef ArgUint16 : ArgType { let Name = "uint16_t"; }
43a7dea167SDimitry Andricdef ArgSint32 : ArgType { let Name = "int32_t"; }
44a7dea167SDimitry Andricdef ArgUint32 : ArgType { let Name = "uint32_t"; }
45a7dea167SDimitry Andricdef ArgSint64 : ArgType { let Name = "int64_t"; }
46a7dea167SDimitry Andricdef ArgUint64 : ArgType { let Name = "uint64_t"; }
4706c3fb27SDimitry Andricdef ArgFloat : ArgType { let Name = "Floating"; }
48a7dea167SDimitry Andricdef ArgBool : ArgType { let Name = "bool"; }
49a7dea167SDimitry Andric
50bdd1243dSDimitry Andricdef ArgFunction : ArgType { let Name = "const Function *"; }
51a7dea167SDimitry Andricdef ArgRecordDecl : ArgType { let Name = "const RecordDecl *"; }
52a7dea167SDimitry Andricdef ArgRecordField : ArgType { let Name = "const Record::Field *"; }
5306c3fb27SDimitry Andricdef ArgFltSemantics : ArgType { let Name = "const llvm::fltSemantics *"; }
5406c3fb27SDimitry Andricdef ArgRoundingMode : ArgType { let Name = "llvm::RoundingMode"; }
5506c3fb27SDimitry Andricdef ArgLETD: ArgType { let Name = "const LifetimeExtendedTemporaryDecl *"; }
56*5f757f3fSDimitry Andricdef ArgCastKind : ArgType { let Name = "CastKind"; }
57*5f757f3fSDimitry Andricdef ArgCallExpr : ArgType { let Name = "const CallExpr *"; }
58*5f757f3fSDimitry Andricdef ArgOffsetOfExpr : ArgType { let Name = "const OffsetOfExpr *"; }
59*5f757f3fSDimitry Andricdef ArgDeclRef : ArgType { let Name = "const DeclRefExpr *"; }
60*5f757f3fSDimitry Andricdef ArgCCI : ArgType { let Name = "const ComparisonCategoryInfo *"; }
61a7dea167SDimitry Andric
62a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
63349cc55cSDimitry Andric// Classes of types instructions operate on.
64a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
65a7dea167SDimitry Andric
66a7dea167SDimitry Andricclass TypeClass {
67a7dea167SDimitry Andric  list<Type> Types;
68a7dea167SDimitry Andric}
69a7dea167SDimitry Andric
70bdd1243dSDimitry Andricdef IntegerTypeClass : TypeClass {
71bdd1243dSDimitry Andric  let Types = [Sint8, Uint8, Sint16, Uint16, Sint32,
72*5f757f3fSDimitry Andric               Uint32, Sint64, Uint64, IntAP, IntAPS];
73*5f757f3fSDimitry Andric}
74*5f757f3fSDimitry Andric
75*5f757f3fSDimitry Andricdef FixedSizeIntegralTypeClass : TypeClass {
76*5f757f3fSDimitry Andric  let Types = [Sint8, Uint8, Sint16, Uint16, Sint32,
77*5f757f3fSDimitry Andric               Uint32, Sint64, Uint64, Bool];
78bdd1243dSDimitry Andric}
79bdd1243dSDimitry Andric
8006c3fb27SDimitry Andricdef NumberTypeClass : TypeClass {
8106c3fb27SDimitry Andric  let Types = !listconcat(IntegerTypeClass.Types, [Float]);
8206c3fb27SDimitry Andric}
8306c3fb27SDimitry Andric
8406c3fb27SDimitry Andricdef FloatTypeClass : TypeClass {
8506c3fb27SDimitry Andric  let Types = [Float];
8606c3fb27SDimitry Andric}
8706c3fb27SDimitry Andric
88bdd1243dSDimitry Andricdef AluTypeClass : TypeClass {
8906c3fb27SDimitry Andric  let Types = !listconcat(IntegerTypeClass.Types, [Bool]);
90a7dea167SDimitry Andric}
91a7dea167SDimitry Andric
92a7dea167SDimitry Andricdef PtrTypeClass : TypeClass {
9306c3fb27SDimitry Andric  let Types = [Ptr, FnPtr];
94a7dea167SDimitry Andric}
95a7dea167SDimitry Andric
96bdd1243dSDimitry Andricdef BoolTypeClass : TypeClass {
97bdd1243dSDimitry Andric  let Types = [Bool];
98bdd1243dSDimitry Andric}
99bdd1243dSDimitry Andric
10006c3fb27SDimitry Andricdef NonPtrTypeClass : TypeClass {
10106c3fb27SDimitry Andric  let Types = !listconcat(IntegerTypeClass.Types, [Bool], [Float]);
10206c3fb27SDimitry Andric}
10306c3fb27SDimitry Andric
104a7dea167SDimitry Andricdef AllTypeClass : TypeClass {
10506c3fb27SDimitry Andric  let Types = !listconcat(AluTypeClass.Types, PtrTypeClass.Types, FloatTypeClass.Types);
106a7dea167SDimitry Andric}
107a7dea167SDimitry Andric
108a7dea167SDimitry Andricdef ComparableTypeClass : TypeClass {
10906c3fb27SDimitry Andric  let Types = !listconcat(AluTypeClass.Types, [Ptr], [Float], [FnPtr]);
110a7dea167SDimitry Andric}
111a7dea167SDimitry Andric
112a7dea167SDimitry Andricclass SingletonTypeClass<Type Ty> : TypeClass {
113a7dea167SDimitry Andric  let Types = [Ty];
114a7dea167SDimitry Andric}
115a7dea167SDimitry Andric
116a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
117a7dea167SDimitry Andric// Record describing all opcodes.
118a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
119a7dea167SDimitry Andric
120a7dea167SDimitry Andricclass Opcode {
121a7dea167SDimitry Andric  list<TypeClass> Types = [];
122a7dea167SDimitry Andric  list<ArgType> Args = [];
123a7dea167SDimitry Andric  string Name = "";
124a7dea167SDimitry Andric  bit CanReturn = 0;
125a7dea167SDimitry Andric  bit ChangesPC = 0;
126a7dea167SDimitry Andric  bit HasCustomLink = 0;
127a7dea167SDimitry Andric  bit HasCustomEval = 0;
128a7dea167SDimitry Andric  bit HasGroup = 0;
129a7dea167SDimitry Andric}
130a7dea167SDimitry Andric
131a7dea167SDimitry Andricclass AluOpcode : Opcode {
132a7dea167SDimitry Andric  let Types = [AluTypeClass];
133a7dea167SDimitry Andric  let HasGroup = 1;
134a7dea167SDimitry Andric}
135a7dea167SDimitry Andric
13606c3fb27SDimitry Andricclass FloatOpcode : Opcode {
13706c3fb27SDimitry Andric  let Types = [];
13806c3fb27SDimitry Andric  let Args = [ArgRoundingMode];
13906c3fb27SDimitry Andric}
14006c3fb27SDimitry Andric
141bdd1243dSDimitry Andricclass IntegerOpcode : Opcode {
142bdd1243dSDimitry Andric  let Types = [IntegerTypeClass];
143bdd1243dSDimitry Andric  let HasGroup = 1;
144bdd1243dSDimitry Andric}
145bdd1243dSDimitry Andric
146a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
147a7dea167SDimitry Andric// Jump opcodes
148a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
149a7dea167SDimitry Andric
150a7dea167SDimitry Andricclass JumpOpcode : Opcode {
151a7dea167SDimitry Andric  let Args = [ArgSint32];
152a7dea167SDimitry Andric  let ChangesPC = 1;
153a7dea167SDimitry Andric  let HasCustomEval = 1;
154a7dea167SDimitry Andric}
155a7dea167SDimitry Andric
156a7dea167SDimitry Andric// [] -> []
157a7dea167SDimitry Andricdef Jmp : JumpOpcode;
158a7dea167SDimitry Andric// [Bool] -> [], jumps if true.
159a7dea167SDimitry Andricdef Jt : JumpOpcode;
160a7dea167SDimitry Andric// [Bool] -> [], jumps if false.
161a7dea167SDimitry Andricdef Jf : JumpOpcode;
162a7dea167SDimitry Andric
163a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
164a7dea167SDimitry Andric// Returns
165a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
166a7dea167SDimitry Andric
167a7dea167SDimitry Andric// [Value] -> []
168a7dea167SDimitry Andricdef Ret : Opcode {
169a7dea167SDimitry Andric  let Types = [AllTypeClass];
170a7dea167SDimitry Andric  let ChangesPC = 1;
171a7dea167SDimitry Andric  let CanReturn = 1;
172a7dea167SDimitry Andric  let HasGroup = 1;
173a7dea167SDimitry Andric  let HasCustomEval = 1;
174a7dea167SDimitry Andric}
175a7dea167SDimitry Andric// [] -> []
176a7dea167SDimitry Andricdef RetVoid : Opcode {
177a7dea167SDimitry Andric  let CanReturn = 1;
178a7dea167SDimitry Andric  let ChangesPC = 1;
179a7dea167SDimitry Andric  let HasCustomEval = 1;
180a7dea167SDimitry Andric}
181a7dea167SDimitry Andric// [Value] -> []
182a7dea167SDimitry Andricdef RetValue : Opcode {
183a7dea167SDimitry Andric  let CanReturn = 1;
184a7dea167SDimitry Andric  let ChangesPC = 1;
185a7dea167SDimitry Andric  let HasCustomEval = 1;
186a7dea167SDimitry Andric}
187a7dea167SDimitry Andric// [] -> EXIT
188a7dea167SDimitry Andricdef NoRet : Opcode {}
189a7dea167SDimitry Andric
190bdd1243dSDimitry Andric
191bdd1243dSDimitry Andricdef Call : Opcode {
192bdd1243dSDimitry Andric  let Args = [ArgFunction];
193bdd1243dSDimitry Andric  let Types = [];
19406c3fb27SDimitry Andric}
19506c3fb27SDimitry Andric
19606c3fb27SDimitry Andricdef CallVirt : Opcode {
19706c3fb27SDimitry Andric  let Args = [ArgFunction];
19806c3fb27SDimitry Andric  let Types = [];
19906c3fb27SDimitry Andric}
20006c3fb27SDimitry Andric
20106c3fb27SDimitry Andricdef CallBI : Opcode {
202*5f757f3fSDimitry Andric  let Args = [ArgFunction, ArgCallExpr];
20306c3fb27SDimitry Andric  let Types = [];
20406c3fb27SDimitry Andric}
20506c3fb27SDimitry Andric
20606c3fb27SDimitry Andricdef CallPtr : Opcode {
20706c3fb27SDimitry Andric  let Args = [];
20806c3fb27SDimitry Andric  let Types = [];
209bdd1243dSDimitry Andric}
210bdd1243dSDimitry Andric
211*5f757f3fSDimitry Andricdef OffsetOf : Opcode {
212*5f757f3fSDimitry Andric  let Types = [IntegerTypeClass];
213*5f757f3fSDimitry Andric  let Args = [ArgOffsetOfExpr];
214*5f757f3fSDimitry Andric  let HasGroup = 1;
215*5f757f3fSDimitry Andric}
216*5f757f3fSDimitry Andric
217a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
218a7dea167SDimitry Andric// Frame management
219a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
220a7dea167SDimitry Andric
221a7dea167SDimitry Andric// [] -> []
222a7dea167SDimitry Andricdef Destroy : Opcode {
223a7dea167SDimitry Andric  let Args = [ArgUint32];
224a7dea167SDimitry Andric  let HasCustomEval = 1;
225a7dea167SDimitry Andric}
226a7dea167SDimitry Andric
227a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
228a7dea167SDimitry Andric// Constants
229a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
230a7dea167SDimitry Andric
231a7dea167SDimitry Andricclass ConstOpcode<Type Ty, ArgType ArgTy> : Opcode {
232a7dea167SDimitry Andric  let Types = [SingletonTypeClass<Ty>];
233a7dea167SDimitry Andric  let Args = [ArgTy];
234a7dea167SDimitry Andric  let Name = "Const";
235a7dea167SDimitry Andric}
236a7dea167SDimitry Andric
237a7dea167SDimitry Andric// [] -> [Integer]
238a7dea167SDimitry Andricdef ConstSint8 : ConstOpcode<Sint8, ArgSint8>;
239a7dea167SDimitry Andricdef ConstUint8 : ConstOpcode<Uint8, ArgUint8>;
240a7dea167SDimitry Andricdef ConstSint16 : ConstOpcode<Sint16, ArgSint16>;
241a7dea167SDimitry Andricdef ConstUint16 : ConstOpcode<Uint16, ArgUint16>;
242a7dea167SDimitry Andricdef ConstSint32 : ConstOpcode<Sint32, ArgSint32>;
243a7dea167SDimitry Andricdef ConstUint32 : ConstOpcode<Uint32, ArgUint32>;
244a7dea167SDimitry Andricdef ConstSint64 : ConstOpcode<Sint64, ArgSint64>;
245a7dea167SDimitry Andricdef ConstUint64 : ConstOpcode<Uint64, ArgUint64>;
24606c3fb27SDimitry Andricdef ConstFloat : ConstOpcode<Float, ArgFloat>;
247a7dea167SDimitry Andricdef ConstBool : ConstOpcode<Bool, ArgBool>;
248a7dea167SDimitry Andric
249a7dea167SDimitry Andric// [] -> [Integer]
250a7dea167SDimitry Andricdef Zero : Opcode {
251*5f757f3fSDimitry Andric  let Types = [FixedSizeIntegralTypeClass];
252bdd1243dSDimitry Andric  let HasGroup = 1;
253a7dea167SDimitry Andric}
254a7dea167SDimitry Andric
255*5f757f3fSDimitry Andricdef ZeroIntAP : Opcode {
256*5f757f3fSDimitry Andric  let Args = [ArgUint32];
257*5f757f3fSDimitry Andric}
258*5f757f3fSDimitry Andric
259*5f757f3fSDimitry Andricdef ZeroIntAPS : Opcode {
260*5f757f3fSDimitry Andric  let Args = [ArgUint32];
261*5f757f3fSDimitry Andric}
262*5f757f3fSDimitry Andric
263a7dea167SDimitry Andric// [] -> [Pointer]
264a7dea167SDimitry Andricdef Null : Opcode {
265a7dea167SDimitry Andric  let Types = [PtrTypeClass];
26606c3fb27SDimitry Andric  let HasGroup = 1;
267a7dea167SDimitry Andric}
268a7dea167SDimitry Andric
269a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
270a7dea167SDimitry Andric// Pointer generation
271a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
272a7dea167SDimitry Andric
273a7dea167SDimitry Andric// [] -> [Pointer]
274a7dea167SDimitry Andricdef GetPtrLocal : Opcode {
275a7dea167SDimitry Andric  // Offset of local.
276a7dea167SDimitry Andric  let Args = [ArgUint32];
277a7dea167SDimitry Andric  bit HasCustomEval = 1;
278a7dea167SDimitry Andric}
279a7dea167SDimitry Andric// [] -> [Pointer]
280a7dea167SDimitry Andricdef GetPtrParam : Opcode {
281a7dea167SDimitry Andric  // Offset of parameter.
282a7dea167SDimitry Andric  let Args = [ArgUint32];
283a7dea167SDimitry Andric}
284a7dea167SDimitry Andric// [] -> [Pointer]
285a7dea167SDimitry Andricdef GetPtrGlobal : Opcode {
286a7dea167SDimitry Andric  // Index of global.
287a7dea167SDimitry Andric  let Args = [ArgUint32];
288a7dea167SDimitry Andric}
289a7dea167SDimitry Andric// [Pointer] -> [Pointer]
290a7dea167SDimitry Andricdef GetPtrField : Opcode {
291a7dea167SDimitry Andric  // Offset of field.
292a7dea167SDimitry Andric  let Args = [ArgUint32];
293a7dea167SDimitry Andric}
294a7dea167SDimitry Andric// [Pointer] -> [Pointer]
295a7dea167SDimitry Andricdef GetPtrActiveField : Opcode {
296a7dea167SDimitry Andric  // Offset of field.
297a7dea167SDimitry Andric  let Args = [ArgUint32];
298a7dea167SDimitry Andric}
299a7dea167SDimitry Andric// [] -> [Pointer]
300a7dea167SDimitry Andricdef GetPtrActiveThisField : Opcode {
301a7dea167SDimitry Andric  // Offset of field.
302a7dea167SDimitry Andric  let Args = [ArgUint32];
303a7dea167SDimitry Andric}
304a7dea167SDimitry Andric// [] -> [Pointer]
305a7dea167SDimitry Andricdef GetPtrThisField : Opcode {
306a7dea167SDimitry Andric  // Offset of field.
307a7dea167SDimitry Andric  let Args = [ArgUint32];
308a7dea167SDimitry Andric}
309a7dea167SDimitry Andric// [Pointer] -> [Pointer]
310a7dea167SDimitry Andricdef GetPtrBase : Opcode {
311a7dea167SDimitry Andric  // Offset of field, which is a base.
312a7dea167SDimitry Andric  let Args = [ArgUint32];
313a7dea167SDimitry Andric}
314a7dea167SDimitry Andric// [Pointer] -> [Pointer]
31506c3fb27SDimitry Andricdef GetPtrBasePop : Opcode {
31606c3fb27SDimitry Andric  // Offset of field, which is a base.
31706c3fb27SDimitry Andric  let Args = [ArgUint32];
31806c3fb27SDimitry Andric}
31906c3fb27SDimitry Andric
320*5f757f3fSDimitry Andricdef InitPtrPop : Opcode {
321*5f757f3fSDimitry Andric  let Args = [];
322*5f757f3fSDimitry Andric}
323*5f757f3fSDimitry Andric
324*5f757f3fSDimitry Andricdef GetPtrDerivedPop : Opcode {
325*5f757f3fSDimitry Andric  let Args = [ArgUint32];
326*5f757f3fSDimitry Andric}
327*5f757f3fSDimitry Andric
32806c3fb27SDimitry Andric// [Pointer] -> [Pointer]
329a7dea167SDimitry Andricdef GetPtrVirtBase : Opcode {
330a7dea167SDimitry Andric  // RecordDecl of base class.
331a7dea167SDimitry Andric  let Args = [ArgRecordDecl];
332a7dea167SDimitry Andric}
333a7dea167SDimitry Andric// [] -> [Pointer]
334a7dea167SDimitry Andricdef GetPtrThisBase : Opcode {
335a7dea167SDimitry Andric  // Offset of field, which is a base.
336a7dea167SDimitry Andric  let Args = [ArgUint32];
337a7dea167SDimitry Andric}
338a7dea167SDimitry Andric// [] -> [Pointer]
339a7dea167SDimitry Andricdef GetPtrThisVirtBase : Opcode {
340a7dea167SDimitry Andric  // RecordDecl of base class.
341a7dea167SDimitry Andric  let Args = [ArgRecordDecl];
342a7dea167SDimitry Andric}
343a7dea167SDimitry Andric// [] -> [Pointer]
344a7dea167SDimitry Andricdef This : Opcode;
345a7dea167SDimitry Andric
346bdd1243dSDimitry Andric// [] -> [Pointer]
347bdd1243dSDimitry Andricdef RVOPtr : Opcode;
348bdd1243dSDimitry Andric
349a7dea167SDimitry Andric// [Pointer] -> [Pointer]
350a7dea167SDimitry Andricdef NarrowPtr : Opcode;
351a7dea167SDimitry Andric// [Pointer] -> [Pointer]
352a7dea167SDimitry Andricdef ExpandPtr : Opcode;
35306c3fb27SDimitry Andric// [Pointer, Offset] -> [Pointer]
35406c3fb27SDimitry Andricdef ArrayElemPtr : AluOpcode;
35506c3fb27SDimitry Andricdef ArrayElemPtrPop : AluOpcode;
356a7dea167SDimitry Andric
357a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
358a7dea167SDimitry Andric// Direct field accessors
359a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
360a7dea167SDimitry Andric
361a7dea167SDimitry Andricclass AccessOpcode : Opcode {
362a7dea167SDimitry Andric  let Types = [AllTypeClass];
363a7dea167SDimitry Andric  let Args = [ArgUint32];
364a7dea167SDimitry Andric  let HasGroup = 1;
365a7dea167SDimitry Andric}
366a7dea167SDimitry Andric
367a7dea167SDimitry Andricclass BitFieldOpcode : Opcode {
368a7dea167SDimitry Andric  let Types = [AluTypeClass];
369a7dea167SDimitry Andric  let Args = [ArgRecordField];
370a7dea167SDimitry Andric  let HasGroup = 1;
371a7dea167SDimitry Andric}
372a7dea167SDimitry Andric
373a7dea167SDimitry Andric// [] -> [Pointer]
374a7dea167SDimitry Andricdef GetLocal : AccessOpcode { let HasCustomEval = 1; }
375a7dea167SDimitry Andric// [] -> [Pointer]
376a7dea167SDimitry Andricdef SetLocal : AccessOpcode { let HasCustomEval = 1; }
377a7dea167SDimitry Andric
37806c3fb27SDimitry Andricdef CheckGlobalCtor : Opcode {}
37906c3fb27SDimitry Andric
380a7dea167SDimitry Andric// [] -> [Value]
381a7dea167SDimitry Andricdef GetGlobal : AccessOpcode;
382a7dea167SDimitry Andric// [Value] -> []
383a7dea167SDimitry Andricdef InitGlobal : AccessOpcode;
384a7dea167SDimitry Andric// [Value] -> []
38506c3fb27SDimitry Andricdef InitGlobalTemp : AccessOpcode {
38606c3fb27SDimitry Andric  let Args = [ArgUint32, ArgLETD];
38706c3fb27SDimitry Andric}
388*5f757f3fSDimitry Andric// [Pointer] -> [Pointer]
389*5f757f3fSDimitry Andricdef InitGlobalTempComp : Opcode {
390*5f757f3fSDimitry Andric  let Args = [ArgLETD];
391*5f757f3fSDimitry Andric  let Types = [];
392*5f757f3fSDimitry Andric  let HasGroup = 0;
393*5f757f3fSDimitry Andric}
39406c3fb27SDimitry Andric// [Value] -> []
395a7dea167SDimitry Andricdef SetGlobal : AccessOpcode;
396a7dea167SDimitry Andric
397a7dea167SDimitry Andric// [] -> [Value]
398a7dea167SDimitry Andricdef GetParam : AccessOpcode;
399a7dea167SDimitry Andric// [Value] -> []
400a7dea167SDimitry Andricdef SetParam : AccessOpcode;
401a7dea167SDimitry Andric
402a7dea167SDimitry Andric// [Pointer] -> [Pointer, Value]
403a7dea167SDimitry Andricdef GetField : AccessOpcode;
404a7dea167SDimitry Andric// [Pointer] -> [Value]
405a7dea167SDimitry Andricdef GetFieldPop : AccessOpcode;
406a7dea167SDimitry Andric// [] -> [Value]
407a7dea167SDimitry Andricdef GetThisField : AccessOpcode;
408a7dea167SDimitry Andric
409a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer]
410a7dea167SDimitry Andricdef SetField : AccessOpcode;
411a7dea167SDimitry Andric// [Value] -> []
412a7dea167SDimitry Andricdef SetThisField : AccessOpcode;
413a7dea167SDimitry Andric
414a7dea167SDimitry Andric// [Value] -> []
415a7dea167SDimitry Andricdef InitThisField : AccessOpcode;
416a7dea167SDimitry Andric// [Value] -> []
417a7dea167SDimitry Andricdef InitThisFieldActive : AccessOpcode;
418a7dea167SDimitry Andric// [Value] -> []
419a7dea167SDimitry Andricdef InitThisBitField : BitFieldOpcode;
420a7dea167SDimitry Andric// [Pointer, Value] -> []
421a7dea167SDimitry Andricdef InitField : AccessOpcode;
422a7dea167SDimitry Andric// [Pointer, Value] -> []
423a7dea167SDimitry Andricdef InitBitField : BitFieldOpcode;
424a7dea167SDimitry Andric// [Pointer, Value] -> []
425a7dea167SDimitry Andricdef InitFieldActive : AccessOpcode;
426a7dea167SDimitry Andric
427a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
428a7dea167SDimitry Andric// Pointer access
429a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
430a7dea167SDimitry Andric
431a7dea167SDimitry Andricclass LoadOpcode : Opcode {
432a7dea167SDimitry Andric  let Types = [AllTypeClass];
433a7dea167SDimitry Andric  let HasGroup = 1;
434a7dea167SDimitry Andric}
435a7dea167SDimitry Andric
436a7dea167SDimitry Andric// [Pointer] -> [Pointer, Value]
437a7dea167SDimitry Andricdef Load : LoadOpcode {}
438a7dea167SDimitry Andric// [Pointer] -> [Value]
439a7dea167SDimitry Andricdef LoadPop : LoadOpcode {}
440a7dea167SDimitry Andric
441a7dea167SDimitry Andricclass StoreOpcode : Opcode {
442a7dea167SDimitry Andric  let Types = [AllTypeClass];
443a7dea167SDimitry Andric  let HasGroup = 1;
444a7dea167SDimitry Andric}
445a7dea167SDimitry Andric
446a7dea167SDimitry Andricclass StoreBitFieldOpcode : Opcode {
447a7dea167SDimitry Andric  let Types = [AluTypeClass];
448a7dea167SDimitry Andric  let HasGroup = 1;
449a7dea167SDimitry Andric}
450a7dea167SDimitry Andric
451a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer]
452a7dea167SDimitry Andricdef Store : StoreOpcode {}
453a7dea167SDimitry Andric// [Pointer, Value] -> []
454a7dea167SDimitry Andricdef StorePop : StoreOpcode {}
455a7dea167SDimitry Andric
456a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer]
457a7dea167SDimitry Andricdef StoreBitField : StoreBitFieldOpcode {}
458a7dea167SDimitry Andric// [Pointer, Value] -> []
459a7dea167SDimitry Andricdef StoreBitFieldPop : StoreBitFieldOpcode {}
460a7dea167SDimitry Andric
461a7dea167SDimitry Andric// [Pointer, Value] -> []
462a7dea167SDimitry Andricdef InitPop : StoreOpcode {}
463a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer]
464a7dea167SDimitry Andricdef InitElem : Opcode {
465a7dea167SDimitry Andric  let Types = [AllTypeClass];
466a7dea167SDimitry Andric  let Args = [ArgUint32];
467a7dea167SDimitry Andric  let HasGroup = 1;
468a7dea167SDimitry Andric}
469a7dea167SDimitry Andric// [Pointer, Value] -> []
470a7dea167SDimitry Andricdef InitElemPop : Opcode {
471a7dea167SDimitry Andric  let Types = [AllTypeClass];
472a7dea167SDimitry Andric  let Args = [ArgUint32];
473a7dea167SDimitry Andric  let HasGroup = 1;
474a7dea167SDimitry Andric}
475a7dea167SDimitry Andric
476a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
477a7dea167SDimitry Andric// Pointer arithmetic.
478a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
479a7dea167SDimitry Andric
480a7dea167SDimitry Andric// [Pointer, Integral] -> [Pointer]
481a7dea167SDimitry Andricdef AddOffset : AluOpcode;
482a7dea167SDimitry Andric// [Pointer, Integral] -> [Pointer]
483a7dea167SDimitry Andricdef SubOffset : AluOpcode;
484a7dea167SDimitry Andric
48506c3fb27SDimitry Andric// [Pointer, Pointer] -> [Integral]
486bdd1243dSDimitry Andricdef SubPtr : Opcode {
487bdd1243dSDimitry Andric  let Types = [IntegerTypeClass];
488bdd1243dSDimitry Andric  let HasGroup = 1;
489bdd1243dSDimitry Andric}
490bdd1243dSDimitry Andric
49106c3fb27SDimitry Andric// [Pointer] -> [Pointer]
49206c3fb27SDimitry Andricdef IncPtr : Opcode {
49306c3fb27SDimitry Andric  let HasGroup = 0;
49406c3fb27SDimitry Andric}
49506c3fb27SDimitry Andric// [Pointer] -> [Pointer]
49606c3fb27SDimitry Andricdef DecPtr : Opcode {
49706c3fb27SDimitry Andric  let HasGroup = 0;
49806c3fb27SDimitry Andric}
49906c3fb27SDimitry Andric
50006c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
50106c3fb27SDimitry Andric// Function pointers.
50206c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
50306c3fb27SDimitry Andricdef GetFnPtr : Opcode {
50406c3fb27SDimitry Andric  let Args = [ArgFunction];
50506c3fb27SDimitry Andric}
50606c3fb27SDimitry Andric
50706c3fb27SDimitry Andric
508a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
509a7dea167SDimitry Andric// Binary operators.
510a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
511a7dea167SDimitry Andric
512a7dea167SDimitry Andric// [Real, Real] -> [Real]
513a7dea167SDimitry Andricdef Add  : AluOpcode;
51406c3fb27SDimitry Andricdef Addf : FloatOpcode;
51506c3fb27SDimitry Andricdef Sub  : AluOpcode;
51606c3fb27SDimitry Andricdef Subf : FloatOpcode;
517a7dea167SDimitry Andricdef Mul  : AluOpcode;
51806c3fb27SDimitry Andricdef Mulf : FloatOpcode;
51906c3fb27SDimitry Andricdef Rem  : IntegerOpcode;
52006c3fb27SDimitry Andricdef Div  : IntegerOpcode;
52106c3fb27SDimitry Andricdef Divf : FloatOpcode;
52206c3fb27SDimitry Andric
52306c3fb27SDimitry Andricdef BitAnd : IntegerOpcode;
52406c3fb27SDimitry Andricdef BitOr : IntegerOpcode;
52506c3fb27SDimitry Andricdef BitXor : IntegerOpcode;
526bdd1243dSDimitry Andric
527bdd1243dSDimitry Andricdef Shl : Opcode {
528bdd1243dSDimitry Andric  let Types = [IntegerTypeClass, IntegerTypeClass];
529bdd1243dSDimitry Andric  let HasGroup = 1;
530bdd1243dSDimitry Andric}
531bdd1243dSDimitry Andric
532bdd1243dSDimitry Andricdef Shr : Opcode {
533bdd1243dSDimitry Andric  let Types = [IntegerTypeClass, IntegerTypeClass];
534bdd1243dSDimitry Andric  let HasGroup = 1;
535bdd1243dSDimitry Andric}
536bdd1243dSDimitry Andric
537bdd1243dSDimitry Andric//===----------------------------------------------------------------------===//
538bdd1243dSDimitry Andric// Unary operators.
539bdd1243dSDimitry Andric//===----------------------------------------------------------------------===//
540bdd1243dSDimitry Andric
541bdd1243dSDimitry Andric// [Real] -> [Real]
542bdd1243dSDimitry Andricdef Inv: Opcode {
543bdd1243dSDimitry Andric  let Types = [BoolTypeClass];
544bdd1243dSDimitry Andric  let HasGroup = 1;
545bdd1243dSDimitry Andric}
546bdd1243dSDimitry Andric
54706c3fb27SDimitry Andric// Increment and decrement.
548bdd1243dSDimitry Andricdef Inc: IntegerOpcode;
549bdd1243dSDimitry Andricdef IncPop : IntegerOpcode;
550bdd1243dSDimitry Andricdef Dec: IntegerOpcode;
551bdd1243dSDimitry Andricdef DecPop: IntegerOpcode;
552bdd1243dSDimitry Andric
55306c3fb27SDimitry Andric// Float increment and decrement.
55406c3fb27SDimitry Andricdef Incf: FloatOpcode;
55506c3fb27SDimitry Andricdef IncfPop : FloatOpcode;
55606c3fb27SDimitry Andricdef Decf: FloatOpcode;
55706c3fb27SDimitry Andricdef DecfPop : FloatOpcode;
55806c3fb27SDimitry Andric
559bdd1243dSDimitry Andric// [Real] -> [Real]
560bdd1243dSDimitry Andricdef Neg: Opcode {
56106c3fb27SDimitry Andric  let Types = [NonPtrTypeClass];
562bdd1243dSDimitry Andric  let HasGroup = 1;
563bdd1243dSDimitry Andric}
564bdd1243dSDimitry Andric
565bdd1243dSDimitry Andric// [Real] -> [Real]
566bdd1243dSDimitry Andricdef Comp: Opcode {
56706c3fb27SDimitry Andric  let Types = [IntegerTypeClass];
568bdd1243dSDimitry Andric  let HasGroup = 1;
569bdd1243dSDimitry Andric}
570bdd1243dSDimitry Andric
571bdd1243dSDimitry Andric//===----------------------------------------------------------------------===//
57206c3fb27SDimitry Andric// Cast, CastFP.
573bdd1243dSDimitry Andric//===----------------------------------------------------------------------===//
574bdd1243dSDimitry Andric
575bdd1243dSDimitry Andricdef FromCastTypeClass : TypeClass {
576*5f757f3fSDimitry Andric  let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64, Bool, IntAP, IntAPS];
577bdd1243dSDimitry Andric}
578bdd1243dSDimitry Andric
579bdd1243dSDimitry Andricdef ToCastTypeClass : TypeClass {
580bdd1243dSDimitry Andric  let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64, Bool];
581bdd1243dSDimitry Andric}
582bdd1243dSDimitry Andric
583bdd1243dSDimitry Andricdef Cast: Opcode {
584bdd1243dSDimitry Andric  let Types = [FromCastTypeClass, ToCastTypeClass];
585bdd1243dSDimitry Andric  let HasGroup = 1;
586bdd1243dSDimitry Andric}
587a7dea167SDimitry Andric
58806c3fb27SDimitry Andricdef CastFP : Opcode {
58906c3fb27SDimitry Andric  let Types = [];
59006c3fb27SDimitry Andric  let Args = [ArgFltSemantics, ArgRoundingMode];
59106c3fb27SDimitry Andric}
59206c3fb27SDimitry Andric
593*5f757f3fSDimitry Andricdef FixedSizeIntegralTypes : TypeClass {
594*5f757f3fSDimitry Andric  let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64, Bool];
595*5f757f3fSDimitry Andric}
596*5f757f3fSDimitry Andric
597*5f757f3fSDimitry Andricdef CastAP : Opcode {
598*5f757f3fSDimitry Andric  let Types = [AluTypeClass];
599*5f757f3fSDimitry Andric  let Args = [ArgUint32];
600*5f757f3fSDimitry Andric  let HasGroup = 1;
601*5f757f3fSDimitry Andric}
602*5f757f3fSDimitry Andric
603*5f757f3fSDimitry Andricdef CastAPS : Opcode {
604*5f757f3fSDimitry Andric  let Types = [AluTypeClass];
605*5f757f3fSDimitry Andric  let Args = [ArgUint32];
606*5f757f3fSDimitry Andric  let HasGroup = 1;
607*5f757f3fSDimitry Andric}
608*5f757f3fSDimitry Andric
60906c3fb27SDimitry Andric// Cast an integer to a floating type
61006c3fb27SDimitry Andricdef CastIntegralFloating : Opcode {
61106c3fb27SDimitry Andric  let Types = [AluTypeClass];
61206c3fb27SDimitry Andric  let Args = [ArgFltSemantics, ArgRoundingMode];
61306c3fb27SDimitry Andric  let HasGroup = 1;
61406c3fb27SDimitry Andric}
61506c3fb27SDimitry Andric
61606c3fb27SDimitry Andric// Cast a floating to an integer type
61706c3fb27SDimitry Andricdef CastFloatingIntegral : Opcode {
618*5f757f3fSDimitry Andric  let Types = [FixedSizeIntegralTypes];
619*5f757f3fSDimitry Andric  let Args = [];
620*5f757f3fSDimitry Andric  let HasGroup = 1;
621*5f757f3fSDimitry Andric}
622*5f757f3fSDimitry Andric
623*5f757f3fSDimitry Andricdef CastFloatingIntegralAP : Opcode {
624*5f757f3fSDimitry Andric  let Types = [];
625*5f757f3fSDimitry Andric  let Args = [ArgUint32];
626*5f757f3fSDimitry Andric}
627*5f757f3fSDimitry Andric
628*5f757f3fSDimitry Andricdef CastFloatingIntegralAPS : Opcode {
629*5f757f3fSDimitry Andric  let Types = [];
630*5f757f3fSDimitry Andric  let Args = [ArgUint32];
631*5f757f3fSDimitry Andric}
632*5f757f3fSDimitry Andric
633*5f757f3fSDimitry Andricdef CastPointerIntegral : Opcode {
63406c3fb27SDimitry Andric  let Types = [AluTypeClass];
63506c3fb27SDimitry Andric  let Args = [];
63606c3fb27SDimitry Andric  let HasGroup = 1;
63706c3fb27SDimitry Andric}
63806c3fb27SDimitry Andric
639a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
640a7dea167SDimitry Andric// Comparison opcodes.
641a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
642a7dea167SDimitry Andric
643a7dea167SDimitry Andricclass EqualityOpcode : Opcode {
644a7dea167SDimitry Andric  let Types = [AllTypeClass];
645a7dea167SDimitry Andric  let HasGroup = 1;
646a7dea167SDimitry Andric}
647a7dea167SDimitry Andric
648a7dea167SDimitry Andricdef EQ : EqualityOpcode;
649a7dea167SDimitry Andricdef NE : EqualityOpcode;
650a7dea167SDimitry Andric
651a7dea167SDimitry Andricclass ComparisonOpcode : Opcode {
652a7dea167SDimitry Andric  let Types = [ComparableTypeClass];
653a7dea167SDimitry Andric  let HasGroup = 1;
654a7dea167SDimitry Andric}
655a7dea167SDimitry Andric
656*5f757f3fSDimitry Andricdef CMP3 : ComparisonOpcode {
657*5f757f3fSDimitry Andric  let Args = [ArgCCI];
658*5f757f3fSDimitry Andric}
659*5f757f3fSDimitry Andric
660a7dea167SDimitry Andricdef LT : ComparisonOpcode;
661a7dea167SDimitry Andricdef LE : ComparisonOpcode;
662a7dea167SDimitry Andricdef GT : ComparisonOpcode;
663a7dea167SDimitry Andricdef GE : ComparisonOpcode;
664a7dea167SDimitry Andric
665a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
666a7dea167SDimitry Andric// Stack management.
667a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
668a7dea167SDimitry Andric
669a7dea167SDimitry Andric// [Value] -> []
670a7dea167SDimitry Andricdef Pop : Opcode {
671a7dea167SDimitry Andric  let Types = [AllTypeClass];
672a7dea167SDimitry Andric  let HasGroup = 1;
673a7dea167SDimitry Andric}
674a7dea167SDimitry Andric
675a7dea167SDimitry Andric// [Value] -> [Value, Value]
676a7dea167SDimitry Andricdef Dup : Opcode {
677a7dea167SDimitry Andric  let Types = [AllTypeClass];
678a7dea167SDimitry Andric  let HasGroup = 1;
679a7dea167SDimitry Andric}
680*5f757f3fSDimitry Andric
681*5f757f3fSDimitry Andric// [] -> []
682*5f757f3fSDimitry Andricdef Invalid : Opcode {}
683*5f757f3fSDimitry Andricdef InvalidCast : Opcode {
684*5f757f3fSDimitry Andric  let Args = [ArgCastKind];
685*5f757f3fSDimitry Andric}
686*5f757f3fSDimitry Andric
687*5f757f3fSDimitry Andricdef InvalidDeclRef : Opcode {
688*5f757f3fSDimitry Andric  let Args = [ArgDeclRef];
689*5f757f3fSDimitry Andric}
690*5f757f3fSDimitry Andric
691*5f757f3fSDimitry Andricdef ArrayDecay : Opcode;
692