xref: /llvm-project/clang/lib/AST/ByteCode/Opcodes.td (revision e86b68ff560aaf5fc723eaa8d8418892b2456e12)
1a07aba5dSTimm Baeder//===--- Opcodes.td - Opcode defitions for the constexpr VM -----*- C++ -*-===//
2a07aba5dSTimm Baeder//
3a07aba5dSTimm Baeder// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4a07aba5dSTimm Baeder// See https://llvm.org/LICENSE.txt for license information.
5a07aba5dSTimm Baeder// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6a07aba5dSTimm Baeder//
7a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
8a07aba5dSTimm Baeder//
9a07aba5dSTimm Baeder// Helper file used to generate opcodes, the interpreter and the disassembler.
10a07aba5dSTimm Baeder//
11a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
12a07aba5dSTimm Baeder
13a07aba5dSTimm Baeder
14a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
15a07aba5dSTimm Baeder// Types evaluated by the interpreter.
16a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
17a07aba5dSTimm Baeder
18a07aba5dSTimm Baederclass Type;
19a07aba5dSTimm Baederdef Bool : Type;
20a07aba5dSTimm Baederdef Sint8 : Type;
21a07aba5dSTimm Baederdef Uint8 : Type;
22a07aba5dSTimm Baederdef Sint16 : Type;
23a07aba5dSTimm Baederdef Uint16 : Type;
24a07aba5dSTimm Baederdef Sint32 : Type;
25a07aba5dSTimm Baederdef Uint32 : Type;
26a07aba5dSTimm Baederdef Sint64 : Type;
27a07aba5dSTimm Baederdef Uint64 : Type;
28a07aba5dSTimm Baederdef IntAP : Type;
29a07aba5dSTimm Baederdef IntAPS : Type;
30a07aba5dSTimm Baederdef Float : Type;
31a07aba5dSTimm Baederdef Ptr : Type;
32a07aba5dSTimm Baederdef FnPtr : Type;
33a07aba5dSTimm Baederdef MemberPtr : Type;
34048bc672STimm Baederdef FixedPoint : Type;
35a07aba5dSTimm Baeder
36a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
37a07aba5dSTimm Baeder// Types transferred to the interpreter.
38a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
39a07aba5dSTimm Baeder
40a07aba5dSTimm Baederclass ArgType { string Name = ?; bit AsRef = false; }
41a07aba5dSTimm Baederdef ArgSint8 : ArgType { let Name = "int8_t"; }
42a07aba5dSTimm Baederdef ArgUint8 : ArgType { let Name = "uint8_t"; }
43a07aba5dSTimm Baederdef ArgSint16 : ArgType { let Name = "int16_t"; }
44a07aba5dSTimm Baederdef ArgUint16 : ArgType { let Name = "uint16_t"; }
45a07aba5dSTimm Baederdef ArgSint32 : ArgType { let Name = "int32_t"; }
46a07aba5dSTimm Baederdef ArgUint32 : ArgType { let Name = "uint32_t"; }
47a07aba5dSTimm Baederdef ArgSint64 : ArgType { let Name = "int64_t"; }
48a07aba5dSTimm Baederdef ArgUint64 : ArgType { let Name = "uint64_t"; }
49a07aba5dSTimm Baederdef ArgIntAP : ArgType { let Name = "IntegralAP<false>"; let AsRef = true; }
50a07aba5dSTimm Baederdef ArgIntAPS : ArgType { let Name = "IntegralAP<true>"; let AsRef = true; }
51a07aba5dSTimm Baederdef ArgFloat : ArgType { let Name = "Floating"; let AsRef = true; }
52a07aba5dSTimm Baederdef ArgBool : ArgType { let Name = "bool"; }
53048bc672STimm Baederdef ArgFixedPoint : ArgType { let Name = "FixedPoint"; let AsRef = true; }
54a07aba5dSTimm Baeder
55a07aba5dSTimm Baederdef ArgFunction : ArgType { let Name = "const Function *"; }
56a07aba5dSTimm Baederdef ArgRecordDecl : ArgType { let Name = "const RecordDecl *"; }
57a07aba5dSTimm Baederdef ArgRecordField : ArgType { let Name = "const Record::Field *"; }
58a07aba5dSTimm Baederdef ArgFltSemantics : ArgType { let Name = "const llvm::fltSemantics *"; }
59a07aba5dSTimm Baederdef ArgRoundingMode : ArgType { let Name = "llvm::RoundingMode"; }
60a07aba5dSTimm Baederdef ArgLETD: ArgType { let Name = "const LifetimeExtendedTemporaryDecl *"; }
61a07aba5dSTimm Baederdef ArgCastKind : ArgType { let Name = "CastKind"; }
62a07aba5dSTimm Baederdef ArgCallExpr : ArgType { let Name = "const CallExpr *"; }
63a07aba5dSTimm Baederdef ArgExpr : ArgType { let Name = "const Expr *"; }
64a07aba5dSTimm Baederdef ArgOffsetOfExpr : ArgType { let Name = "const OffsetOfExpr *"; }
65a07aba5dSTimm Baederdef ArgDeclRef : ArgType { let Name = "const DeclRefExpr *"; }
66a07aba5dSTimm Baederdef ArgCCI : ArgType { let Name = "const ComparisonCategoryInfo *"; }
676f81c878STimm Baederdef ArgValueDecl : ArgType { let Name = "const ValueDecl*"; }
68a07aba5dSTimm Baederdef ArgVarDecl : ArgType { let Name = "const VarDecl*"; }
69a07aba5dSTimm Baederdef ArgDesc : ArgType { let Name = "const Descriptor *"; }
70a07aba5dSTimm Baederdef ArgPrimType : ArgType { let Name = "PrimType"; }
71a07aba5dSTimm Baederdef ArgEnumDecl : ArgType { let Name = "const EnumDecl *"; }
72a07aba5dSTimm Baederdef ArgTypePtr : ArgType { let Name = "const Type *"; }
73a07aba5dSTimm Baeder
74a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
75a07aba5dSTimm Baeder// Classes of types instructions operate on.
76a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
77a07aba5dSTimm Baeder
78a07aba5dSTimm Baederclass TypeClass {
79a07aba5dSTimm Baeder  list<Type> Types;
80a07aba5dSTimm Baeder}
81a07aba5dSTimm Baeder
82a07aba5dSTimm Baederdef IntegerTypeClass : TypeClass {
83a07aba5dSTimm Baeder  let Types = [Sint8, Uint8, Sint16, Uint16, Sint32,
84a07aba5dSTimm Baeder               Uint32, Sint64, Uint64, IntAP, IntAPS];
85a07aba5dSTimm Baeder}
86a07aba5dSTimm Baeder
875c811cccSTimm Baederdef IntegerAndFixedTypeClass : TypeClass {
885c811cccSTimm Baeder  let Types = [Sint8, Uint8, Sint16, Uint16, Sint32,
895c811cccSTimm Baeder               Uint32, Sint64, Uint64, IntAP, IntAPS, FixedPoint];
905c811cccSTimm Baeder}
915c811cccSTimm Baeder
92a07aba5dSTimm Baederdef FixedSizeIntegralTypeClass : TypeClass {
93a07aba5dSTimm Baeder  let Types = [Sint8, Uint8, Sint16, Uint16, Sint32,
94a07aba5dSTimm Baeder               Uint32, Sint64, Uint64, Bool];
95a07aba5dSTimm Baeder}
96a07aba5dSTimm Baeder
97a07aba5dSTimm Baederdef NumberTypeClass : TypeClass {
98a07aba5dSTimm Baeder  let Types = !listconcat(IntegerTypeClass.Types, [Float]);
99a07aba5dSTimm Baeder}
100a07aba5dSTimm Baeder
101a07aba5dSTimm Baederdef FloatTypeClass : TypeClass {
102a07aba5dSTimm Baeder  let Types = [Float];
103a07aba5dSTimm Baeder}
104a07aba5dSTimm Baeder
105a07aba5dSTimm Baederdef AluTypeClass : TypeClass {
106defead4dSTimm Baeder  let Types = !listconcat(IntegerTypeClass.Types, [Bool], [FixedPoint]);
107a07aba5dSTimm Baeder}
108a07aba5dSTimm Baeder
109a07aba5dSTimm Baederdef PtrTypeClass : TypeClass {
110a07aba5dSTimm Baeder  let Types = [Ptr, FnPtr, MemberPtr];
111a07aba5dSTimm Baeder}
112a07aba5dSTimm Baeder
113a07aba5dSTimm Baederdef NonPtrTypeClass : TypeClass {
114581c015eSTimm Baeder  let Types = !listconcat(IntegerTypeClass.Types, [Bool], [Float], [FixedPoint]);
115a07aba5dSTimm Baeder}
116a07aba5dSTimm Baeder
117a07aba5dSTimm Baederdef AllTypeClass : TypeClass {
118defead4dSTimm Baeder  let Types = !listconcat(AluTypeClass.Types, PtrTypeClass.Types, FloatTypeClass.Types);
119a07aba5dSTimm Baeder}
120a07aba5dSTimm Baeder
121a07aba5dSTimm Baederdef ComparableTypeClass : TypeClass {
122a07aba5dSTimm Baeder  let Types = !listconcat(AluTypeClass.Types, [Ptr], [Float], [FnPtr]);
123a07aba5dSTimm Baeder}
124a07aba5dSTimm Baeder
125a07aba5dSTimm Baederclass SingletonTypeClass<Type Ty> : TypeClass {
126a07aba5dSTimm Baeder  let Types = [Ty];
127a07aba5dSTimm Baeder}
128a07aba5dSTimm Baeder
129a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
130a07aba5dSTimm Baeder// Record describing all opcodes.
131a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
132a07aba5dSTimm Baeder
133a07aba5dSTimm Baederclass Opcode {
134a07aba5dSTimm Baeder  list<TypeClass> Types = [];
135a07aba5dSTimm Baeder  list<ArgType> Args = [];
136a07aba5dSTimm Baeder  string Name = "";
137a07aba5dSTimm Baeder  bit CanReturn = 0;
138a07aba5dSTimm Baeder  bit ChangesPC = 0;
139a07aba5dSTimm Baeder  bit HasCustomLink = 0;
140a07aba5dSTimm Baeder  bit HasCustomEval = 0;
141a07aba5dSTimm Baeder  bit HasGroup = 0;
142a07aba5dSTimm Baeder}
143a07aba5dSTimm Baeder
144a07aba5dSTimm Baederclass AluOpcode : Opcode {
145a07aba5dSTimm Baeder  let Types = [AluTypeClass];
146a07aba5dSTimm Baeder  let HasGroup = 1;
147a07aba5dSTimm Baeder}
148a07aba5dSTimm Baeder
149a07aba5dSTimm Baederclass FloatOpcode : Opcode {
1500f5f440fSTimm Baeder  let Args = [ArgUint32];
151a07aba5dSTimm Baeder}
152a07aba5dSTimm Baeder
153a07aba5dSTimm Baederclass IntegerOpcode : Opcode {
1545c811cccSTimm Baeder  let Types = [IntegerAndFixedTypeClass];
155a07aba5dSTimm Baeder  let HasGroup = 1;
156a07aba5dSTimm Baeder}
157a07aba5dSTimm Baeder
158a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
159a07aba5dSTimm Baeder// Jump opcodes
160a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
161a07aba5dSTimm Baeder
162a07aba5dSTimm Baederclass JumpOpcode : Opcode {
163a07aba5dSTimm Baeder  let Args = [ArgSint32];
164a07aba5dSTimm Baeder  let ChangesPC = 1;
165a07aba5dSTimm Baeder  let HasCustomEval = 1;
166a07aba5dSTimm Baeder}
167a07aba5dSTimm Baeder
168a07aba5dSTimm Baeder// [] -> []
169a07aba5dSTimm Baederdef Jmp : JumpOpcode;
170a07aba5dSTimm Baeder// [Bool] -> [], jumps if true.
171a07aba5dSTimm Baederdef Jt : JumpOpcode;
172a07aba5dSTimm Baeder// [Bool] -> [], jumps if false.
173a07aba5dSTimm Baederdef Jf : JumpOpcode;
174a07aba5dSTimm Baeder
175a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
176a07aba5dSTimm Baeder// Returns
177a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
178a07aba5dSTimm Baeder
179a07aba5dSTimm Baeder// [Value] -> []
180a07aba5dSTimm Baederdef Ret : Opcode {
181a07aba5dSTimm Baeder  let Types = [AllTypeClass];
182a07aba5dSTimm Baeder  let ChangesPC = 1;
183a07aba5dSTimm Baeder  let CanReturn = 1;
184a07aba5dSTimm Baeder  let HasGroup = 1;
185a07aba5dSTimm Baeder  let HasCustomEval = 1;
186a07aba5dSTimm Baeder}
187a07aba5dSTimm Baeder// [] -> []
188a07aba5dSTimm Baederdef RetVoid : Opcode {
189a07aba5dSTimm Baeder  let CanReturn = 1;
190a07aba5dSTimm Baeder  let ChangesPC = 1;
191a07aba5dSTimm Baeder  let HasCustomEval = 1;
192a07aba5dSTimm Baeder}
193a07aba5dSTimm Baeder// [Value] -> []
194a07aba5dSTimm Baederdef RetValue : Opcode {
195a07aba5dSTimm Baeder  let CanReturn = 1;
196a07aba5dSTimm Baeder  let ChangesPC = 1;
197a07aba5dSTimm Baeder  let HasCustomEval = 1;
198a07aba5dSTimm Baeder}
199a07aba5dSTimm Baeder// [] -> EXIT
200a07aba5dSTimm Baederdef NoRet : Opcode {}
201a07aba5dSTimm Baeder
202a07aba5dSTimm Baeder
203a07aba5dSTimm Baederdef Call : Opcode {
204a07aba5dSTimm Baeder  let Args = [ArgFunction, ArgUint32];
205a07aba5dSTimm Baeder}
206a07aba5dSTimm Baeder
207a07aba5dSTimm Baederdef CallVirt : Opcode {
208a07aba5dSTimm Baeder  let Args = [ArgFunction, ArgUint32];
209a07aba5dSTimm Baeder}
210a07aba5dSTimm Baeder
211a07aba5dSTimm Baederdef CallBI : Opcode {
21278cf9b83STimm Baeder  let Args = [ArgFunction, ArgCallExpr, ArgUint32];
213a07aba5dSTimm Baeder}
214a07aba5dSTimm Baeder
215a07aba5dSTimm Baederdef CallPtr : Opcode {
216a07aba5dSTimm Baeder  let Args = [ArgUint32, ArgCallExpr];
217a07aba5dSTimm Baeder}
218a07aba5dSTimm Baeder
219a07aba5dSTimm Baederdef CallVar : Opcode {
220a07aba5dSTimm Baeder  let Args = [ArgFunction, ArgUint32];
221a07aba5dSTimm Baeder}
222a07aba5dSTimm Baeder
223a07aba5dSTimm Baederdef OffsetOf : Opcode {
224a07aba5dSTimm Baeder  let Types = [IntegerTypeClass];
225a07aba5dSTimm Baeder  let Args = [ArgOffsetOfExpr];
226a07aba5dSTimm Baeder  let HasGroup = 1;
227a07aba5dSTimm Baeder}
228a07aba5dSTimm Baeder
229a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
230a07aba5dSTimm Baeder// Frame management
231a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
232a07aba5dSTimm Baeder
233a07aba5dSTimm Baeder// [] -> []
234a07aba5dSTimm Baederdef Destroy : Opcode {
235a07aba5dSTimm Baeder  let Args = [ArgUint32];
236a07aba5dSTimm Baeder  let HasCustomEval = 1;
237a07aba5dSTimm Baeder}
238a07aba5dSTimm Baederdef InitScope : Opcode {
239a07aba5dSTimm Baeder  let Args = [ArgUint32];
240a07aba5dSTimm Baeder}
241a07aba5dSTimm Baeder
242a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
243a07aba5dSTimm Baeder// Constants
244a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
245a07aba5dSTimm Baeder
246a07aba5dSTimm Baederclass ConstOpcode<Type Ty, ArgType ArgTy> : Opcode {
247a07aba5dSTimm Baeder  let Types = [SingletonTypeClass<Ty>];
248a07aba5dSTimm Baeder  let Args = [ArgTy];
249a07aba5dSTimm Baeder  let Name = "Const";
250a07aba5dSTimm Baeder}
251a07aba5dSTimm Baeder
252a07aba5dSTimm Baeder// [] -> [Integer]
253a07aba5dSTimm Baederdef ConstSint8 : ConstOpcode<Sint8, ArgSint8>;
254a07aba5dSTimm Baederdef ConstUint8 : ConstOpcode<Uint8, ArgUint8>;
255a07aba5dSTimm Baederdef ConstSint16 : ConstOpcode<Sint16, ArgSint16>;
256a07aba5dSTimm Baederdef ConstUint16 : ConstOpcode<Uint16, ArgUint16>;
257a07aba5dSTimm Baederdef ConstSint32 : ConstOpcode<Sint32, ArgSint32>;
258a07aba5dSTimm Baederdef ConstUint32 : ConstOpcode<Uint32, ArgUint32>;
259a07aba5dSTimm Baederdef ConstSint64 : ConstOpcode<Sint64, ArgSint64>;
260a07aba5dSTimm Baederdef ConstUint64 : ConstOpcode<Uint64, ArgUint64>;
261a07aba5dSTimm Baederdef ConstFloat : ConstOpcode<Float, ArgFloat>;
262a07aba5dSTimm Baederdef constIntAP : ConstOpcode<IntAP, ArgIntAP>;
263a07aba5dSTimm Baederdef constIntAPS : ConstOpcode<IntAPS, ArgIntAPS>;
264a07aba5dSTimm Baederdef ConstBool : ConstOpcode<Bool, ArgBool>;
265048bc672STimm Baederdef ConstFixedPoint : ConstOpcode<FixedPoint, ArgFixedPoint>;
266a07aba5dSTimm Baeder
267a07aba5dSTimm Baeder// [] -> [Integer]
268a07aba5dSTimm Baederdef Zero : Opcode {
269a07aba5dSTimm Baeder  let Types = [FixedSizeIntegralTypeClass];
270a07aba5dSTimm Baeder  let HasGroup = 1;
271a07aba5dSTimm Baeder}
272a07aba5dSTimm Baeder
273a07aba5dSTimm Baederdef ZeroIntAP : Opcode {
274a07aba5dSTimm Baeder  let Args = [ArgUint32];
275a07aba5dSTimm Baeder}
276a07aba5dSTimm Baeder
277a07aba5dSTimm Baederdef ZeroIntAPS : Opcode {
278a07aba5dSTimm Baeder  let Args = [ArgUint32];
279a07aba5dSTimm Baeder}
280a07aba5dSTimm Baeder
281a07aba5dSTimm Baeder// [] -> [Pointer]
282a07aba5dSTimm Baederdef Null : Opcode {
283a07aba5dSTimm Baeder  let Types = [PtrTypeClass];
28444be7946STimm Baeder  let Args = [ArgUint64, ArgDesc];
285a07aba5dSTimm Baeder  let HasGroup = 1;
286a07aba5dSTimm Baeder}
287a07aba5dSTimm Baeder
288a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
289a07aba5dSTimm Baeder// Pointer generation
290a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
291a07aba5dSTimm Baederclass OffsetOpcode : Opcode {
292a07aba5dSTimm Baeder  let Args = [ArgUint32];
293a07aba5dSTimm Baeder}
294a07aba5dSTimm Baeder
295a07aba5dSTimm Baeder// [] -> [Pointer]
296a07aba5dSTimm Baederdef GetPtrLocal : OffsetOpcode {
297a07aba5dSTimm Baeder  bit HasCustomEval = 1;
298a07aba5dSTimm Baeder}
299a07aba5dSTimm Baeder// [] -> [Pointer]
300a07aba5dSTimm Baederdef GetPtrParam : OffsetOpcode;
301a07aba5dSTimm Baeder// [] -> [Pointer]
302a07aba5dSTimm Baederdef GetPtrGlobal : OffsetOpcode;
303a07aba5dSTimm Baeder// [Pointer] -> [Pointer]
304a07aba5dSTimm Baederdef GetPtrField : OffsetOpcode;
305a07aba5dSTimm Baederdef GetPtrFieldPop : OffsetOpcode;
306a07aba5dSTimm Baeder// [Pointer] -> [Pointer]
307a07aba5dSTimm Baederdef GetPtrActiveField : OffsetOpcode;
308a07aba5dSTimm Baeder// [] -> [Pointer]
309a07aba5dSTimm Baederdef GetPtrActiveThisField : OffsetOpcode;
310a07aba5dSTimm Baeder// [] -> [Pointer]
311a07aba5dSTimm Baederdef GetPtrThisField : OffsetOpcode;
312a07aba5dSTimm Baeder// [Pointer] -> [Pointer]
313a07aba5dSTimm Baederdef GetPtrBase : OffsetOpcode;
314a07aba5dSTimm Baeder// [Pointer] -> [Pointer]
315a07aba5dSTimm Baederdef GetPtrBasePop : OffsetOpcode;
316a07aba5dSTimm Baederdef GetMemberPtrBasePop : Opcode {
317a07aba5dSTimm Baeder  // Offset of field, which is a base.
318a07aba5dSTimm Baeder  let Args = [ArgSint32];
319a07aba5dSTimm Baeder}
320a07aba5dSTimm Baeder
321a07aba5dSTimm Baeder
322a07aba5dSTimm Baederdef FinishInitPop : Opcode;
323a07aba5dSTimm Baederdef FinishInit    : Opcode;
324a07aba5dSTimm Baeder
325a07aba5dSTimm Baederdef GetPtrDerivedPop : Opcode {
326a07aba5dSTimm Baeder  let Args = [ArgUint32];
327a07aba5dSTimm Baeder}
328a07aba5dSTimm Baeder
329a07aba5dSTimm Baeder// [Pointer] -> [Pointer]
330a07aba5dSTimm Baederdef GetPtrVirtBasePop : Opcode {
331a07aba5dSTimm Baeder  // RecordDecl of base class.
332a07aba5dSTimm Baeder  let Args = [ArgRecordDecl];
333a07aba5dSTimm Baeder}
334a07aba5dSTimm Baeder// [] -> [Pointer]
335a07aba5dSTimm Baederdef GetPtrThisBase : Opcode {
336a07aba5dSTimm Baeder  // Offset of field, which is a base.
337a07aba5dSTimm Baeder  let Args = [ArgUint32];
338a07aba5dSTimm Baeder}
339a07aba5dSTimm Baeder// [] -> [Pointer]
340a07aba5dSTimm Baederdef GetPtrThisVirtBase : Opcode {
341a07aba5dSTimm Baeder  // RecordDecl of base class.
342a07aba5dSTimm Baeder  let Args = [ArgRecordDecl];
343a07aba5dSTimm Baeder}
344a07aba5dSTimm Baeder// [] -> [Pointer]
345a07aba5dSTimm Baederdef This : Opcode;
346a07aba5dSTimm Baeder
347a07aba5dSTimm Baeder// [] -> [Pointer]
348a07aba5dSTimm Baederdef RVOPtr : Opcode;
349a07aba5dSTimm Baeder
350a07aba5dSTimm Baeder// [Pointer] -> [Pointer]
351a07aba5dSTimm Baederdef NarrowPtr : Opcode;
352a07aba5dSTimm Baeder// [Pointer] -> [Pointer]
353a07aba5dSTimm Baederdef ExpandPtr : Opcode;
354a07aba5dSTimm Baeder// [Pointer, Offset] -> [Pointer]
355a07aba5dSTimm Baederdef ArrayElemPtr : AluOpcode;
356a07aba5dSTimm Baederdef ArrayElemPtrPop : AluOpcode;
357a07aba5dSTimm Baeder
358a07aba5dSTimm Baederdef ArrayElemPop : Opcode {
359a07aba5dSTimm Baeder  let Args = [ArgUint32];
360a07aba5dSTimm Baeder  let Types = [AllTypeClass];
361a07aba5dSTimm Baeder  let HasGroup = 1;
362a07aba5dSTimm Baeder}
363a07aba5dSTimm Baeder
364a07aba5dSTimm Baederdef ArrayElem : Opcode {
365a07aba5dSTimm Baeder  let Args = [ArgUint32];
366a07aba5dSTimm Baeder  let Types = [AllTypeClass];
367a07aba5dSTimm Baeder  let HasGroup = 1;
368a07aba5dSTimm Baeder}
369a07aba5dSTimm Baeder
370a07aba5dSTimm Baederdef CopyArray : Opcode {
371a07aba5dSTimm Baeder  let Args = [ArgUint32, ArgUint32, ArgUint32];
372a07aba5dSTimm Baeder  let Types = [AllTypeClass];
373a07aba5dSTimm Baeder  let HasGroup = 1;
374a07aba5dSTimm Baeder}
375a07aba5dSTimm Baeder
376a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
377a07aba5dSTimm Baeder// Direct field accessors
378a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
379a07aba5dSTimm Baeder
380a07aba5dSTimm Baederclass AccessOpcode : Opcode {
381a07aba5dSTimm Baeder  let Types = [AllTypeClass];
382a07aba5dSTimm Baeder  let Args = [ArgUint32];
383a07aba5dSTimm Baeder  let HasGroup = 1;
384a07aba5dSTimm Baeder}
385a07aba5dSTimm Baeder
386a07aba5dSTimm Baederclass BitFieldOpcode : Opcode {
387a07aba5dSTimm Baeder  let Types = [AluTypeClass];
388a07aba5dSTimm Baeder  let Args = [ArgRecordField];
389a07aba5dSTimm Baeder  let HasGroup = 1;
390a07aba5dSTimm Baeder}
391a07aba5dSTimm Baeder
392a07aba5dSTimm Baeder// [] -> [Pointer]
393a07aba5dSTimm Baederdef GetLocal : AccessOpcode { let HasCustomEval = 1; }
394a07aba5dSTimm Baeder// [] -> [Pointer]
395a07aba5dSTimm Baederdef SetLocal : AccessOpcode { let HasCustomEval = 1; }
396a07aba5dSTimm Baeder
397a07aba5dSTimm Baederdef CheckDecl : Opcode {
398a07aba5dSTimm Baeder  let Args = [ArgVarDecl];
399a07aba5dSTimm Baeder}
400a07aba5dSTimm Baeder
401a07aba5dSTimm Baederdef CheckEnumValue : Opcode {
402a07aba5dSTimm Baeder  let Args = [ArgEnumDecl];
403a07aba5dSTimm Baeder  let Types = [FixedSizeIntegralTypeClass];
404a07aba5dSTimm Baeder  let HasGroup = 1;
405a07aba5dSTimm Baeder}
406a07aba5dSTimm Baeder
407a07aba5dSTimm Baederdef CheckLiteralType : Opcode {
408a07aba5dSTimm Baeder  let Args = [ArgTypePtr];
409a07aba5dSTimm Baeder}
410a07aba5dSTimm Baeder
411a07aba5dSTimm Baeder// [] -> [Value]
412a07aba5dSTimm Baederdef GetGlobal : AccessOpcode;
413a07aba5dSTimm Baederdef GetGlobalUnchecked : AccessOpcode;
414a07aba5dSTimm Baeder// [Value] -> []
415a07aba5dSTimm Baederdef InitGlobal : AccessOpcode;
416a07aba5dSTimm Baeder// [Value] -> []
417a07aba5dSTimm Baederdef InitGlobalTemp : AccessOpcode {
418a07aba5dSTimm Baeder  let Args = [ArgUint32, ArgLETD];
419a07aba5dSTimm Baeder}
420a07aba5dSTimm Baeder// [Pointer] -> [Pointer]
421a07aba5dSTimm Baederdef InitGlobalTempComp : Opcode {
422a07aba5dSTimm Baeder  let Args = [ArgLETD];
423a07aba5dSTimm Baeder}
424a07aba5dSTimm Baeder// [Value] -> []
425a07aba5dSTimm Baederdef SetGlobal : AccessOpcode;
426a07aba5dSTimm Baeder
427a07aba5dSTimm Baeder// [] -> [Value]
428a07aba5dSTimm Baederdef GetParam : AccessOpcode;
429a07aba5dSTimm Baeder// [Value] -> []
430a07aba5dSTimm Baederdef SetParam : AccessOpcode;
431a07aba5dSTimm Baeder
432a07aba5dSTimm Baeder// [Pointer] -> [Pointer, Value]
433a07aba5dSTimm Baederdef GetField : AccessOpcode;
434a07aba5dSTimm Baeder// [Pointer] -> [Value]
435a07aba5dSTimm Baederdef GetFieldPop : AccessOpcode;
436a07aba5dSTimm Baeder// [] -> [Value]
437a07aba5dSTimm Baederdef GetThisField : AccessOpcode;
438a07aba5dSTimm Baeder
439a07aba5dSTimm Baeder// [Pointer, Value] -> [Pointer]
440a07aba5dSTimm Baederdef SetField : AccessOpcode;
441a07aba5dSTimm Baeder// [Value] -> []
442a07aba5dSTimm Baederdef SetThisField : AccessOpcode;
443a07aba5dSTimm Baeder
444a07aba5dSTimm Baeder// [Value] -> []
445a07aba5dSTimm Baederdef InitThisField : AccessOpcode;
446a07aba5dSTimm Baeder// [Value] -> []
447a07aba5dSTimm Baederdef InitThisBitField : Opcode {
448a07aba5dSTimm Baeder  let Types = [AluTypeClass];
449a07aba5dSTimm Baeder  let Args = [ArgRecordField, ArgUint32];
450a07aba5dSTimm Baeder  let HasGroup = 1;
451a07aba5dSTimm Baeder}
452a07aba5dSTimm Baeder// [Pointer, Value] -> []
453a07aba5dSTimm Baederdef InitField : AccessOpcode;
454a07aba5dSTimm Baeder// [Pointer, Value] -> []
455a07aba5dSTimm Baederdef InitBitField : BitFieldOpcode;
456a07aba5dSTimm Baeder
457a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
458a07aba5dSTimm Baeder// Pointer access
459a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
460a07aba5dSTimm Baeder
461a07aba5dSTimm Baederclass LoadOpcode : Opcode {
462a07aba5dSTimm Baeder  let Types = [AllTypeClass];
463a07aba5dSTimm Baeder  let HasGroup = 1;
464a07aba5dSTimm Baeder}
465a07aba5dSTimm Baeder
466a07aba5dSTimm Baeder// [Pointer] -> [Pointer, Value]
467a07aba5dSTimm Baederdef Load : LoadOpcode {}
468a07aba5dSTimm Baeder// [Pointer] -> [Value]
469a07aba5dSTimm Baederdef LoadPop : LoadOpcode {}
470a07aba5dSTimm Baeder
471a07aba5dSTimm Baederclass StoreOpcode : Opcode {
472a07aba5dSTimm Baeder  let Types = [AllTypeClass];
473a07aba5dSTimm Baeder  let HasGroup = 1;
474a07aba5dSTimm Baeder}
475a07aba5dSTimm Baeder
476a07aba5dSTimm Baederclass StoreBitFieldOpcode : Opcode {
477a07aba5dSTimm Baeder  let Types = [AluTypeClass];
478a07aba5dSTimm Baeder  let HasGroup = 1;
479a07aba5dSTimm Baeder}
480a07aba5dSTimm Baeder
481a07aba5dSTimm Baeder// [Pointer, Value] -> [Pointer]
482a07aba5dSTimm Baederdef Store : StoreOpcode {}
483a07aba5dSTimm Baeder// [Pointer, Value] -> []
484a07aba5dSTimm Baederdef StorePop : StoreOpcode {}
485a07aba5dSTimm Baeder
486a07aba5dSTimm Baeder// [Pointer, Value] -> [Pointer]
487a07aba5dSTimm Baederdef StoreBitField : StoreBitFieldOpcode {}
488a07aba5dSTimm Baeder// [Pointer, Value] -> []
489a07aba5dSTimm Baederdef StoreBitFieldPop : StoreBitFieldOpcode {}
490a07aba5dSTimm Baeder
491a07aba5dSTimm Baeder// [Pointer, Value] -> []
492a07aba5dSTimm Baederdef Init : StoreOpcode {}
493a07aba5dSTimm Baederdef InitPop : StoreOpcode {}
494a07aba5dSTimm Baeder// [Pointer, Value] -> [Pointer]
495a07aba5dSTimm Baederdef InitElem : Opcode {
496a07aba5dSTimm Baeder  let Types = [AllTypeClass];
497a07aba5dSTimm Baeder  let Args = [ArgUint32];
498a07aba5dSTimm Baeder  let HasGroup = 1;
499a07aba5dSTimm Baeder}
500a07aba5dSTimm Baeder// [Pointer, Value] -> []
501a07aba5dSTimm Baederdef InitElemPop : Opcode {
502a07aba5dSTimm Baeder  let Types = [AllTypeClass];
503a07aba5dSTimm Baeder  let Args = [ArgUint32];
504a07aba5dSTimm Baeder  let HasGroup = 1;
505a07aba5dSTimm Baeder}
506a07aba5dSTimm Baeder
507a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
508a07aba5dSTimm Baeder// Pointer arithmetic.
509a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
510a07aba5dSTimm Baeder
511a07aba5dSTimm Baeder// [Pointer, Integral] -> [Pointer]
512a07aba5dSTimm Baederdef AddOffset : AluOpcode;
513a07aba5dSTimm Baeder// [Pointer, Integral] -> [Pointer]
514a07aba5dSTimm Baederdef SubOffset : AluOpcode;
515a07aba5dSTimm Baeder
516a07aba5dSTimm Baeder// [Pointer, Pointer] -> [Integral]
517a07aba5dSTimm Baederdef SubPtr : Opcode {
518a07aba5dSTimm Baeder  let Types = [IntegerTypeClass];
519a07aba5dSTimm Baeder  let HasGroup = 1;
520a07aba5dSTimm Baeder}
521a07aba5dSTimm Baeder
522a07aba5dSTimm Baeder// [Pointer] -> [Pointer]
523a07aba5dSTimm Baederdef IncPtr : Opcode;
524a07aba5dSTimm Baeder// [Pointer] -> [Pointer]
525a07aba5dSTimm Baederdef DecPtr : Opcode;
526a07aba5dSTimm Baeder
527a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
528a07aba5dSTimm Baeder// Function pointers.
529a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
530a07aba5dSTimm Baederdef GetFnPtr : Opcode {
531a07aba5dSTimm Baeder  let Args = [ArgFunction];
532a07aba5dSTimm Baeder}
533a07aba5dSTimm Baeder
534a07aba5dSTimm Baederdef GetIntPtr : Opcode {
535a07aba5dSTimm Baeder  let Types = [AluTypeClass];
536a07aba5dSTimm Baeder  let Args = [ArgDesc];
537a07aba5dSTimm Baeder  let HasGroup = 1;
538a07aba5dSTimm Baeder}
539a07aba5dSTimm Baeder
540a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
541a07aba5dSTimm Baeder// Binary operators.
542a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
543a07aba5dSTimm Baeder
544a07aba5dSTimm Baeder// [Real, Real] -> [Real]
545a07aba5dSTimm Baederdef Add  : AluOpcode;
546a07aba5dSTimm Baederdef Addf : FloatOpcode;
547a07aba5dSTimm Baederdef Sub  : AluOpcode;
548a07aba5dSTimm Baederdef Subf : FloatOpcode;
549a07aba5dSTimm Baederdef Mul  : AluOpcode;
550a07aba5dSTimm Baederdef Mulf : FloatOpcode;
551a07aba5dSTimm Baederdef Mulc : Opcode {
552a07aba5dSTimm Baeder  let Types = [NumberTypeClass];
553a07aba5dSTimm Baeder  let HasGroup = 1;
554a07aba5dSTimm Baeder}
555a07aba5dSTimm Baederdef Rem  : IntegerOpcode;
556a07aba5dSTimm Baederdef Div  : IntegerOpcode;
557a07aba5dSTimm Baederdef Divf : FloatOpcode;
558a07aba5dSTimm Baederdef Divc : Opcode {
559a07aba5dSTimm Baeder  let Types = [NumberTypeClass];
560a07aba5dSTimm Baeder  let HasGroup = 1;
561a07aba5dSTimm Baeder}
562a07aba5dSTimm Baeder
563a07aba5dSTimm Baederdef BitAnd : IntegerOpcode;
564a07aba5dSTimm Baederdef BitOr : IntegerOpcode;
565a07aba5dSTimm Baederdef BitXor : IntegerOpcode;
566a07aba5dSTimm Baeder
567a07aba5dSTimm Baederdef Shl : Opcode {
568a07aba5dSTimm Baeder  let Types = [IntegerTypeClass, IntegerTypeClass];
569a07aba5dSTimm Baeder  let HasGroup = 1;
570a07aba5dSTimm Baeder}
571a07aba5dSTimm Baeder
572a07aba5dSTimm Baederdef Shr : Opcode {
573a07aba5dSTimm Baeder  let Types = [IntegerTypeClass, IntegerTypeClass];
574a07aba5dSTimm Baeder  let HasGroup = 1;
575a07aba5dSTimm Baeder}
576a07aba5dSTimm Baeder
577a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
578a07aba5dSTimm Baeder// Unary operators.
579a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
580a07aba5dSTimm Baeder
581d082f1f3STimm Bäder// [Bool] -> [Bool]
582d082f1f3STimm Bäderdef Inv: Opcode;
583a07aba5dSTimm Baeder
584a07aba5dSTimm Baeder// Increment and decrement.
585a07aba5dSTimm Baederdef Inc: AluOpcode;
586a07aba5dSTimm Baederdef IncPop : AluOpcode;
587a07aba5dSTimm Baederdef Dec: AluOpcode;
588a07aba5dSTimm Baederdef DecPop: AluOpcode;
589a07aba5dSTimm Baeder
590a07aba5dSTimm Baeder// Float increment and decrement.
591a07aba5dSTimm Baederdef Incf: FloatOpcode;
592a07aba5dSTimm Baederdef IncfPop : FloatOpcode;
593a07aba5dSTimm Baederdef Decf: FloatOpcode;
594a07aba5dSTimm Baederdef DecfPop : FloatOpcode;
595a07aba5dSTimm Baeder
596a07aba5dSTimm Baeder// [Real] -> [Real]
597a07aba5dSTimm Baederdef Neg: Opcode {
598a07aba5dSTimm Baeder  let Types = [NonPtrTypeClass];
599a07aba5dSTimm Baeder  let HasGroup = 1;
600a07aba5dSTimm Baeder}
601a07aba5dSTimm Baeder
602a07aba5dSTimm Baeder// [Real] -> [Real]
603a07aba5dSTimm Baederdef Comp: Opcode {
604a07aba5dSTimm Baeder  let Types = [IntegerTypeClass];
605a07aba5dSTimm Baeder  let HasGroup = 1;
606a07aba5dSTimm Baeder}
607a07aba5dSTimm Baeder
608360e4abfSTimm Baederdef IsNonNull : Opcode {
609360e4abfSTimm Baeder  let Types = [PtrTypeClass];
610360e4abfSTimm Baeder  let HasGroup = 1;
611360e4abfSTimm Baeder}
612360e4abfSTimm Baeder
613a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
614a07aba5dSTimm Baeder// Cast, CastFP.
615a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
616a07aba5dSTimm Baeder
617a07aba5dSTimm Baederdef FromCastTypeClass : TypeClass {
618048bc672STimm Baeder  let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64, Bool, IntAP, IntAPS, FixedPoint];
619a07aba5dSTimm Baeder}
620a07aba5dSTimm Baeder
621a07aba5dSTimm Baederdef ToCastTypeClass : TypeClass {
622a07aba5dSTimm Baeder  let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64, Bool];
623a07aba5dSTimm Baeder}
624a07aba5dSTimm Baeder
625a07aba5dSTimm Baederdef Cast: Opcode {
626a07aba5dSTimm Baeder  let Types = [FromCastTypeClass, ToCastTypeClass];
627a07aba5dSTimm Baeder  let HasGroup = 1;
628a07aba5dSTimm Baeder}
629a07aba5dSTimm Baeder
630a07aba5dSTimm Baederdef CastFP : Opcode {
631a07aba5dSTimm Baeder  let Args = [ArgFltSemantics, ArgRoundingMode];
632a07aba5dSTimm Baeder}
633a07aba5dSTimm Baeder
634c2a37e41STimm Baederdef CastFixedPoint : Opcode {
635c2a37e41STimm Baeder  let Args = [ArgUint32];
636c2a37e41STimm Baeder}
637c2a37e41STimm Baeder
638a07aba5dSTimm Baederdef FixedSizeIntegralTypes : TypeClass {
639a07aba5dSTimm Baeder  let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64, Bool];
640a07aba5dSTimm Baeder}
641a07aba5dSTimm Baeder
642a07aba5dSTimm Baederdef CastAP : Opcode {
643a07aba5dSTimm Baeder  let Types = [AluTypeClass];
644a07aba5dSTimm Baeder  let Args = [ArgUint32];
645a07aba5dSTimm Baeder  let HasGroup = 1;
646a07aba5dSTimm Baeder}
647a07aba5dSTimm Baeder
648a07aba5dSTimm Baederdef CastAPS : Opcode {
649a07aba5dSTimm Baeder  let Types = [AluTypeClass];
650a07aba5dSTimm Baeder  let Args = [ArgUint32];
651a07aba5dSTimm Baeder  let HasGroup = 1;
652a07aba5dSTimm Baeder}
653a07aba5dSTimm Baeder
654a07aba5dSTimm Baeder// Cast an integer to a floating type
655a07aba5dSTimm Baederdef CastIntegralFloating : Opcode {
656a07aba5dSTimm Baeder  let Types = [AluTypeClass];
6570f5f440fSTimm Baeder  let Args = [ArgFltSemantics, ArgUint32];
658a07aba5dSTimm Baeder  let HasGroup = 1;
659a07aba5dSTimm Baeder}
660a07aba5dSTimm Baeder
661a07aba5dSTimm Baeder// Cast a floating to an integer type
662a07aba5dSTimm Baederdef CastFloatingIntegral : Opcode {
663a07aba5dSTimm Baeder  let Types = [FixedSizeIntegralTypes];
6640f5f440fSTimm Baeder  let Args = [ArgUint32];
665a07aba5dSTimm Baeder  let HasGroup = 1;
666a07aba5dSTimm Baeder}
667a07aba5dSTimm Baeder
668a07aba5dSTimm Baederdef CastFloatingIntegralAP : Opcode {
6690f5f440fSTimm Baeder  let Args = [ArgUint32, ArgUint32];
670a07aba5dSTimm Baeder}
671a07aba5dSTimm Baeder
672a07aba5dSTimm Baederdef CastFloatingIntegralAPS : Opcode {
6730f5f440fSTimm Baeder  let Args = [ArgUint32, ArgUint32];
674a07aba5dSTimm Baeder}
675a07aba5dSTimm Baeder
676a07aba5dSTimm Baederdef CastPointerIntegral : Opcode {
677a07aba5dSTimm Baeder  let Types = [FixedSizeIntegralTypeClass];
678a07aba5dSTimm Baeder  let HasGroup = 1;
679a07aba5dSTimm Baeder}
680a07aba5dSTimm Baederdef CastPointerIntegralAP : Opcode {
681a07aba5dSTimm Baeder  let Args = [ArgUint32];
682a07aba5dSTimm Baeder}
683a07aba5dSTimm Baederdef CastPointerIntegralAPS : Opcode {
684a07aba5dSTimm Baeder  let Args = [ArgUint32];
685a07aba5dSTimm Baeder}
686641b4d53STimm Baederdef CastIntegralFixedPoint : Opcode {
687641b4d53STimm Baeder  let Types = [FixedSizeIntegralTypes];
688641b4d53STimm Baeder  let Args = [ArgUint32];
689641b4d53STimm Baeder  let HasGroup = 1;
690641b4d53STimm Baeder}
6916cbd8a30STimm Baederdef CastFloatingFixedPoint : Opcode {
6926cbd8a30STimm Baeder  let Args = [ArgUint32];
6936cbd8a30STimm Baeder}
6943a5b9da1STimm Baederdef CastFixedPointFloating : Opcode {
6953a5b9da1STimm Baeder  let Args = [ArgFltSemantics];
6963a5b9da1STimm Baeder}
69795ce78b7STimm Baederdef CastFixedPointIntegral : Opcode {
69895ce78b7STimm Baeder  let Types = [FixedSizeIntegralTypes];
69995ce78b7STimm Baeder  let HasGroup = 1;
70095ce78b7STimm Baeder}
7016f04e65cSTimm Baederdef ShiftFixedPoint : Opcode {
7026f04e65cSTimm Baeder  let Args = [ArgBool];
7036f04e65cSTimm Baeder}
704641b4d53STimm Baeder
705a07aba5dSTimm Baederdef PtrPtrCast : Opcode {
706a07aba5dSTimm Baeder  let Args = [ArgBool];
707a07aba5dSTimm Baeder
708a07aba5dSTimm Baeder}
709a07aba5dSTimm Baeder
710a07aba5dSTimm Baederdef DecayPtr : Opcode {
711a07aba5dSTimm Baeder  let Types = [PtrTypeClass, PtrTypeClass];
712a07aba5dSTimm Baeder  let HasGroup = 1;
713a07aba5dSTimm Baeder}
714a07aba5dSTimm Baeder
715a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
716a07aba5dSTimm Baeder// Comparison opcodes.
717a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
718a07aba5dSTimm Baeder
719a07aba5dSTimm Baederclass EqualityOpcode : Opcode {
720a07aba5dSTimm Baeder  let Types = [AllTypeClass];
721a07aba5dSTimm Baeder  let HasGroup = 1;
722a07aba5dSTimm Baeder}
723a07aba5dSTimm Baeder
724a07aba5dSTimm Baederdef EQ : EqualityOpcode;
725a07aba5dSTimm Baederdef NE : EqualityOpcode;
726a07aba5dSTimm Baeder
727a07aba5dSTimm Baederclass ComparisonOpcode : Opcode {
728a07aba5dSTimm Baeder  let Types = [ComparableTypeClass];
729a07aba5dSTimm Baeder  let HasGroup = 1;
730a07aba5dSTimm Baeder}
731a07aba5dSTimm Baeder
732a07aba5dSTimm Baederdef CMP3 : ComparisonOpcode {
733a07aba5dSTimm Baeder  let Args = [ArgCCI];
734a07aba5dSTimm Baeder}
735a07aba5dSTimm Baeder
736a07aba5dSTimm Baederdef LT : ComparisonOpcode;
737a07aba5dSTimm Baederdef LE : ComparisonOpcode;
738a07aba5dSTimm Baederdef GT : ComparisonOpcode;
739a07aba5dSTimm Baederdef GE : ComparisonOpcode;
740a07aba5dSTimm Baeder
741a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
742a07aba5dSTimm Baeder// Stack management.
743a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
744a07aba5dSTimm Baeder
745a07aba5dSTimm Baeder// [Value] -> []
746a07aba5dSTimm Baederdef Pop : Opcode {
747a07aba5dSTimm Baeder  let Types = [AllTypeClass];
748a07aba5dSTimm Baeder  let HasGroup = 1;
749a07aba5dSTimm Baeder}
750a07aba5dSTimm Baeder
751a07aba5dSTimm Baeder// [Value] -> [Value, Value]
752a07aba5dSTimm Baederdef Dup : Opcode {
753a07aba5dSTimm Baeder  let Types = [AllTypeClass];
754a07aba5dSTimm Baeder  let HasGroup = 1;
755a07aba5dSTimm Baeder}
756a07aba5dSTimm Baeder
757a07aba5dSTimm Baederdef Flip : Opcode {
758a07aba5dSTimm Baeder  let Types = [AllTypeClass, AllTypeClass];
759a07aba5dSTimm Baeder  let HasGroup = 1;
760a07aba5dSTimm Baeder}
761a07aba5dSTimm Baeder
762a07aba5dSTimm Baeder// [] -> []
763a07aba5dSTimm Baederdef Invalid : Opcode {}
764a07aba5dSTimm Baederdef Unsupported : Opcode {}
765a07aba5dSTimm Baederdef Error : Opcode {}
76683fea8b8STimm Baederdef SideEffect : Opcode {}
767a07aba5dSTimm Baederdef InvalidCast : Opcode {
768a07aba5dSTimm Baeder  let Args = [ArgCastKind, ArgBool];
769a07aba5dSTimm Baeder}
770a07aba5dSTimm Baeder
771a07aba5dSTimm Baederdef InvalidDeclRef : Opcode {
772159f2530STimm Baeder  let Args = [ArgDeclRef, ArgBool];
773a07aba5dSTimm Baeder}
774a07aba5dSTimm Baeder
775a07aba5dSTimm Baederdef SizelessVectorElementSize : Opcode;
776fed8695bSTimm Baederdef InvalidShuffleVectorIndex : Opcode {
777fed8695bSTimm Baeder  let Args = [ArgUint32];
778fed8695bSTimm Baeder}
779a07aba5dSTimm Baeder
780a07aba5dSTimm Baederdef Assume : Opcode;
781a07aba5dSTimm Baeder
782a07aba5dSTimm Baederdef ArrayDecay : Opcode;
783a07aba5dSTimm Baeder
784a07aba5dSTimm Baederdef CheckNonNullArg : Opcode {
785a07aba5dSTimm Baeder  let Types = [PtrTypeClass];
786a07aba5dSTimm Baeder  let HasGroup = 1;
787a07aba5dSTimm Baeder}
788a07aba5dSTimm Baeder
789a07aba5dSTimm Baederdef Memcpy : Opcode;
790a07aba5dSTimm Baeder
791a07aba5dSTimm Baederdef ToMemberPtr : Opcode;
792a07aba5dSTimm Baederdef CastMemberPtrPtr : Opcode;
793a07aba5dSTimm Baederdef GetMemberPtr : Opcode {
7946f81c878STimm Baeder  let Args = [ArgValueDecl];
795a07aba5dSTimm Baeder}
796a07aba5dSTimm Baederdef GetMemberPtrBase : Opcode;
797a07aba5dSTimm Baederdef GetMemberPtrDecl : Opcode;
798a07aba5dSTimm Baeder
799a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
800a07aba5dSTimm Baeder// Debugging.
801a07aba5dSTimm Baeder//===----------------------------------------------------------------------===//
802a07aba5dSTimm Baederdef Dump : Opcode;
803a07aba5dSTimm Baeder
804a07aba5dSTimm Baederdef Alloc : Opcode {
805a07aba5dSTimm Baeder  let Args = [ArgDesc];
806a07aba5dSTimm Baeder}
807a07aba5dSTimm Baeder
808a07aba5dSTimm Baederdef AllocN : Opcode {
809a07aba5dSTimm Baeder  let Types = [IntegerTypeClass];
810a07aba5dSTimm Baeder  let Args = [ArgPrimType, ArgExpr, ArgBool];
811a07aba5dSTimm Baeder  let HasGroup = 1;
812a07aba5dSTimm Baeder}
813a07aba5dSTimm Baeder
814a07aba5dSTimm Baederdef AllocCN : Opcode {
815a07aba5dSTimm Baeder  let Types = [IntegerTypeClass];
816a07aba5dSTimm Baeder  let Args = [ArgDesc, ArgBool];
817a07aba5dSTimm Baeder  let HasGroup = 1;
818a07aba5dSTimm Baeder}
819a07aba5dSTimm Baeder
820a07aba5dSTimm Baederdef Free : Opcode {
821f93258e4STimm Baeder  let Args = [ArgBool, ArgBool];
822a07aba5dSTimm Baeder}
823b9c4c4ccSTimm Baeder
824c712ab82STimm Baederdef CheckNewTypeMismatch : Opcode {
825c712ab82STimm Baeder  let Args = [ArgExpr];
826c712ab82STimm Baeder}
827c712ab82STimm Baeder
828c712ab82STimm Baederdef InvalidNewDeleteExpr : Opcode {
829c712ab82STimm Baeder  let Args = [ArgExpr];
830c712ab82STimm Baeder}
831c712ab82STimm Baeder
832c712ab82STimm Baederdef CheckNewTypeMismatchArray : Opcode {
833c712ab82STimm Baeder  let Types = [IntegerTypeClass];
834c712ab82STimm Baeder  let Args = [ArgExpr];
835c712ab82STimm Baeder  let HasGroup = 1;
836c712ab82STimm Baeder}
837c712ab82STimm Baeder
838b9c4c4ccSTimm Baederdef IsConstantContext: Opcode;
8393eaf4a9dSTimm Baederdef CheckAllocations : Opcode;
840ef2a104cSTimm Baeder
841ef2a104cSTimm Baederdef BitCastTypeClass : TypeClass {
84256fd46edSTimm Baeder  let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64,
84356fd46edSTimm Baeder               IntAP, IntAPS, Bool, Float, Ptr];
844ef2a104cSTimm Baeder}
845ef2a104cSTimm Baeder
84656fd46edSTimm Baederdef BitCastPrim : Opcode {
847ef2a104cSTimm Baeder  let Types = [BitCastTypeClass];
848ef2a104cSTimm Baeder  let Args = [ArgBool, ArgUint32, ArgFltSemantics];
849ef2a104cSTimm Baeder  let HasGroup = 1;
850ef2a104cSTimm Baeder}
8512588b8beSTimm Baeder
85256fd46edSTimm Baederdef BitCast : Opcode;
853*e86b68ffSTimm Baeder
854*e86b68ffSTimm Baederdef GetTypeid : Opcode { let Args = [ArgTypePtr, ArgTypePtr]; }
855*e86b68ffSTimm Baederdef GetTypeidPtr : Opcode { let Args = [ArgTypePtr]; }
856*e86b68ffSTimm Baederdef DiagTypeid : Opcode;
857