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*06c3fb27SDimitry Andricdef Float : Type; 29a7dea167SDimitry Andricdef Ptr : Type; 30*06c3fb27SDimitry Andricdef FnPtr : Type; 31a7dea167SDimitry Andric 32a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 33a7dea167SDimitry Andric// Types transferred to the interpreter. 34a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 35a7dea167SDimitry Andric 36a7dea167SDimitry Andricclass ArgType { string Name = ?; } 37a7dea167SDimitry Andricdef ArgSint8 : ArgType { let Name = "int8_t"; } 38a7dea167SDimitry Andricdef ArgUint8 : ArgType { let Name = "uint8_t"; } 39a7dea167SDimitry Andricdef ArgSint16 : ArgType { let Name = "int16_t"; } 40a7dea167SDimitry Andricdef ArgUint16 : ArgType { let Name = "uint16_t"; } 41a7dea167SDimitry Andricdef ArgSint32 : ArgType { let Name = "int32_t"; } 42a7dea167SDimitry Andricdef ArgUint32 : ArgType { let Name = "uint32_t"; } 43a7dea167SDimitry Andricdef ArgSint64 : ArgType { let Name = "int64_t"; } 44a7dea167SDimitry Andricdef ArgUint64 : ArgType { let Name = "uint64_t"; } 45*06c3fb27SDimitry Andricdef ArgFloat : ArgType { let Name = "Floating"; } 46a7dea167SDimitry Andricdef ArgBool : ArgType { let Name = "bool"; } 47a7dea167SDimitry Andric 48bdd1243dSDimitry Andricdef ArgFunction : ArgType { let Name = "const Function *"; } 49a7dea167SDimitry Andricdef ArgRecordDecl : ArgType { let Name = "const RecordDecl *"; } 50a7dea167SDimitry Andricdef ArgRecordField : ArgType { let Name = "const Record::Field *"; } 51*06c3fb27SDimitry Andricdef ArgFltSemantics : ArgType { let Name = "const llvm::fltSemantics *"; } 52*06c3fb27SDimitry Andricdef ArgRoundingMode : ArgType { let Name = "llvm::RoundingMode"; } 53*06c3fb27SDimitry Andricdef ArgLETD: ArgType { let Name = "const LifetimeExtendedTemporaryDecl *"; } 54a7dea167SDimitry Andric 55a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 56349cc55cSDimitry Andric// Classes of types instructions operate on. 57a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 58a7dea167SDimitry Andric 59a7dea167SDimitry Andricclass TypeClass { 60a7dea167SDimitry Andric list<Type> Types; 61a7dea167SDimitry Andric} 62a7dea167SDimitry Andric 63bdd1243dSDimitry Andricdef IntegerTypeClass : TypeClass { 64bdd1243dSDimitry Andric let Types = [Sint8, Uint8, Sint16, Uint16, Sint32, 65bdd1243dSDimitry Andric Uint32, Sint64, Uint64]; 66bdd1243dSDimitry Andric} 67bdd1243dSDimitry Andric 68*06c3fb27SDimitry Andricdef NumberTypeClass : TypeClass { 69*06c3fb27SDimitry Andric let Types = !listconcat(IntegerTypeClass.Types, [Float]); 70*06c3fb27SDimitry Andric} 71*06c3fb27SDimitry Andric 72*06c3fb27SDimitry Andricdef FloatTypeClass : TypeClass { 73*06c3fb27SDimitry Andric let Types = [Float]; 74*06c3fb27SDimitry Andric} 75*06c3fb27SDimitry Andric 76bdd1243dSDimitry Andricdef AluTypeClass : TypeClass { 77*06c3fb27SDimitry Andric let Types = !listconcat(IntegerTypeClass.Types, [Bool]); 78a7dea167SDimitry Andric} 79a7dea167SDimitry Andric 80a7dea167SDimitry Andricdef PtrTypeClass : TypeClass { 81*06c3fb27SDimitry Andric let Types = [Ptr, FnPtr]; 82a7dea167SDimitry Andric} 83a7dea167SDimitry Andric 84bdd1243dSDimitry Andricdef BoolTypeClass : TypeClass { 85bdd1243dSDimitry Andric let Types = [Bool]; 86bdd1243dSDimitry Andric} 87bdd1243dSDimitry Andric 88*06c3fb27SDimitry Andricdef NonPtrTypeClass : TypeClass { 89*06c3fb27SDimitry Andric let Types = !listconcat(IntegerTypeClass.Types, [Bool], [Float]); 90*06c3fb27SDimitry Andric} 91*06c3fb27SDimitry Andric 92a7dea167SDimitry Andricdef AllTypeClass : TypeClass { 93*06c3fb27SDimitry Andric let Types = !listconcat(AluTypeClass.Types, PtrTypeClass.Types, FloatTypeClass.Types); 94a7dea167SDimitry Andric} 95a7dea167SDimitry Andric 96a7dea167SDimitry Andricdef ComparableTypeClass : TypeClass { 97*06c3fb27SDimitry Andric let Types = !listconcat(AluTypeClass.Types, [Ptr], [Float], [FnPtr]); 98a7dea167SDimitry Andric} 99a7dea167SDimitry Andric 100a7dea167SDimitry Andricclass SingletonTypeClass<Type Ty> : TypeClass { 101a7dea167SDimitry Andric let Types = [Ty]; 102a7dea167SDimitry Andric} 103a7dea167SDimitry Andric 104a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 105a7dea167SDimitry Andric// Record describing all opcodes. 106a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 107a7dea167SDimitry Andric 108a7dea167SDimitry Andricclass Opcode { 109a7dea167SDimitry Andric list<TypeClass> Types = []; 110a7dea167SDimitry Andric list<ArgType> Args = []; 111a7dea167SDimitry Andric string Name = ""; 112a7dea167SDimitry Andric bit CanReturn = 0; 113a7dea167SDimitry Andric bit ChangesPC = 0; 114a7dea167SDimitry Andric bit HasCustomLink = 0; 115a7dea167SDimitry Andric bit HasCustomEval = 0; 116a7dea167SDimitry Andric bit HasGroup = 0; 117a7dea167SDimitry Andric} 118a7dea167SDimitry Andric 119a7dea167SDimitry Andricclass AluOpcode : Opcode { 120a7dea167SDimitry Andric let Types = [AluTypeClass]; 121a7dea167SDimitry Andric let HasGroup = 1; 122a7dea167SDimitry Andric} 123a7dea167SDimitry Andric 124*06c3fb27SDimitry Andricclass FloatOpcode : Opcode { 125*06c3fb27SDimitry Andric let Types = []; 126*06c3fb27SDimitry Andric let Args = [ArgRoundingMode]; 127*06c3fb27SDimitry Andric} 128*06c3fb27SDimitry Andric 129bdd1243dSDimitry Andricclass IntegerOpcode : Opcode { 130bdd1243dSDimitry Andric let Types = [IntegerTypeClass]; 131bdd1243dSDimitry Andric let HasGroup = 1; 132bdd1243dSDimitry Andric} 133bdd1243dSDimitry Andric 134a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 135a7dea167SDimitry Andric// Jump opcodes 136a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 137a7dea167SDimitry Andric 138a7dea167SDimitry Andricclass JumpOpcode : Opcode { 139a7dea167SDimitry Andric let Args = [ArgSint32]; 140a7dea167SDimitry Andric let ChangesPC = 1; 141a7dea167SDimitry Andric let HasCustomEval = 1; 142a7dea167SDimitry Andric} 143a7dea167SDimitry Andric 144a7dea167SDimitry Andric// [] -> [] 145a7dea167SDimitry Andricdef Jmp : JumpOpcode; 146a7dea167SDimitry Andric// [Bool] -> [], jumps if true. 147a7dea167SDimitry Andricdef Jt : JumpOpcode; 148a7dea167SDimitry Andric// [Bool] -> [], jumps if false. 149a7dea167SDimitry Andricdef Jf : JumpOpcode; 150a7dea167SDimitry Andric 151a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 152a7dea167SDimitry Andric// Returns 153a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 154a7dea167SDimitry Andric 155a7dea167SDimitry Andric// [Value] -> [] 156a7dea167SDimitry Andricdef Ret : Opcode { 157a7dea167SDimitry Andric let Types = [AllTypeClass]; 158a7dea167SDimitry Andric let ChangesPC = 1; 159a7dea167SDimitry Andric let CanReturn = 1; 160a7dea167SDimitry Andric let HasGroup = 1; 161a7dea167SDimitry Andric let HasCustomEval = 1; 162a7dea167SDimitry Andric} 163a7dea167SDimitry Andric// [] -> [] 164a7dea167SDimitry Andricdef RetVoid : Opcode { 165a7dea167SDimitry Andric let CanReturn = 1; 166a7dea167SDimitry Andric let ChangesPC = 1; 167a7dea167SDimitry Andric let HasCustomEval = 1; 168a7dea167SDimitry Andric} 169a7dea167SDimitry Andric// [Value] -> [] 170a7dea167SDimitry Andricdef RetValue : Opcode { 171a7dea167SDimitry Andric let CanReturn = 1; 172a7dea167SDimitry Andric let ChangesPC = 1; 173a7dea167SDimitry Andric let HasCustomEval = 1; 174a7dea167SDimitry Andric} 175a7dea167SDimitry Andric// [] -> EXIT 176a7dea167SDimitry Andricdef NoRet : Opcode {} 177a7dea167SDimitry Andric 178bdd1243dSDimitry Andric 179bdd1243dSDimitry Andricdef Call : Opcode { 180bdd1243dSDimitry Andric let Args = [ArgFunction]; 181bdd1243dSDimitry Andric let Types = []; 182*06c3fb27SDimitry Andric} 183*06c3fb27SDimitry Andric 184*06c3fb27SDimitry Andricdef CallVirt : Opcode { 185*06c3fb27SDimitry Andric let Args = [ArgFunction]; 186*06c3fb27SDimitry Andric let Types = []; 187*06c3fb27SDimitry Andric} 188*06c3fb27SDimitry Andric 189*06c3fb27SDimitry Andricdef CallBI : Opcode { 190*06c3fb27SDimitry Andric let Args = [ArgFunction]; 191*06c3fb27SDimitry Andric let Types = []; 192*06c3fb27SDimitry Andric} 193*06c3fb27SDimitry Andric 194*06c3fb27SDimitry Andricdef CallPtr : Opcode { 195*06c3fb27SDimitry Andric let Args = []; 196*06c3fb27SDimitry Andric let Types = []; 197bdd1243dSDimitry Andric} 198bdd1243dSDimitry Andric 199a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 200a7dea167SDimitry Andric// Frame management 201a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 202a7dea167SDimitry Andric 203a7dea167SDimitry Andric// [] -> [] 204a7dea167SDimitry Andricdef Destroy : Opcode { 205a7dea167SDimitry Andric let Args = [ArgUint32]; 206a7dea167SDimitry Andric let HasCustomEval = 1; 207a7dea167SDimitry Andric} 208a7dea167SDimitry Andric 209a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 210a7dea167SDimitry Andric// Constants 211a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 212a7dea167SDimitry Andric 213a7dea167SDimitry Andricclass ConstOpcode<Type Ty, ArgType ArgTy> : Opcode { 214a7dea167SDimitry Andric let Types = [SingletonTypeClass<Ty>]; 215a7dea167SDimitry Andric let Args = [ArgTy]; 216a7dea167SDimitry Andric let Name = "Const"; 217a7dea167SDimitry Andric} 218a7dea167SDimitry Andric 219a7dea167SDimitry Andric// [] -> [Integer] 220a7dea167SDimitry Andricdef ConstSint8 : ConstOpcode<Sint8, ArgSint8>; 221a7dea167SDimitry Andricdef ConstUint8 : ConstOpcode<Uint8, ArgUint8>; 222a7dea167SDimitry Andricdef ConstSint16 : ConstOpcode<Sint16, ArgSint16>; 223a7dea167SDimitry Andricdef ConstUint16 : ConstOpcode<Uint16, ArgUint16>; 224a7dea167SDimitry Andricdef ConstSint32 : ConstOpcode<Sint32, ArgSint32>; 225a7dea167SDimitry Andricdef ConstUint32 : ConstOpcode<Uint32, ArgUint32>; 226a7dea167SDimitry Andricdef ConstSint64 : ConstOpcode<Sint64, ArgSint64>; 227a7dea167SDimitry Andricdef ConstUint64 : ConstOpcode<Uint64, ArgUint64>; 228*06c3fb27SDimitry Andricdef ConstFloat : ConstOpcode<Float, ArgFloat>; 229a7dea167SDimitry Andricdef ConstBool : ConstOpcode<Bool, ArgBool>; 230a7dea167SDimitry Andric 231a7dea167SDimitry Andric// [] -> [Integer] 232a7dea167SDimitry Andricdef Zero : Opcode { 233a7dea167SDimitry Andric let Types = [AluTypeClass]; 234bdd1243dSDimitry Andric let HasGroup = 1; 235a7dea167SDimitry Andric} 236a7dea167SDimitry Andric 237a7dea167SDimitry Andric// [] -> [Pointer] 238a7dea167SDimitry Andricdef Null : Opcode { 239a7dea167SDimitry Andric let Types = [PtrTypeClass]; 240*06c3fb27SDimitry Andric let HasGroup = 1; 241a7dea167SDimitry Andric} 242a7dea167SDimitry Andric 243a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 244a7dea167SDimitry Andric// Pointer generation 245a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 246a7dea167SDimitry Andric 247a7dea167SDimitry Andric// [] -> [Pointer] 248a7dea167SDimitry Andricdef GetPtrLocal : Opcode { 249a7dea167SDimitry Andric // Offset of local. 250a7dea167SDimitry Andric let Args = [ArgUint32]; 251a7dea167SDimitry Andric bit HasCustomEval = 1; 252a7dea167SDimitry Andric} 253a7dea167SDimitry Andric// [] -> [Pointer] 254a7dea167SDimitry Andricdef GetPtrParam : Opcode { 255a7dea167SDimitry Andric // Offset of parameter. 256a7dea167SDimitry Andric let Args = [ArgUint32]; 257a7dea167SDimitry Andric} 258a7dea167SDimitry Andric// [] -> [Pointer] 259a7dea167SDimitry Andricdef GetPtrGlobal : Opcode { 260a7dea167SDimitry Andric // Index of global. 261a7dea167SDimitry Andric let Args = [ArgUint32]; 262a7dea167SDimitry Andric} 263a7dea167SDimitry Andric// [Pointer] -> [Pointer] 264a7dea167SDimitry Andricdef GetPtrField : Opcode { 265a7dea167SDimitry Andric // Offset of field. 266a7dea167SDimitry Andric let Args = [ArgUint32]; 267a7dea167SDimitry Andric} 268a7dea167SDimitry Andric// [Pointer] -> [Pointer] 269a7dea167SDimitry Andricdef GetPtrActiveField : Opcode { 270a7dea167SDimitry Andric // Offset of field. 271a7dea167SDimitry Andric let Args = [ArgUint32]; 272a7dea167SDimitry Andric} 273a7dea167SDimitry Andric// [] -> [Pointer] 274a7dea167SDimitry Andricdef GetPtrActiveThisField : Opcode { 275a7dea167SDimitry Andric // Offset of field. 276a7dea167SDimitry Andric let Args = [ArgUint32]; 277a7dea167SDimitry Andric} 278a7dea167SDimitry Andric// [] -> [Pointer] 279a7dea167SDimitry Andricdef GetPtrThisField : Opcode { 280a7dea167SDimitry Andric // Offset of field. 281a7dea167SDimitry Andric let Args = [ArgUint32]; 282a7dea167SDimitry Andric} 283a7dea167SDimitry Andric// [Pointer] -> [Pointer] 284a7dea167SDimitry Andricdef GetPtrBase : Opcode { 285a7dea167SDimitry Andric // Offset of field, which is a base. 286a7dea167SDimitry Andric let Args = [ArgUint32]; 287a7dea167SDimitry Andric} 288a7dea167SDimitry Andric// [Pointer] -> [Pointer] 289*06c3fb27SDimitry Andricdef GetPtrBasePop : Opcode { 290*06c3fb27SDimitry Andric // Offset of field, which is a base. 291*06c3fb27SDimitry Andric let Args = [ArgUint32]; 292*06c3fb27SDimitry Andric} 293*06c3fb27SDimitry Andric 294*06c3fb27SDimitry Andric// [Pointer] -> [Pointer] 295a7dea167SDimitry Andricdef GetPtrVirtBase : Opcode { 296a7dea167SDimitry Andric // RecordDecl of base class. 297a7dea167SDimitry Andric let Args = [ArgRecordDecl]; 298a7dea167SDimitry Andric} 299a7dea167SDimitry Andric// [] -> [Pointer] 300a7dea167SDimitry Andricdef GetPtrThisBase : Opcode { 301a7dea167SDimitry Andric // Offset of field, which is a base. 302a7dea167SDimitry Andric let Args = [ArgUint32]; 303a7dea167SDimitry Andric} 304a7dea167SDimitry Andric// [] -> [Pointer] 305a7dea167SDimitry Andricdef GetPtrThisVirtBase : Opcode { 306a7dea167SDimitry Andric // RecordDecl of base class. 307a7dea167SDimitry Andric let Args = [ArgRecordDecl]; 308a7dea167SDimitry Andric} 309a7dea167SDimitry Andric// [] -> [Pointer] 310a7dea167SDimitry Andricdef This : Opcode; 311a7dea167SDimitry Andric 312bdd1243dSDimitry Andric// [] -> [Pointer] 313bdd1243dSDimitry Andricdef RVOPtr : Opcode; 314bdd1243dSDimitry Andric 315a7dea167SDimitry Andric// [Pointer] -> [Pointer] 316a7dea167SDimitry Andricdef NarrowPtr : Opcode; 317a7dea167SDimitry Andric// [Pointer] -> [Pointer] 318a7dea167SDimitry Andricdef ExpandPtr : Opcode; 319*06c3fb27SDimitry Andric// [Pointer, Offset] -> [Pointer] 320*06c3fb27SDimitry Andricdef ArrayElemPtr : AluOpcode; 321*06c3fb27SDimitry Andricdef ArrayElemPtrPop : AluOpcode; 322a7dea167SDimitry Andric 323a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 324a7dea167SDimitry Andric// Direct field accessors 325a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 326a7dea167SDimitry Andric 327a7dea167SDimitry Andricclass AccessOpcode : Opcode { 328a7dea167SDimitry Andric let Types = [AllTypeClass]; 329a7dea167SDimitry Andric let Args = [ArgUint32]; 330a7dea167SDimitry Andric let HasGroup = 1; 331a7dea167SDimitry Andric} 332a7dea167SDimitry Andric 333a7dea167SDimitry Andricclass BitFieldOpcode : Opcode { 334a7dea167SDimitry Andric let Types = [AluTypeClass]; 335a7dea167SDimitry Andric let Args = [ArgRecordField]; 336a7dea167SDimitry Andric let HasGroup = 1; 337a7dea167SDimitry Andric} 338a7dea167SDimitry Andric 339a7dea167SDimitry Andric// [] -> [Pointer] 340a7dea167SDimitry Andricdef GetLocal : AccessOpcode { let HasCustomEval = 1; } 341a7dea167SDimitry Andric// [] -> [Pointer] 342a7dea167SDimitry Andricdef SetLocal : AccessOpcode { let HasCustomEval = 1; } 343a7dea167SDimitry Andric 344*06c3fb27SDimitry Andricdef CheckGlobalCtor : Opcode {} 345*06c3fb27SDimitry Andric 346a7dea167SDimitry Andric// [] -> [Value] 347a7dea167SDimitry Andricdef GetGlobal : AccessOpcode; 348a7dea167SDimitry Andric// [Value] -> [] 349a7dea167SDimitry Andricdef InitGlobal : AccessOpcode; 350a7dea167SDimitry Andric// [Value] -> [] 351*06c3fb27SDimitry Andricdef InitGlobalTemp : AccessOpcode { 352*06c3fb27SDimitry Andric let Args = [ArgUint32, ArgLETD]; 353*06c3fb27SDimitry Andric} 354*06c3fb27SDimitry Andric// [Value] -> [] 355a7dea167SDimitry Andricdef SetGlobal : AccessOpcode; 356a7dea167SDimitry Andric 357a7dea167SDimitry Andric// [] -> [Value] 358a7dea167SDimitry Andricdef GetParam : AccessOpcode; 359a7dea167SDimitry Andric// [Value] -> [] 360a7dea167SDimitry Andricdef SetParam : AccessOpcode; 361a7dea167SDimitry Andric 362a7dea167SDimitry Andric// [Pointer] -> [Pointer, Value] 363a7dea167SDimitry Andricdef GetField : AccessOpcode; 364a7dea167SDimitry Andric// [Pointer] -> [Value] 365a7dea167SDimitry Andricdef GetFieldPop : AccessOpcode; 366a7dea167SDimitry Andric// [] -> [Value] 367a7dea167SDimitry Andricdef GetThisField : AccessOpcode; 368a7dea167SDimitry Andric 369a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer] 370a7dea167SDimitry Andricdef SetField : AccessOpcode; 371a7dea167SDimitry Andric// [Value] -> [] 372a7dea167SDimitry Andricdef SetThisField : AccessOpcode; 373a7dea167SDimitry Andric 374a7dea167SDimitry Andric// [Value] -> [] 375a7dea167SDimitry Andricdef InitThisField : AccessOpcode; 376a7dea167SDimitry Andric// [Value] -> [] 377a7dea167SDimitry Andricdef InitThisFieldActive : AccessOpcode; 378a7dea167SDimitry Andric// [Value] -> [] 379a7dea167SDimitry Andricdef InitThisBitField : BitFieldOpcode; 380a7dea167SDimitry Andric// [Pointer, Value] -> [] 381a7dea167SDimitry Andricdef InitField : AccessOpcode; 382a7dea167SDimitry Andric// [Pointer, Value] -> [] 383a7dea167SDimitry Andricdef InitBitField : BitFieldOpcode; 384a7dea167SDimitry Andric// [Pointer, Value] -> [] 385a7dea167SDimitry Andricdef InitFieldActive : AccessOpcode; 386a7dea167SDimitry Andric 387a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 388a7dea167SDimitry Andric// Pointer access 389a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 390a7dea167SDimitry Andric 391a7dea167SDimitry Andricclass LoadOpcode : Opcode { 392a7dea167SDimitry Andric let Types = [AllTypeClass]; 393a7dea167SDimitry Andric let HasGroup = 1; 394a7dea167SDimitry Andric} 395a7dea167SDimitry Andric 396a7dea167SDimitry Andric// [Pointer] -> [Pointer, Value] 397a7dea167SDimitry Andricdef Load : LoadOpcode {} 398a7dea167SDimitry Andric// [Pointer] -> [Value] 399a7dea167SDimitry Andricdef LoadPop : LoadOpcode {} 400a7dea167SDimitry Andric 401a7dea167SDimitry Andricclass StoreOpcode : Opcode { 402a7dea167SDimitry Andric let Types = [AllTypeClass]; 403a7dea167SDimitry Andric let HasGroup = 1; 404a7dea167SDimitry Andric} 405a7dea167SDimitry Andric 406a7dea167SDimitry Andricclass StoreBitFieldOpcode : Opcode { 407a7dea167SDimitry Andric let Types = [AluTypeClass]; 408a7dea167SDimitry Andric let HasGroup = 1; 409a7dea167SDimitry Andric} 410a7dea167SDimitry Andric 411a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer] 412a7dea167SDimitry Andricdef Store : StoreOpcode {} 413a7dea167SDimitry Andric// [Pointer, Value] -> [] 414a7dea167SDimitry Andricdef StorePop : StoreOpcode {} 415a7dea167SDimitry Andric 416a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer] 417a7dea167SDimitry Andricdef StoreBitField : StoreBitFieldOpcode {} 418a7dea167SDimitry Andric// [Pointer, Value] -> [] 419a7dea167SDimitry Andricdef StoreBitFieldPop : StoreBitFieldOpcode {} 420a7dea167SDimitry Andric 421a7dea167SDimitry Andric// [Pointer, Value] -> [] 422a7dea167SDimitry Andricdef InitPop : StoreOpcode {} 423a7dea167SDimitry Andric// [Pointer, Value] -> [Pointer] 424a7dea167SDimitry Andricdef InitElem : Opcode { 425a7dea167SDimitry Andric let Types = [AllTypeClass]; 426a7dea167SDimitry Andric let Args = [ArgUint32]; 427a7dea167SDimitry Andric let HasGroup = 1; 428a7dea167SDimitry Andric} 429a7dea167SDimitry Andric// [Pointer, Value] -> [] 430a7dea167SDimitry Andricdef InitElemPop : Opcode { 431a7dea167SDimitry Andric let Types = [AllTypeClass]; 432a7dea167SDimitry Andric let Args = [ArgUint32]; 433a7dea167SDimitry Andric let HasGroup = 1; 434a7dea167SDimitry Andric} 435a7dea167SDimitry Andric 436a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 437a7dea167SDimitry Andric// Pointer arithmetic. 438a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 439a7dea167SDimitry Andric 440a7dea167SDimitry Andric// [Pointer, Integral] -> [Pointer] 441a7dea167SDimitry Andricdef AddOffset : AluOpcode; 442a7dea167SDimitry Andric// [Pointer, Integral] -> [Pointer] 443a7dea167SDimitry Andricdef SubOffset : AluOpcode; 444a7dea167SDimitry Andric 445*06c3fb27SDimitry Andric// [Pointer, Pointer] -> [Integral] 446bdd1243dSDimitry Andricdef SubPtr : Opcode { 447bdd1243dSDimitry Andric let Types = [IntegerTypeClass]; 448bdd1243dSDimitry Andric let HasGroup = 1; 449bdd1243dSDimitry Andric} 450bdd1243dSDimitry Andric 451*06c3fb27SDimitry Andric// [Pointer] -> [Pointer] 452*06c3fb27SDimitry Andricdef IncPtr : Opcode { 453*06c3fb27SDimitry Andric let HasGroup = 0; 454*06c3fb27SDimitry Andric} 455*06c3fb27SDimitry Andric// [Pointer] -> [Pointer] 456*06c3fb27SDimitry Andricdef DecPtr : Opcode { 457*06c3fb27SDimitry Andric let HasGroup = 0; 458*06c3fb27SDimitry Andric} 459*06c3fb27SDimitry Andric 460*06c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 461*06c3fb27SDimitry Andric// Function pointers. 462*06c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 463*06c3fb27SDimitry Andricdef GetFnPtr : Opcode { 464*06c3fb27SDimitry Andric let Args = [ArgFunction]; 465*06c3fb27SDimitry Andric} 466*06c3fb27SDimitry Andric 467*06c3fb27SDimitry Andric 468a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 469a7dea167SDimitry Andric// Binary operators. 470a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 471a7dea167SDimitry Andric 472a7dea167SDimitry Andric// [Real, Real] -> [Real] 473a7dea167SDimitry Andricdef Add : AluOpcode; 474*06c3fb27SDimitry Andricdef Addf : FloatOpcode; 475*06c3fb27SDimitry Andricdef Sub : AluOpcode; 476*06c3fb27SDimitry Andricdef Subf : FloatOpcode; 477a7dea167SDimitry Andricdef Mul : AluOpcode; 478*06c3fb27SDimitry Andricdef Mulf : FloatOpcode; 479*06c3fb27SDimitry Andricdef Rem : IntegerOpcode; 480*06c3fb27SDimitry Andricdef Div : IntegerOpcode; 481*06c3fb27SDimitry Andricdef Divf : FloatOpcode; 482*06c3fb27SDimitry Andric 483*06c3fb27SDimitry Andricdef BitAnd : IntegerOpcode; 484*06c3fb27SDimitry Andricdef BitOr : IntegerOpcode; 485*06c3fb27SDimitry Andricdef BitXor : IntegerOpcode; 486bdd1243dSDimitry Andric 487bdd1243dSDimitry Andricdef Shl : Opcode { 488bdd1243dSDimitry Andric let Types = [IntegerTypeClass, IntegerTypeClass]; 489bdd1243dSDimitry Andric let HasGroup = 1; 490bdd1243dSDimitry Andric} 491bdd1243dSDimitry Andric 492bdd1243dSDimitry Andricdef Shr : Opcode { 493bdd1243dSDimitry Andric let Types = [IntegerTypeClass, IntegerTypeClass]; 494bdd1243dSDimitry Andric let HasGroup = 1; 495bdd1243dSDimitry Andric} 496bdd1243dSDimitry Andric 497bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 498bdd1243dSDimitry Andric// Unary operators. 499bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 500bdd1243dSDimitry Andric 501bdd1243dSDimitry Andric// [Real] -> [Real] 502bdd1243dSDimitry Andricdef Inv: Opcode { 503bdd1243dSDimitry Andric let Types = [BoolTypeClass]; 504bdd1243dSDimitry Andric let HasGroup = 1; 505bdd1243dSDimitry Andric} 506bdd1243dSDimitry Andric 507*06c3fb27SDimitry Andric// Increment and decrement. 508bdd1243dSDimitry Andricdef Inc: IntegerOpcode; 509bdd1243dSDimitry Andricdef IncPop : IntegerOpcode; 510bdd1243dSDimitry Andricdef Dec: IntegerOpcode; 511bdd1243dSDimitry Andricdef DecPop: IntegerOpcode; 512bdd1243dSDimitry Andric 513*06c3fb27SDimitry Andric// Float increment and decrement. 514*06c3fb27SDimitry Andricdef Incf: FloatOpcode; 515*06c3fb27SDimitry Andricdef IncfPop : FloatOpcode; 516*06c3fb27SDimitry Andricdef Decf: FloatOpcode; 517*06c3fb27SDimitry Andricdef DecfPop : FloatOpcode; 518*06c3fb27SDimitry Andric 519bdd1243dSDimitry Andric// [Real] -> [Real] 520bdd1243dSDimitry Andricdef Neg: Opcode { 521*06c3fb27SDimitry Andric let Types = [NonPtrTypeClass]; 522bdd1243dSDimitry Andric let HasGroup = 1; 523bdd1243dSDimitry Andric} 524bdd1243dSDimitry Andric 525bdd1243dSDimitry Andric// [Real] -> [Real] 526bdd1243dSDimitry Andricdef Comp: Opcode { 527*06c3fb27SDimitry Andric let Types = [IntegerTypeClass]; 528bdd1243dSDimitry Andric let HasGroup = 1; 529bdd1243dSDimitry Andric} 530bdd1243dSDimitry Andric 531bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 532*06c3fb27SDimitry Andric// Cast, CastFP. 533bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 534bdd1243dSDimitry Andric 535bdd1243dSDimitry Andricdef FromCastTypeClass : TypeClass { 536bdd1243dSDimitry Andric let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64, Bool]; 537bdd1243dSDimitry Andric} 538bdd1243dSDimitry Andric 539bdd1243dSDimitry Andricdef ToCastTypeClass : TypeClass { 540bdd1243dSDimitry Andric let Types = [Uint8, Sint8, Uint16, Sint16, Uint32, Sint32, Uint64, Sint64, Bool]; 541bdd1243dSDimitry Andric} 542bdd1243dSDimitry Andric 543bdd1243dSDimitry Andricdef Cast: Opcode { 544bdd1243dSDimitry Andric let Types = [FromCastTypeClass, ToCastTypeClass]; 545bdd1243dSDimitry Andric let HasGroup = 1; 546bdd1243dSDimitry Andric} 547a7dea167SDimitry Andric 548*06c3fb27SDimitry Andricdef CastFP : Opcode { 549*06c3fb27SDimitry Andric let Types = []; 550*06c3fb27SDimitry Andric let Args = [ArgFltSemantics, ArgRoundingMode]; 551*06c3fb27SDimitry Andric} 552*06c3fb27SDimitry Andric 553*06c3fb27SDimitry Andric// Cast an integer to a floating type 554*06c3fb27SDimitry Andricdef CastIntegralFloating : Opcode { 555*06c3fb27SDimitry Andric let Types = [AluTypeClass]; 556*06c3fb27SDimitry Andric let Args = [ArgFltSemantics, ArgRoundingMode]; 557*06c3fb27SDimitry Andric let HasGroup = 1; 558*06c3fb27SDimitry Andric} 559*06c3fb27SDimitry Andric 560*06c3fb27SDimitry Andric// Cast a floating to an integer type 561*06c3fb27SDimitry Andricdef CastFloatingIntegral : Opcode { 562*06c3fb27SDimitry Andric let Types = [AluTypeClass]; 563*06c3fb27SDimitry Andric let Args = []; 564*06c3fb27SDimitry Andric let HasGroup = 1; 565*06c3fb27SDimitry Andric} 566*06c3fb27SDimitry Andric 567a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 568a7dea167SDimitry Andric// Comparison opcodes. 569a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 570a7dea167SDimitry Andric 571a7dea167SDimitry Andricclass EqualityOpcode : Opcode { 572a7dea167SDimitry Andric let Types = [AllTypeClass]; 573a7dea167SDimitry Andric let HasGroup = 1; 574a7dea167SDimitry Andric} 575a7dea167SDimitry Andric 576a7dea167SDimitry Andricdef EQ : EqualityOpcode; 577a7dea167SDimitry Andricdef NE : EqualityOpcode; 578a7dea167SDimitry Andric 579a7dea167SDimitry Andricclass ComparisonOpcode : Opcode { 580a7dea167SDimitry Andric let Types = [ComparableTypeClass]; 581a7dea167SDimitry Andric let HasGroup = 1; 582a7dea167SDimitry Andric} 583a7dea167SDimitry Andric 584a7dea167SDimitry Andricdef LT : ComparisonOpcode; 585a7dea167SDimitry Andricdef LE : ComparisonOpcode; 586a7dea167SDimitry Andricdef GT : ComparisonOpcode; 587a7dea167SDimitry Andricdef GE : ComparisonOpcode; 588a7dea167SDimitry Andric 589a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 590a7dea167SDimitry Andric// Stack management. 591a7dea167SDimitry Andric//===----------------------------------------------------------------------===// 592a7dea167SDimitry Andric 593a7dea167SDimitry Andric// [Value] -> [] 594a7dea167SDimitry Andricdef Pop : Opcode { 595a7dea167SDimitry Andric let Types = [AllTypeClass]; 596a7dea167SDimitry Andric let HasGroup = 1; 597a7dea167SDimitry Andric} 598a7dea167SDimitry Andric 599a7dea167SDimitry Andric// [Value] -> [Value, Value] 600a7dea167SDimitry Andricdef Dup : Opcode { 601a7dea167SDimitry Andric let Types = [AllTypeClass]; 602a7dea167SDimitry Andric let HasGroup = 1; 603a7dea167SDimitry Andric} 604