1 | //=== MipsInstPrinter.h - Convert Mips MCInst to assembly syntax -*- C++ -*-==// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // This class prints a Mips MCInst to a .s file. |
10 | // |
11 | //===----------------------------------------------------------------------===// |
12 | |
13 | #ifndef LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSINSTPRINTER_H |
14 | #define LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSINSTPRINTER_H |
15 | #include "llvm/MC/MCInstPrinter.h" |
16 | |
17 | namespace llvm { |
18 | // These enumeration declarations were originally in MipsInstrInfo.h but |
19 | // had to be moved here to avoid circular dependencies between |
20 | // LLVMMipsCodeGen and LLVMMipsAsmPrinter. |
21 | namespace Mips { |
22 | // Mips Branch Codes |
23 | enum FPBranchCode { |
24 | BRANCH_F, |
25 | BRANCH_T, |
26 | BRANCH_FL, |
27 | BRANCH_TL, |
28 | BRANCH_INVALID |
29 | }; |
30 | |
31 | // Mips Condition Codes |
32 | enum CondCode { |
33 | // To be used with float branch True |
34 | FCOND_F, |
35 | FCOND_UN, |
36 | FCOND_OEQ, |
37 | FCOND_UEQ, |
38 | FCOND_OLT, |
39 | FCOND_ULT, |
40 | FCOND_OLE, |
41 | FCOND_ULE, |
42 | FCOND_SF, |
43 | FCOND_NGLE, |
44 | FCOND_SEQ, |
45 | FCOND_NGL, |
46 | FCOND_LT, |
47 | FCOND_NGE, |
48 | FCOND_LE, |
49 | FCOND_NGT, |
50 | |
51 | // To be used with float branch False |
52 | // This conditions have the same mnemonic as the |
53 | // above ones, but are used with a branch False; |
54 | FCOND_T, |
55 | FCOND_OR, |
56 | FCOND_UNE, |
57 | FCOND_ONE, |
58 | FCOND_UGE, |
59 | FCOND_OGE, |
60 | FCOND_UGT, |
61 | FCOND_OGT, |
62 | FCOND_ST, |
63 | FCOND_GLE, |
64 | FCOND_SNE, |
65 | FCOND_GL, |
66 | FCOND_NLT, |
67 | FCOND_GE, |
68 | FCOND_NLE, |
69 | FCOND_GT |
70 | }; |
71 | |
72 | const char *MipsFCCToString(Mips::CondCode CC); |
73 | } // end namespace Mips |
74 | |
75 | class MipsInstPrinter : public MCInstPrinter { |
76 | public: |
77 | MipsInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII, |
78 | const MCRegisterInfo &MRI) |
79 | : MCInstPrinter(MAI, MII, MRI) {} |
80 | |
81 | // Autogenerated by tblgen. |
82 | std::pair<const char *, uint64_t> getMnemonic(const MCInst *MI) override; |
83 | void printInstruction(const MCInst *MI, uint64_t Address, |
84 | const MCSubtargetInfo &STI, raw_ostream &O); |
85 | static const char *getRegisterName(MCRegister Reg); |
86 | |
87 | void printRegName(raw_ostream &OS, MCRegister Reg) const override; |
88 | void printInst(const MCInst *MI, uint64_t Address, StringRef Annot, |
89 | const MCSubtargetInfo &STI, raw_ostream &O) override; |
90 | |
91 | bool printAliasInstr(const MCInst *MI, uint64_t Address, |
92 | const MCSubtargetInfo &STI, raw_ostream &OS); |
93 | void printCustomAliasOperand(const MCInst *MI, uint64_t Address, |
94 | unsigned OpIdx, unsigned PrintMethodIdx, |
95 | const MCSubtargetInfo &STI, raw_ostream &O); |
96 | |
97 | private: |
98 | void printOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, |
99 | raw_ostream &O); |
100 | void printJumpOperand(const MCInst *MI, unsigned OpNo, |
101 | const MCSubtargetInfo &STI, raw_ostream &O); |
102 | void printBranchOperand(const MCInst *MI, uint64_t Address, unsigned OpNo, |
103 | const MCSubtargetInfo &STI, raw_ostream &O); |
104 | template <unsigned Bits, unsigned Offset = 0> |
105 | void printUImm(const MCInst *MI, int opNum, const MCSubtargetInfo &STI, |
106 | raw_ostream &O); |
107 | void printMemOperand(const MCInst *MI, int opNum, const MCSubtargetInfo &STI, |
108 | raw_ostream &O); |
109 | void printMemOperandEA(const MCInst *MI, int opNum, |
110 | const MCSubtargetInfo &STI, raw_ostream &O); |
111 | void printFCCOperand(const MCInst *MI, int opNum, const MCSubtargetInfo &STI, |
112 | raw_ostream &O); |
113 | void printSHFMask(const MCInst *MI, int opNum, raw_ostream &O); |
114 | |
115 | bool printAlias(const char *Str, const MCInst &MI, uint64_t Address, |
116 | unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &OS, |
117 | bool IsBranch = false); |
118 | bool printAlias(const char *Str, const MCInst &MI, uint64_t Address, |
119 | unsigned OpNo0, unsigned OpNo1, const MCSubtargetInfo &STI, |
120 | raw_ostream &OS, bool IsBranch = false); |
121 | bool printAlias(const MCInst &MI, uint64_t Address, |
122 | const MCSubtargetInfo &STI, raw_ostream &OS); |
123 | void printSaveRestore(const MCInst *MI, const MCSubtargetInfo &STI, |
124 | raw_ostream &O); |
125 | void printRegisterList(const MCInst *MI, int opNum, |
126 | const MCSubtargetInfo &STI, raw_ostream &O); |
127 | }; |
128 | } // end namespace llvm |
129 | |
130 | #endif |
131 | |