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; 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 *"; } 565f757f3fSDimitry Andricdef ArgCastKind : ArgType { let Name = "CastKind"; } 575f757f3fSDimitry Andricdef ArgCallExpr : ArgType { let Name = "const CallExpr *"; } 585f757f3fSDimitry Andricdef ArgOffsetOfExpr : ArgType { let Name = "const OffsetOfExpr *"; } 595f757f3fSDimitry Andricdef ArgDeclRef : ArgType { let Name = "const DeclRefExpr *"; } 605f757f3fSDimitry 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, 725f757f3fSDimitry Andric Uint32, Sint64, Uint64, IntAP, IntAPS]; 735f757f3fSDimitry Andric} 745f757f3fSDimitry Andric 755f757f3fSDimitry Andricdef FixedSizeIntegralTypeClass : TypeClass { 765f757f3fSDimitry Andric let Types = [Sint8, Uint8, Sint16, Uint16, Sint32, 775f757f3fSDimitry 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 { 2025f757f3fSDimitry 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 2115f757f3fSDimitry Andricdef OffsetOf : Opcode { 2125f757f3fSDimitry Andric let Types = [IntegerTypeClass]; 2135f757f3fSDimitry Andric let Args = [ArgOffsetOfExpr]; 2145f757f3fSDimitry Andric let HasGroup = 1; 2155f757f3fSDimitry Andric} 2165f757f3fSDimitry 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 { 2515f757f3fSDimitry Andric let Types = [FixedSizeIntegralTypeClass]; 252bdd1243dSDimitry Andric let HasGroup = 1; 253a7dea167SDimitry Andric} 254a7dea167SDimitry Andric 2555f757f3fSDimitry Andricdef ZeroIntAP : Opcode { 2565f757f3fSDimitry Andric let Args = [ArgUint32]; 2575f757f3fSDimitry Andric} 2585f757f3fSDimitry Andric 2595f757f3fSDimitry Andricdef ZeroIntAPS : Opcode { 2605f757f3fSDimitry Andric let Args = [ArgUint32]; 2615f757f3fSDimitry Andric} 2625f757f3fSDimitry 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 3205f757f3fSDimitry Andricdef InitPtrPop : Opcode { 3215f757f3fSDimitry Andric let Args = []; 3225f757f3fSDimitry Andric} 3235f757f3fSDimitry Andric 3245f757f3fSDimitry Andricdef GetPtrDerivedPop : Opcode { 3255f757f3fSDimitry Andric let Args = [ArgUint32]; 3265f757f3fSDimitry Andric} 3275f757f3fSDimitry 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 378a7dea167SDimitry Andric// [] -> [Value] 379a7dea167SDimitry Andricdef GetGlobal : AccessOpcode; 380*7a6dacacSDimitry Andricdef GetGlobalUnchecked : AccessOpcode; 381a7dea167SDimitry Andric// [Value] -> [] 382a7dea167SDimitry Andricdef InitGlobal : AccessOpcode; 383a7dea167SDimitry Andric// [Value] -> [] 38406c3fb27SDimitry Andricdef InitGlobalTemp : AccessOpcode { 38506c3fb27SDimitry Andric let Args = [ArgUint32, ArgLETD]; 38606c3fb27SDimitry Andric} 3875f757f3fSDimitry Andric// [Pointer] -> [Pointer] 3885f757f3fSDimitry Andricdef InitGlobalTempComp : Opcode { 3895f757f3fSDimitry Andric let Args = [ArgLETD]; 3905f757f3fSDimitry Andric let Types = []; 3915f757f3fSDimitry Andric let HasGroup = 0; 3925f757f3fSDimitry Andric} 39306c3fb27SDimitry Andric// [Value] -> [] 394a7dea167SDimitry Andricdef SetGlobal : AccessOpcode; 395a7dea167SDimitry Andric 396a7dea167SDimitry Andric// [] -> [Value] 397a7dea167SDimitry Andricdef GetParam : AccessOpcode; 398a7dea167SDimitry Andric// [Value] -> [] 399a7dea167SDimitry Andricdef SetParam : AccessOpcode; 400a7dea167SDimitry Andric 401a7dea167SDimitry Andric// [Pointer] -> [Pointer, Value] 402a7dea167SDimitry Andricdef GetField : AccessOpcode; 403a7dea167SDimitry Andric// [Pointer] -> [Value] 404a7dea167SDimitry Andricdef GetFieldPop : AccessOpcode; 405a7dea167SDimitry Andric// [] -> [Value] 406a7dea167SDimitry Andricdef GetThisField : AccessOpcode; 407a7dea167SDimitry Andric 408a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer] 409a7dea167SDimitry Andricdef SetField : AccessOpcode; 410a7dea167SDimitry Andric// [Value] -> [] 411a7dea167SDimitry Andricdef SetThisField : AccessOpcode; 412a7dea167SDimitry Andric 413a7dea167SDimitry Andric// [Value] -> [] 414a7dea167SDimitry Andricdef InitThisField : AccessOpcode; 415a7dea167SDimitry Andric// [Value] -> [] 416a7dea167SDimitry Andricdef InitThisFieldActive : AccessOpcode; 417a7dea167SDimitry Andric// [Value] -> [] 418*7a6dacacSDimitry Andricdef InitThisBitField : Opcode { 419*7a6dacacSDimitry Andric let Types = [AluTypeClass]; 420*7a6dacacSDimitry Andric let Args = [ArgRecordField, ArgUint32]; 421*7a6dacacSDimitry Andric let HasGroup = 1; 422*7a6dacacSDimitry Andric} 423a7dea167SDimitry Andric// [Pointer, Value] -> [] 424a7dea167SDimitry Andricdef InitField : AccessOpcode; 425a7dea167SDimitry Andric// [Pointer, Value] -> [] 426a7dea167SDimitry Andricdef InitBitField : BitFieldOpcode; 427a7dea167SDimitry Andric// [Pointer, Value] -> [] 428a7dea167SDimitry Andricdef InitFieldActive : AccessOpcode; 429a7dea167SDimitry Andric 430a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 431a7dea167SDimitry Andric// Pointer access 432a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 433a7dea167SDimitry Andric 434a7dea167SDimitry Andricclass LoadOpcode : Opcode { 435a7dea167SDimitry Andric let Types = [AllTypeClass]; 436a7dea167SDimitry Andric let HasGroup = 1; 437a7dea167SDimitry Andric} 438a7dea167SDimitry Andric 439a7dea167SDimitry Andric// [Pointer] -> [Pointer, Value] 440a7dea167SDimitry Andricdef Load : LoadOpcode {} 441a7dea167SDimitry Andric// [Pointer] -> [Value] 442a7dea167SDimitry Andricdef LoadPop : LoadOpcode {} 443a7dea167SDimitry Andric 444a7dea167SDimitry Andricclass StoreOpcode : Opcode { 445a7dea167SDimitry Andric let Types = [AllTypeClass]; 446a7dea167SDimitry Andric let HasGroup = 1; 447a7dea167SDimitry Andric} 448a7dea167SDimitry Andric 449a7dea167SDimitry Andricclass StoreBitFieldOpcode : Opcode { 450a7dea167SDimitry Andric let Types = [AluTypeClass]; 451a7dea167SDimitry Andric let HasGroup = 1; 452a7dea167SDimitry Andric} 453a7dea167SDimitry Andric 454a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer] 455a7dea167SDimitry Andricdef Store : StoreOpcode {} 456a7dea167SDimitry Andric// [Pointer, Value] -> [] 457a7dea167SDimitry Andricdef StorePop : StoreOpcode {} 458a7dea167SDimitry Andric 459a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer] 460a7dea167SDimitry Andricdef StoreBitField : StoreBitFieldOpcode {} 461a7dea167SDimitry Andric// [Pointer, Value] -> [] 462a7dea167SDimitry Andricdef StoreBitFieldPop : StoreBitFieldOpcode {} 463a7dea167SDimitry Andric 464a7dea167SDimitry Andric// [Pointer, Value] -> [] 465a7dea167SDimitry Andricdef InitPop : StoreOpcode {} 466a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer] 467a7dea167SDimitry Andricdef InitElem : Opcode { 468a7dea167SDimitry Andric let Types = [AllTypeClass]; 469a7dea167SDimitry Andric let Args = [ArgUint32]; 470a7dea167SDimitry Andric let HasGroup = 1; 471a7dea167SDimitry Andric} 472a7dea167SDimitry Andric// [Pointer, Value] -> [] 473a7dea167SDimitry Andricdef InitElemPop : Opcode { 474a7dea167SDimitry Andric let Types = [AllTypeClass]; 475a7dea167SDimitry Andric let Args = [ArgUint32]; 476a7dea167SDimitry Andric let HasGroup = 1; 477a7dea167SDimitry Andric} 478a7dea167SDimitry Andric 479a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 480a7dea167SDimitry Andric// Pointer arithmetic. 481a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 482a7dea167SDimitry Andric 483a7dea167SDimitry Andric// [Pointer, Integral] -> [Pointer] 484a7dea167SDimitry Andricdef AddOffset : AluOpcode; 485a7dea167SDimitry Andric// [Pointer, Integral] -> [Pointer] 486a7dea167SDimitry Andricdef SubOffset : AluOpcode; 487a7dea167SDimitry Andric 48806c3fb27SDimitry Andric// [Pointer, Pointer] -> [Integral] 489bdd1243dSDimitry Andricdef SubPtr : Opcode { 490bdd1243dSDimitry Andric let Types = [IntegerTypeClass]; 491bdd1243dSDimitry Andric let HasGroup = 1; 492bdd1243dSDimitry Andric} 493bdd1243dSDimitry Andric 49406c3fb27SDimitry Andric// [Pointer] -> [Pointer] 49506c3fb27SDimitry Andricdef IncPtr : Opcode { 49606c3fb27SDimitry Andric let HasGroup = 0; 49706c3fb27SDimitry Andric} 49806c3fb27SDimitry Andric// [Pointer] -> [Pointer] 49906c3fb27SDimitry Andricdef DecPtr : Opcode { 50006c3fb27SDimitry Andric let HasGroup = 0; 50106c3fb27SDimitry Andric} 50206c3fb27SDimitry Andric 50306c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 50406c3fb27SDimitry Andric// Function pointers. 50506c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 50606c3fb27SDimitry Andricdef GetFnPtr : Opcode { 50706c3fb27SDimitry Andric let Args = [ArgFunction]; 50806c3fb27SDimitry Andric} 50906c3fb27SDimitry Andric 51006c3fb27SDimitry Andric 511a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 512a7dea167SDimitry Andric// Binary operators. 513a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 514a7dea167SDimitry Andric 515a7dea167SDimitry Andric// [Real, Real] -> [Real] 516a7dea167SDimitry Andricdef Add : AluOpcode; 51706c3fb27SDimitry Andricdef Addf : FloatOpcode; 51806c3fb27SDimitry Andricdef Sub : AluOpcode; 51906c3fb27SDimitry Andricdef Subf : FloatOpcode; 520a7dea167SDimitry Andricdef Mul : AluOpcode; 52106c3fb27SDimitry Andricdef Mulf : FloatOpcode; 52206c3fb27SDimitry Andricdef Rem : IntegerOpcode; 52306c3fb27SDimitry Andricdef Div : IntegerOpcode; 52406c3fb27SDimitry Andricdef Divf : FloatOpcode; 52506c3fb27SDimitry Andric 52606c3fb27SDimitry Andricdef BitAnd : IntegerOpcode; 52706c3fb27SDimitry Andricdef BitOr : IntegerOpcode; 52806c3fb27SDimitry Andricdef BitXor : IntegerOpcode; 529bdd1243dSDimitry Andric 530bdd1243dSDimitry Andricdef Shl : Opcode { 531bdd1243dSDimitry Andric let Types = [IntegerTypeClass, IntegerTypeClass]; 532bdd1243dSDimitry Andric let HasGroup = 1; 533bdd1243dSDimitry Andric} 534bdd1243dSDimitry Andric 535bdd1243dSDimitry Andricdef Shr : Opcode { 536bdd1243dSDimitry Andric let Types = [IntegerTypeClass, IntegerTypeClass]; 537bdd1243dSDimitry Andric let HasGroup = 1; 538bdd1243dSDimitry Andric} 539bdd1243dSDimitry Andric 540bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 541bdd1243dSDimitry Andric// Unary operators. 542bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 543bdd1243dSDimitry Andric 544bdd1243dSDimitry Andric// [Real] -> [Real] 545bdd1243dSDimitry Andricdef Inv: Opcode { 546bdd1243dSDimitry Andric let Types = [BoolTypeClass]; 547bdd1243dSDimitry Andric let HasGroup = 1; 548bdd1243dSDimitry Andric} 549bdd1243dSDimitry Andric 55006c3fb27SDimitry Andric// Increment and decrement. 551bdd1243dSDimitry Andricdef Inc: IntegerOpcode; 552bdd1243dSDimitry Andricdef IncPop : IntegerOpcode; 553bdd1243dSDimitry Andricdef Dec: IntegerOpcode; 554bdd1243dSDimitry Andricdef DecPop: IntegerOpcode; 555bdd1243dSDimitry Andric 55606c3fb27SDimitry Andric// Float increment and decrement. 55706c3fb27SDimitry Andricdef Incf: FloatOpcode; 55806c3fb27SDimitry Andricdef IncfPop : FloatOpcode; 55906c3fb27SDimitry Andricdef Decf: FloatOpcode; 56006c3fb27SDimitry Andricdef DecfPop : FloatOpcode; 56106c3fb27SDimitry Andric 562bdd1243dSDimitry Andric// [Real] -> [Real] 563bdd1243dSDimitry Andricdef Neg: Opcode { 56406c3fb27SDimitry Andric let Types = [NonPtrTypeClass]; 565bdd1243dSDimitry Andric let HasGroup = 1; 566bdd1243dSDimitry Andric} 567bdd1243dSDimitry Andric 568bdd1243dSDimitry Andric// [Real] -> [Real] 569bdd1243dSDimitry Andricdef Comp: Opcode { 57006c3fb27SDimitry Andric let Types = [IntegerTypeClass]; 571bdd1243dSDimitry Andric let HasGroup = 1; 572bdd1243dSDimitry Andric} 573bdd1243dSDimitry Andric 574bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 57506c3fb27SDimitry Andric// Cast, CastFP. 576bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 577bdd1243dSDimitry Andric 578bdd1243dSDimitry Andricdef FromCastTypeClass : TypeClass { 5795f757f3fSDimitry Andric let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64, Bool, IntAP, IntAPS]; 580bdd1243dSDimitry Andric} 581bdd1243dSDimitry Andric 582bdd1243dSDimitry Andricdef ToCastTypeClass : TypeClass { 583bdd1243dSDimitry Andric let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64, Bool]; 584bdd1243dSDimitry Andric} 585bdd1243dSDimitry Andric 586bdd1243dSDimitry Andricdef Cast: Opcode { 587bdd1243dSDimitry Andric let Types = [FromCastTypeClass, ToCastTypeClass]; 588bdd1243dSDimitry Andric let HasGroup = 1; 589bdd1243dSDimitry Andric} 590a7dea167SDimitry Andric 59106c3fb27SDimitry Andricdef CastFP : Opcode { 59206c3fb27SDimitry Andric let Types = []; 59306c3fb27SDimitry Andric let Args = [ArgFltSemantics, ArgRoundingMode]; 59406c3fb27SDimitry Andric} 59506c3fb27SDimitry Andric 5965f757f3fSDimitry Andricdef FixedSizeIntegralTypes : TypeClass { 5975f757f3fSDimitry Andric let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64, Bool]; 5985f757f3fSDimitry Andric} 5995f757f3fSDimitry Andric 6005f757f3fSDimitry Andricdef CastAP : Opcode { 6015f757f3fSDimitry Andric let Types = [AluTypeClass]; 6025f757f3fSDimitry Andric let Args = [ArgUint32]; 6035f757f3fSDimitry Andric let HasGroup = 1; 6045f757f3fSDimitry Andric} 6055f757f3fSDimitry Andric 6065f757f3fSDimitry Andricdef CastAPS : Opcode { 6075f757f3fSDimitry Andric let Types = [AluTypeClass]; 6085f757f3fSDimitry Andric let Args = [ArgUint32]; 6095f757f3fSDimitry Andric let HasGroup = 1; 6105f757f3fSDimitry Andric} 6115f757f3fSDimitry Andric 61206c3fb27SDimitry Andric// Cast an integer to a floating type 61306c3fb27SDimitry Andricdef CastIntegralFloating : Opcode { 61406c3fb27SDimitry Andric let Types = [AluTypeClass]; 61506c3fb27SDimitry Andric let Args = [ArgFltSemantics, ArgRoundingMode]; 61606c3fb27SDimitry Andric let HasGroup = 1; 61706c3fb27SDimitry Andric} 61806c3fb27SDimitry Andric 61906c3fb27SDimitry Andric// Cast a floating to an integer type 62006c3fb27SDimitry Andricdef CastFloatingIntegral : Opcode { 6215f757f3fSDimitry Andric let Types = [FixedSizeIntegralTypes]; 6225f757f3fSDimitry Andric let Args = []; 6235f757f3fSDimitry Andric let HasGroup = 1; 6245f757f3fSDimitry Andric} 6255f757f3fSDimitry Andric 6265f757f3fSDimitry Andricdef CastFloatingIntegralAP : Opcode { 6275f757f3fSDimitry Andric let Types = []; 6285f757f3fSDimitry Andric let Args = [ArgUint32]; 6295f757f3fSDimitry Andric} 6305f757f3fSDimitry Andric 6315f757f3fSDimitry Andricdef CastFloatingIntegralAPS : Opcode { 6325f757f3fSDimitry Andric let Types = []; 6335f757f3fSDimitry Andric let Args = [ArgUint32]; 6345f757f3fSDimitry Andric} 6355f757f3fSDimitry Andric 6365f757f3fSDimitry Andricdef CastPointerIntegral : Opcode { 63706c3fb27SDimitry Andric let Types = [AluTypeClass]; 63806c3fb27SDimitry Andric let Args = []; 63906c3fb27SDimitry Andric let HasGroup = 1; 64006c3fb27SDimitry Andric} 64106c3fb27SDimitry Andric 642a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 643a7dea167SDimitry Andric// Comparison opcodes. 644a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 645a7dea167SDimitry Andric 646a7dea167SDimitry Andricclass EqualityOpcode : Opcode { 647a7dea167SDimitry Andric let Types = [AllTypeClass]; 648a7dea167SDimitry Andric let HasGroup = 1; 649a7dea167SDimitry Andric} 650a7dea167SDimitry Andric 651a7dea167SDimitry Andricdef EQ : EqualityOpcode; 652a7dea167SDimitry Andricdef NE : EqualityOpcode; 653a7dea167SDimitry Andric 654a7dea167SDimitry Andricclass ComparisonOpcode : Opcode { 655a7dea167SDimitry Andric let Types = [ComparableTypeClass]; 656a7dea167SDimitry Andric let HasGroup = 1; 657a7dea167SDimitry Andric} 658a7dea167SDimitry Andric 6595f757f3fSDimitry Andricdef CMP3 : ComparisonOpcode { 6605f757f3fSDimitry Andric let Args = [ArgCCI]; 6615f757f3fSDimitry Andric} 6625f757f3fSDimitry Andric 663a7dea167SDimitry Andricdef LT : ComparisonOpcode; 664a7dea167SDimitry Andricdef LE : ComparisonOpcode; 665a7dea167SDimitry Andricdef GT : ComparisonOpcode; 666a7dea167SDimitry Andricdef GE : ComparisonOpcode; 667a7dea167SDimitry Andric 668a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 669a7dea167SDimitry Andric// Stack management. 670a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 671a7dea167SDimitry Andric 672a7dea167SDimitry Andric// [Value] -> [] 673a7dea167SDimitry Andricdef Pop : Opcode { 674a7dea167SDimitry Andric let Types = [AllTypeClass]; 675a7dea167SDimitry Andric let HasGroup = 1; 676a7dea167SDimitry Andric} 677a7dea167SDimitry Andric 678a7dea167SDimitry Andric// [Value] -> [Value, Value] 679a7dea167SDimitry Andricdef Dup : Opcode { 680a7dea167SDimitry Andric let Types = [AllTypeClass]; 681a7dea167SDimitry Andric let HasGroup = 1; 682a7dea167SDimitry Andric} 6835f757f3fSDimitry Andric 6845f757f3fSDimitry Andric// [] -> [] 6855f757f3fSDimitry Andricdef Invalid : Opcode {} 6865f757f3fSDimitry Andricdef InvalidCast : Opcode { 6875f757f3fSDimitry Andric let Args = [ArgCastKind]; 6885f757f3fSDimitry Andric} 6895f757f3fSDimitry Andric 6905f757f3fSDimitry Andricdef InvalidDeclRef : Opcode { 6915f757f3fSDimitry Andric let Args = [ArgDeclRef]; 6925f757f3fSDimitry Andric} 6935f757f3fSDimitry Andric 6945f757f3fSDimitry Andricdef ArrayDecay : Opcode; 695