Break ARM addrmode4 (load/store multiple base address) into its constituent
[oota-llvm.git] / lib / Target / ARM / InstPrinter / ARMInstPrinter.h
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
19 namespace llvm {
20   class MCOperand;
21
22 class ARMInstPrinter : public MCInstPrinter {
23 public:
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 printLdStmModeOperand(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