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