xref: /freebsd-src/contrib/llvm-project/clang/lib/AST/Interp/Opcodes.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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;
285f757f3fSDimitry Andricdef IntAP : Type;
295f757f3fSDimitry Andricdef IntAPS : Type;
3006c3fb27SDimitry Andricdef Float : Type;
31a7dea167SDimitry Andricdef Ptr : Type;
3206c3fb27SDimitry Andricdef FnPtr : Type;
33*0fca6ea1SDimitry Andricdef MemberPtr : Type;
34a7dea167SDimitry Andric
35a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
36a7dea167SDimitry Andric// Types transferred to the interpreter.
37a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
38a7dea167SDimitry Andric
39*0fca6ea1SDimitry Andricclass ArgType { string Name = ?; bit AsRef = false; }
40a7dea167SDimitry Andricdef ArgSint8 : ArgType { let Name = "int8_t"; }
41a7dea167SDimitry Andricdef ArgUint8 : ArgType { let Name = "uint8_t"; }
42a7dea167SDimitry Andricdef ArgSint16 : ArgType { let Name = "int16_t"; }
43a7dea167SDimitry Andricdef ArgUint16 : ArgType { let Name = "uint16_t"; }
44a7dea167SDimitry Andricdef ArgSint32 : ArgType { let Name = "int32_t"; }
45a7dea167SDimitry Andricdef ArgUint32 : ArgType { let Name = "uint32_t"; }
46a7dea167SDimitry Andricdef ArgSint64 : ArgType { let Name = "int64_t"; }
47a7dea167SDimitry Andricdef ArgUint64 : ArgType { let Name = "uint64_t"; }
48*0fca6ea1SDimitry Andricdef ArgIntAP : ArgType { let Name = "IntegralAP<false>"; let AsRef = true; }
49*0fca6ea1SDimitry Andricdef ArgIntAPS : ArgType { let Name = "IntegralAP<true>"; let AsRef = true; }
50*0fca6ea1SDimitry Andricdef ArgFloat : ArgType { let Name = "Floating"; let AsRef = true; }
51a7dea167SDimitry Andricdef ArgBool : ArgType { let Name = "bool"; }
52a7dea167SDimitry Andric
53bdd1243dSDimitry Andricdef ArgFunction : ArgType { let Name = "const Function *"; }
54a7dea167SDimitry Andricdef ArgRecordDecl : ArgType { let Name = "const RecordDecl *"; }
55a7dea167SDimitry Andricdef ArgRecordField : ArgType { let Name = "const Record::Field *"; }
5606c3fb27SDimitry Andricdef ArgFltSemantics : ArgType { let Name = "const llvm::fltSemantics *"; }
5706c3fb27SDimitry Andricdef ArgRoundingMode : ArgType { let Name = "llvm::RoundingMode"; }
5806c3fb27SDimitry Andricdef ArgLETD: ArgType { let Name = "const LifetimeExtendedTemporaryDecl *"; }
595f757f3fSDimitry Andricdef ArgCastKind : ArgType { let Name = "CastKind"; }
605f757f3fSDimitry Andricdef ArgCallExpr : ArgType { let Name = "const CallExpr *"; }
61*0fca6ea1SDimitry Andricdef ArgExpr : ArgType { let Name = "const Expr *"; }
625f757f3fSDimitry Andricdef ArgOffsetOfExpr : ArgType { let Name = "const OffsetOfExpr *"; }
635f757f3fSDimitry Andricdef ArgDeclRef : ArgType { let Name = "const DeclRefExpr *"; }
645f757f3fSDimitry Andricdef ArgCCI : ArgType { let Name = "const ComparisonCategoryInfo *"; }
65*0fca6ea1SDimitry Andricdef ArgDecl : ArgType { let Name = "const Decl*"; }
66*0fca6ea1SDimitry Andricdef ArgVarDecl : ArgType { let Name = "const VarDecl*"; }
67*0fca6ea1SDimitry Andricdef ArgDesc : ArgType { let Name = "const Descriptor *"; }
68*0fca6ea1SDimitry Andricdef ArgPrimType : ArgType { let Name = "PrimType"; }
69*0fca6ea1SDimitry Andricdef ArgEnumDecl : ArgType { let Name = "const EnumDecl *"; }
70a7dea167SDimitry Andric
71a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
72349cc55cSDimitry Andric// Classes of types instructions operate on.
73a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
74a7dea167SDimitry Andric
75a7dea167SDimitry Andricclass TypeClass {
76a7dea167SDimitry Andric  list<Type> Types;
77a7dea167SDimitry Andric}
78a7dea167SDimitry Andric
79bdd1243dSDimitry Andricdef IntegerTypeClass : TypeClass {
80bdd1243dSDimitry Andric  let Types = [Sint8, Uint8, Sint16, Uint16, Sint32,
815f757f3fSDimitry Andric               Uint32, Sint64, Uint64, IntAP, IntAPS];
825f757f3fSDimitry Andric}
835f757f3fSDimitry Andric
845f757f3fSDimitry Andricdef FixedSizeIntegralTypeClass : TypeClass {
855f757f3fSDimitry Andric  let Types = [Sint8, Uint8, Sint16, Uint16, Sint32,
865f757f3fSDimitry Andric               Uint32, Sint64, Uint64, Bool];
87bdd1243dSDimitry Andric}
88bdd1243dSDimitry Andric
8906c3fb27SDimitry Andricdef NumberTypeClass : TypeClass {
9006c3fb27SDimitry Andric  let Types = !listconcat(IntegerTypeClass.Types, [Float]);
9106c3fb27SDimitry Andric}
9206c3fb27SDimitry Andric
9306c3fb27SDimitry Andricdef FloatTypeClass : TypeClass {
9406c3fb27SDimitry Andric  let Types = [Float];
9506c3fb27SDimitry Andric}
9606c3fb27SDimitry Andric
97bdd1243dSDimitry Andricdef AluTypeClass : TypeClass {
9806c3fb27SDimitry Andric  let Types = !listconcat(IntegerTypeClass.Types, [Bool]);
99a7dea167SDimitry Andric}
100a7dea167SDimitry Andric
101a7dea167SDimitry Andricdef PtrTypeClass : TypeClass {
102*0fca6ea1SDimitry Andric  let Types = [Ptr, FnPtr, MemberPtr];
103a7dea167SDimitry Andric}
104a7dea167SDimitry Andric
105bdd1243dSDimitry Andricdef BoolTypeClass : TypeClass {
106bdd1243dSDimitry Andric  let Types = [Bool];
107bdd1243dSDimitry Andric}
108bdd1243dSDimitry Andric
10906c3fb27SDimitry Andricdef NonPtrTypeClass : TypeClass {
11006c3fb27SDimitry Andric  let Types = !listconcat(IntegerTypeClass.Types, [Bool], [Float]);
11106c3fb27SDimitry Andric}
11206c3fb27SDimitry Andric
113a7dea167SDimitry Andricdef AllTypeClass : TypeClass {
11406c3fb27SDimitry Andric  let Types = !listconcat(AluTypeClass.Types, PtrTypeClass.Types, FloatTypeClass.Types);
115a7dea167SDimitry Andric}
116a7dea167SDimitry Andric
117a7dea167SDimitry Andricdef ComparableTypeClass : TypeClass {
11806c3fb27SDimitry Andric  let Types = !listconcat(AluTypeClass.Types, [Ptr], [Float], [FnPtr]);
119a7dea167SDimitry Andric}
120a7dea167SDimitry Andric
121a7dea167SDimitry Andricclass SingletonTypeClass<Type Ty> : TypeClass {
122a7dea167SDimitry Andric  let Types = [Ty];
123a7dea167SDimitry Andric}
124a7dea167SDimitry Andric
125a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
126a7dea167SDimitry Andric// Record describing all opcodes.
127a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
128a7dea167SDimitry Andric
129a7dea167SDimitry Andricclass Opcode {
130a7dea167SDimitry Andric  list<TypeClass> Types = [];
131a7dea167SDimitry Andric  list<ArgType> Args = [];
132a7dea167SDimitry Andric  string Name = "";
133a7dea167SDimitry Andric  bit CanReturn = 0;
134a7dea167SDimitry Andric  bit ChangesPC = 0;
135a7dea167SDimitry Andric  bit HasCustomLink = 0;
136a7dea167SDimitry Andric  bit HasCustomEval = 0;
137a7dea167SDimitry Andric  bit HasGroup = 0;
138a7dea167SDimitry Andric}
139a7dea167SDimitry Andric
140a7dea167SDimitry Andricclass AluOpcode : Opcode {
141a7dea167SDimitry Andric  let Types = [AluTypeClass];
142a7dea167SDimitry Andric  let HasGroup = 1;
143a7dea167SDimitry Andric}
144a7dea167SDimitry Andric
14506c3fb27SDimitry Andricclass FloatOpcode : Opcode {
14606c3fb27SDimitry Andric  let Args = [ArgRoundingMode];
14706c3fb27SDimitry Andric}
14806c3fb27SDimitry Andric
149bdd1243dSDimitry Andricclass IntegerOpcode : Opcode {
150bdd1243dSDimitry Andric  let Types = [IntegerTypeClass];
151bdd1243dSDimitry Andric  let HasGroup = 1;
152bdd1243dSDimitry Andric}
153bdd1243dSDimitry Andric
154a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
155a7dea167SDimitry Andric// Jump opcodes
156a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
157a7dea167SDimitry Andric
158a7dea167SDimitry Andricclass JumpOpcode : Opcode {
159a7dea167SDimitry Andric  let Args = [ArgSint32];
160a7dea167SDimitry Andric  let ChangesPC = 1;
161a7dea167SDimitry Andric  let HasCustomEval = 1;
162a7dea167SDimitry Andric}
163a7dea167SDimitry Andric
164a7dea167SDimitry Andric// [] -> []
165a7dea167SDimitry Andricdef Jmp : JumpOpcode;
166a7dea167SDimitry Andric// [Bool] -> [], jumps if true.
167a7dea167SDimitry Andricdef Jt : JumpOpcode;
168a7dea167SDimitry Andric// [Bool] -> [], jumps if false.
169a7dea167SDimitry Andricdef Jf : JumpOpcode;
170a7dea167SDimitry Andric
171a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
172a7dea167SDimitry Andric// Returns
173a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
174a7dea167SDimitry Andric
175a7dea167SDimitry Andric// [Value] -> []
176a7dea167SDimitry Andricdef Ret : Opcode {
177a7dea167SDimitry Andric  let Types = [AllTypeClass];
178a7dea167SDimitry Andric  let ChangesPC = 1;
179a7dea167SDimitry Andric  let CanReturn = 1;
180a7dea167SDimitry Andric  let HasGroup = 1;
181a7dea167SDimitry Andric  let HasCustomEval = 1;
182a7dea167SDimitry Andric}
183a7dea167SDimitry Andric// [] -> []
184a7dea167SDimitry Andricdef RetVoid : Opcode {
185a7dea167SDimitry Andric  let CanReturn = 1;
186a7dea167SDimitry Andric  let ChangesPC = 1;
187a7dea167SDimitry Andric  let HasCustomEval = 1;
188a7dea167SDimitry Andric}
189a7dea167SDimitry Andric// [Value] -> []
190a7dea167SDimitry Andricdef RetValue : Opcode {
191a7dea167SDimitry Andric  let CanReturn = 1;
192a7dea167SDimitry Andric  let ChangesPC = 1;
193a7dea167SDimitry Andric  let HasCustomEval = 1;
194a7dea167SDimitry Andric}
195a7dea167SDimitry Andric// [] -> EXIT
196a7dea167SDimitry Andricdef NoRet : Opcode {}
197a7dea167SDimitry Andric
198bdd1243dSDimitry Andric
199bdd1243dSDimitry Andricdef Call : Opcode {
200*0fca6ea1SDimitry Andric  let Args = [ArgFunction, ArgUint32];
20106c3fb27SDimitry Andric}
20206c3fb27SDimitry Andric
20306c3fb27SDimitry Andricdef CallVirt : Opcode {
204*0fca6ea1SDimitry Andric  let Args = [ArgFunction, ArgUint32];
20506c3fb27SDimitry Andric}
20606c3fb27SDimitry Andric
20706c3fb27SDimitry Andricdef CallBI : Opcode {
2085f757f3fSDimitry Andric  let Args = [ArgFunction, ArgCallExpr];
20906c3fb27SDimitry Andric}
21006c3fb27SDimitry Andric
21106c3fb27SDimitry Andricdef CallPtr : Opcode {
212*0fca6ea1SDimitry Andric  let Args = [ArgUint32, ArgCallExpr];
213*0fca6ea1SDimitry Andric}
214*0fca6ea1SDimitry Andric
215*0fca6ea1SDimitry Andricdef CallVar : Opcode {
216*0fca6ea1SDimitry Andric  let Args = [ArgFunction, ArgUint32];
217bdd1243dSDimitry Andric}
218bdd1243dSDimitry Andric
2195f757f3fSDimitry Andricdef OffsetOf : Opcode {
2205f757f3fSDimitry Andric  let Types = [IntegerTypeClass];
2215f757f3fSDimitry Andric  let Args = [ArgOffsetOfExpr];
2225f757f3fSDimitry Andric  let HasGroup = 1;
2235f757f3fSDimitry Andric}
2245f757f3fSDimitry Andric
225a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
226a7dea167SDimitry Andric// Frame management
227a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
228a7dea167SDimitry Andric
229a7dea167SDimitry Andric// [] -> []
230a7dea167SDimitry Andricdef Destroy : Opcode {
231a7dea167SDimitry Andric  let Args = [ArgUint32];
232a7dea167SDimitry Andric  let HasCustomEval = 1;
233a7dea167SDimitry Andric}
234a7dea167SDimitry Andric
235a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
236a7dea167SDimitry Andric// Constants
237a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
238a7dea167SDimitry Andric
239a7dea167SDimitry Andricclass ConstOpcode<Type Ty, ArgType ArgTy> : Opcode {
240a7dea167SDimitry Andric  let Types = [SingletonTypeClass<Ty>];
241a7dea167SDimitry Andric  let Args = [ArgTy];
242a7dea167SDimitry Andric  let Name = "Const";
243a7dea167SDimitry Andric}
244a7dea167SDimitry Andric
245a7dea167SDimitry Andric// [] -> [Integer]
246a7dea167SDimitry Andricdef ConstSint8 : ConstOpcode<Sint8, ArgSint8>;
247a7dea167SDimitry Andricdef ConstUint8 : ConstOpcode<Uint8, ArgUint8>;
248a7dea167SDimitry Andricdef ConstSint16 : ConstOpcode<Sint16, ArgSint16>;
249a7dea167SDimitry Andricdef ConstUint16 : ConstOpcode<Uint16, ArgUint16>;
250a7dea167SDimitry Andricdef ConstSint32 : ConstOpcode<Sint32, ArgSint32>;
251a7dea167SDimitry Andricdef ConstUint32 : ConstOpcode<Uint32, ArgUint32>;
252a7dea167SDimitry Andricdef ConstSint64 : ConstOpcode<Sint64, ArgSint64>;
253a7dea167SDimitry Andricdef ConstUint64 : ConstOpcode<Uint64, ArgUint64>;
25406c3fb27SDimitry Andricdef ConstFloat : ConstOpcode<Float, ArgFloat>;
255*0fca6ea1SDimitry Andricdef constIntAP : ConstOpcode<IntAP, ArgIntAP>;
256*0fca6ea1SDimitry Andricdef constIntAPS : ConstOpcode<IntAPS, ArgIntAPS>;
257a7dea167SDimitry Andricdef ConstBool : ConstOpcode<Bool, ArgBool>;
258a7dea167SDimitry Andric
259a7dea167SDimitry Andric// [] -> [Integer]
260a7dea167SDimitry Andricdef Zero : Opcode {
2615f757f3fSDimitry Andric  let Types = [FixedSizeIntegralTypeClass];
262bdd1243dSDimitry Andric  let HasGroup = 1;
263a7dea167SDimitry Andric}
264a7dea167SDimitry Andric
2655f757f3fSDimitry Andricdef ZeroIntAP : Opcode {
2665f757f3fSDimitry Andric  let Args = [ArgUint32];
2675f757f3fSDimitry Andric}
2685f757f3fSDimitry Andric
2695f757f3fSDimitry Andricdef ZeroIntAPS : Opcode {
2705f757f3fSDimitry Andric  let Args = [ArgUint32];
2715f757f3fSDimitry Andric}
2725f757f3fSDimitry Andric
273a7dea167SDimitry Andric// [] -> [Pointer]
274a7dea167SDimitry Andricdef Null : Opcode {
275a7dea167SDimitry Andric  let Types = [PtrTypeClass];
276*0fca6ea1SDimitry Andric  let Args = [ArgDesc];
27706c3fb27SDimitry Andric  let HasGroup = 1;
278a7dea167SDimitry Andric}
279a7dea167SDimitry Andric
280a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
281a7dea167SDimitry Andric// Pointer generation
282a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
283*0fca6ea1SDimitry Andricclass OffsetOpcode : Opcode {
284*0fca6ea1SDimitry Andric  let Args = [ArgUint32];
285*0fca6ea1SDimitry Andric}
286a7dea167SDimitry Andric
287a7dea167SDimitry Andric// [] -> [Pointer]
288*0fca6ea1SDimitry Andricdef GetPtrLocal : OffsetOpcode {
289a7dea167SDimitry Andric  bit HasCustomEval = 1;
290a7dea167SDimitry Andric}
291a7dea167SDimitry Andric// [] -> [Pointer]
292*0fca6ea1SDimitry Andricdef GetPtrParam : OffsetOpcode;
293a7dea167SDimitry Andric// [] -> [Pointer]
294*0fca6ea1SDimitry Andricdef GetPtrGlobal : OffsetOpcode;
295a7dea167SDimitry Andric// [Pointer] -> [Pointer]
296*0fca6ea1SDimitry Andricdef GetPtrField : OffsetOpcode;
297*0fca6ea1SDimitry Andricdef GetPtrFieldPop : OffsetOpcode;
298a7dea167SDimitry Andric// [Pointer] -> [Pointer]
299*0fca6ea1SDimitry Andricdef GetPtrActiveField : OffsetOpcode;
300a7dea167SDimitry Andric// [] -> [Pointer]
301*0fca6ea1SDimitry Andricdef GetPtrActiveThisField : OffsetOpcode;
302a7dea167SDimitry Andric// [] -> [Pointer]
303*0fca6ea1SDimitry Andricdef GetPtrThisField : OffsetOpcode;
304a7dea167SDimitry Andric// [Pointer] -> [Pointer]
305*0fca6ea1SDimitry Andricdef GetPtrBase : OffsetOpcode;
306*0fca6ea1SDimitry Andric// [Pointer] -> [Pointer]
307*0fca6ea1SDimitry Andricdef GetPtrBasePop : OffsetOpcode;
308*0fca6ea1SDimitry Andricdef GetMemberPtrBasePop : Opcode {
309a7dea167SDimitry Andric  // Offset of field, which is a base.
310*0fca6ea1SDimitry Andric  let Args = [ArgSint32];
31106c3fb27SDimitry Andric}
31206c3fb27SDimitry Andric
313*0fca6ea1SDimitry Andric
314*0fca6ea1SDimitry Andricdef FinishInitPop : Opcode;
315*0fca6ea1SDimitry Andricdef FinishInit    : Opcode;
3165f757f3fSDimitry Andric
3175f757f3fSDimitry Andricdef GetPtrDerivedPop : Opcode {
3185f757f3fSDimitry Andric  let Args = [ArgUint32];
3195f757f3fSDimitry Andric}
3205f757f3fSDimitry Andric
32106c3fb27SDimitry Andric// [Pointer] -> [Pointer]
322*0fca6ea1SDimitry Andricdef GetPtrVirtBasePop : Opcode {
323a7dea167SDimitry Andric  // RecordDecl of base class.
324a7dea167SDimitry Andric  let Args = [ArgRecordDecl];
325a7dea167SDimitry Andric}
326a7dea167SDimitry Andric// [] -> [Pointer]
327a7dea167SDimitry Andricdef GetPtrThisBase : Opcode {
328a7dea167SDimitry Andric  // Offset of field, which is a base.
329a7dea167SDimitry Andric  let Args = [ArgUint32];
330a7dea167SDimitry Andric}
331a7dea167SDimitry Andric// [] -> [Pointer]
332a7dea167SDimitry Andricdef GetPtrThisVirtBase : Opcode {
333a7dea167SDimitry Andric  // RecordDecl of base class.
334a7dea167SDimitry Andric  let Args = [ArgRecordDecl];
335a7dea167SDimitry Andric}
336a7dea167SDimitry Andric// [] -> [Pointer]
337a7dea167SDimitry Andricdef This : Opcode;
338a7dea167SDimitry Andric
339bdd1243dSDimitry Andric// [] -> [Pointer]
340bdd1243dSDimitry Andricdef RVOPtr : Opcode;
341bdd1243dSDimitry Andric
342a7dea167SDimitry Andric// [Pointer] -> [Pointer]
343a7dea167SDimitry Andricdef NarrowPtr : Opcode;
344a7dea167SDimitry Andric// [Pointer] -> [Pointer]
345a7dea167SDimitry Andricdef ExpandPtr : Opcode;
34606c3fb27SDimitry Andric// [Pointer, Offset] -> [Pointer]
34706c3fb27SDimitry Andricdef ArrayElemPtr : AluOpcode;
34806c3fb27SDimitry Andricdef ArrayElemPtrPop : AluOpcode;
349a7dea167SDimitry Andric
350*0fca6ea1SDimitry Andricdef ArrayElemPop : Opcode {
351*0fca6ea1SDimitry Andric  let Args = [ArgUint32];
352*0fca6ea1SDimitry Andric  let Types = [AllTypeClass];
353*0fca6ea1SDimitry Andric  let HasGroup = 1;
354*0fca6ea1SDimitry Andric}
355*0fca6ea1SDimitry Andric
356*0fca6ea1SDimitry Andricdef ArrayElem : Opcode {
357*0fca6ea1SDimitry Andric  let Args = [ArgUint32];
358*0fca6ea1SDimitry Andric  let Types = [AllTypeClass];
359*0fca6ea1SDimitry Andric  let HasGroup = 1;
360*0fca6ea1SDimitry Andric}
361*0fca6ea1SDimitry Andric
362*0fca6ea1SDimitry Andricdef CopyArray : Opcode {
363*0fca6ea1SDimitry Andric  let Args = [ArgUint32, ArgUint32, ArgUint32];
364*0fca6ea1SDimitry Andric  let Types = [AllTypeClass];
365*0fca6ea1SDimitry Andric  let HasGroup = 1;
366*0fca6ea1SDimitry Andric}
367*0fca6ea1SDimitry Andric
368a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
369a7dea167SDimitry Andric// Direct field accessors
370a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
371a7dea167SDimitry Andric
372a7dea167SDimitry Andricclass AccessOpcode : Opcode {
373a7dea167SDimitry Andric  let Types = [AllTypeClass];
374a7dea167SDimitry Andric  let Args = [ArgUint32];
375a7dea167SDimitry Andric  let HasGroup = 1;
376a7dea167SDimitry Andric}
377a7dea167SDimitry Andric
378a7dea167SDimitry Andricclass BitFieldOpcode : Opcode {
379a7dea167SDimitry Andric  let Types = [AluTypeClass];
380a7dea167SDimitry Andric  let Args = [ArgRecordField];
381a7dea167SDimitry Andric  let HasGroup = 1;
382a7dea167SDimitry Andric}
383a7dea167SDimitry Andric
384a7dea167SDimitry Andric// [] -> [Pointer]
385a7dea167SDimitry Andricdef GetLocal : AccessOpcode { let HasCustomEval = 1; }
386a7dea167SDimitry Andric// [] -> [Pointer]
387a7dea167SDimitry Andricdef SetLocal : AccessOpcode { let HasCustomEval = 1; }
388a7dea167SDimitry Andric
389*0fca6ea1SDimitry Andricdef CheckDecl : Opcode {
390*0fca6ea1SDimitry Andric  let Args = [ArgVarDecl];
391*0fca6ea1SDimitry Andric}
392*0fca6ea1SDimitry Andric
393*0fca6ea1SDimitry Andricdef CheckEnumValue : Opcode {
394*0fca6ea1SDimitry Andric  let Args = [ArgEnumDecl];
395*0fca6ea1SDimitry Andric  let Types = [FixedSizeIntegralTypeClass];
396*0fca6ea1SDimitry Andric  let HasGroup = 1;
397*0fca6ea1SDimitry Andric}
398*0fca6ea1SDimitry Andric
399a7dea167SDimitry Andric// [] -> [Value]
400a7dea167SDimitry Andricdef GetGlobal : AccessOpcode;
4017a6dacacSDimitry Andricdef GetGlobalUnchecked : AccessOpcode;
402a7dea167SDimitry Andric// [Value] -> []
403a7dea167SDimitry Andricdef InitGlobal : AccessOpcode;
404a7dea167SDimitry Andric// [Value] -> []
40506c3fb27SDimitry Andricdef InitGlobalTemp : AccessOpcode {
40606c3fb27SDimitry Andric  let Args = [ArgUint32, ArgLETD];
40706c3fb27SDimitry Andric}
4085f757f3fSDimitry Andric// [Pointer] -> [Pointer]
4095f757f3fSDimitry Andricdef InitGlobalTempComp : Opcode {
4105f757f3fSDimitry Andric  let Args = [ArgLETD];
4115f757f3fSDimitry Andric}
41206c3fb27SDimitry Andric// [Value] -> []
413a7dea167SDimitry Andricdef SetGlobal : AccessOpcode;
414a7dea167SDimitry Andric
415a7dea167SDimitry Andric// [] -> [Value]
416a7dea167SDimitry Andricdef GetParam : AccessOpcode;
417a7dea167SDimitry Andric// [Value] -> []
418a7dea167SDimitry Andricdef SetParam : AccessOpcode;
419a7dea167SDimitry Andric
420a7dea167SDimitry Andric// [Pointer] -> [Pointer, Value]
421a7dea167SDimitry Andricdef GetField : AccessOpcode;
422a7dea167SDimitry Andric// [Pointer] -> [Value]
423a7dea167SDimitry Andricdef GetFieldPop : AccessOpcode;
424a7dea167SDimitry Andric// [] -> [Value]
425a7dea167SDimitry Andricdef GetThisField : AccessOpcode;
426a7dea167SDimitry Andric
427a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer]
428a7dea167SDimitry Andricdef SetField : AccessOpcode;
429a7dea167SDimitry Andric// [Value] -> []
430a7dea167SDimitry Andricdef SetThisField : AccessOpcode;
431a7dea167SDimitry Andric
432a7dea167SDimitry Andric// [Value] -> []
433a7dea167SDimitry Andricdef InitThisField : AccessOpcode;
434a7dea167SDimitry Andric// [Value] -> []
435a7dea167SDimitry Andricdef InitThisFieldActive : AccessOpcode;
436a7dea167SDimitry Andric// [Value] -> []
4377a6dacacSDimitry Andricdef InitThisBitField : Opcode {
4387a6dacacSDimitry Andric  let Types = [AluTypeClass];
4397a6dacacSDimitry Andric  let Args = [ArgRecordField, ArgUint32];
4407a6dacacSDimitry Andric  let HasGroup = 1;
4417a6dacacSDimitry Andric}
442a7dea167SDimitry Andric// [Pointer, Value] -> []
443a7dea167SDimitry Andricdef InitField : AccessOpcode;
444a7dea167SDimitry Andric// [Pointer, Value] -> []
445a7dea167SDimitry Andricdef InitBitField : BitFieldOpcode;
446a7dea167SDimitry Andric// [Pointer, Value] -> []
447a7dea167SDimitry Andricdef InitFieldActive : AccessOpcode;
448a7dea167SDimitry Andric
449a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
450a7dea167SDimitry Andric// Pointer access
451a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
452a7dea167SDimitry Andric
453a7dea167SDimitry Andricclass LoadOpcode : Opcode {
454a7dea167SDimitry Andric  let Types = [AllTypeClass];
455a7dea167SDimitry Andric  let HasGroup = 1;
456a7dea167SDimitry Andric}
457a7dea167SDimitry Andric
458a7dea167SDimitry Andric// [Pointer] -> [Pointer, Value]
459a7dea167SDimitry Andricdef Load : LoadOpcode {}
460a7dea167SDimitry Andric// [Pointer] -> [Value]
461a7dea167SDimitry Andricdef LoadPop : LoadOpcode {}
462a7dea167SDimitry Andric
463a7dea167SDimitry Andricclass StoreOpcode : Opcode {
464a7dea167SDimitry Andric  let Types = [AllTypeClass];
465a7dea167SDimitry Andric  let HasGroup = 1;
466a7dea167SDimitry Andric}
467a7dea167SDimitry Andric
468a7dea167SDimitry Andricclass StoreBitFieldOpcode : Opcode {
469a7dea167SDimitry Andric  let Types = [AluTypeClass];
470a7dea167SDimitry Andric  let HasGroup = 1;
471a7dea167SDimitry Andric}
472a7dea167SDimitry Andric
473a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer]
474a7dea167SDimitry Andricdef Store : StoreOpcode {}
475a7dea167SDimitry Andric// [Pointer, Value] -> []
476a7dea167SDimitry Andricdef StorePop : StoreOpcode {}
477a7dea167SDimitry Andric
478a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer]
479a7dea167SDimitry Andricdef StoreBitField : StoreBitFieldOpcode {}
480a7dea167SDimitry Andric// [Pointer, Value] -> []
481a7dea167SDimitry Andricdef StoreBitFieldPop : StoreBitFieldOpcode {}
482a7dea167SDimitry Andric
483a7dea167SDimitry Andric// [Pointer, Value] -> []
484*0fca6ea1SDimitry Andricdef Init : StoreOpcode {}
485a7dea167SDimitry Andricdef InitPop : StoreOpcode {}
486a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer]
487a7dea167SDimitry Andricdef InitElem : Opcode {
488a7dea167SDimitry Andric  let Types = [AllTypeClass];
489a7dea167SDimitry Andric  let Args = [ArgUint32];
490a7dea167SDimitry Andric  let HasGroup = 1;
491a7dea167SDimitry Andric}
492a7dea167SDimitry Andric// [Pointer, Value] -> []
493a7dea167SDimitry Andricdef InitElemPop : Opcode {
494a7dea167SDimitry Andric  let Types = [AllTypeClass];
495a7dea167SDimitry Andric  let Args = [ArgUint32];
496a7dea167SDimitry Andric  let HasGroup = 1;
497a7dea167SDimitry Andric}
498a7dea167SDimitry Andric
499a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
500a7dea167SDimitry Andric// Pointer arithmetic.
501a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
502a7dea167SDimitry Andric
503a7dea167SDimitry Andric// [Pointer, Integral] -> [Pointer]
504a7dea167SDimitry Andricdef AddOffset : AluOpcode;
505a7dea167SDimitry Andric// [Pointer, Integral] -> [Pointer]
506a7dea167SDimitry Andricdef SubOffset : AluOpcode;
507a7dea167SDimitry Andric
50806c3fb27SDimitry Andric// [Pointer, Pointer] -> [Integral]
509bdd1243dSDimitry Andricdef SubPtr : Opcode {
510bdd1243dSDimitry Andric  let Types = [IntegerTypeClass];
511bdd1243dSDimitry Andric  let HasGroup = 1;
512bdd1243dSDimitry Andric}
513bdd1243dSDimitry Andric
51406c3fb27SDimitry Andric// [Pointer] -> [Pointer]
515*0fca6ea1SDimitry Andricdef IncPtr : Opcode;
51606c3fb27SDimitry Andric// [Pointer] -> [Pointer]
517*0fca6ea1SDimitry Andricdef DecPtr : Opcode;
51806c3fb27SDimitry Andric
51906c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
52006c3fb27SDimitry Andric// Function pointers.
52106c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
52206c3fb27SDimitry Andricdef GetFnPtr : Opcode {
52306c3fb27SDimitry Andric  let Args = [ArgFunction];
52406c3fb27SDimitry Andric}
52506c3fb27SDimitry Andric
526*0fca6ea1SDimitry Andricdef GetIntPtr : Opcode {
527*0fca6ea1SDimitry Andric  let Types = [AluTypeClass];
528*0fca6ea1SDimitry Andric  let Args = [ArgDesc];
529*0fca6ea1SDimitry Andric  let HasGroup = 1;
530*0fca6ea1SDimitry Andric}
53106c3fb27SDimitry Andric
532a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
533a7dea167SDimitry Andric// Binary operators.
534a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
535a7dea167SDimitry Andric
536a7dea167SDimitry Andric// [Real, Real] -> [Real]
537a7dea167SDimitry Andricdef Add  : AluOpcode;
53806c3fb27SDimitry Andricdef Addf : FloatOpcode;
53906c3fb27SDimitry Andricdef Sub  : AluOpcode;
54006c3fb27SDimitry Andricdef Subf : FloatOpcode;
541a7dea167SDimitry Andricdef Mul  : AluOpcode;
54206c3fb27SDimitry Andricdef Mulf : FloatOpcode;
543*0fca6ea1SDimitry Andricdef Mulc : Opcode {
544*0fca6ea1SDimitry Andric  let Types = [NumberTypeClass];
545*0fca6ea1SDimitry Andric  let HasGroup = 1;
546*0fca6ea1SDimitry Andric}
54706c3fb27SDimitry Andricdef Rem  : IntegerOpcode;
54806c3fb27SDimitry Andricdef Div  : IntegerOpcode;
54906c3fb27SDimitry Andricdef Divf : FloatOpcode;
550*0fca6ea1SDimitry Andricdef Divc : Opcode {
551*0fca6ea1SDimitry Andric  let Types = [NumberTypeClass];
552*0fca6ea1SDimitry Andric  let HasGroup = 1;
553*0fca6ea1SDimitry Andric}
55406c3fb27SDimitry Andric
55506c3fb27SDimitry Andricdef BitAnd : IntegerOpcode;
55606c3fb27SDimitry Andricdef BitOr : IntegerOpcode;
55706c3fb27SDimitry Andricdef BitXor : IntegerOpcode;
558bdd1243dSDimitry Andric
559bdd1243dSDimitry Andricdef Shl : Opcode {
560bdd1243dSDimitry Andric  let Types = [IntegerTypeClass, IntegerTypeClass];
561bdd1243dSDimitry Andric  let HasGroup = 1;
562bdd1243dSDimitry Andric}
563bdd1243dSDimitry Andric
564bdd1243dSDimitry Andricdef Shr : Opcode {
565bdd1243dSDimitry Andric  let Types = [IntegerTypeClass, IntegerTypeClass];
566bdd1243dSDimitry Andric  let HasGroup = 1;
567bdd1243dSDimitry Andric}
568bdd1243dSDimitry Andric
569bdd1243dSDimitry Andric//===----------------------------------------------------------------------===//
570bdd1243dSDimitry Andric// Unary operators.
571bdd1243dSDimitry Andric//===----------------------------------------------------------------------===//
572bdd1243dSDimitry Andric
573bdd1243dSDimitry Andric// [Real] -> [Real]
574bdd1243dSDimitry Andricdef Inv: Opcode {
575bdd1243dSDimitry Andric  let Types = [BoolTypeClass];
576bdd1243dSDimitry Andric  let HasGroup = 1;
577bdd1243dSDimitry Andric}
578bdd1243dSDimitry Andric
57906c3fb27SDimitry Andric// Increment and decrement.
580*0fca6ea1SDimitry Andricdef Inc: AluOpcode;
581*0fca6ea1SDimitry Andricdef IncPop : AluOpcode;
582*0fca6ea1SDimitry Andricdef Dec: AluOpcode;
583*0fca6ea1SDimitry Andricdef DecPop: AluOpcode;
584bdd1243dSDimitry Andric
58506c3fb27SDimitry Andric// Float increment and decrement.
58606c3fb27SDimitry Andricdef Incf: FloatOpcode;
58706c3fb27SDimitry Andricdef IncfPop : FloatOpcode;
58806c3fb27SDimitry Andricdef Decf: FloatOpcode;
58906c3fb27SDimitry Andricdef DecfPop : FloatOpcode;
59006c3fb27SDimitry Andric
591bdd1243dSDimitry Andric// [Real] -> [Real]
592bdd1243dSDimitry Andricdef Neg: Opcode {
59306c3fb27SDimitry Andric  let Types = [NonPtrTypeClass];
594bdd1243dSDimitry Andric  let HasGroup = 1;
595bdd1243dSDimitry Andric}
596bdd1243dSDimitry Andric
597bdd1243dSDimitry Andric// [Real] -> [Real]
598bdd1243dSDimitry Andricdef Comp: Opcode {
59906c3fb27SDimitry Andric  let Types = [IntegerTypeClass];
600bdd1243dSDimitry Andric  let HasGroup = 1;
601bdd1243dSDimitry Andric}
602bdd1243dSDimitry Andric
603bdd1243dSDimitry Andric//===----------------------------------------------------------------------===//
60406c3fb27SDimitry Andric// Cast, CastFP.
605bdd1243dSDimitry Andric//===----------------------------------------------------------------------===//
606bdd1243dSDimitry Andric
607bdd1243dSDimitry Andricdef FromCastTypeClass : TypeClass {
6085f757f3fSDimitry Andric  let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64, Bool, IntAP, IntAPS];
609bdd1243dSDimitry Andric}
610bdd1243dSDimitry Andric
611bdd1243dSDimitry Andricdef ToCastTypeClass : TypeClass {
612bdd1243dSDimitry Andric  let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64, Bool];
613bdd1243dSDimitry Andric}
614bdd1243dSDimitry Andric
615bdd1243dSDimitry Andricdef Cast: Opcode {
616bdd1243dSDimitry Andric  let Types = [FromCastTypeClass, ToCastTypeClass];
617bdd1243dSDimitry Andric  let HasGroup = 1;
618bdd1243dSDimitry Andric}
619a7dea167SDimitry Andric
62006c3fb27SDimitry Andricdef CastFP : Opcode {
62106c3fb27SDimitry Andric  let Args = [ArgFltSemantics, ArgRoundingMode];
62206c3fb27SDimitry Andric}
62306c3fb27SDimitry Andric
6245f757f3fSDimitry Andricdef FixedSizeIntegralTypes : TypeClass {
6255f757f3fSDimitry Andric  let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64, Bool];
6265f757f3fSDimitry Andric}
6275f757f3fSDimitry Andric
6285f757f3fSDimitry Andricdef CastAP : Opcode {
6295f757f3fSDimitry Andric  let Types = [AluTypeClass];
6305f757f3fSDimitry Andric  let Args = [ArgUint32];
6315f757f3fSDimitry Andric  let HasGroup = 1;
6325f757f3fSDimitry Andric}
6335f757f3fSDimitry Andric
6345f757f3fSDimitry Andricdef CastAPS : Opcode {
6355f757f3fSDimitry Andric  let Types = [AluTypeClass];
6365f757f3fSDimitry Andric  let Args = [ArgUint32];
6375f757f3fSDimitry Andric  let HasGroup = 1;
6385f757f3fSDimitry Andric}
6395f757f3fSDimitry Andric
64006c3fb27SDimitry Andric// Cast an integer to a floating type
64106c3fb27SDimitry Andricdef CastIntegralFloating : Opcode {
64206c3fb27SDimitry Andric  let Types = [AluTypeClass];
64306c3fb27SDimitry Andric  let Args = [ArgFltSemantics, ArgRoundingMode];
64406c3fb27SDimitry Andric  let HasGroup = 1;
64506c3fb27SDimitry Andric}
64606c3fb27SDimitry Andric
64706c3fb27SDimitry Andric// Cast a floating to an integer type
64806c3fb27SDimitry Andricdef CastFloatingIntegral : Opcode {
6495f757f3fSDimitry Andric  let Types = [FixedSizeIntegralTypes];
6505f757f3fSDimitry Andric  let Args = [];
6515f757f3fSDimitry Andric  let HasGroup = 1;
6525f757f3fSDimitry Andric}
6535f757f3fSDimitry Andric
6545f757f3fSDimitry Andricdef CastFloatingIntegralAP : Opcode {
6555f757f3fSDimitry Andric  let Args = [ArgUint32];
6565f757f3fSDimitry Andric}
6575f757f3fSDimitry Andric
6585f757f3fSDimitry Andricdef CastFloatingIntegralAPS : Opcode {
6595f757f3fSDimitry Andric  let Args = [ArgUint32];
6605f757f3fSDimitry Andric}
6615f757f3fSDimitry Andric
6625f757f3fSDimitry Andricdef CastPointerIntegral : Opcode {
663*0fca6ea1SDimitry Andric  let Types = [FixedSizeIntegralTypeClass];
664*0fca6ea1SDimitry Andric  let HasGroup = 1;
665*0fca6ea1SDimitry Andric}
666*0fca6ea1SDimitry Andricdef CastPointerIntegralAP : Opcode {
667*0fca6ea1SDimitry Andric  let Args = [ArgUint32];
668*0fca6ea1SDimitry Andric}
669*0fca6ea1SDimitry Andricdef CastPointerIntegralAPS : Opcode {
670*0fca6ea1SDimitry Andric  let Args = [ArgUint32];
671*0fca6ea1SDimitry Andric}
672*0fca6ea1SDimitry Andricdef PtrPtrCast : Opcode {
673*0fca6ea1SDimitry Andric  let Args = [ArgBool];
674*0fca6ea1SDimitry Andric
675*0fca6ea1SDimitry Andric}
676*0fca6ea1SDimitry Andric
677*0fca6ea1SDimitry Andricdef DecayPtr : Opcode {
678*0fca6ea1SDimitry Andric  let Types = [PtrTypeClass, PtrTypeClass];
67906c3fb27SDimitry Andric  let HasGroup = 1;
68006c3fb27SDimitry Andric}
68106c3fb27SDimitry Andric
682a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
683a7dea167SDimitry Andric// Comparison opcodes.
684a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
685a7dea167SDimitry Andric
686a7dea167SDimitry Andricclass EqualityOpcode : Opcode {
687a7dea167SDimitry Andric  let Types = [AllTypeClass];
688a7dea167SDimitry Andric  let HasGroup = 1;
689a7dea167SDimitry Andric}
690a7dea167SDimitry Andric
691a7dea167SDimitry Andricdef EQ : EqualityOpcode;
692a7dea167SDimitry Andricdef NE : EqualityOpcode;
693a7dea167SDimitry Andric
694a7dea167SDimitry Andricclass ComparisonOpcode : Opcode {
695a7dea167SDimitry Andric  let Types = [ComparableTypeClass];
696a7dea167SDimitry Andric  let HasGroup = 1;
697a7dea167SDimitry Andric}
698a7dea167SDimitry Andric
6995f757f3fSDimitry Andricdef CMP3 : ComparisonOpcode {
7005f757f3fSDimitry Andric  let Args = [ArgCCI];
7015f757f3fSDimitry Andric}
7025f757f3fSDimitry Andric
703a7dea167SDimitry Andricdef LT : ComparisonOpcode;
704a7dea167SDimitry Andricdef LE : ComparisonOpcode;
705a7dea167SDimitry Andricdef GT : ComparisonOpcode;
706a7dea167SDimitry Andricdef GE : ComparisonOpcode;
707a7dea167SDimitry Andric
708a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
709a7dea167SDimitry Andric// Stack management.
710a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
711a7dea167SDimitry Andric
712a7dea167SDimitry Andric// [Value] -> []
713a7dea167SDimitry Andricdef Pop : Opcode {
714a7dea167SDimitry Andric  let Types = [AllTypeClass];
715a7dea167SDimitry Andric  let HasGroup = 1;
716a7dea167SDimitry Andric}
717a7dea167SDimitry Andric
718a7dea167SDimitry Andric// [Value] -> [Value, Value]
719a7dea167SDimitry Andricdef Dup : Opcode {
720a7dea167SDimitry Andric  let Types = [AllTypeClass];
721a7dea167SDimitry Andric  let HasGroup = 1;
722a7dea167SDimitry Andric}
7235f757f3fSDimitry Andric
7245f757f3fSDimitry Andric// [] -> []
7255f757f3fSDimitry Andricdef Invalid : Opcode {}
726*0fca6ea1SDimitry Andricdef Unsupported : Opcode {}
727*0fca6ea1SDimitry Andricdef Error : Opcode {}
7285f757f3fSDimitry Andricdef InvalidCast : Opcode {
7295f757f3fSDimitry Andric  let Args = [ArgCastKind];
7305f757f3fSDimitry Andric}
7315f757f3fSDimitry Andric
7325f757f3fSDimitry Andricdef InvalidDeclRef : Opcode {
7335f757f3fSDimitry Andric  let Args = [ArgDeclRef];
7345f757f3fSDimitry Andric}
7355f757f3fSDimitry Andric
736*0fca6ea1SDimitry Andricdef SizelessVectorElementSize : Opcode;
737*0fca6ea1SDimitry Andric
738*0fca6ea1SDimitry Andricdef Assume : Opcode;
739*0fca6ea1SDimitry Andric
7405f757f3fSDimitry Andricdef ArrayDecay : Opcode;
741*0fca6ea1SDimitry Andric
742*0fca6ea1SDimitry Andricdef CheckNonNullArg : Opcode {
743*0fca6ea1SDimitry Andric  let Types = [PtrTypeClass];
744*0fca6ea1SDimitry Andric  let HasGroup = 1;
745*0fca6ea1SDimitry Andric}
746*0fca6ea1SDimitry Andric
747*0fca6ea1SDimitry Andricdef Memcpy : Opcode;
748*0fca6ea1SDimitry Andric
749*0fca6ea1SDimitry Andricdef ToMemberPtr : Opcode;
750*0fca6ea1SDimitry Andricdef CastMemberPtrPtr : Opcode;
751*0fca6ea1SDimitry Andricdef GetMemberPtr : Opcode {
752*0fca6ea1SDimitry Andric  let Args = [ArgDecl];
753*0fca6ea1SDimitry Andric}
754*0fca6ea1SDimitry Andricdef GetMemberPtrBase : Opcode;
755*0fca6ea1SDimitry Andricdef GetMemberPtrDecl : Opcode;
756*0fca6ea1SDimitry Andric
757*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===//
758*0fca6ea1SDimitry Andric// Debugging.
759*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===//
760*0fca6ea1SDimitry Andricdef Dump : Opcode;
761*0fca6ea1SDimitry Andric
762*0fca6ea1SDimitry Andricdef Alloc : Opcode {
763*0fca6ea1SDimitry Andric  let Args = [ArgDesc];
764*0fca6ea1SDimitry Andric}
765*0fca6ea1SDimitry Andric
766*0fca6ea1SDimitry Andricdef AllocN : Opcode {
767*0fca6ea1SDimitry Andric  let Types = [IntegerTypeClass];
768*0fca6ea1SDimitry Andric  let Args = [ArgPrimType, ArgExpr, ArgBool];
769*0fca6ea1SDimitry Andric  let HasGroup = 1;
770*0fca6ea1SDimitry Andric}
771*0fca6ea1SDimitry Andric
772*0fca6ea1SDimitry Andricdef AllocCN : Opcode {
773*0fca6ea1SDimitry Andric  let Types = [IntegerTypeClass];
774*0fca6ea1SDimitry Andric  let Args = [ArgDesc, ArgBool];
775*0fca6ea1SDimitry Andric  let HasGroup = 1;
776*0fca6ea1SDimitry Andric}
777*0fca6ea1SDimitry Andric
778*0fca6ea1SDimitry Andricdef Free : Opcode {
779*0fca6ea1SDimitry Andric  let Args = [ArgBool];
780*0fca6ea1SDimitry Andric}
781