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