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