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