summaryrefslogtreecommitdiffstats
path: root/lib/Target/AArch64/InstPrinter/AArch64InstPrinter.h
blob: 37b7273438ddae4bf2209170ca48d76b081afadc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
//===-- AArch64InstPrinter.h - Convert AArch64 MCInst to assembly syntax --===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This class prints an AArch64 MCInst to a .s file.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_AARCH64INSTPRINTER_H
#define LLVM_AARCH64INSTPRINTER_H

#include "MCTargetDesc/AArch64MCTargetDesc.h"
#include "Utils/AArch64BaseInfo.h"
#include "llvm/MC/MCInstPrinter.h"
#include "llvm/MC/MCSubtargetInfo.h"

namespace llvm {

class MCOperand;

class AArch64InstPrinter : public MCInstPrinter {
public:
  AArch64InstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
                     const MCRegisterInfo &MRI, const MCSubtargetInfo &STI);

  // Autogenerated by tblgen
  void printInstruction(const MCInst *MI, raw_ostream &O);
  bool printAliasInstr(const MCInst *MI, raw_ostream &O);
  static const char *getRegisterName(unsigned RegNo);
  static const char *getInstructionName(unsigned Opcode);

  void printRegName(raw_ostream &O, unsigned RegNum) const;

  template<unsigned MemSize, unsigned RmSize>
  void printAddrRegExtendOperand(const MCInst *MI, unsigned OpNum,
                                 raw_ostream &O) {
    printAddrRegExtendOperand(MI, OpNum, O, MemSize, RmSize);
  }


  void printAddrRegExtendOperand(const MCInst *MI, unsigned OpNum,
                                 raw_ostream &O, unsigned MemSize,
                                 unsigned RmSize);

  void printAddSubImmLSL0Operand(const MCInst *MI,
                                 unsigned OpNum, raw_ostream &O);
  void printAddSubImmLSL12Operand(const MCInst *MI,
                                  unsigned OpNum, raw_ostream &O);

  void printBareImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);

  template<unsigned RegWidth>
  void printBFILSBOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
  void printBFIWidthOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
  void printBFXWidthOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);


  void printCondCodeOperand(const MCInst *MI, unsigned OpNum,
                            raw_ostream &O);

  void printCRxOperand(const MCInst *MI, unsigned OpNum,
                       raw_ostream &O);

  void printCVTFixedPosOperand(const MCInst *MI, unsigned OpNum,
                               raw_ostream &O);

  void printFPImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &o);

  void printFPZeroOperand(const MCInst *MI, unsigned OpNum, raw_ostream &o);

  template<int MemScale>
  void printOffsetUImm12Operand(const MCInst *MI,
                                  unsigned OpNum, raw_ostream &o) {
    printOffsetUImm12Operand(MI, OpNum, o, MemScale);
  }

  void printOffsetUImm12Operand(const MCInst *MI, unsigned OpNum,
                                  raw_ostream &o, int MemScale);

  template<unsigned field_width, unsigned scale>
  void printLabelOperand(const MCInst *MI, unsigned OpNum,
                         raw_ostream &O);

  template<unsigned RegWidth>
  void printLogicalImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);

  template<typename SomeNamedImmMapper>
  void printNamedImmOperand(const MCInst *MI, unsigned OpNum,
                            raw_ostream &O) {
    printNamedImmOperand(SomeNamedImmMapper(), MI, OpNum, O);
  }

  void printNamedImmOperand(const NamedImmMapper &Mapper,
                            const MCInst *MI, unsigned OpNum,
                            raw_ostream &O);

  void printSysRegOperand(const A64SysReg::SysRegMapper &Mapper,
                          const MCInst *MI, unsigned OpNum,
                          raw_ostream &O);

  void printMRSOperand(const MCInst *MI, unsigned OpNum,
                       raw_ostream &O) {
    printSysRegOperand(A64SysReg::MRSMapper(), MI, OpNum, O);
  }

  void printMSROperand(const MCInst *MI, unsigned OpNum,
                       raw_ostream &O) {
    printSysRegOperand(A64SysReg::MSRMapper(), MI, OpNum, O);
  }

  void printShiftOperand(const char *name, const MCInst *MI,
                         unsigned OpIdx, raw_ostream &O);

  void printLSLOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);

  void printLSROperand(const MCInst *MI, unsigned OpNum, raw_ostream &O) {
    printShiftOperand("lsr", MI, OpNum, O);
  }
  void printASROperand(const MCInst *MI, unsigned OpNum, raw_ostream &O) {
    printShiftOperand("asr", MI, OpNum, O);
  }
  void printROROperand(const MCInst *MI, unsigned OpNum, raw_ostream &O) {
    printShiftOperand("ror", MI, OpNum, O);
  }

  template<A64SE::ShiftExtSpecifiers Shift>
  void printShiftOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O) {
    printShiftOperand(MI, OpNum, O, Shift);
  }

  void printShiftOperand(const MCInst *MI, unsigned OpNum,
                         raw_ostream &O, A64SE::ShiftExtSpecifiers Sh);


  void printMoveWideImmOperand(const  MCInst *MI, unsigned OpNum,
                               raw_ostream &O);

  template<int MemSize> void
  printSImm7ScaledOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);

  void printOffsetSImm9Operand(const MCInst *MI, unsigned OpNum,
                               raw_ostream &O);

  void printPRFMOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);

  template<A64SE::ShiftExtSpecifiers EXT>
  void printRegExtendOperand(const MCInst *MI, unsigned OpNum,
                             raw_ostream &O) {
    printRegExtendOperand(MI, OpNum, O, EXT);
  }

  void printRegExtendOperand(const MCInst *MI, unsigned OpNum,
                             raw_ostream &O, A64SE::ShiftExtSpecifiers Ext);

  void printVPRRegister(const MCInst *MI, unsigned OpNo, raw_ostream &O);
  void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
  virtual void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot);

  bool isStackReg(unsigned RegNo) {
    return RegNo == AArch64::XSP || RegNo == AArch64::WSP;
  }

  template <A64SE::ShiftExtSpecifiers Ext, bool IsHalf>
  void printNeonMovImmShiftOperand(const MCInst *MI, unsigned OpNum,
                                   raw_ostream &O);
  void printNeonUImm0Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
  void printUImmHexOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
  void printUImmBareOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
  void printNeonUImm64MaskOperand(const MCInst *MI, unsigned OpNum,
                                  raw_ostream &O);

  template <A64Layout::VectorLayout Layout, unsigned Count>
  void printVectorList(const MCInst *MI, unsigned OpNum, raw_ostream &O);
};
}

#endif