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; 28*5f757f3fSDimitry Andricdef IntAP : Type; 29*5f757f3fSDimitry Andricdef IntAPS : Type; 3006c3fb27SDimitry Andricdef Float : Type; 31a7dea167SDimitry Andricdef Ptr : Type; 3206c3fb27SDimitry Andricdef FnPtr : Type; 33a7dea167SDimitry Andric 34a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 35a7dea167SDimitry Andric// Types transferred to the interpreter. 36a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 37a7dea167SDimitry Andric 38a7dea167SDimitry Andricclass ArgType { string Name = ?; } 39a7dea167SDimitry Andricdef ArgSint8 : ArgType { let Name = "int8_t"; } 40a7dea167SDimitry Andricdef ArgUint8 : ArgType { let Name = "uint8_t"; } 41a7dea167SDimitry Andricdef ArgSint16 : ArgType { let Name = "int16_t"; } 42a7dea167SDimitry Andricdef ArgUint16 : ArgType { let Name = "uint16_t"; } 43a7dea167SDimitry Andricdef ArgSint32 : ArgType { let Name = "int32_t"; } 44a7dea167SDimitry Andricdef ArgUint32 : ArgType { let Name = "uint32_t"; } 45a7dea167SDimitry Andricdef ArgSint64 : ArgType { let Name = "int64_t"; } 46a7dea167SDimitry Andricdef ArgUint64 : ArgType { let Name = "uint64_t"; } 4706c3fb27SDimitry Andricdef ArgFloat : ArgType { let Name = "Floating"; } 48a7dea167SDimitry Andricdef ArgBool : ArgType { let Name = "bool"; } 49a7dea167SDimitry Andric 50bdd1243dSDimitry Andricdef ArgFunction : ArgType { let Name = "const Function *"; } 51a7dea167SDimitry Andricdef ArgRecordDecl : ArgType { let Name = "const RecordDecl *"; } 52a7dea167SDimitry Andricdef ArgRecordField : ArgType { let Name = "const Record::Field *"; } 5306c3fb27SDimitry Andricdef ArgFltSemantics : ArgType { let Name = "const llvm::fltSemantics *"; } 5406c3fb27SDimitry Andricdef ArgRoundingMode : ArgType { let Name = "llvm::RoundingMode"; } 5506c3fb27SDimitry Andricdef ArgLETD: ArgType { let Name = "const LifetimeExtendedTemporaryDecl *"; } 56*5f757f3fSDimitry Andricdef ArgCastKind : ArgType { let Name = "CastKind"; } 57*5f757f3fSDimitry Andricdef ArgCallExpr : ArgType { let Name = "const CallExpr *"; } 58*5f757f3fSDimitry Andricdef ArgOffsetOfExpr : ArgType { let Name = "const OffsetOfExpr *"; } 59*5f757f3fSDimitry Andricdef ArgDeclRef : ArgType { let Name = "const DeclRefExpr *"; } 60*5f757f3fSDimitry Andricdef ArgCCI : ArgType { let Name = "const ComparisonCategoryInfo *"; } 61a7dea167SDimitry Andric 62a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 63349cc55cSDimitry Andric// Classes of types instructions operate on. 64a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 65a7dea167SDimitry Andric 66a7dea167SDimitry Andricclass TypeClass { 67a7dea167SDimitry Andric list<Type> Types; 68a7dea167SDimitry Andric} 69a7dea167SDimitry Andric 70bdd1243dSDimitry Andricdef IntegerTypeClass : TypeClass { 71bdd1243dSDimitry Andric let Types = [Sint8, Uint8, Sint16, Uint16, Sint32, 72*5f757f3fSDimitry Andric Uint32, Sint64, Uint64, IntAP, IntAPS]; 73*5f757f3fSDimitry Andric} 74*5f757f3fSDimitry Andric 75*5f757f3fSDimitry Andricdef FixedSizeIntegralTypeClass : TypeClass { 76*5f757f3fSDimitry Andric let Types = [Sint8, Uint8, Sint16, Uint16, Sint32, 77*5f757f3fSDimitry Andric Uint32, Sint64, Uint64, Bool]; 78bdd1243dSDimitry Andric} 79bdd1243dSDimitry Andric 8006c3fb27SDimitry Andricdef NumberTypeClass : TypeClass { 8106c3fb27SDimitry Andric let Types = !listconcat(IntegerTypeClass.Types, [Float]); 8206c3fb27SDimitry Andric} 8306c3fb27SDimitry Andric 8406c3fb27SDimitry Andricdef FloatTypeClass : TypeClass { 8506c3fb27SDimitry Andric let Types = [Float]; 8606c3fb27SDimitry Andric} 8706c3fb27SDimitry Andric 88bdd1243dSDimitry Andricdef AluTypeClass : TypeClass { 8906c3fb27SDimitry Andric let Types = !listconcat(IntegerTypeClass.Types, [Bool]); 90a7dea167SDimitry Andric} 91a7dea167SDimitry Andric 92a7dea167SDimitry Andricdef PtrTypeClass : TypeClass { 9306c3fb27SDimitry Andric let Types = [Ptr, FnPtr]; 94a7dea167SDimitry Andric} 95a7dea167SDimitry Andric 96bdd1243dSDimitry Andricdef BoolTypeClass : TypeClass { 97bdd1243dSDimitry Andric let Types = [Bool]; 98bdd1243dSDimitry Andric} 99bdd1243dSDimitry Andric 10006c3fb27SDimitry Andricdef NonPtrTypeClass : TypeClass { 10106c3fb27SDimitry Andric let Types = !listconcat(IntegerTypeClass.Types, [Bool], [Float]); 10206c3fb27SDimitry Andric} 10306c3fb27SDimitry Andric 104a7dea167SDimitry Andricdef AllTypeClass : TypeClass { 10506c3fb27SDimitry Andric let Types = !listconcat(AluTypeClass.Types, PtrTypeClass.Types, FloatTypeClass.Types); 106a7dea167SDimitry Andric} 107a7dea167SDimitry Andric 108a7dea167SDimitry Andricdef ComparableTypeClass : TypeClass { 10906c3fb27SDimitry Andric let Types = !listconcat(AluTypeClass.Types, [Ptr], [Float], [FnPtr]); 110a7dea167SDimitry Andric} 111a7dea167SDimitry Andric 112a7dea167SDimitry Andricclass SingletonTypeClass<Type Ty> : TypeClass { 113a7dea167SDimitry Andric let Types = [Ty]; 114a7dea167SDimitry Andric} 115a7dea167SDimitry Andric 116a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 117a7dea167SDimitry Andric// Record describing all opcodes. 118a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 119a7dea167SDimitry Andric 120a7dea167SDimitry Andricclass Opcode { 121a7dea167SDimitry Andric list<TypeClass> Types = []; 122a7dea167SDimitry Andric list<ArgType> Args = []; 123a7dea167SDimitry Andric string Name = ""; 124a7dea167SDimitry Andric bit CanReturn = 0; 125a7dea167SDimitry Andric bit ChangesPC = 0; 126a7dea167SDimitry Andric bit HasCustomLink = 0; 127a7dea167SDimitry Andric bit HasCustomEval = 0; 128a7dea167SDimitry Andric bit HasGroup = 0; 129a7dea167SDimitry Andric} 130a7dea167SDimitry Andric 131a7dea167SDimitry Andricclass AluOpcode : Opcode { 132a7dea167SDimitry Andric let Types = [AluTypeClass]; 133a7dea167SDimitry Andric let HasGroup = 1; 134a7dea167SDimitry Andric} 135a7dea167SDimitry Andric 13606c3fb27SDimitry Andricclass FloatOpcode : Opcode { 13706c3fb27SDimitry Andric let Types = []; 13806c3fb27SDimitry Andric let Args = [ArgRoundingMode]; 13906c3fb27SDimitry Andric} 14006c3fb27SDimitry Andric 141bdd1243dSDimitry Andricclass IntegerOpcode : Opcode { 142bdd1243dSDimitry Andric let Types = [IntegerTypeClass]; 143bdd1243dSDimitry Andric let HasGroup = 1; 144bdd1243dSDimitry Andric} 145bdd1243dSDimitry Andric 146a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 147a7dea167SDimitry Andric// Jump opcodes 148a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 149a7dea167SDimitry Andric 150a7dea167SDimitry Andricclass JumpOpcode : Opcode { 151a7dea167SDimitry Andric let Args = [ArgSint32]; 152a7dea167SDimitry Andric let ChangesPC = 1; 153a7dea167SDimitry Andric let HasCustomEval = 1; 154a7dea167SDimitry Andric} 155a7dea167SDimitry Andric 156a7dea167SDimitry Andric// [] -> [] 157a7dea167SDimitry Andricdef Jmp : JumpOpcode; 158a7dea167SDimitry Andric// [Bool] -> [], jumps if true. 159a7dea167SDimitry Andricdef Jt : JumpOpcode; 160a7dea167SDimitry Andric// [Bool] -> [], jumps if false. 161a7dea167SDimitry Andricdef Jf : JumpOpcode; 162a7dea167SDimitry Andric 163a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 164a7dea167SDimitry Andric// Returns 165a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 166a7dea167SDimitry Andric 167a7dea167SDimitry Andric// [Value] -> [] 168a7dea167SDimitry Andricdef Ret : Opcode { 169a7dea167SDimitry Andric let Types = [AllTypeClass]; 170a7dea167SDimitry Andric let ChangesPC = 1; 171a7dea167SDimitry Andric let CanReturn = 1; 172a7dea167SDimitry Andric let HasGroup = 1; 173a7dea167SDimitry Andric let HasCustomEval = 1; 174a7dea167SDimitry Andric} 175a7dea167SDimitry Andric// [] -> [] 176a7dea167SDimitry Andricdef RetVoid : Opcode { 177a7dea167SDimitry Andric let CanReturn = 1; 178a7dea167SDimitry Andric let ChangesPC = 1; 179a7dea167SDimitry Andric let HasCustomEval = 1; 180a7dea167SDimitry Andric} 181a7dea167SDimitry Andric// [Value] -> [] 182a7dea167SDimitry Andricdef RetValue : Opcode { 183a7dea167SDimitry Andric let CanReturn = 1; 184a7dea167SDimitry Andric let ChangesPC = 1; 185a7dea167SDimitry Andric let HasCustomEval = 1; 186a7dea167SDimitry Andric} 187a7dea167SDimitry Andric// [] -> EXIT 188a7dea167SDimitry Andricdef NoRet : Opcode {} 189a7dea167SDimitry Andric 190bdd1243dSDimitry Andric 191bdd1243dSDimitry Andricdef Call : Opcode { 192bdd1243dSDimitry Andric let Args = [ArgFunction]; 193bdd1243dSDimitry Andric let Types = []; 19406c3fb27SDimitry Andric} 19506c3fb27SDimitry Andric 19606c3fb27SDimitry Andricdef CallVirt : Opcode { 19706c3fb27SDimitry Andric let Args = [ArgFunction]; 19806c3fb27SDimitry Andric let Types = []; 19906c3fb27SDimitry Andric} 20006c3fb27SDimitry Andric 20106c3fb27SDimitry Andricdef CallBI : Opcode { 202*5f757f3fSDimitry Andric let Args = [ArgFunction, ArgCallExpr]; 20306c3fb27SDimitry Andric let Types = []; 20406c3fb27SDimitry Andric} 20506c3fb27SDimitry Andric 20606c3fb27SDimitry Andricdef CallPtr : Opcode { 20706c3fb27SDimitry Andric let Args = []; 20806c3fb27SDimitry Andric let Types = []; 209bdd1243dSDimitry Andric} 210bdd1243dSDimitry Andric 211*5f757f3fSDimitry Andricdef OffsetOf : Opcode { 212*5f757f3fSDimitry Andric let Types = [IntegerTypeClass]; 213*5f757f3fSDimitry Andric let Args = [ArgOffsetOfExpr]; 214*5f757f3fSDimitry Andric let HasGroup = 1; 215*5f757f3fSDimitry Andric} 216*5f757f3fSDimitry Andric 217a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 218a7dea167SDimitry Andric// Frame management 219a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 220a7dea167SDimitry Andric 221a7dea167SDimitry Andric// [] -> [] 222a7dea167SDimitry Andricdef Destroy : Opcode { 223a7dea167SDimitry Andric let Args = [ArgUint32]; 224a7dea167SDimitry Andric let HasCustomEval = 1; 225a7dea167SDimitry Andric} 226a7dea167SDimitry Andric 227a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 228a7dea167SDimitry Andric// Constants 229a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 230a7dea167SDimitry Andric 231a7dea167SDimitry Andricclass ConstOpcode<Type Ty, ArgType ArgTy> : Opcode { 232a7dea167SDimitry Andric let Types = [SingletonTypeClass<Ty>]; 233a7dea167SDimitry Andric let Args = [ArgTy]; 234a7dea167SDimitry Andric let Name = "Const"; 235a7dea167SDimitry Andric} 236a7dea167SDimitry Andric 237a7dea167SDimitry Andric// [] -> [Integer] 238a7dea167SDimitry Andricdef ConstSint8 : ConstOpcode<Sint8, ArgSint8>; 239a7dea167SDimitry Andricdef ConstUint8 : ConstOpcode<Uint8, ArgUint8>; 240a7dea167SDimitry Andricdef ConstSint16 : ConstOpcode<Sint16, ArgSint16>; 241a7dea167SDimitry Andricdef ConstUint16 : ConstOpcode<Uint16, ArgUint16>; 242a7dea167SDimitry Andricdef ConstSint32 : ConstOpcode<Sint32, ArgSint32>; 243a7dea167SDimitry Andricdef ConstUint32 : ConstOpcode<Uint32, ArgUint32>; 244a7dea167SDimitry Andricdef ConstSint64 : ConstOpcode<Sint64, ArgSint64>; 245a7dea167SDimitry Andricdef ConstUint64 : ConstOpcode<Uint64, ArgUint64>; 24606c3fb27SDimitry Andricdef ConstFloat : ConstOpcode<Float, ArgFloat>; 247a7dea167SDimitry Andricdef ConstBool : ConstOpcode<Bool, ArgBool>; 248a7dea167SDimitry Andric 249a7dea167SDimitry Andric// [] -> [Integer] 250a7dea167SDimitry Andricdef Zero : Opcode { 251*5f757f3fSDimitry Andric let Types = [FixedSizeIntegralTypeClass]; 252bdd1243dSDimitry Andric let HasGroup = 1; 253a7dea167SDimitry Andric} 254a7dea167SDimitry Andric 255*5f757f3fSDimitry Andricdef ZeroIntAP : Opcode { 256*5f757f3fSDimitry Andric let Args = [ArgUint32]; 257*5f757f3fSDimitry Andric} 258*5f757f3fSDimitry Andric 259*5f757f3fSDimitry Andricdef ZeroIntAPS : Opcode { 260*5f757f3fSDimitry Andric let Args = [ArgUint32]; 261*5f757f3fSDimitry Andric} 262*5f757f3fSDimitry Andric 263a7dea167SDimitry Andric// [] -> [Pointer] 264a7dea167SDimitry Andricdef Null : Opcode { 265a7dea167SDimitry Andric let Types = [PtrTypeClass]; 26606c3fb27SDimitry Andric let HasGroup = 1; 267a7dea167SDimitry Andric} 268a7dea167SDimitry Andric 269a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 270a7dea167SDimitry Andric// Pointer generation 271a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 272a7dea167SDimitry Andric 273a7dea167SDimitry Andric// [] -> [Pointer] 274a7dea167SDimitry Andricdef GetPtrLocal : Opcode { 275a7dea167SDimitry Andric // Offset of local. 276a7dea167SDimitry Andric let Args = [ArgUint32]; 277a7dea167SDimitry Andric bit HasCustomEval = 1; 278a7dea167SDimitry Andric} 279a7dea167SDimitry Andric// [] -> [Pointer] 280a7dea167SDimitry Andricdef GetPtrParam : Opcode { 281a7dea167SDimitry Andric // Offset of parameter. 282a7dea167SDimitry Andric let Args = [ArgUint32]; 283a7dea167SDimitry Andric} 284a7dea167SDimitry Andric// [] -> [Pointer] 285a7dea167SDimitry Andricdef GetPtrGlobal : Opcode { 286a7dea167SDimitry Andric // Index of global. 287a7dea167SDimitry Andric let Args = [ArgUint32]; 288a7dea167SDimitry Andric} 289a7dea167SDimitry Andric// [Pointer] -> [Pointer] 290a7dea167SDimitry Andricdef GetPtrField : Opcode { 291a7dea167SDimitry Andric // Offset of field. 292a7dea167SDimitry Andric let Args = [ArgUint32]; 293a7dea167SDimitry Andric} 294a7dea167SDimitry Andric// [Pointer] -> [Pointer] 295a7dea167SDimitry Andricdef GetPtrActiveField : Opcode { 296a7dea167SDimitry Andric // Offset of field. 297a7dea167SDimitry Andric let Args = [ArgUint32]; 298a7dea167SDimitry Andric} 299a7dea167SDimitry Andric// [] -> [Pointer] 300a7dea167SDimitry Andricdef GetPtrActiveThisField : Opcode { 301a7dea167SDimitry Andric // Offset of field. 302a7dea167SDimitry Andric let Args = [ArgUint32]; 303a7dea167SDimitry Andric} 304a7dea167SDimitry Andric// [] -> [Pointer] 305a7dea167SDimitry Andricdef GetPtrThisField : Opcode { 306a7dea167SDimitry Andric // Offset of field. 307a7dea167SDimitry Andric let Args = [ArgUint32]; 308a7dea167SDimitry Andric} 309a7dea167SDimitry Andric// [Pointer] -> [Pointer] 310a7dea167SDimitry Andricdef GetPtrBase : Opcode { 311a7dea167SDimitry Andric // Offset of field, which is a base. 312a7dea167SDimitry Andric let Args = [ArgUint32]; 313a7dea167SDimitry Andric} 314a7dea167SDimitry Andric// [Pointer] -> [Pointer] 31506c3fb27SDimitry Andricdef GetPtrBasePop : Opcode { 31606c3fb27SDimitry Andric // Offset of field, which is a base. 31706c3fb27SDimitry Andric let Args = [ArgUint32]; 31806c3fb27SDimitry Andric} 31906c3fb27SDimitry Andric 320*5f757f3fSDimitry Andricdef InitPtrPop : Opcode { 321*5f757f3fSDimitry Andric let Args = []; 322*5f757f3fSDimitry Andric} 323*5f757f3fSDimitry Andric 324*5f757f3fSDimitry Andricdef GetPtrDerivedPop : Opcode { 325*5f757f3fSDimitry Andric let Args = [ArgUint32]; 326*5f757f3fSDimitry Andric} 327*5f757f3fSDimitry Andric 32806c3fb27SDimitry Andric// [Pointer] -> [Pointer] 329a7dea167SDimitry Andricdef GetPtrVirtBase : Opcode { 330a7dea167SDimitry Andric // RecordDecl of base class. 331a7dea167SDimitry Andric let Args = [ArgRecordDecl]; 332a7dea167SDimitry Andric} 333a7dea167SDimitry Andric// [] -> [Pointer] 334a7dea167SDimitry Andricdef GetPtrThisBase : Opcode { 335a7dea167SDimitry Andric // Offset of field, which is a base. 336a7dea167SDimitry Andric let Args = [ArgUint32]; 337a7dea167SDimitry Andric} 338a7dea167SDimitry Andric// [] -> [Pointer] 339a7dea167SDimitry Andricdef GetPtrThisVirtBase : Opcode { 340a7dea167SDimitry Andric // RecordDecl of base class. 341a7dea167SDimitry Andric let Args = [ArgRecordDecl]; 342a7dea167SDimitry Andric} 343a7dea167SDimitry Andric// [] -> [Pointer] 344a7dea167SDimitry Andricdef This : Opcode; 345a7dea167SDimitry Andric 346bdd1243dSDimitry Andric// [] -> [Pointer] 347bdd1243dSDimitry Andricdef RVOPtr : Opcode; 348bdd1243dSDimitry Andric 349a7dea167SDimitry Andric// [Pointer] -> [Pointer] 350a7dea167SDimitry Andricdef NarrowPtr : Opcode; 351a7dea167SDimitry Andric// [Pointer] -> [Pointer] 352a7dea167SDimitry Andricdef ExpandPtr : Opcode; 35306c3fb27SDimitry Andric// [Pointer, Offset] -> [Pointer] 35406c3fb27SDimitry Andricdef ArrayElemPtr : AluOpcode; 35506c3fb27SDimitry Andricdef ArrayElemPtrPop : AluOpcode; 356a7dea167SDimitry Andric 357a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 358a7dea167SDimitry Andric// Direct field accessors 359a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 360a7dea167SDimitry Andric 361a7dea167SDimitry Andricclass AccessOpcode : Opcode { 362a7dea167SDimitry Andric let Types = [AllTypeClass]; 363a7dea167SDimitry Andric let Args = [ArgUint32]; 364a7dea167SDimitry Andric let HasGroup = 1; 365a7dea167SDimitry Andric} 366a7dea167SDimitry Andric 367a7dea167SDimitry Andricclass BitFieldOpcode : Opcode { 368a7dea167SDimitry Andric let Types = [AluTypeClass]; 369a7dea167SDimitry Andric let Args = [ArgRecordField]; 370a7dea167SDimitry Andric let HasGroup = 1; 371a7dea167SDimitry Andric} 372a7dea167SDimitry Andric 373a7dea167SDimitry Andric// [] -> [Pointer] 374a7dea167SDimitry Andricdef GetLocal : AccessOpcode { let HasCustomEval = 1; } 375a7dea167SDimitry Andric// [] -> [Pointer] 376a7dea167SDimitry Andricdef SetLocal : AccessOpcode { let HasCustomEval = 1; } 377a7dea167SDimitry Andric 37806c3fb27SDimitry Andricdef CheckGlobalCtor : Opcode {} 37906c3fb27SDimitry Andric 380a7dea167SDimitry Andric// [] -> [Value] 381a7dea167SDimitry Andricdef GetGlobal : AccessOpcode; 382a7dea167SDimitry Andric// [Value] -> [] 383a7dea167SDimitry Andricdef InitGlobal : AccessOpcode; 384a7dea167SDimitry Andric// [Value] -> [] 38506c3fb27SDimitry Andricdef InitGlobalTemp : AccessOpcode { 38606c3fb27SDimitry Andric let Args = [ArgUint32, ArgLETD]; 38706c3fb27SDimitry Andric} 388*5f757f3fSDimitry Andric// [Pointer] -> [Pointer] 389*5f757f3fSDimitry Andricdef InitGlobalTempComp : Opcode { 390*5f757f3fSDimitry Andric let Args = [ArgLETD]; 391*5f757f3fSDimitry Andric let Types = []; 392*5f757f3fSDimitry Andric let HasGroup = 0; 393*5f757f3fSDimitry Andric} 39406c3fb27SDimitry Andric// [Value] -> [] 395a7dea167SDimitry Andricdef SetGlobal : AccessOpcode; 396a7dea167SDimitry Andric 397a7dea167SDimitry Andric// [] -> [Value] 398a7dea167SDimitry Andricdef GetParam : AccessOpcode; 399a7dea167SDimitry Andric// [Value] -> [] 400a7dea167SDimitry Andricdef SetParam : AccessOpcode; 401a7dea167SDimitry Andric 402a7dea167SDimitry Andric// [Pointer] -> [Pointer, Value] 403a7dea167SDimitry Andricdef GetField : AccessOpcode; 404a7dea167SDimitry Andric// [Pointer] -> [Value] 405a7dea167SDimitry Andricdef GetFieldPop : AccessOpcode; 406a7dea167SDimitry Andric// [] -> [Value] 407a7dea167SDimitry Andricdef GetThisField : AccessOpcode; 408a7dea167SDimitry Andric 409a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer] 410a7dea167SDimitry Andricdef SetField : AccessOpcode; 411a7dea167SDimitry Andric// [Value] -> [] 412a7dea167SDimitry Andricdef SetThisField : AccessOpcode; 413a7dea167SDimitry Andric 414a7dea167SDimitry Andric// [Value] -> [] 415a7dea167SDimitry Andricdef InitThisField : AccessOpcode; 416a7dea167SDimitry Andric// [Value] -> [] 417a7dea167SDimitry Andricdef InitThisFieldActive : AccessOpcode; 418a7dea167SDimitry Andric// [Value] -> [] 419a7dea167SDimitry Andricdef InitThisBitField : BitFieldOpcode; 420a7dea167SDimitry Andric// [Pointer, Value] -> [] 421a7dea167SDimitry Andricdef InitField : AccessOpcode; 422a7dea167SDimitry Andric// [Pointer, Value] -> [] 423a7dea167SDimitry Andricdef InitBitField : BitFieldOpcode; 424a7dea167SDimitry Andric// [Pointer, Value] -> [] 425a7dea167SDimitry Andricdef InitFieldActive : AccessOpcode; 426a7dea167SDimitry Andric 427a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 428a7dea167SDimitry Andric// Pointer access 429a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 430a7dea167SDimitry Andric 431a7dea167SDimitry Andricclass LoadOpcode : Opcode { 432a7dea167SDimitry Andric let Types = [AllTypeClass]; 433a7dea167SDimitry Andric let HasGroup = 1; 434a7dea167SDimitry Andric} 435a7dea167SDimitry Andric 436a7dea167SDimitry Andric// [Pointer] -> [Pointer, Value] 437a7dea167SDimitry Andricdef Load : LoadOpcode {} 438a7dea167SDimitry Andric// [Pointer] -> [Value] 439a7dea167SDimitry Andricdef LoadPop : LoadOpcode {} 440a7dea167SDimitry Andric 441a7dea167SDimitry Andricclass StoreOpcode : Opcode { 442a7dea167SDimitry Andric let Types = [AllTypeClass]; 443a7dea167SDimitry Andric let HasGroup = 1; 444a7dea167SDimitry Andric} 445a7dea167SDimitry Andric 446a7dea167SDimitry Andricclass StoreBitFieldOpcode : Opcode { 447a7dea167SDimitry Andric let Types = [AluTypeClass]; 448a7dea167SDimitry Andric let HasGroup = 1; 449a7dea167SDimitry Andric} 450a7dea167SDimitry Andric 451a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer] 452a7dea167SDimitry Andricdef Store : StoreOpcode {} 453a7dea167SDimitry Andric// [Pointer, Value] -> [] 454a7dea167SDimitry Andricdef StorePop : StoreOpcode {} 455a7dea167SDimitry Andric 456a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer] 457a7dea167SDimitry Andricdef StoreBitField : StoreBitFieldOpcode {} 458a7dea167SDimitry Andric// [Pointer, Value] -> [] 459a7dea167SDimitry Andricdef StoreBitFieldPop : StoreBitFieldOpcode {} 460a7dea167SDimitry Andric 461a7dea167SDimitry Andric// [Pointer, Value] -> [] 462a7dea167SDimitry Andricdef InitPop : StoreOpcode {} 463a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer] 464a7dea167SDimitry Andricdef InitElem : Opcode { 465a7dea167SDimitry Andric let Types = [AllTypeClass]; 466a7dea167SDimitry Andric let Args = [ArgUint32]; 467a7dea167SDimitry Andric let HasGroup = 1; 468a7dea167SDimitry Andric} 469a7dea167SDimitry Andric// [Pointer, Value] -> [] 470a7dea167SDimitry Andricdef InitElemPop : Opcode { 471a7dea167SDimitry Andric let Types = [AllTypeClass]; 472a7dea167SDimitry Andric let Args = [ArgUint32]; 473a7dea167SDimitry Andric let HasGroup = 1; 474a7dea167SDimitry Andric} 475a7dea167SDimitry Andric 476a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 477a7dea167SDimitry Andric// Pointer arithmetic. 478a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 479a7dea167SDimitry Andric 480a7dea167SDimitry Andric// [Pointer, Integral] -> [Pointer] 481a7dea167SDimitry Andricdef AddOffset : AluOpcode; 482a7dea167SDimitry Andric// [Pointer, Integral] -> [Pointer] 483a7dea167SDimitry Andricdef SubOffset : AluOpcode; 484a7dea167SDimitry Andric 48506c3fb27SDimitry Andric// [Pointer, Pointer] -> [Integral] 486bdd1243dSDimitry Andricdef SubPtr : Opcode { 487bdd1243dSDimitry Andric let Types = [IntegerTypeClass]; 488bdd1243dSDimitry Andric let HasGroup = 1; 489bdd1243dSDimitry Andric} 490bdd1243dSDimitry Andric 49106c3fb27SDimitry Andric// [Pointer] -> [Pointer] 49206c3fb27SDimitry Andricdef IncPtr : Opcode { 49306c3fb27SDimitry Andric let HasGroup = 0; 49406c3fb27SDimitry Andric} 49506c3fb27SDimitry Andric// [Pointer] -> [Pointer] 49606c3fb27SDimitry Andricdef DecPtr : Opcode { 49706c3fb27SDimitry Andric let HasGroup = 0; 49806c3fb27SDimitry Andric} 49906c3fb27SDimitry Andric 50006c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 50106c3fb27SDimitry Andric// Function pointers. 50206c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 50306c3fb27SDimitry Andricdef GetFnPtr : Opcode { 50406c3fb27SDimitry Andric let Args = [ArgFunction]; 50506c3fb27SDimitry Andric} 50606c3fb27SDimitry Andric 50706c3fb27SDimitry Andric 508a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 509a7dea167SDimitry Andric// Binary operators. 510a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 511a7dea167SDimitry Andric 512a7dea167SDimitry Andric// [Real, Real] -> [Real] 513a7dea167SDimitry Andricdef Add : AluOpcode; 51406c3fb27SDimitry Andricdef Addf : FloatOpcode; 51506c3fb27SDimitry Andricdef Sub : AluOpcode; 51606c3fb27SDimitry Andricdef Subf : FloatOpcode; 517a7dea167SDimitry Andricdef Mul : AluOpcode; 51806c3fb27SDimitry Andricdef Mulf : FloatOpcode; 51906c3fb27SDimitry Andricdef Rem : IntegerOpcode; 52006c3fb27SDimitry Andricdef Div : IntegerOpcode; 52106c3fb27SDimitry Andricdef Divf : FloatOpcode; 52206c3fb27SDimitry Andric 52306c3fb27SDimitry Andricdef BitAnd : IntegerOpcode; 52406c3fb27SDimitry Andricdef BitOr : IntegerOpcode; 52506c3fb27SDimitry Andricdef BitXor : IntegerOpcode; 526bdd1243dSDimitry Andric 527bdd1243dSDimitry Andricdef Shl : Opcode { 528bdd1243dSDimitry Andric let Types = [IntegerTypeClass, IntegerTypeClass]; 529bdd1243dSDimitry Andric let HasGroup = 1; 530bdd1243dSDimitry Andric} 531bdd1243dSDimitry Andric 532bdd1243dSDimitry Andricdef Shr : Opcode { 533bdd1243dSDimitry Andric let Types = [IntegerTypeClass, IntegerTypeClass]; 534bdd1243dSDimitry Andric let HasGroup = 1; 535bdd1243dSDimitry Andric} 536bdd1243dSDimitry Andric 537bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 538bdd1243dSDimitry Andric// Unary operators. 539bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 540bdd1243dSDimitry Andric 541bdd1243dSDimitry Andric// [Real] -> [Real] 542bdd1243dSDimitry Andricdef Inv: Opcode { 543bdd1243dSDimitry Andric let Types = [BoolTypeClass]; 544bdd1243dSDimitry Andric let HasGroup = 1; 545bdd1243dSDimitry Andric} 546bdd1243dSDimitry Andric 54706c3fb27SDimitry Andric// Increment and decrement. 548bdd1243dSDimitry Andricdef Inc: IntegerOpcode; 549bdd1243dSDimitry Andricdef IncPop : IntegerOpcode; 550bdd1243dSDimitry Andricdef Dec: IntegerOpcode; 551bdd1243dSDimitry Andricdef DecPop: IntegerOpcode; 552bdd1243dSDimitry Andric 55306c3fb27SDimitry Andric// Float increment and decrement. 55406c3fb27SDimitry Andricdef Incf: FloatOpcode; 55506c3fb27SDimitry Andricdef IncfPop : FloatOpcode; 55606c3fb27SDimitry Andricdef Decf: FloatOpcode; 55706c3fb27SDimitry Andricdef DecfPop : FloatOpcode; 55806c3fb27SDimitry Andric 559bdd1243dSDimitry Andric// [Real] -> [Real] 560bdd1243dSDimitry Andricdef Neg: Opcode { 56106c3fb27SDimitry Andric let Types = [NonPtrTypeClass]; 562bdd1243dSDimitry Andric let HasGroup = 1; 563bdd1243dSDimitry Andric} 564bdd1243dSDimitry Andric 565bdd1243dSDimitry Andric// [Real] -> [Real] 566bdd1243dSDimitry Andricdef Comp: Opcode { 56706c3fb27SDimitry Andric let Types = [IntegerTypeClass]; 568bdd1243dSDimitry Andric let HasGroup = 1; 569bdd1243dSDimitry Andric} 570bdd1243dSDimitry Andric 571bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 57206c3fb27SDimitry Andric// Cast, CastFP. 573bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 574bdd1243dSDimitry Andric 575bdd1243dSDimitry Andricdef FromCastTypeClass : TypeClass { 576*5f757f3fSDimitry Andric let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64, Bool, IntAP, IntAPS]; 577bdd1243dSDimitry Andric} 578bdd1243dSDimitry Andric 579bdd1243dSDimitry Andricdef ToCastTypeClass : TypeClass { 580bdd1243dSDimitry Andric let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64, Bool]; 581bdd1243dSDimitry Andric} 582bdd1243dSDimitry Andric 583bdd1243dSDimitry Andricdef Cast: Opcode { 584bdd1243dSDimitry Andric let Types = [FromCastTypeClass, ToCastTypeClass]; 585bdd1243dSDimitry Andric let HasGroup = 1; 586bdd1243dSDimitry Andric} 587a7dea167SDimitry Andric 58806c3fb27SDimitry Andricdef CastFP : Opcode { 58906c3fb27SDimitry Andric let Types = []; 59006c3fb27SDimitry Andric let Args = [ArgFltSemantics, ArgRoundingMode]; 59106c3fb27SDimitry Andric} 59206c3fb27SDimitry Andric 593*5f757f3fSDimitry Andricdef FixedSizeIntegralTypes : TypeClass { 594*5f757f3fSDimitry Andric let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64, Bool]; 595*5f757f3fSDimitry Andric} 596*5f757f3fSDimitry Andric 597*5f757f3fSDimitry Andricdef CastAP : Opcode { 598*5f757f3fSDimitry Andric let Types = [AluTypeClass]; 599*5f757f3fSDimitry Andric let Args = [ArgUint32]; 600*5f757f3fSDimitry Andric let HasGroup = 1; 601*5f757f3fSDimitry Andric} 602*5f757f3fSDimitry Andric 603*5f757f3fSDimitry Andricdef CastAPS : Opcode { 604*5f757f3fSDimitry Andric let Types = [AluTypeClass]; 605*5f757f3fSDimitry Andric let Args = [ArgUint32]; 606*5f757f3fSDimitry Andric let HasGroup = 1; 607*5f757f3fSDimitry Andric} 608*5f757f3fSDimitry Andric 60906c3fb27SDimitry Andric// Cast an integer to a floating type 61006c3fb27SDimitry Andricdef CastIntegralFloating : Opcode { 61106c3fb27SDimitry Andric let Types = [AluTypeClass]; 61206c3fb27SDimitry Andric let Args = [ArgFltSemantics, ArgRoundingMode]; 61306c3fb27SDimitry Andric let HasGroup = 1; 61406c3fb27SDimitry Andric} 61506c3fb27SDimitry Andric 61606c3fb27SDimitry Andric// Cast a floating to an integer type 61706c3fb27SDimitry Andricdef CastFloatingIntegral : Opcode { 618*5f757f3fSDimitry Andric let Types = [FixedSizeIntegralTypes]; 619*5f757f3fSDimitry Andric let Args = []; 620*5f757f3fSDimitry Andric let HasGroup = 1; 621*5f757f3fSDimitry Andric} 622*5f757f3fSDimitry Andric 623*5f757f3fSDimitry Andricdef CastFloatingIntegralAP : Opcode { 624*5f757f3fSDimitry Andric let Types = []; 625*5f757f3fSDimitry Andric let Args = [ArgUint32]; 626*5f757f3fSDimitry Andric} 627*5f757f3fSDimitry Andric 628*5f757f3fSDimitry Andricdef CastFloatingIntegralAPS : Opcode { 629*5f757f3fSDimitry Andric let Types = []; 630*5f757f3fSDimitry Andric let Args = [ArgUint32]; 631*5f757f3fSDimitry Andric} 632*5f757f3fSDimitry Andric 633*5f757f3fSDimitry Andricdef CastPointerIntegral : Opcode { 63406c3fb27SDimitry Andric let Types = [AluTypeClass]; 63506c3fb27SDimitry Andric let Args = []; 63606c3fb27SDimitry Andric let HasGroup = 1; 63706c3fb27SDimitry Andric} 63806c3fb27SDimitry Andric 639a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 640a7dea167SDimitry Andric// Comparison opcodes. 641a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 642a7dea167SDimitry Andric 643a7dea167SDimitry Andricclass EqualityOpcode : Opcode { 644a7dea167SDimitry Andric let Types = [AllTypeClass]; 645a7dea167SDimitry Andric let HasGroup = 1; 646a7dea167SDimitry Andric} 647a7dea167SDimitry Andric 648a7dea167SDimitry Andricdef EQ : EqualityOpcode; 649a7dea167SDimitry Andricdef NE : EqualityOpcode; 650a7dea167SDimitry Andric 651a7dea167SDimitry Andricclass ComparisonOpcode : Opcode { 652a7dea167SDimitry Andric let Types = [ComparableTypeClass]; 653a7dea167SDimitry Andric let HasGroup = 1; 654a7dea167SDimitry Andric} 655a7dea167SDimitry Andric 656*5f757f3fSDimitry Andricdef CMP3 : ComparisonOpcode { 657*5f757f3fSDimitry Andric let Args = [ArgCCI]; 658*5f757f3fSDimitry Andric} 659*5f757f3fSDimitry Andric 660a7dea167SDimitry Andricdef LT : ComparisonOpcode; 661a7dea167SDimitry Andricdef LE : ComparisonOpcode; 662a7dea167SDimitry Andricdef GT : ComparisonOpcode; 663a7dea167SDimitry Andricdef GE : ComparisonOpcode; 664a7dea167SDimitry Andric 665a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 666a7dea167SDimitry Andric// Stack management. 667a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 668a7dea167SDimitry Andric 669a7dea167SDimitry Andric// [Value] -> [] 670a7dea167SDimitry Andricdef Pop : Opcode { 671a7dea167SDimitry Andric let Types = [AllTypeClass]; 672a7dea167SDimitry Andric let HasGroup = 1; 673a7dea167SDimitry Andric} 674a7dea167SDimitry Andric 675a7dea167SDimitry Andric// [Value] -> [Value, Value] 676a7dea167SDimitry Andricdef Dup : Opcode { 677a7dea167SDimitry Andric let Types = [AllTypeClass]; 678a7dea167SDimitry Andric let HasGroup = 1; 679a7dea167SDimitry Andric} 680*5f757f3fSDimitry Andric 681*5f757f3fSDimitry Andric// [] -> [] 682*5f757f3fSDimitry Andricdef Invalid : Opcode {} 683*5f757f3fSDimitry Andricdef InvalidCast : Opcode { 684*5f757f3fSDimitry Andric let Args = [ArgCastKind]; 685*5f757f3fSDimitry Andric} 686*5f757f3fSDimitry Andric 687*5f757f3fSDimitry Andricdef InvalidDeclRef : Opcode { 688*5f757f3fSDimitry Andric let Args = [ArgDeclRef]; 689*5f757f3fSDimitry Andric} 690*5f757f3fSDimitry Andric 691*5f757f3fSDimitry Andricdef ArrayDecay : Opcode; 692