brintos

brintos / llvm-project-archived public Read only

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