//== ColossusInstPrinter.h - Convert Colossus MCInst to asm -------*- C++ -*-=// // Copyright (c) 2023 Graphcore Ltd. All Rights Reserved. // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // --- LLVM Exceptions to the Apache 2.0 License ---- // // As an exception, if, as a result of your compiling your source code, portions // of this Software are embedded into an Object form of such source code, you // may redistribute such embedded portions in such Object form without complying // with the conditions of Sections 4(a), 4(b) and 4(d) of the License. // // In addition, if you combine or link compiled forms of this Software with // software that is licensed under the GPLv2 ("Combined Software") and if a // court of competent jurisdiction determines that the patent provision (Section // 3), the indemnity provision (Section 9) or other Section of the License // conflicts with the conditions of the GPLv2, you may retroactively and // prospectively choose to deem waived or otherwise exclude such Section(s) of // the License, but only in their entirety and only with respect to the Combined // Software. // //===----------------------------------------------------------------------===// /// /// \file /// \brief This file contains the declaration of the ColossusInstPrinter class, /// which is used to print Colossus MCInst to a .s file. /// //===----------------------------------------------------------------------===// #ifndef LLVM_LIB_TARGET_COLOSSUS_INSTPRINTER_COLOSSUSINSTPRINTER_H #define LLVM_LIB_TARGET_COLOSSUS_INSTPRINTER_COLOSSUSINSTPRINTER_H #include "llvm/MC/MCInstPrinter.h" namespace llvm { class TargetMachine; class ColossusInstPrinter : public MCInstPrinter { public: ColossusInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI) : MCInstPrinter(MAI, MII, MRI), MII(MII) {} // Autogenerated by tblgen. std::pair getMnemonic(const MCInst *MI) override; bool printAliasInstr(const MCInst *MI, uint64_t Address, const MCSubtargetInfo &STI, raw_ostream &O); void printCustomAliasOperand(const MCInst *MI, uint64_t Address, unsigned OpIdx, unsigned PrintMethodIdx, const MCSubtargetInfo &STI, raw_ostream &O); void printInstruction(const MCInst *MI, uint64_t Address, const MCSubtargetInfo &STI, raw_ostream &O); static const char *getRegisterName(unsigned RegNo); void printRegName(raw_ostream &OS, unsigned RegNo) const override; void printInst(const MCInst *MI, uint64_t Address, StringRef Annot, const MCSubtargetInfo &STI, raw_ostream &O) override; template void printImmSIOperand(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O); template void printBranchOperand(const MCInst *MI, unsigned int OpNo, const MCSubtargetInfo &STI, raw_ostream &O); void printACCOperand(const MCInst *MI, unsigned int OpNo, raw_ostream &O); private: const MCInstrInfo &MII; void printSingleInst(const MCInst *MI, uint64_t Address, StringRef Annot, const MCSubtargetInfo &STI, raw_ostream &O); void printOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O); void printMEM2Operand(const MCInst *MI, int opNum, const MCSubtargetInfo &STI, raw_ostream &O); void printBroadcastLowerOperand(const MCInst *MI, int opNum, const MCSubtargetInfo &STI, raw_ostream &O); void printBroadcastUpperOperand(const MCInst *MI, int opNum, const MCSubtargetInfo &STI, raw_ostream &O); void printBroadcastOperand(const MCInst *MI, int opNum, const MCSubtargetInfo &STI, raw_ostream &O); void printMEM3Operand(const MCInst *MI, int opNum, const MCSubtargetInfo &STI, raw_ostream &O); void printGPRPairOperand(const MCInst *MI, unsigned opNum, raw_ostream &O); void printARPairOperand(const MCInst *MI, unsigned opNum, raw_ostream &O); void printARQuadOperand(const MCInst *MI, unsigned opNum, raw_ostream &O); protected: static const char BundlePadding; }; } // end namespace llvm #endif