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