1//=- X86ATTInstPrinter.h - Convert X86 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 an X86 MCInst to AT&T style .s file syntax.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_LIB_TARGET_X86_MCTARGETDESC_X86ATTINSTPRINTER_H
14#define LLVM_LIB_TARGET_X86_MCTARGETDESC_X86ATTINSTPRINTER_H
15
16#include "X86InstPrinterCommon.h"
17
18namespace llvm {
19
20class X86ATTInstPrinter final : public X86InstPrinterCommon {
21public:
22  X86ATTInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
23                    const MCRegisterInfo &MRI)
24      : X86InstPrinterCommon(MAI, MII, MRI), HasCustomInstComment(false) {}
25
26  void printRegName(raw_ostream &OS, MCRegister Reg) const override;
27  void printInst(const MCInst *MI, uint64_t Address, StringRef Annot,
28                 const MCSubtargetInfo &STI, raw_ostream &OS) override;
29  bool printVecCompareInstr(const MCInst *MI, raw_ostream &OS);
30
31  // Autogenerated by tblgen, returns true if we successfully printed an
32  // alias.
33  bool printAliasInstr(const MCInst *MI, uint64_t Address, raw_ostream &OS);
34  void printCustomAliasOperand(const MCInst *MI, uint64_t Address,
35                               unsigned OpIdx, unsigned PrintMethodIdx,
36                               raw_ostream &O);
37
38  // Autogenerated by tblgen.
39  std::pair<const char *, uint64_t> getMnemonic(const MCInst *MI) override;
40  void printInstruction(const MCInst *MI, uint64_t Address, raw_ostream &OS);
41  static const char *getRegisterName(MCRegister Reg);
42
43  void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &OS) override;
44  void printMemReference(const MCInst *MI, unsigned Op, raw_ostream &OS);
45  void printMemOffset(const MCInst *MI, unsigned OpNo, raw_ostream &OS);
46  void printSrcIdx(const MCInst *MI, unsigned Op, raw_ostream &O);
47  void printDstIdx(const MCInst *MI, unsigned Op, raw_ostream &O);
48  void printU8Imm(const MCInst *MI, unsigned Op, raw_ostream &OS);
49  void printSTiRegOperand(const MCInst *MI, unsigned OpNo, raw_ostream &OS);
50
51  void printbytemem(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
52    printMemReference(MI, OpNo, O);
53  }
54  void printwordmem(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
55    printMemReference(MI, OpNo, O);
56  }
57  void printdwordmem(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
58    printMemReference(MI, OpNo, O);
59  }
60  void printqwordmem(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
61    printMemReference(MI, OpNo, O);
62  }
63  void printxmmwordmem(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
64    printMemReference(MI, OpNo, O);
65  }
66  void printymmwordmem(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
67    printMemReference(MI, OpNo, O);
68  }
69  void printzmmwordmem(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
70    printMemReference(MI, OpNo, O);
71  }
72  void printtbytemem(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
73    printMemReference(MI, OpNo, O);
74  }
75
76  void printSrcIdx8(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
77    printSrcIdx(MI, OpNo, O);
78  }
79  void printSrcIdx16(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
80    printSrcIdx(MI, OpNo, O);
81  }
82  void printSrcIdx32(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
83    printSrcIdx(MI, OpNo, O);
84  }
85  void printSrcIdx64(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
86    printSrcIdx(MI, OpNo, O);
87  }
88  void printDstIdx8(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
89    printDstIdx(MI, OpNo, O);
90  }
91  void printDstIdx16(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
92    printDstIdx(MI, OpNo, O);
93  }
94  void printDstIdx32(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
95    printDstIdx(MI, OpNo, O);
96  }
97  void printDstIdx64(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
98    printDstIdx(MI, OpNo, O);
99  }
100  void printMemOffs8(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
101    printMemOffset(MI, OpNo, O);
102  }
103  void printMemOffs16(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
104    printMemOffset(MI, OpNo, O);
105  }
106  void printMemOffs32(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
107    printMemOffset(MI, OpNo, O);
108  }
109  void printMemOffs64(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
110    printMemOffset(MI, OpNo, O);
111  }
112
113private:
114  bool HasCustomInstComment;
115};
116
117} // end namespace llvm
118
119#endif // LLVM_LIB_TARGET_X86_MCTARGETDESC_X86ATTINSTPRINTER_H
120