1 | //==- SystemZInstPrinter.h - Convert SystemZ MCInst to assembly --*- 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 SystemZ MCInst to a .s file. |
10 | // |
11 | //===----------------------------------------------------------------------===// |
12 | |
13 | #ifndef LLVM_LIB_TARGET_SYSTEMZ_MCTARGETDESC_SYSTEMZINSTPRINTER_H |
14 | #define LLVM_LIB_TARGET_SYSTEMZ_MCTARGETDESC_SYSTEMZINSTPRINTER_H |
15 | |
16 | #include "SystemZMCAsmInfo.h" |
17 | #include "llvm/MC/MCInstPrinter.h" |
18 | #include <cstdint> |
19 | |
20 | namespace llvm { |
21 | |
22 | class MCOperand; |
23 | |
24 | class SystemZInstPrinter : public MCInstPrinter { |
25 | public: |
26 | SystemZInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII, |
27 | const MCRegisterInfo &MRI) |
28 | : MCInstPrinter(MAI, MII, MRI) {} |
29 | |
30 | // Automatically generated by tblgen. |
31 | std::pair<const char *, uint64_t> getMnemonic(const MCInst *MI) override; |
32 | void printInstruction(const MCInst *MI, uint64_t Address, raw_ostream &O); |
33 | static const char *getRegisterName(MCRegister Reg); |
34 | |
35 | // Print an address with the given base, displacement and index. |
36 | void printAddress(const MCAsmInfo *MAI, MCRegister Base, |
37 | const MCOperand &DispMO, MCRegister Index, raw_ostream &O); |
38 | |
39 | // Print the given operand. |
40 | void printOperand(const MCOperand &MO, const MCAsmInfo *MAI, raw_ostream &O); |
41 | |
42 | void printFormattedRegName(const MCAsmInfo *MAI, MCRegister Reg, |
43 | raw_ostream &O) const; |
44 | |
45 | // Override MCInstPrinter. |
46 | void printRegName(raw_ostream &O, MCRegister Reg) const override; |
47 | |
48 | void printInst(const MCInst *MI, uint64_t Address, StringRef Annot, |
49 | const MCSubtargetInfo &STI, raw_ostream &O) override; |
50 | |
51 | private: |
52 | template <unsigned N> |
53 | void printUImmOperand(const MCInst *MI, int OpNum, raw_ostream &O); |
54 | template <unsigned N> |
55 | void printSImmOperand(const MCInst *MI, int OpNum, raw_ostream &O); |
56 | |
57 | // Print various types of operand. |
58 | void printOperand(const MCInst *MI, int OpNum, raw_ostream &O); |
59 | void printOperand(const MCInst *MI, uint64_t /*Address*/, unsigned OpNum, |
60 | raw_ostream &O) { |
61 | printOperand(MI, OpNum, O); |
62 | } |
63 | void printBDAddrOperand(const MCInst *MI, int OpNum, raw_ostream &O); |
64 | void printBDXAddrOperand(const MCInst *MI, int OpNum, raw_ostream &O); |
65 | void printBDLAddrOperand(const MCInst *MI, int OpNum, raw_ostream &O); |
66 | void printBDRAddrOperand(const MCInst *MI, int OpNum, raw_ostream &O); |
67 | void printBDVAddrOperand(const MCInst *MI, int OpNum, raw_ostream &O); |
68 | void printU1ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O); |
69 | void printU2ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O); |
70 | void printU3ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O); |
71 | void printU4ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O); |
72 | void printS8ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O); |
73 | void printU8ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O); |
74 | void printU12ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O); |
75 | void printS16ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O); |
76 | void printU16ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O); |
77 | void printS32ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O); |
78 | void printU32ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O); |
79 | void printU48ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O); |
80 | void printPCRelOperand(const MCInst *MI, int OpNum, raw_ostream &O); |
81 | void printPCRelOperand(const MCInst *MI, uint64_t /*Address*/, int OpNum, |
82 | raw_ostream &O) { |
83 | printPCRelOperand(MI, OpNum, O); |
84 | } |
85 | void printPCRelTLSOperand(const MCInst *MI, uint64_t Address, int OpNum, |
86 | raw_ostream &O); |
87 | |
88 | // Print the mnemonic for a condition-code mask ("ne", "lh", etc.) |
89 | // This forms part of the instruction name rather than the operand list. |
90 | void printCond4Operand(const MCInst *MI, int OpNum, raw_ostream &O); |
91 | }; |
92 | |
93 | } // end namespace llvm |
94 | |
95 | #endif // LLVM_LIB_TARGET_SYSTEMZ_MCTARGETDESC_SYSTEMZINSTPRINTER_H |
96 | |