//===- CodeGenInstAlias.h - InstAlias Class Wrapper -------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file defines a wrapper class for the 'InstAlias' TableGen class. // //===----------------------------------------------------------------------===// #ifndef LLVM_UTILS_TABLEGEN_CODEGENINSTALIAS_H #define LLVM_UTILS_TABLEGEN_CODEGENINSTALIAS_H #include "llvm/ADT/StringRef.h" #include #include #include #include #include namespace llvm { template class ArrayRef; class CodeGenInstruction; class CodeGenTarget; class DagInit; class SMLoc; class Record; /// CodeGenInstAlias - This represents an InstAlias definition. class CodeGenInstAlias { public: Record *TheDef; // The actual record defining this InstAlias. /// AsmString - The format string used to emit a .s file for the /// instruction. std::string AsmString; /// Result - The result instruction. DagInit *Result; /// ResultInst - The instruction generated by the alias (decoded from /// Result). CodeGenInstruction *ResultInst; struct ResultOperand { private: std::string Name; Record *R = nullptr; int64_t Imm = 0; public: enum { K_Record, K_Imm, K_Reg } Kind; ResultOperand(std::string N, Record *r) : Name(std::move(N)), R(r), Kind(K_Record) {} ResultOperand(int64_t I) : Imm(I), Kind(K_Imm) {} ResultOperand(Record *r) : R(r), Kind(K_Reg) {} bool isRecord() const { return Kind == K_Record; } bool isImm() const { return Kind == K_Imm; } bool isReg() const { return Kind == K_Reg; } StringRef getName() const { assert(isRecord()); return Name; } Record *getRecord() const { assert(isRecord()); return R; } int64_t getImm() const { assert(isImm()); return Imm; } Record *getRegister() const { assert(isReg()); return R; } unsigned getMINumOperands() const; }; /// ResultOperands - The decoded operands for the result instruction. std::vector ResultOperands; /// ResultInstOperandIndex - For each operand, this vector holds a pair of /// indices to identify the corresponding operand in the result /// instruction. The first index specifies the operand and the second /// index specifies the suboperand. If there are no suboperands or if all /// of them are matched by the operand, the second value should be -1. std::vector> ResultInstOperandIndex; CodeGenInstAlias(Record *R, CodeGenTarget &T); bool tryAliasOpMatch(DagInit *Result, unsigned AliasOpNo, Record *InstOpRec, bool hasSubOps, ArrayRef Loc, CodeGenTarget &T, ResultOperand &ResOp); }; } // namespace llvm #endif // LLVM_UTILS_TABLEGEN_CODEGENINSTALIAS_H