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