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