xref: /freebsd-src/contrib/llvm-project/clang/lib/AST/Interp/Opcodes.td (revision 7a6dacaca14b62ca4b74406814becb87a3fefac0)
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;
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 *"; }
565f757f3fSDimitry Andricdef ArgCastKind : ArgType { let Name = "CastKind"; }
575f757f3fSDimitry Andricdef ArgCallExpr : ArgType { let Name = "const CallExpr *"; }
585f757f3fSDimitry Andricdef ArgOffsetOfExpr : ArgType { let Name = "const OffsetOfExpr *"; }
595f757f3fSDimitry Andricdef ArgDeclRef : ArgType { let Name = "const DeclRefExpr *"; }
605f757f3fSDimitry 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,
725f757f3fSDimitry Andric               Uint32, Sint64, Uint64, IntAP, IntAPS];
735f757f3fSDimitry Andric}
745f757f3fSDimitry Andric
755f757f3fSDimitry Andricdef FixedSizeIntegralTypeClass : TypeClass {
765f757f3fSDimitry Andric  let Types = [Sint8, Uint8, Sint16, Uint16, Sint32,
775f757f3fSDimitry 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 {
2025f757f3fSDimitry 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
2115f757f3fSDimitry Andricdef OffsetOf : Opcode {
2125f757f3fSDimitry Andric  let Types = [IntegerTypeClass];
2135f757f3fSDimitry Andric  let Args = [ArgOffsetOfExpr];
2145f757f3fSDimitry Andric  let HasGroup = 1;
2155f757f3fSDimitry Andric}
2165f757f3fSDimitry 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 {
2515f757f3fSDimitry Andric  let Types = [FixedSizeIntegralTypeClass];
252bdd1243dSDimitry Andric  let HasGroup = 1;
253a7dea167SDimitry Andric}
254a7dea167SDimitry Andric
2555f757f3fSDimitry Andricdef ZeroIntAP : Opcode {
2565f757f3fSDimitry Andric  let Args = [ArgUint32];
2575f757f3fSDimitry Andric}
2585f757f3fSDimitry Andric
2595f757f3fSDimitry Andricdef ZeroIntAPS : Opcode {
2605f757f3fSDimitry Andric  let Args = [ArgUint32];
2615f757f3fSDimitry Andric}
2625f757f3fSDimitry 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
3205f757f3fSDimitry Andricdef InitPtrPop : Opcode {
3215f757f3fSDimitry Andric  let Args = [];
3225f757f3fSDimitry Andric}
3235f757f3fSDimitry Andric
3245f757f3fSDimitry Andricdef GetPtrDerivedPop : Opcode {
3255f757f3fSDimitry Andric  let Args = [ArgUint32];
3265f757f3fSDimitry Andric}
3275f757f3fSDimitry 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
378a7dea167SDimitry Andric// [] -> [Value]
379a7dea167SDimitry Andricdef GetGlobal : AccessOpcode;
380*7a6dacacSDimitry Andricdef GetGlobalUnchecked : AccessOpcode;
381a7dea167SDimitry Andric// [Value] -> []
382a7dea167SDimitry Andricdef InitGlobal : AccessOpcode;
383a7dea167SDimitry Andric// [Value] -> []
38406c3fb27SDimitry Andricdef InitGlobalTemp : AccessOpcode {
38506c3fb27SDimitry Andric  let Args = [ArgUint32, ArgLETD];
38606c3fb27SDimitry Andric}
3875f757f3fSDimitry Andric// [Pointer] -> [Pointer]
3885f757f3fSDimitry Andricdef InitGlobalTempComp : Opcode {
3895f757f3fSDimitry Andric  let Args = [ArgLETD];
3905f757f3fSDimitry Andric  let Types = [];
3915f757f3fSDimitry Andric  let HasGroup = 0;
3925f757f3fSDimitry Andric}
39306c3fb27SDimitry Andric// [Value] -> []
394a7dea167SDimitry Andricdef SetGlobal : AccessOpcode;
395a7dea167SDimitry Andric
396a7dea167SDimitry Andric// [] -> [Value]
397a7dea167SDimitry Andricdef GetParam : AccessOpcode;
398a7dea167SDimitry Andric// [Value] -> []
399a7dea167SDimitry Andricdef SetParam : AccessOpcode;
400a7dea167SDimitry Andric
401a7dea167SDimitry Andric// [Pointer] -> [Pointer, Value]
402a7dea167SDimitry Andricdef GetField : AccessOpcode;
403a7dea167SDimitry Andric// [Pointer] -> [Value]
404a7dea167SDimitry Andricdef GetFieldPop : AccessOpcode;
405a7dea167SDimitry Andric// [] -> [Value]
406a7dea167SDimitry Andricdef GetThisField : AccessOpcode;
407a7dea167SDimitry Andric
408a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer]
409a7dea167SDimitry Andricdef SetField : AccessOpcode;
410a7dea167SDimitry Andric// [Value] -> []
411a7dea167SDimitry Andricdef SetThisField : AccessOpcode;
412a7dea167SDimitry Andric
413a7dea167SDimitry Andric// [Value] -> []
414a7dea167SDimitry Andricdef InitThisField : AccessOpcode;
415a7dea167SDimitry Andric// [Value] -> []
416a7dea167SDimitry Andricdef InitThisFieldActive : AccessOpcode;
417a7dea167SDimitry Andric// [Value] -> []
418*7a6dacacSDimitry Andricdef InitThisBitField : Opcode {
419*7a6dacacSDimitry Andric  let Types = [AluTypeClass];
420*7a6dacacSDimitry Andric  let Args = [ArgRecordField, ArgUint32];
421*7a6dacacSDimitry Andric  let HasGroup = 1;
422*7a6dacacSDimitry Andric}
423a7dea167SDimitry Andric// [Pointer, Value] -> []
424a7dea167SDimitry Andricdef InitField : AccessOpcode;
425a7dea167SDimitry Andric// [Pointer, Value] -> []
426a7dea167SDimitry Andricdef InitBitField : BitFieldOpcode;
427a7dea167SDimitry Andric// [Pointer, Value] -> []
428a7dea167SDimitry Andricdef InitFieldActive : AccessOpcode;
429a7dea167SDimitry Andric
430a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
431a7dea167SDimitry Andric// Pointer access
432a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
433a7dea167SDimitry Andric
434a7dea167SDimitry Andricclass LoadOpcode : Opcode {
435a7dea167SDimitry Andric  let Types = [AllTypeClass];
436a7dea167SDimitry Andric  let HasGroup = 1;
437a7dea167SDimitry Andric}
438a7dea167SDimitry Andric
439a7dea167SDimitry Andric// [Pointer] -> [Pointer, Value]
440a7dea167SDimitry Andricdef Load : LoadOpcode {}
441a7dea167SDimitry Andric// [Pointer] -> [Value]
442a7dea167SDimitry Andricdef LoadPop : LoadOpcode {}
443a7dea167SDimitry Andric
444a7dea167SDimitry Andricclass StoreOpcode : Opcode {
445a7dea167SDimitry Andric  let Types = [AllTypeClass];
446a7dea167SDimitry Andric  let HasGroup = 1;
447a7dea167SDimitry Andric}
448a7dea167SDimitry Andric
449a7dea167SDimitry Andricclass StoreBitFieldOpcode : Opcode {
450a7dea167SDimitry Andric  let Types = [AluTypeClass];
451a7dea167SDimitry Andric  let HasGroup = 1;
452a7dea167SDimitry Andric}
453a7dea167SDimitry Andric
454a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer]
455a7dea167SDimitry Andricdef Store : StoreOpcode {}
456a7dea167SDimitry Andric// [Pointer, Value] -> []
457a7dea167SDimitry Andricdef StorePop : StoreOpcode {}
458a7dea167SDimitry Andric
459a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer]
460a7dea167SDimitry Andricdef StoreBitField : StoreBitFieldOpcode {}
461a7dea167SDimitry Andric// [Pointer, Value] -> []
462a7dea167SDimitry Andricdef StoreBitFieldPop : StoreBitFieldOpcode {}
463a7dea167SDimitry Andric
464a7dea167SDimitry Andric// [Pointer, Value] -> []
465a7dea167SDimitry Andricdef InitPop : StoreOpcode {}
466a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer]
467a7dea167SDimitry Andricdef InitElem : Opcode {
468a7dea167SDimitry Andric  let Types = [AllTypeClass];
469a7dea167SDimitry Andric  let Args = [ArgUint32];
470a7dea167SDimitry Andric  let HasGroup = 1;
471a7dea167SDimitry Andric}
472a7dea167SDimitry Andric// [Pointer, Value] -> []
473a7dea167SDimitry Andricdef InitElemPop : Opcode {
474a7dea167SDimitry Andric  let Types = [AllTypeClass];
475a7dea167SDimitry Andric  let Args = [ArgUint32];
476a7dea167SDimitry Andric  let HasGroup = 1;
477a7dea167SDimitry Andric}
478a7dea167SDimitry Andric
479a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
480a7dea167SDimitry Andric// Pointer arithmetic.
481a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
482a7dea167SDimitry Andric
483a7dea167SDimitry Andric// [Pointer, Integral] -> [Pointer]
484a7dea167SDimitry Andricdef AddOffset : AluOpcode;
485a7dea167SDimitry Andric// [Pointer, Integral] -> [Pointer]
486a7dea167SDimitry Andricdef SubOffset : AluOpcode;
487a7dea167SDimitry Andric
48806c3fb27SDimitry Andric// [Pointer, Pointer] -> [Integral]
489bdd1243dSDimitry Andricdef SubPtr : Opcode {
490bdd1243dSDimitry Andric  let Types = [IntegerTypeClass];
491bdd1243dSDimitry Andric  let HasGroup = 1;
492bdd1243dSDimitry Andric}
493bdd1243dSDimitry Andric
49406c3fb27SDimitry Andric// [Pointer] -> [Pointer]
49506c3fb27SDimitry Andricdef IncPtr : Opcode {
49606c3fb27SDimitry Andric  let HasGroup = 0;
49706c3fb27SDimitry Andric}
49806c3fb27SDimitry Andric// [Pointer] -> [Pointer]
49906c3fb27SDimitry Andricdef DecPtr : Opcode {
50006c3fb27SDimitry Andric  let HasGroup = 0;
50106c3fb27SDimitry Andric}
50206c3fb27SDimitry Andric
50306c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
50406c3fb27SDimitry Andric// Function pointers.
50506c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
50606c3fb27SDimitry Andricdef GetFnPtr : Opcode {
50706c3fb27SDimitry Andric  let Args = [ArgFunction];
50806c3fb27SDimitry Andric}
50906c3fb27SDimitry Andric
51006c3fb27SDimitry Andric
511a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
512a7dea167SDimitry Andric// Binary operators.
513a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
514a7dea167SDimitry Andric
515a7dea167SDimitry Andric// [Real, Real] -> [Real]
516a7dea167SDimitry Andricdef Add  : AluOpcode;
51706c3fb27SDimitry Andricdef Addf : FloatOpcode;
51806c3fb27SDimitry Andricdef Sub  : AluOpcode;
51906c3fb27SDimitry Andricdef Subf : FloatOpcode;
520a7dea167SDimitry Andricdef Mul  : AluOpcode;
52106c3fb27SDimitry Andricdef Mulf : FloatOpcode;
52206c3fb27SDimitry Andricdef Rem  : IntegerOpcode;
52306c3fb27SDimitry Andricdef Div  : IntegerOpcode;
52406c3fb27SDimitry Andricdef Divf : FloatOpcode;
52506c3fb27SDimitry Andric
52606c3fb27SDimitry Andricdef BitAnd : IntegerOpcode;
52706c3fb27SDimitry Andricdef BitOr : IntegerOpcode;
52806c3fb27SDimitry Andricdef BitXor : IntegerOpcode;
529bdd1243dSDimitry Andric
530bdd1243dSDimitry Andricdef Shl : Opcode {
531bdd1243dSDimitry Andric  let Types = [IntegerTypeClass, IntegerTypeClass];
532bdd1243dSDimitry Andric  let HasGroup = 1;
533bdd1243dSDimitry Andric}
534bdd1243dSDimitry Andric
535bdd1243dSDimitry Andricdef Shr : Opcode {
536bdd1243dSDimitry Andric  let Types = [IntegerTypeClass, IntegerTypeClass];
537bdd1243dSDimitry Andric  let HasGroup = 1;
538bdd1243dSDimitry Andric}
539bdd1243dSDimitry Andric
540bdd1243dSDimitry Andric//===----------------------------------------------------------------------===//
541bdd1243dSDimitry Andric// Unary operators.
542bdd1243dSDimitry Andric//===----------------------------------------------------------------------===//
543bdd1243dSDimitry Andric
544bdd1243dSDimitry Andric// [Real] -> [Real]
545bdd1243dSDimitry Andricdef Inv: Opcode {
546bdd1243dSDimitry Andric  let Types = [BoolTypeClass];
547bdd1243dSDimitry Andric  let HasGroup = 1;
548bdd1243dSDimitry Andric}
549bdd1243dSDimitry Andric
55006c3fb27SDimitry Andric// Increment and decrement.
551bdd1243dSDimitry Andricdef Inc: IntegerOpcode;
552bdd1243dSDimitry Andricdef IncPop : IntegerOpcode;
553bdd1243dSDimitry Andricdef Dec: IntegerOpcode;
554bdd1243dSDimitry Andricdef DecPop: IntegerOpcode;
555bdd1243dSDimitry Andric
55606c3fb27SDimitry Andric// Float increment and decrement.
55706c3fb27SDimitry Andricdef Incf: FloatOpcode;
55806c3fb27SDimitry Andricdef IncfPop : FloatOpcode;
55906c3fb27SDimitry Andricdef Decf: FloatOpcode;
56006c3fb27SDimitry Andricdef DecfPop : FloatOpcode;
56106c3fb27SDimitry Andric
562bdd1243dSDimitry Andric// [Real] -> [Real]
563bdd1243dSDimitry Andricdef Neg: Opcode {
56406c3fb27SDimitry Andric  let Types = [NonPtrTypeClass];
565bdd1243dSDimitry Andric  let HasGroup = 1;
566bdd1243dSDimitry Andric}
567bdd1243dSDimitry Andric
568bdd1243dSDimitry Andric// [Real] -> [Real]
569bdd1243dSDimitry Andricdef Comp: Opcode {
57006c3fb27SDimitry Andric  let Types = [IntegerTypeClass];
571bdd1243dSDimitry Andric  let HasGroup = 1;
572bdd1243dSDimitry Andric}
573bdd1243dSDimitry Andric
574bdd1243dSDimitry Andric//===----------------------------------------------------------------------===//
57506c3fb27SDimitry Andric// Cast, CastFP.
576bdd1243dSDimitry Andric//===----------------------------------------------------------------------===//
577bdd1243dSDimitry Andric
578bdd1243dSDimitry Andricdef FromCastTypeClass : TypeClass {
5795f757f3fSDimitry Andric  let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64, Bool, IntAP, IntAPS];
580bdd1243dSDimitry Andric}
581bdd1243dSDimitry Andric
582bdd1243dSDimitry Andricdef ToCastTypeClass : TypeClass {
583bdd1243dSDimitry Andric  let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64, Bool];
584bdd1243dSDimitry Andric}
585bdd1243dSDimitry Andric
586bdd1243dSDimitry Andricdef Cast: Opcode {
587bdd1243dSDimitry Andric  let Types = [FromCastTypeClass, ToCastTypeClass];
588bdd1243dSDimitry Andric  let HasGroup = 1;
589bdd1243dSDimitry Andric}
590a7dea167SDimitry Andric
59106c3fb27SDimitry Andricdef CastFP : Opcode {
59206c3fb27SDimitry Andric  let Types = [];
59306c3fb27SDimitry Andric  let Args = [ArgFltSemantics, ArgRoundingMode];
59406c3fb27SDimitry Andric}
59506c3fb27SDimitry Andric
5965f757f3fSDimitry Andricdef FixedSizeIntegralTypes : TypeClass {
5975f757f3fSDimitry Andric  let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64, Bool];
5985f757f3fSDimitry Andric}
5995f757f3fSDimitry Andric
6005f757f3fSDimitry Andricdef CastAP : Opcode {
6015f757f3fSDimitry Andric  let Types = [AluTypeClass];
6025f757f3fSDimitry Andric  let Args = [ArgUint32];
6035f757f3fSDimitry Andric  let HasGroup = 1;
6045f757f3fSDimitry Andric}
6055f757f3fSDimitry Andric
6065f757f3fSDimitry Andricdef CastAPS : Opcode {
6075f757f3fSDimitry Andric  let Types = [AluTypeClass];
6085f757f3fSDimitry Andric  let Args = [ArgUint32];
6095f757f3fSDimitry Andric  let HasGroup = 1;
6105f757f3fSDimitry Andric}
6115f757f3fSDimitry Andric
61206c3fb27SDimitry Andric// Cast an integer to a floating type
61306c3fb27SDimitry Andricdef CastIntegralFloating : Opcode {
61406c3fb27SDimitry Andric  let Types = [AluTypeClass];
61506c3fb27SDimitry Andric  let Args = [ArgFltSemantics, ArgRoundingMode];
61606c3fb27SDimitry Andric  let HasGroup = 1;
61706c3fb27SDimitry Andric}
61806c3fb27SDimitry Andric
61906c3fb27SDimitry Andric// Cast a floating to an integer type
62006c3fb27SDimitry Andricdef CastFloatingIntegral : Opcode {
6215f757f3fSDimitry Andric  let Types = [FixedSizeIntegralTypes];
6225f757f3fSDimitry Andric  let Args = [];
6235f757f3fSDimitry Andric  let HasGroup = 1;
6245f757f3fSDimitry Andric}
6255f757f3fSDimitry Andric
6265f757f3fSDimitry Andricdef CastFloatingIntegralAP : Opcode {
6275f757f3fSDimitry Andric  let Types = [];
6285f757f3fSDimitry Andric  let Args = [ArgUint32];
6295f757f3fSDimitry Andric}
6305f757f3fSDimitry Andric
6315f757f3fSDimitry Andricdef CastFloatingIntegralAPS : Opcode {
6325f757f3fSDimitry Andric  let Types = [];
6335f757f3fSDimitry Andric  let Args = [ArgUint32];
6345f757f3fSDimitry Andric}
6355f757f3fSDimitry Andric
6365f757f3fSDimitry Andricdef CastPointerIntegral : Opcode {
63706c3fb27SDimitry Andric  let Types = [AluTypeClass];
63806c3fb27SDimitry Andric  let Args = [];
63906c3fb27SDimitry Andric  let HasGroup = 1;
64006c3fb27SDimitry Andric}
64106c3fb27SDimitry Andric
642a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
643a7dea167SDimitry Andric// Comparison opcodes.
644a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
645a7dea167SDimitry Andric
646a7dea167SDimitry Andricclass EqualityOpcode : Opcode {
647a7dea167SDimitry Andric  let Types = [AllTypeClass];
648a7dea167SDimitry Andric  let HasGroup = 1;
649a7dea167SDimitry Andric}
650a7dea167SDimitry Andric
651a7dea167SDimitry Andricdef EQ : EqualityOpcode;
652a7dea167SDimitry Andricdef NE : EqualityOpcode;
653a7dea167SDimitry Andric
654a7dea167SDimitry Andricclass ComparisonOpcode : Opcode {
655a7dea167SDimitry Andric  let Types = [ComparableTypeClass];
656a7dea167SDimitry Andric  let HasGroup = 1;
657a7dea167SDimitry Andric}
658a7dea167SDimitry Andric
6595f757f3fSDimitry Andricdef CMP3 : ComparisonOpcode {
6605f757f3fSDimitry Andric  let Args = [ArgCCI];
6615f757f3fSDimitry Andric}
6625f757f3fSDimitry Andric
663a7dea167SDimitry Andricdef LT : ComparisonOpcode;
664a7dea167SDimitry Andricdef LE : ComparisonOpcode;
665a7dea167SDimitry Andricdef GT : ComparisonOpcode;
666a7dea167SDimitry Andricdef GE : ComparisonOpcode;
667a7dea167SDimitry Andric
668a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
669a7dea167SDimitry Andric// Stack management.
670a7dea167SDimitry Andric//===----------------------------------------------------------------------===//
671a7dea167SDimitry Andric
672a7dea167SDimitry Andric// [Value] -> []
673a7dea167SDimitry Andricdef Pop : Opcode {
674a7dea167SDimitry Andric  let Types = [AllTypeClass];
675a7dea167SDimitry Andric  let HasGroup = 1;
676a7dea167SDimitry Andric}
677a7dea167SDimitry Andric
678a7dea167SDimitry Andric// [Value] -> [Value, Value]
679a7dea167SDimitry Andricdef Dup : Opcode {
680a7dea167SDimitry Andric  let Types = [AllTypeClass];
681a7dea167SDimitry Andric  let HasGroup = 1;
682a7dea167SDimitry Andric}
6835f757f3fSDimitry Andric
6845f757f3fSDimitry Andric// [] -> []
6855f757f3fSDimitry Andricdef Invalid : Opcode {}
6865f757f3fSDimitry Andricdef InvalidCast : Opcode {
6875f757f3fSDimitry Andric  let Args = [ArgCastKind];
6885f757f3fSDimitry Andric}
6895f757f3fSDimitry Andric
6905f757f3fSDimitry Andricdef InvalidDeclRef : Opcode {
6915f757f3fSDimitry Andric  let Args = [ArgDeclRef];
6925f757f3fSDimitry Andric}
6935f757f3fSDimitry Andric
6945f757f3fSDimitry Andricdef ArrayDecay : Opcode;
695