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