1fa3d789dSPierre van Houtryve //===- CodeGenInstAlias.h - InstAlias Class Wrapper -------------*- C++ -*-===// 2fa3d789dSPierre van Houtryve // 3fa3d789dSPierre van Houtryve // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4fa3d789dSPierre van Houtryve // See https://llvm.org/LICENSE.txt for license information. 5fa3d789dSPierre van Houtryve // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6fa3d789dSPierre van Houtryve // 7fa3d789dSPierre van Houtryve //===----------------------------------------------------------------------===// 8fa3d789dSPierre van Houtryve // 9fa3d789dSPierre van Houtryve // This file defines a wrapper class for the 'InstAlias' TableGen class. 10fa3d789dSPierre van Houtryve // 11fa3d789dSPierre van Houtryve //===----------------------------------------------------------------------===// 12fa3d789dSPierre van Houtryve 138a61bfcfSRahul Joshi #ifndef LLVM_UTILS_TABLEGEN_COMMON_CODEGENINSTALIAS_H 148a61bfcfSRahul Joshi #define LLVM_UTILS_TABLEGEN_COMMON_CODEGENINSTALIAS_H 15fa3d789dSPierre van Houtryve 16fa3d789dSPierre van Houtryve #include "llvm/ADT/StringRef.h" 17fa3d789dSPierre van Houtryve #include <cassert> 18fa3d789dSPierre van Houtryve #include <cstdint> 19fa3d789dSPierre van Houtryve #include <string> 20fa3d789dSPierre van Houtryve #include <utility> 21fa3d789dSPierre van Houtryve #include <vector> 22fa3d789dSPierre van Houtryve 23fa3d789dSPierre van Houtryve namespace llvm { 24fa3d789dSPierre van Houtryve 25fa3d789dSPierre van Houtryve template <typename T> class ArrayRef; 26fa3d789dSPierre van Houtryve class CodeGenInstruction; 27fa3d789dSPierre van Houtryve class CodeGenTarget; 28fa3d789dSPierre van Houtryve class DagInit; 29fa3d789dSPierre van Houtryve class SMLoc; 30fa3d789dSPierre van Houtryve class Record; 31fa3d789dSPierre van Houtryve 32fa3d789dSPierre van Houtryve /// CodeGenInstAlias - This represents an InstAlias definition. 33fa3d789dSPierre van Houtryve class CodeGenInstAlias { 34fa3d789dSPierre van Houtryve public: 358783bd5fSRahul Joshi const Record *TheDef; // The actual record defining this InstAlias. 36fa3d789dSPierre van Houtryve 37fa3d789dSPierre van Houtryve /// AsmString - The format string used to emit a .s file for the 38fa3d789dSPierre van Houtryve /// instruction. 39fa3d789dSPierre van Houtryve std::string AsmString; 40fa3d789dSPierre van Houtryve 41fa3d789dSPierre van Houtryve /// Result - The result instruction. 42*62e2c7fbSRahul Joshi const DagInit *Result; 43fa3d789dSPierre van Houtryve 44fa3d789dSPierre van Houtryve /// ResultInst - The instruction generated by the alias (decoded from 45fa3d789dSPierre van Houtryve /// Result). 46fa3d789dSPierre van Houtryve CodeGenInstruction *ResultInst; 47fa3d789dSPierre van Houtryve 48fa3d789dSPierre van Houtryve struct ResultOperand { 49fa3d789dSPierre van Houtryve private: 50fa3d789dSPierre van Houtryve std::string Name; 518783bd5fSRahul Joshi const Record *R = nullptr; 52fa3d789dSPierre van Houtryve int64_t Imm = 0; 53fa3d789dSPierre van Houtryve 54fa3d789dSPierre van Houtryve public: 55fa3d789dSPierre van Houtryve enum { K_Record, K_Imm, K_Reg } Kind; 56fa3d789dSPierre van Houtryve 578783bd5fSRahul Joshi ResultOperand(std::string N, const Record *R) 588783bd5fSRahul Joshi : Name(std::move(N)), R(R), Kind(K_Record) {} 59fa3d789dSPierre van Houtryve ResultOperand(int64_t I) : Imm(I), Kind(K_Imm) {} 603138eb50SRahul Joshi ResultOperand(const Record *R) : R(R), Kind(K_Reg) {} 61fa3d789dSPierre van Houtryve 62fa3d789dSPierre van Houtryve bool isRecord() const { return Kind == K_Record; } 63fa3d789dSPierre van Houtryve bool isImm() const { return Kind == K_Imm; } 64fa3d789dSPierre van Houtryve bool isReg() const { return Kind == K_Reg; } 65fa3d789dSPierre van Houtryve 66fa3d789dSPierre van Houtryve StringRef getName() const { 67fa3d789dSPierre van Houtryve assert(isRecord()); 68fa3d789dSPierre van Houtryve return Name; 69fa3d789dSPierre van Houtryve } 708783bd5fSRahul Joshi const Record *getRecord() const { 71fa3d789dSPierre van Houtryve assert(isRecord()); 72fa3d789dSPierre van Houtryve return R; 73fa3d789dSPierre van Houtryve } 74fa3d789dSPierre van Houtryve int64_t getImm() const { 75fa3d789dSPierre van Houtryve assert(isImm()); 76fa3d789dSPierre van Houtryve return Imm; 77fa3d789dSPierre van Houtryve } 788783bd5fSRahul Joshi const Record *getRegister() const { 79fa3d789dSPierre van Houtryve assert(isReg()); 80fa3d789dSPierre van Houtryve return R; 81fa3d789dSPierre van Houtryve } 82fa3d789dSPierre van Houtryve 83fa3d789dSPierre van Houtryve unsigned getMINumOperands() const; 84fa3d789dSPierre van Houtryve }; 85fa3d789dSPierre van Houtryve 86fa3d789dSPierre van Houtryve /// ResultOperands - The decoded operands for the result instruction. 87fa3d789dSPierre van Houtryve std::vector<ResultOperand> ResultOperands; 88fa3d789dSPierre van Houtryve 89fa3d789dSPierre van Houtryve /// ResultInstOperandIndex - For each operand, this vector holds a pair of 90fa3d789dSPierre van Houtryve /// indices to identify the corresponding operand in the result 91fa3d789dSPierre van Houtryve /// instruction. The first index specifies the operand and the second 92fa3d789dSPierre van Houtryve /// index specifies the suboperand. If there are no suboperands or if all 93fa3d789dSPierre van Houtryve /// of them are matched by the operand, the second value should be -1. 94fa3d789dSPierre van Houtryve std::vector<std::pair<unsigned, int>> ResultInstOperandIndex; 95fa3d789dSPierre van Houtryve 968783bd5fSRahul Joshi CodeGenInstAlias(const Record *R, const CodeGenTarget &T); 97fa3d789dSPierre van Houtryve 988783bd5fSRahul Joshi bool tryAliasOpMatch(const DagInit *Result, unsigned AliasOpNo, 99bdf02249SRahul Joshi const Record *InstOpRec, bool hasSubOps, 1008783bd5fSRahul Joshi ArrayRef<SMLoc> Loc, const CodeGenTarget &T, 101fa3d789dSPierre van Houtryve ResultOperand &ResOp); 102fa3d789dSPierre van Houtryve }; 103fa3d789dSPierre van Houtryve 104fa3d789dSPierre van Houtryve } // namespace llvm 105fa3d789dSPierre van Houtryve 1068a61bfcfSRahul Joshi #endif // LLVM_UTILS_TABLEGEN_COMMON_CODEGENINSTALIAS_H 107