ARMInstPrinter.h revision 8aee3f10dd8cfec46d0beb1581e63b86b4310621
1//===-- ARMInstPrinter.h - Convert ARM MCInst to assembly syntax ----------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This class prints an ARM MCInst to a .s file.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef ARMINSTPRINTER_H
15#define ARMINSTPRINTER_H
16
17#include "llvm/MC/MCInstPrinter.h"
18
19namespace llvm {
20  class MCOperand;
21
22class ARMInstPrinter : public MCInstPrinter {
23public:
24  ARMInstPrinter(const MCAsmInfo &MAI) : MCInstPrinter(MAI) {}
25
26  virtual void printInst(const MCInst *MI, raw_ostream &O);
27  virtual StringRef getOpcodeName(unsigned Opcode) const;
28
29  static const char *getInstructionName(unsigned Opcode);
30
31  // Autogenerated by tblgen.
32  void printInstruction(const MCInst *MI, raw_ostream &O);
33  static const char *getRegisterName(unsigned RegNo);
34
35
36  void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O,
37                    const char *Modifier = 0);
38
39  void printSOImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
40  void printSOImm2PartOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
41
42  void printSORegOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
43  void printAddrMode2Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
44  void printAddrMode2OffsetOperand(const MCInst *MI, unsigned OpNum,
45                                   raw_ostream &O);
46  void printAddrMode3Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
47  void printAddrMode3OffsetOperand(const MCInst *MI, unsigned OpNum,
48                                   raw_ostream &O);
49  void printAddrMode4Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O,
50                             const char *Modifier = 0);
51  void printAddrMode5Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O,
52                             const char *Modifier = 0);
53  void printAddrMode6Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
54  void printAddrMode6OffsetOperand(const MCInst *MI, unsigned OpNum,
55                                   raw_ostream &O);
56  void printAddrModePCOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O,
57                              const char *Modifier = 0);
58
59  void printBitfieldInvMaskImmOperand(const MCInst *MI, unsigned OpNum,
60                                      raw_ostream &O);
61  void printMemBOption(const MCInst *MI, unsigned OpNum, raw_ostream &O);
62  void printShiftImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
63
64  void printThumbS4ImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
65  void printThumbITMask(const MCInst *MI, unsigned OpNum, raw_ostream &O);
66  void printThumbAddrModeRROperand(const MCInst *MI, unsigned OpNum,
67                                   raw_ostream &O);
68  void printThumbAddrModeRI5Operand(const MCInst *MI, unsigned OpNum,
69                                    raw_ostream &O, unsigned Scale);
70  void printThumbAddrModeS1Operand(const MCInst *MI, unsigned OpNum,
71                                   raw_ostream &O);
72  void printThumbAddrModeS2Operand(const MCInst *MI, unsigned OpNum,
73                                   raw_ostream &O);
74  void printThumbAddrModeS4Operand(const MCInst *MI, unsigned OpNum,
75                                   raw_ostream &O);
76  void printThumbAddrModeSPOperand(const MCInst *MI, unsigned OpNum,
77                                   raw_ostream &O);
78
79  void printT2SOOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
80  void printAddrModeImm12Operand(const MCInst *MI, unsigned OpNum,
81                                 raw_ostream &O);
82  void printT2AddrModeImm8Operand(const MCInst *MI, unsigned OpNum,
83                                  raw_ostream &O);
84  void printT2AddrModeImm8s4Operand(const MCInst *MI, unsigned OpNum,
85                                    raw_ostream &O);
86  void printT2AddrModeImm8OffsetOperand(const MCInst *MI, unsigned OpNum,
87                                        raw_ostream &O);
88  void printT2AddrModeImm8s4OffsetOperand(const MCInst *MI, unsigned OpNum,
89                                          raw_ostream &O);
90  void printT2AddrModeSoRegOperand(const MCInst *MI, unsigned OpNum,
91                                   raw_ostream &O);
92
93  void printSetendOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
94  void printCPSOptionOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
95  void printMSRMaskOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
96  void printNegZeroOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
97  void printPredicateOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
98  void printMandatoryPredicateOperand(const MCInst *MI, unsigned OpNum,
99                                      raw_ostream &O);
100  void printSBitModifierOperand(const MCInst *MI, unsigned OpNum,
101                                raw_ostream &O);
102  void printRegisterList(const MCInst *MI, unsigned OpNum, raw_ostream &O);
103  void printCPInstOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O,
104                          const char *Modifier);
105  // The jump table instructions have custom handling in ARMAsmPrinter
106  // to output the jump table. Nothing further is necessary here.
107  void printJTBlockOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O) {}
108  void printJT2BlockOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O) {}
109  void printTBAddrMode(const MCInst *MI, unsigned OpNum, raw_ostream &O);
110  void printNoHashImmediate(const MCInst *MI, unsigned OpNum, raw_ostream &O);
111  void printVFPf32ImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
112  void printVFPf64ImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
113  void printNEONModImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
114
115  void printPCLabel(const MCInst *MI, unsigned OpNum, raw_ostream &O);
116};
117
118}
119
120#endif
121