1a7dea167SDimitry Andric//===--- Opcodes.td - Opcode defitions for the constexpr VM -----*- C++ -*-===// 2a7dea167SDimitry Andric// 3a7dea167SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4a7dea167SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5a7dea167SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6a7dea167SDimitry Andric// 7a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 8a7dea167SDimitry Andric// 9a7dea167SDimitry Andric// Helper file used to generate opcodes, the interpreter and the disassembler. 10a7dea167SDimitry Andric// 11a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 12a7dea167SDimitry Andric 13a7dea167SDimitry Andric 14a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 15a7dea167SDimitry Andric// Types evaluated by the interpreter. 16a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 17a7dea167SDimitry Andric 18a7dea167SDimitry Andricclass Type; 19a7dea167SDimitry Andricdef Bool : Type; 20a7dea167SDimitry Andricdef Sint8 : Type; 21a7dea167SDimitry Andricdef Uint8 : Type; 22a7dea167SDimitry Andricdef Sint16 : Type; 23a7dea167SDimitry Andricdef Uint16 : Type; 24a7dea167SDimitry Andricdef Sint32 : Type; 25a7dea167SDimitry Andricdef Uint32 : Type; 26a7dea167SDimitry Andricdef Sint64 : Type; 27a7dea167SDimitry Andricdef Uint64 : Type; 285f757f3fSDimitry Andricdef IntAP : Type; 295f757f3fSDimitry Andricdef IntAPS : Type; 3006c3fb27SDimitry Andricdef Float : Type; 31a7dea167SDimitry Andricdef Ptr : Type; 3206c3fb27SDimitry Andricdef FnPtr : Type; 33*0fca6ea1SDimitry Andricdef MemberPtr : Type; 34a7dea167SDimitry Andric 35a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 36a7dea167SDimitry Andric// Types transferred to the interpreter. 37a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 38a7dea167SDimitry Andric 39*0fca6ea1SDimitry Andricclass ArgType { string Name = ?; bit AsRef = false; } 40a7dea167SDimitry Andricdef ArgSint8 : ArgType { let Name = "int8_t"; } 41a7dea167SDimitry Andricdef ArgUint8 : ArgType { let Name = "uint8_t"; } 42a7dea167SDimitry Andricdef ArgSint16 : ArgType { let Name = "int16_t"; } 43a7dea167SDimitry Andricdef ArgUint16 : ArgType { let Name = "uint16_t"; } 44a7dea167SDimitry Andricdef ArgSint32 : ArgType { let Name = "int32_t"; } 45a7dea167SDimitry Andricdef ArgUint32 : ArgType { let Name = "uint32_t"; } 46a7dea167SDimitry Andricdef ArgSint64 : ArgType { let Name = "int64_t"; } 47a7dea167SDimitry Andricdef ArgUint64 : ArgType { let Name = "uint64_t"; } 48*0fca6ea1SDimitry Andricdef ArgIntAP : ArgType { let Name = "IntegralAP<false>"; let AsRef = true; } 49*0fca6ea1SDimitry Andricdef ArgIntAPS : ArgType { let Name = "IntegralAP<true>"; let AsRef = true; } 50*0fca6ea1SDimitry Andricdef ArgFloat : ArgType { let Name = "Floating"; let AsRef = true; } 51a7dea167SDimitry Andricdef ArgBool : ArgType { let Name = "bool"; } 52a7dea167SDimitry Andric 53bdd1243dSDimitry Andricdef ArgFunction : ArgType { let Name = "const Function *"; } 54a7dea167SDimitry Andricdef ArgRecordDecl : ArgType { let Name = "const RecordDecl *"; } 55a7dea167SDimitry Andricdef ArgRecordField : ArgType { let Name = "const Record::Field *"; } 5606c3fb27SDimitry Andricdef ArgFltSemantics : ArgType { let Name = "const llvm::fltSemantics *"; } 5706c3fb27SDimitry Andricdef ArgRoundingMode : ArgType { let Name = "llvm::RoundingMode"; } 5806c3fb27SDimitry Andricdef ArgLETD: ArgType { let Name = "const LifetimeExtendedTemporaryDecl *"; } 595f757f3fSDimitry Andricdef ArgCastKind : ArgType { let Name = "CastKind"; } 605f757f3fSDimitry Andricdef ArgCallExpr : ArgType { let Name = "const CallExpr *"; } 61*0fca6ea1SDimitry Andricdef ArgExpr : ArgType { let Name = "const Expr *"; } 625f757f3fSDimitry Andricdef ArgOffsetOfExpr : ArgType { let Name = "const OffsetOfExpr *"; } 635f757f3fSDimitry Andricdef ArgDeclRef : ArgType { let Name = "const DeclRefExpr *"; } 645f757f3fSDimitry Andricdef ArgCCI : ArgType { let Name = "const ComparisonCategoryInfo *"; } 65*0fca6ea1SDimitry Andricdef ArgDecl : ArgType { let Name = "const Decl*"; } 66*0fca6ea1SDimitry Andricdef ArgVarDecl : ArgType { let Name = "const VarDecl*"; } 67*0fca6ea1SDimitry Andricdef ArgDesc : ArgType { let Name = "const Descriptor *"; } 68*0fca6ea1SDimitry Andricdef ArgPrimType : ArgType { let Name = "PrimType"; } 69*0fca6ea1SDimitry Andricdef ArgEnumDecl : ArgType { let Name = "const EnumDecl *"; } 70a7dea167SDimitry Andric 71a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 72349cc55cSDimitry Andric// Classes of types instructions operate on. 73a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 74a7dea167SDimitry Andric 75a7dea167SDimitry Andricclass TypeClass { 76a7dea167SDimitry Andric list<Type> Types; 77a7dea167SDimitry Andric} 78a7dea167SDimitry Andric 79bdd1243dSDimitry Andricdef IntegerTypeClass : TypeClass { 80bdd1243dSDimitry Andric let Types = [Sint8, Uint8, Sint16, Uint16, Sint32, 815f757f3fSDimitry Andric Uint32, Sint64, Uint64, IntAP, IntAPS]; 825f757f3fSDimitry Andric} 835f757f3fSDimitry Andric 845f757f3fSDimitry Andricdef FixedSizeIntegralTypeClass : TypeClass { 855f757f3fSDimitry Andric let Types = [Sint8, Uint8, Sint16, Uint16, Sint32, 865f757f3fSDimitry Andric Uint32, Sint64, Uint64, Bool]; 87bdd1243dSDimitry Andric} 88bdd1243dSDimitry Andric 8906c3fb27SDimitry Andricdef NumberTypeClass : TypeClass { 9006c3fb27SDimitry Andric let Types = !listconcat(IntegerTypeClass.Types, [Float]); 9106c3fb27SDimitry Andric} 9206c3fb27SDimitry Andric 9306c3fb27SDimitry Andricdef FloatTypeClass : TypeClass { 9406c3fb27SDimitry Andric let Types = [Float]; 9506c3fb27SDimitry Andric} 9606c3fb27SDimitry Andric 97bdd1243dSDimitry Andricdef AluTypeClass : TypeClass { 9806c3fb27SDimitry Andric let Types = !listconcat(IntegerTypeClass.Types, [Bool]); 99a7dea167SDimitry Andric} 100a7dea167SDimitry Andric 101a7dea167SDimitry Andricdef PtrTypeClass : TypeClass { 102*0fca6ea1SDimitry Andric let Types = [Ptr, FnPtr, MemberPtr]; 103a7dea167SDimitry Andric} 104a7dea167SDimitry Andric 105bdd1243dSDimitry Andricdef BoolTypeClass : TypeClass { 106bdd1243dSDimitry Andric let Types = [Bool]; 107bdd1243dSDimitry Andric} 108bdd1243dSDimitry Andric 10906c3fb27SDimitry Andricdef NonPtrTypeClass : TypeClass { 11006c3fb27SDimitry Andric let Types = !listconcat(IntegerTypeClass.Types, [Bool], [Float]); 11106c3fb27SDimitry Andric} 11206c3fb27SDimitry Andric 113a7dea167SDimitry Andricdef AllTypeClass : TypeClass { 11406c3fb27SDimitry Andric let Types = !listconcat(AluTypeClass.Types, PtrTypeClass.Types, FloatTypeClass.Types); 115a7dea167SDimitry Andric} 116a7dea167SDimitry Andric 117a7dea167SDimitry Andricdef ComparableTypeClass : TypeClass { 11806c3fb27SDimitry Andric let Types = !listconcat(AluTypeClass.Types, [Ptr], [Float], [FnPtr]); 119a7dea167SDimitry Andric} 120a7dea167SDimitry Andric 121a7dea167SDimitry Andricclass SingletonTypeClass<Type Ty> : TypeClass { 122a7dea167SDimitry Andric let Types = [Ty]; 123a7dea167SDimitry Andric} 124a7dea167SDimitry Andric 125a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 126a7dea167SDimitry Andric// Record describing all opcodes. 127a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 128a7dea167SDimitry Andric 129a7dea167SDimitry Andricclass Opcode { 130a7dea167SDimitry Andric list<TypeClass> Types = []; 131a7dea167SDimitry Andric list<ArgType> Args = []; 132a7dea167SDimitry Andric string Name = ""; 133a7dea167SDimitry Andric bit CanReturn = 0; 134a7dea167SDimitry Andric bit ChangesPC = 0; 135a7dea167SDimitry Andric bit HasCustomLink = 0; 136a7dea167SDimitry Andric bit HasCustomEval = 0; 137a7dea167SDimitry Andric bit HasGroup = 0; 138a7dea167SDimitry Andric} 139a7dea167SDimitry Andric 140a7dea167SDimitry Andricclass AluOpcode : Opcode { 141a7dea167SDimitry Andric let Types = [AluTypeClass]; 142a7dea167SDimitry Andric let HasGroup = 1; 143a7dea167SDimitry Andric} 144a7dea167SDimitry Andric 14506c3fb27SDimitry Andricclass FloatOpcode : Opcode { 14606c3fb27SDimitry Andric let Args = [ArgRoundingMode]; 14706c3fb27SDimitry Andric} 14806c3fb27SDimitry Andric 149bdd1243dSDimitry Andricclass IntegerOpcode : Opcode { 150bdd1243dSDimitry Andric let Types = [IntegerTypeClass]; 151bdd1243dSDimitry Andric let HasGroup = 1; 152bdd1243dSDimitry Andric} 153bdd1243dSDimitry Andric 154a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 155a7dea167SDimitry Andric// Jump opcodes 156a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 157a7dea167SDimitry Andric 158a7dea167SDimitry Andricclass JumpOpcode : Opcode { 159a7dea167SDimitry Andric let Args = [ArgSint32]; 160a7dea167SDimitry Andric let ChangesPC = 1; 161a7dea167SDimitry Andric let HasCustomEval = 1; 162a7dea167SDimitry Andric} 163a7dea167SDimitry Andric 164a7dea167SDimitry Andric// [] -> [] 165a7dea167SDimitry Andricdef Jmp : JumpOpcode; 166a7dea167SDimitry Andric// [Bool] -> [], jumps if true. 167a7dea167SDimitry Andricdef Jt : JumpOpcode; 168a7dea167SDimitry Andric// [Bool] -> [], jumps if false. 169a7dea167SDimitry Andricdef Jf : JumpOpcode; 170a7dea167SDimitry Andric 171a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 172a7dea167SDimitry Andric// Returns 173a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 174a7dea167SDimitry Andric 175a7dea167SDimitry Andric// [Value] -> [] 176a7dea167SDimitry Andricdef Ret : Opcode { 177a7dea167SDimitry Andric let Types = [AllTypeClass]; 178a7dea167SDimitry Andric let ChangesPC = 1; 179a7dea167SDimitry Andric let CanReturn = 1; 180a7dea167SDimitry Andric let HasGroup = 1; 181a7dea167SDimitry Andric let HasCustomEval = 1; 182a7dea167SDimitry Andric} 183a7dea167SDimitry Andric// [] -> [] 184a7dea167SDimitry Andricdef RetVoid : Opcode { 185a7dea167SDimitry Andric let CanReturn = 1; 186a7dea167SDimitry Andric let ChangesPC = 1; 187a7dea167SDimitry Andric let HasCustomEval = 1; 188a7dea167SDimitry Andric} 189a7dea167SDimitry Andric// [Value] -> [] 190a7dea167SDimitry Andricdef RetValue : Opcode { 191a7dea167SDimitry Andric let CanReturn = 1; 192a7dea167SDimitry Andric let ChangesPC = 1; 193a7dea167SDimitry Andric let HasCustomEval = 1; 194a7dea167SDimitry Andric} 195a7dea167SDimitry Andric// [] -> EXIT 196a7dea167SDimitry Andricdef NoRet : Opcode {} 197a7dea167SDimitry Andric 198bdd1243dSDimitry Andric 199bdd1243dSDimitry Andricdef Call : Opcode { 200*0fca6ea1SDimitry Andric let Args = [ArgFunction, ArgUint32]; 20106c3fb27SDimitry Andric} 20206c3fb27SDimitry Andric 20306c3fb27SDimitry Andricdef CallVirt : Opcode { 204*0fca6ea1SDimitry Andric let Args = [ArgFunction, ArgUint32]; 20506c3fb27SDimitry Andric} 20606c3fb27SDimitry Andric 20706c3fb27SDimitry Andricdef CallBI : Opcode { 2085f757f3fSDimitry Andric let Args = [ArgFunction, ArgCallExpr]; 20906c3fb27SDimitry Andric} 21006c3fb27SDimitry Andric 21106c3fb27SDimitry Andricdef CallPtr : Opcode { 212*0fca6ea1SDimitry Andric let Args = [ArgUint32, ArgCallExpr]; 213*0fca6ea1SDimitry Andric} 214*0fca6ea1SDimitry Andric 215*0fca6ea1SDimitry Andricdef CallVar : Opcode { 216*0fca6ea1SDimitry Andric let Args = [ArgFunction, ArgUint32]; 217bdd1243dSDimitry Andric} 218bdd1243dSDimitry Andric 2195f757f3fSDimitry Andricdef OffsetOf : Opcode { 2205f757f3fSDimitry Andric let Types = [IntegerTypeClass]; 2215f757f3fSDimitry Andric let Args = [ArgOffsetOfExpr]; 2225f757f3fSDimitry Andric let HasGroup = 1; 2235f757f3fSDimitry Andric} 2245f757f3fSDimitry Andric 225a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 226a7dea167SDimitry Andric// Frame management 227a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 228a7dea167SDimitry Andric 229a7dea167SDimitry Andric// [] -> [] 230a7dea167SDimitry Andricdef Destroy : Opcode { 231a7dea167SDimitry Andric let Args = [ArgUint32]; 232a7dea167SDimitry Andric let HasCustomEval = 1; 233a7dea167SDimitry Andric} 234a7dea167SDimitry Andric 235a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 236a7dea167SDimitry Andric// Constants 237a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 238a7dea167SDimitry Andric 239a7dea167SDimitry Andricclass ConstOpcode<Type Ty, ArgType ArgTy> : Opcode { 240a7dea167SDimitry Andric let Types = [SingletonTypeClass<Ty>]; 241a7dea167SDimitry Andric let Args = [ArgTy]; 242a7dea167SDimitry Andric let Name = "Const"; 243a7dea167SDimitry Andric} 244a7dea167SDimitry Andric 245a7dea167SDimitry Andric// [] -> [Integer] 246a7dea167SDimitry Andricdef ConstSint8 : ConstOpcode<Sint8, ArgSint8>; 247a7dea167SDimitry Andricdef ConstUint8 : ConstOpcode<Uint8, ArgUint8>; 248a7dea167SDimitry Andricdef ConstSint16 : ConstOpcode<Sint16, ArgSint16>; 249a7dea167SDimitry Andricdef ConstUint16 : ConstOpcode<Uint16, ArgUint16>; 250a7dea167SDimitry Andricdef ConstSint32 : ConstOpcode<Sint32, ArgSint32>; 251a7dea167SDimitry Andricdef ConstUint32 : ConstOpcode<Uint32, ArgUint32>; 252a7dea167SDimitry Andricdef ConstSint64 : ConstOpcode<Sint64, ArgSint64>; 253a7dea167SDimitry Andricdef ConstUint64 : ConstOpcode<Uint64, ArgUint64>; 25406c3fb27SDimitry Andricdef ConstFloat : ConstOpcode<Float, ArgFloat>; 255*0fca6ea1SDimitry Andricdef constIntAP : ConstOpcode<IntAP, ArgIntAP>; 256*0fca6ea1SDimitry Andricdef constIntAPS : ConstOpcode<IntAPS, ArgIntAPS>; 257a7dea167SDimitry Andricdef ConstBool : ConstOpcode<Bool, ArgBool>; 258a7dea167SDimitry Andric 259a7dea167SDimitry Andric// [] -> [Integer] 260a7dea167SDimitry Andricdef Zero : Opcode { 2615f757f3fSDimitry Andric let Types = [FixedSizeIntegralTypeClass]; 262bdd1243dSDimitry Andric let HasGroup = 1; 263a7dea167SDimitry Andric} 264a7dea167SDimitry Andric 2655f757f3fSDimitry Andricdef ZeroIntAP : Opcode { 2665f757f3fSDimitry Andric let Args = [ArgUint32]; 2675f757f3fSDimitry Andric} 2685f757f3fSDimitry Andric 2695f757f3fSDimitry Andricdef ZeroIntAPS : Opcode { 2705f757f3fSDimitry Andric let Args = [ArgUint32]; 2715f757f3fSDimitry Andric} 2725f757f3fSDimitry Andric 273a7dea167SDimitry Andric// [] -> [Pointer] 274a7dea167SDimitry Andricdef Null : Opcode { 275a7dea167SDimitry Andric let Types = [PtrTypeClass]; 276*0fca6ea1SDimitry Andric let Args = [ArgDesc]; 27706c3fb27SDimitry Andric let HasGroup = 1; 278a7dea167SDimitry Andric} 279a7dea167SDimitry Andric 280a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 281a7dea167SDimitry Andric// Pointer generation 282a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 283*0fca6ea1SDimitry Andricclass OffsetOpcode : Opcode { 284*0fca6ea1SDimitry Andric let Args = [ArgUint32]; 285*0fca6ea1SDimitry Andric} 286a7dea167SDimitry Andric 287a7dea167SDimitry Andric// [] -> [Pointer] 288*0fca6ea1SDimitry Andricdef GetPtrLocal : OffsetOpcode { 289a7dea167SDimitry Andric bit HasCustomEval = 1; 290a7dea167SDimitry Andric} 291a7dea167SDimitry Andric// [] -> [Pointer] 292*0fca6ea1SDimitry Andricdef GetPtrParam : OffsetOpcode; 293a7dea167SDimitry Andric// [] -> [Pointer] 294*0fca6ea1SDimitry Andricdef GetPtrGlobal : OffsetOpcode; 295a7dea167SDimitry Andric// [Pointer] -> [Pointer] 296*0fca6ea1SDimitry Andricdef GetPtrField : OffsetOpcode; 297*0fca6ea1SDimitry Andricdef GetPtrFieldPop : OffsetOpcode; 298a7dea167SDimitry Andric// [Pointer] -> [Pointer] 299*0fca6ea1SDimitry Andricdef GetPtrActiveField : OffsetOpcode; 300a7dea167SDimitry Andric// [] -> [Pointer] 301*0fca6ea1SDimitry Andricdef GetPtrActiveThisField : OffsetOpcode; 302a7dea167SDimitry Andric// [] -> [Pointer] 303*0fca6ea1SDimitry Andricdef GetPtrThisField : OffsetOpcode; 304a7dea167SDimitry Andric// [Pointer] -> [Pointer] 305*0fca6ea1SDimitry Andricdef GetPtrBase : OffsetOpcode; 306*0fca6ea1SDimitry Andric// [Pointer] -> [Pointer] 307*0fca6ea1SDimitry Andricdef GetPtrBasePop : OffsetOpcode; 308*0fca6ea1SDimitry Andricdef GetMemberPtrBasePop : Opcode { 309a7dea167SDimitry Andric // Offset of field, which is a base. 310*0fca6ea1SDimitry Andric let Args = [ArgSint32]; 31106c3fb27SDimitry Andric} 31206c3fb27SDimitry Andric 313*0fca6ea1SDimitry Andric 314*0fca6ea1SDimitry Andricdef FinishInitPop : Opcode; 315*0fca6ea1SDimitry Andricdef FinishInit : Opcode; 3165f757f3fSDimitry Andric 3175f757f3fSDimitry Andricdef GetPtrDerivedPop : Opcode { 3185f757f3fSDimitry Andric let Args = [ArgUint32]; 3195f757f3fSDimitry Andric} 3205f757f3fSDimitry Andric 32106c3fb27SDimitry Andric// [Pointer] -> [Pointer] 322*0fca6ea1SDimitry Andricdef GetPtrVirtBasePop : Opcode { 323a7dea167SDimitry Andric // RecordDecl of base class. 324a7dea167SDimitry Andric let Args = [ArgRecordDecl]; 325a7dea167SDimitry Andric} 326a7dea167SDimitry Andric// [] -> [Pointer] 327a7dea167SDimitry Andricdef GetPtrThisBase : Opcode { 328a7dea167SDimitry Andric // Offset of field, which is a base. 329a7dea167SDimitry Andric let Args = [ArgUint32]; 330a7dea167SDimitry Andric} 331a7dea167SDimitry Andric// [] -> [Pointer] 332a7dea167SDimitry Andricdef GetPtrThisVirtBase : Opcode { 333a7dea167SDimitry Andric // RecordDecl of base class. 334a7dea167SDimitry Andric let Args = [ArgRecordDecl]; 335a7dea167SDimitry Andric} 336a7dea167SDimitry Andric// [] -> [Pointer] 337a7dea167SDimitry Andricdef This : Opcode; 338a7dea167SDimitry Andric 339bdd1243dSDimitry Andric// [] -> [Pointer] 340bdd1243dSDimitry Andricdef RVOPtr : Opcode; 341bdd1243dSDimitry Andric 342a7dea167SDimitry Andric// [Pointer] -> [Pointer] 343a7dea167SDimitry Andricdef NarrowPtr : Opcode; 344a7dea167SDimitry Andric// [Pointer] -> [Pointer] 345a7dea167SDimitry Andricdef ExpandPtr : Opcode; 34606c3fb27SDimitry Andric// [Pointer, Offset] -> [Pointer] 34706c3fb27SDimitry Andricdef ArrayElemPtr : AluOpcode; 34806c3fb27SDimitry Andricdef ArrayElemPtrPop : AluOpcode; 349a7dea167SDimitry Andric 350*0fca6ea1SDimitry Andricdef ArrayElemPop : Opcode { 351*0fca6ea1SDimitry Andric let Args = [ArgUint32]; 352*0fca6ea1SDimitry Andric let Types = [AllTypeClass]; 353*0fca6ea1SDimitry Andric let HasGroup = 1; 354*0fca6ea1SDimitry Andric} 355*0fca6ea1SDimitry Andric 356*0fca6ea1SDimitry Andricdef ArrayElem : Opcode { 357*0fca6ea1SDimitry Andric let Args = [ArgUint32]; 358*0fca6ea1SDimitry Andric let Types = [AllTypeClass]; 359*0fca6ea1SDimitry Andric let HasGroup = 1; 360*0fca6ea1SDimitry Andric} 361*0fca6ea1SDimitry Andric 362*0fca6ea1SDimitry Andricdef CopyArray : Opcode { 363*0fca6ea1SDimitry Andric let Args = [ArgUint32, ArgUint32, ArgUint32]; 364*0fca6ea1SDimitry Andric let Types = [AllTypeClass]; 365*0fca6ea1SDimitry Andric let HasGroup = 1; 366*0fca6ea1SDimitry Andric} 367*0fca6ea1SDimitry Andric 368a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 369a7dea167SDimitry Andric// Direct field accessors 370a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 371a7dea167SDimitry Andric 372a7dea167SDimitry Andricclass AccessOpcode : Opcode { 373a7dea167SDimitry Andric let Types = [AllTypeClass]; 374a7dea167SDimitry Andric let Args = [ArgUint32]; 375a7dea167SDimitry Andric let HasGroup = 1; 376a7dea167SDimitry Andric} 377a7dea167SDimitry Andric 378a7dea167SDimitry Andricclass BitFieldOpcode : Opcode { 379a7dea167SDimitry Andric let Types = [AluTypeClass]; 380a7dea167SDimitry Andric let Args = [ArgRecordField]; 381a7dea167SDimitry Andric let HasGroup = 1; 382a7dea167SDimitry Andric} 383a7dea167SDimitry Andric 384a7dea167SDimitry Andric// [] -> [Pointer] 385a7dea167SDimitry Andricdef GetLocal : AccessOpcode { let HasCustomEval = 1; } 386a7dea167SDimitry Andric// [] -> [Pointer] 387a7dea167SDimitry Andricdef SetLocal : AccessOpcode { let HasCustomEval = 1; } 388a7dea167SDimitry Andric 389*0fca6ea1SDimitry Andricdef CheckDecl : Opcode { 390*0fca6ea1SDimitry Andric let Args = [ArgVarDecl]; 391*0fca6ea1SDimitry Andric} 392*0fca6ea1SDimitry Andric 393*0fca6ea1SDimitry Andricdef CheckEnumValue : Opcode { 394*0fca6ea1SDimitry Andric let Args = [ArgEnumDecl]; 395*0fca6ea1SDimitry Andric let Types = [FixedSizeIntegralTypeClass]; 396*0fca6ea1SDimitry Andric let HasGroup = 1; 397*0fca6ea1SDimitry Andric} 398*0fca6ea1SDimitry Andric 399a7dea167SDimitry Andric// [] -> [Value] 400a7dea167SDimitry Andricdef GetGlobal : AccessOpcode; 4017a6dacacSDimitry Andricdef GetGlobalUnchecked : AccessOpcode; 402a7dea167SDimitry Andric// [Value] -> [] 403a7dea167SDimitry Andricdef InitGlobal : AccessOpcode; 404a7dea167SDimitry Andric// [Value] -> [] 40506c3fb27SDimitry Andricdef InitGlobalTemp : AccessOpcode { 40606c3fb27SDimitry Andric let Args = [ArgUint32, ArgLETD]; 40706c3fb27SDimitry Andric} 4085f757f3fSDimitry Andric// [Pointer] -> [Pointer] 4095f757f3fSDimitry Andricdef InitGlobalTempComp : Opcode { 4105f757f3fSDimitry Andric let Args = [ArgLETD]; 4115f757f3fSDimitry Andric} 41206c3fb27SDimitry Andric// [Value] -> [] 413a7dea167SDimitry Andricdef SetGlobal : AccessOpcode; 414a7dea167SDimitry Andric 415a7dea167SDimitry Andric// [] -> [Value] 416a7dea167SDimitry Andricdef GetParam : AccessOpcode; 417a7dea167SDimitry Andric// [Value] -> [] 418a7dea167SDimitry Andricdef SetParam : AccessOpcode; 419a7dea167SDimitry Andric 420a7dea167SDimitry Andric// [Pointer] -> [Pointer, Value] 421a7dea167SDimitry Andricdef GetField : AccessOpcode; 422a7dea167SDimitry Andric// [Pointer] -> [Value] 423a7dea167SDimitry Andricdef GetFieldPop : AccessOpcode; 424a7dea167SDimitry Andric// [] -> [Value] 425a7dea167SDimitry Andricdef GetThisField : AccessOpcode; 426a7dea167SDimitry Andric 427a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer] 428a7dea167SDimitry Andricdef SetField : AccessOpcode; 429a7dea167SDimitry Andric// [Value] -> [] 430a7dea167SDimitry Andricdef SetThisField : AccessOpcode; 431a7dea167SDimitry Andric 432a7dea167SDimitry Andric// [Value] -> [] 433a7dea167SDimitry Andricdef InitThisField : AccessOpcode; 434a7dea167SDimitry Andric// [Value] -> [] 435a7dea167SDimitry Andricdef InitThisFieldActive : AccessOpcode; 436a7dea167SDimitry Andric// [Value] -> [] 4377a6dacacSDimitry Andricdef InitThisBitField : Opcode { 4387a6dacacSDimitry Andric let Types = [AluTypeClass]; 4397a6dacacSDimitry Andric let Args = [ArgRecordField, ArgUint32]; 4407a6dacacSDimitry Andric let HasGroup = 1; 4417a6dacacSDimitry Andric} 442a7dea167SDimitry Andric// [Pointer, Value] -> [] 443a7dea167SDimitry Andricdef InitField : AccessOpcode; 444a7dea167SDimitry Andric// [Pointer, Value] -> [] 445a7dea167SDimitry Andricdef InitBitField : BitFieldOpcode; 446a7dea167SDimitry Andric// [Pointer, Value] -> [] 447a7dea167SDimitry Andricdef InitFieldActive : AccessOpcode; 448a7dea167SDimitry Andric 449a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 450a7dea167SDimitry Andric// Pointer access 451a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 452a7dea167SDimitry Andric 453a7dea167SDimitry Andricclass LoadOpcode : Opcode { 454a7dea167SDimitry Andric let Types = [AllTypeClass]; 455a7dea167SDimitry Andric let HasGroup = 1; 456a7dea167SDimitry Andric} 457a7dea167SDimitry Andric 458a7dea167SDimitry Andric// [Pointer] -> [Pointer, Value] 459a7dea167SDimitry Andricdef Load : LoadOpcode {} 460a7dea167SDimitry Andric// [Pointer] -> [Value] 461a7dea167SDimitry Andricdef LoadPop : LoadOpcode {} 462a7dea167SDimitry Andric 463a7dea167SDimitry Andricclass StoreOpcode : Opcode { 464a7dea167SDimitry Andric let Types = [AllTypeClass]; 465a7dea167SDimitry Andric let HasGroup = 1; 466a7dea167SDimitry Andric} 467a7dea167SDimitry Andric 468a7dea167SDimitry Andricclass StoreBitFieldOpcode : Opcode { 469a7dea167SDimitry Andric let Types = [AluTypeClass]; 470a7dea167SDimitry Andric let HasGroup = 1; 471a7dea167SDimitry Andric} 472a7dea167SDimitry Andric 473a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer] 474a7dea167SDimitry Andricdef Store : StoreOpcode {} 475a7dea167SDimitry Andric// [Pointer, Value] -> [] 476a7dea167SDimitry Andricdef StorePop : StoreOpcode {} 477a7dea167SDimitry Andric 478a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer] 479a7dea167SDimitry Andricdef StoreBitField : StoreBitFieldOpcode {} 480a7dea167SDimitry Andric// [Pointer, Value] -> [] 481a7dea167SDimitry Andricdef StoreBitFieldPop : StoreBitFieldOpcode {} 482a7dea167SDimitry Andric 483a7dea167SDimitry Andric// [Pointer, Value] -> [] 484*0fca6ea1SDimitry Andricdef Init : StoreOpcode {} 485a7dea167SDimitry Andricdef InitPop : StoreOpcode {} 486a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer] 487a7dea167SDimitry Andricdef InitElem : Opcode { 488a7dea167SDimitry Andric let Types = [AllTypeClass]; 489a7dea167SDimitry Andric let Args = [ArgUint32]; 490a7dea167SDimitry Andric let HasGroup = 1; 491a7dea167SDimitry Andric} 492a7dea167SDimitry Andric// [Pointer, Value] -> [] 493a7dea167SDimitry Andricdef InitElemPop : Opcode { 494a7dea167SDimitry Andric let Types = [AllTypeClass]; 495a7dea167SDimitry Andric let Args = [ArgUint32]; 496a7dea167SDimitry Andric let HasGroup = 1; 497a7dea167SDimitry Andric} 498a7dea167SDimitry Andric 499a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 500a7dea167SDimitry Andric// Pointer arithmetic. 501a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 502a7dea167SDimitry Andric 503a7dea167SDimitry Andric// [Pointer, Integral] -> [Pointer] 504a7dea167SDimitry Andricdef AddOffset : AluOpcode; 505a7dea167SDimitry Andric// [Pointer, Integral] -> [Pointer] 506a7dea167SDimitry Andricdef SubOffset : AluOpcode; 507a7dea167SDimitry Andric 50806c3fb27SDimitry Andric// [Pointer, Pointer] -> [Integral] 509bdd1243dSDimitry Andricdef SubPtr : Opcode { 510bdd1243dSDimitry Andric let Types = [IntegerTypeClass]; 511bdd1243dSDimitry Andric let HasGroup = 1; 512bdd1243dSDimitry Andric} 513bdd1243dSDimitry Andric 51406c3fb27SDimitry Andric// [Pointer] -> [Pointer] 515*0fca6ea1SDimitry Andricdef IncPtr : Opcode; 51606c3fb27SDimitry Andric// [Pointer] -> [Pointer] 517*0fca6ea1SDimitry Andricdef DecPtr : Opcode; 51806c3fb27SDimitry Andric 51906c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 52006c3fb27SDimitry Andric// Function pointers. 52106c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 52206c3fb27SDimitry Andricdef GetFnPtr : Opcode { 52306c3fb27SDimitry Andric let Args = [ArgFunction]; 52406c3fb27SDimitry Andric} 52506c3fb27SDimitry Andric 526*0fca6ea1SDimitry Andricdef GetIntPtr : Opcode { 527*0fca6ea1SDimitry Andric let Types = [AluTypeClass]; 528*0fca6ea1SDimitry Andric let Args = [ArgDesc]; 529*0fca6ea1SDimitry Andric let HasGroup = 1; 530*0fca6ea1SDimitry Andric} 53106c3fb27SDimitry Andric 532a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 533a7dea167SDimitry Andric// Binary operators. 534a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 535a7dea167SDimitry Andric 536a7dea167SDimitry Andric// [Real, Real] -> [Real] 537a7dea167SDimitry Andricdef Add : AluOpcode; 53806c3fb27SDimitry Andricdef Addf : FloatOpcode; 53906c3fb27SDimitry Andricdef Sub : AluOpcode; 54006c3fb27SDimitry Andricdef Subf : FloatOpcode; 541a7dea167SDimitry Andricdef Mul : AluOpcode; 54206c3fb27SDimitry Andricdef Mulf : FloatOpcode; 543*0fca6ea1SDimitry Andricdef Mulc : Opcode { 544*0fca6ea1SDimitry Andric let Types = [NumberTypeClass]; 545*0fca6ea1SDimitry Andric let HasGroup = 1; 546*0fca6ea1SDimitry Andric} 54706c3fb27SDimitry Andricdef Rem : IntegerOpcode; 54806c3fb27SDimitry Andricdef Div : IntegerOpcode; 54906c3fb27SDimitry Andricdef Divf : FloatOpcode; 550*0fca6ea1SDimitry Andricdef Divc : Opcode { 551*0fca6ea1SDimitry Andric let Types = [NumberTypeClass]; 552*0fca6ea1SDimitry Andric let HasGroup = 1; 553*0fca6ea1SDimitry Andric} 55406c3fb27SDimitry Andric 55506c3fb27SDimitry Andricdef BitAnd : IntegerOpcode; 55606c3fb27SDimitry Andricdef BitOr : IntegerOpcode; 55706c3fb27SDimitry Andricdef BitXor : IntegerOpcode; 558bdd1243dSDimitry Andric 559bdd1243dSDimitry Andricdef Shl : Opcode { 560bdd1243dSDimitry Andric let Types = [IntegerTypeClass, IntegerTypeClass]; 561bdd1243dSDimitry Andric let HasGroup = 1; 562bdd1243dSDimitry Andric} 563bdd1243dSDimitry Andric 564bdd1243dSDimitry Andricdef Shr : Opcode { 565bdd1243dSDimitry Andric let Types = [IntegerTypeClass, IntegerTypeClass]; 566bdd1243dSDimitry Andric let HasGroup = 1; 567bdd1243dSDimitry Andric} 568bdd1243dSDimitry Andric 569bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 570bdd1243dSDimitry Andric// Unary operators. 571bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 572bdd1243dSDimitry Andric 573bdd1243dSDimitry Andric// [Real] -> [Real] 574bdd1243dSDimitry Andricdef Inv: Opcode { 575bdd1243dSDimitry Andric let Types = [BoolTypeClass]; 576bdd1243dSDimitry Andric let HasGroup = 1; 577bdd1243dSDimitry Andric} 578bdd1243dSDimitry Andric 57906c3fb27SDimitry Andric// Increment and decrement. 580*0fca6ea1SDimitry Andricdef Inc: AluOpcode; 581*0fca6ea1SDimitry Andricdef IncPop : AluOpcode; 582*0fca6ea1SDimitry Andricdef Dec: AluOpcode; 583*0fca6ea1SDimitry Andricdef DecPop: AluOpcode; 584bdd1243dSDimitry Andric 58506c3fb27SDimitry Andric// Float increment and decrement. 58606c3fb27SDimitry Andricdef Incf: FloatOpcode; 58706c3fb27SDimitry Andricdef IncfPop : FloatOpcode; 58806c3fb27SDimitry Andricdef Decf: FloatOpcode; 58906c3fb27SDimitry Andricdef DecfPop : FloatOpcode; 59006c3fb27SDimitry Andric 591bdd1243dSDimitry Andric// [Real] -> [Real] 592bdd1243dSDimitry Andricdef Neg: Opcode { 59306c3fb27SDimitry Andric let Types = [NonPtrTypeClass]; 594bdd1243dSDimitry Andric let HasGroup = 1; 595bdd1243dSDimitry Andric} 596bdd1243dSDimitry Andric 597bdd1243dSDimitry Andric// [Real] -> [Real] 598bdd1243dSDimitry Andricdef Comp: Opcode { 59906c3fb27SDimitry Andric let Types = [IntegerTypeClass]; 600bdd1243dSDimitry Andric let HasGroup = 1; 601bdd1243dSDimitry Andric} 602bdd1243dSDimitry Andric 603bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 60406c3fb27SDimitry Andric// Cast, CastFP. 605bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 606bdd1243dSDimitry Andric 607bdd1243dSDimitry Andricdef FromCastTypeClass : TypeClass { 6085f757f3fSDimitry Andric let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64, Bool, IntAP, IntAPS]; 609bdd1243dSDimitry Andric} 610bdd1243dSDimitry Andric 611bdd1243dSDimitry Andricdef ToCastTypeClass : TypeClass { 612bdd1243dSDimitry Andric let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64, Bool]; 613bdd1243dSDimitry Andric} 614bdd1243dSDimitry Andric 615bdd1243dSDimitry Andricdef Cast: Opcode { 616bdd1243dSDimitry Andric let Types = [FromCastTypeClass, ToCastTypeClass]; 617bdd1243dSDimitry Andric let HasGroup = 1; 618bdd1243dSDimitry Andric} 619a7dea167SDimitry Andric 62006c3fb27SDimitry Andricdef CastFP : Opcode { 62106c3fb27SDimitry Andric let Args = [ArgFltSemantics, ArgRoundingMode]; 62206c3fb27SDimitry Andric} 62306c3fb27SDimitry Andric 6245f757f3fSDimitry Andricdef FixedSizeIntegralTypes : TypeClass { 6255f757f3fSDimitry Andric let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64, Bool]; 6265f757f3fSDimitry Andric} 6275f757f3fSDimitry Andric 6285f757f3fSDimitry Andricdef CastAP : Opcode { 6295f757f3fSDimitry Andric let Types = [AluTypeClass]; 6305f757f3fSDimitry Andric let Args = [ArgUint32]; 6315f757f3fSDimitry Andric let HasGroup = 1; 6325f757f3fSDimitry Andric} 6335f757f3fSDimitry Andric 6345f757f3fSDimitry Andricdef CastAPS : Opcode { 6355f757f3fSDimitry Andric let Types = [AluTypeClass]; 6365f757f3fSDimitry Andric let Args = [ArgUint32]; 6375f757f3fSDimitry Andric let HasGroup = 1; 6385f757f3fSDimitry Andric} 6395f757f3fSDimitry Andric 64006c3fb27SDimitry Andric// Cast an integer to a floating type 64106c3fb27SDimitry Andricdef CastIntegralFloating : Opcode { 64206c3fb27SDimitry Andric let Types = [AluTypeClass]; 64306c3fb27SDimitry Andric let Args = [ArgFltSemantics, ArgRoundingMode]; 64406c3fb27SDimitry Andric let HasGroup = 1; 64506c3fb27SDimitry Andric} 64606c3fb27SDimitry Andric 64706c3fb27SDimitry Andric// Cast a floating to an integer type 64806c3fb27SDimitry Andricdef CastFloatingIntegral : Opcode { 6495f757f3fSDimitry Andric let Types = [FixedSizeIntegralTypes]; 6505f757f3fSDimitry Andric let Args = []; 6515f757f3fSDimitry Andric let HasGroup = 1; 6525f757f3fSDimitry Andric} 6535f757f3fSDimitry Andric 6545f757f3fSDimitry Andricdef CastFloatingIntegralAP : Opcode { 6555f757f3fSDimitry Andric let Args = [ArgUint32]; 6565f757f3fSDimitry Andric} 6575f757f3fSDimitry Andric 6585f757f3fSDimitry Andricdef CastFloatingIntegralAPS : Opcode { 6595f757f3fSDimitry Andric let Args = [ArgUint32]; 6605f757f3fSDimitry Andric} 6615f757f3fSDimitry Andric 6625f757f3fSDimitry Andricdef CastPointerIntegral : Opcode { 663*0fca6ea1SDimitry Andric let Types = [FixedSizeIntegralTypeClass]; 664*0fca6ea1SDimitry Andric let HasGroup = 1; 665*0fca6ea1SDimitry Andric} 666*0fca6ea1SDimitry Andricdef CastPointerIntegralAP : Opcode { 667*0fca6ea1SDimitry Andric let Args = [ArgUint32]; 668*0fca6ea1SDimitry Andric} 669*0fca6ea1SDimitry Andricdef CastPointerIntegralAPS : Opcode { 670*0fca6ea1SDimitry Andric let Args = [ArgUint32]; 671*0fca6ea1SDimitry Andric} 672*0fca6ea1SDimitry Andricdef PtrPtrCast : Opcode { 673*0fca6ea1SDimitry Andric let Args = [ArgBool]; 674*0fca6ea1SDimitry Andric 675*0fca6ea1SDimitry Andric} 676*0fca6ea1SDimitry Andric 677*0fca6ea1SDimitry Andricdef DecayPtr : Opcode { 678*0fca6ea1SDimitry Andric let Types = [PtrTypeClass, PtrTypeClass]; 67906c3fb27SDimitry Andric let HasGroup = 1; 68006c3fb27SDimitry Andric} 68106c3fb27SDimitry Andric 682a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 683a7dea167SDimitry Andric// Comparison opcodes. 684a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 685a7dea167SDimitry Andric 686a7dea167SDimitry Andricclass EqualityOpcode : Opcode { 687a7dea167SDimitry Andric let Types = [AllTypeClass]; 688a7dea167SDimitry Andric let HasGroup = 1; 689a7dea167SDimitry Andric} 690a7dea167SDimitry Andric 691a7dea167SDimitry Andricdef EQ : EqualityOpcode; 692a7dea167SDimitry Andricdef NE : EqualityOpcode; 693a7dea167SDimitry Andric 694a7dea167SDimitry Andricclass ComparisonOpcode : Opcode { 695a7dea167SDimitry Andric let Types = [ComparableTypeClass]; 696a7dea167SDimitry Andric let HasGroup = 1; 697a7dea167SDimitry Andric} 698a7dea167SDimitry Andric 6995f757f3fSDimitry Andricdef CMP3 : ComparisonOpcode { 7005f757f3fSDimitry Andric let Args = [ArgCCI]; 7015f757f3fSDimitry Andric} 7025f757f3fSDimitry Andric 703a7dea167SDimitry Andricdef LT : ComparisonOpcode; 704a7dea167SDimitry Andricdef LE : ComparisonOpcode; 705a7dea167SDimitry Andricdef GT : ComparisonOpcode; 706a7dea167SDimitry Andricdef GE : ComparisonOpcode; 707a7dea167SDimitry Andric 708a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 709a7dea167SDimitry Andric// Stack management. 710a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 711a7dea167SDimitry Andric 712a7dea167SDimitry Andric// [Value] -> [] 713a7dea167SDimitry Andricdef Pop : Opcode { 714a7dea167SDimitry Andric let Types = [AllTypeClass]; 715a7dea167SDimitry Andric let HasGroup = 1; 716a7dea167SDimitry Andric} 717a7dea167SDimitry Andric 718a7dea167SDimitry Andric// [Value] -> [Value, Value] 719a7dea167SDimitry Andricdef Dup : Opcode { 720a7dea167SDimitry Andric let Types = [AllTypeClass]; 721a7dea167SDimitry Andric let HasGroup = 1; 722a7dea167SDimitry Andric} 7235f757f3fSDimitry Andric 7245f757f3fSDimitry Andric// [] -> [] 7255f757f3fSDimitry Andricdef Invalid : Opcode {} 726*0fca6ea1SDimitry Andricdef Unsupported : Opcode {} 727*0fca6ea1SDimitry Andricdef Error : Opcode {} 7285f757f3fSDimitry Andricdef InvalidCast : Opcode { 7295f757f3fSDimitry Andric let Args = [ArgCastKind]; 7305f757f3fSDimitry Andric} 7315f757f3fSDimitry Andric 7325f757f3fSDimitry Andricdef InvalidDeclRef : Opcode { 7335f757f3fSDimitry Andric let Args = [ArgDeclRef]; 7345f757f3fSDimitry Andric} 7355f757f3fSDimitry Andric 736*0fca6ea1SDimitry Andricdef SizelessVectorElementSize : Opcode; 737*0fca6ea1SDimitry Andric 738*0fca6ea1SDimitry Andricdef Assume : Opcode; 739*0fca6ea1SDimitry Andric 7405f757f3fSDimitry Andricdef ArrayDecay : Opcode; 741*0fca6ea1SDimitry Andric 742*0fca6ea1SDimitry Andricdef CheckNonNullArg : Opcode { 743*0fca6ea1SDimitry Andric let Types = [PtrTypeClass]; 744*0fca6ea1SDimitry Andric let HasGroup = 1; 745*0fca6ea1SDimitry Andric} 746*0fca6ea1SDimitry Andric 747*0fca6ea1SDimitry Andricdef Memcpy : Opcode; 748*0fca6ea1SDimitry Andric 749*0fca6ea1SDimitry Andricdef ToMemberPtr : Opcode; 750*0fca6ea1SDimitry Andricdef CastMemberPtrPtr : Opcode; 751*0fca6ea1SDimitry Andricdef GetMemberPtr : Opcode { 752*0fca6ea1SDimitry Andric let Args = [ArgDecl]; 753*0fca6ea1SDimitry Andric} 754*0fca6ea1SDimitry Andricdef GetMemberPtrBase : Opcode; 755*0fca6ea1SDimitry Andricdef GetMemberPtrDecl : Opcode; 756*0fca6ea1SDimitry Andric 757*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 758*0fca6ea1SDimitry Andric// Debugging. 759*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 760*0fca6ea1SDimitry Andricdef Dump : Opcode; 761*0fca6ea1SDimitry Andric 762*0fca6ea1SDimitry Andricdef Alloc : Opcode { 763*0fca6ea1SDimitry Andric let Args = [ArgDesc]; 764*0fca6ea1SDimitry Andric} 765*0fca6ea1SDimitry Andric 766*0fca6ea1SDimitry Andricdef AllocN : Opcode { 767*0fca6ea1SDimitry Andric let Types = [IntegerTypeClass]; 768*0fca6ea1SDimitry Andric let Args = [ArgPrimType, ArgExpr, ArgBool]; 769*0fca6ea1SDimitry Andric let HasGroup = 1; 770*0fca6ea1SDimitry Andric} 771*0fca6ea1SDimitry Andric 772*0fca6ea1SDimitry Andricdef AllocCN : Opcode { 773*0fca6ea1SDimitry Andric let Types = [IntegerTypeClass]; 774*0fca6ea1SDimitry Andric let Args = [ArgDesc, ArgBool]; 775*0fca6ea1SDimitry Andric let HasGroup = 1; 776*0fca6ea1SDimitry Andric} 777*0fca6ea1SDimitry Andric 778*0fca6ea1SDimitry Andricdef Free : Opcode { 779*0fca6ea1SDimitry Andric let Args = [ArgBool]; 780*0fca6ea1SDimitry Andric} 781