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