1 //===- ARMInstPrinter.h - Convert ARM MCInst to assembly syntax -*- C++ -*-===// 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 LLVM_LIB_TARGET_ARM_INSTPRINTER_ARMINSTPRINTER_H 15 #define LLVM_LIB_TARGET_ARM_INSTPRINTER_ARMINSTPRINTER_H 16 17 #include "llvm/MC/MCInstPrinter.h" 18 19 namespace llvm { 20 21 class ARMInstPrinter : public MCInstPrinter { 22 public: 23 ARMInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII, 24 const MCRegisterInfo &MRI); 25 26 void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot, 27 const MCSubtargetInfo &STI) override; 28 void printRegName(raw_ostream &OS, unsigned RegNo) const override; 29 30 // Autogenerated by tblgen. 31 void printInstruction(const MCInst *MI, const MCSubtargetInfo &STI, 32 raw_ostream &O); 33 virtual bool printAliasInstr(const MCInst *MI, const MCSubtargetInfo &STI, 34 raw_ostream &O); 35 virtual void printCustomAliasOperand(const MCInst *MI, unsigned OpIdx, 36 unsigned PrintMethodIdx, 37 const MCSubtargetInfo &STI, 38 raw_ostream &O); 39 static const char *getRegisterName(unsigned RegNo); 40 41 void printOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, 42 raw_ostream &O); 43 44 void printSORegRegOperand(const MCInst *MI, unsigned OpNum, 45 const MCSubtargetInfo &STI, raw_ostream &O); 46 void printSORegImmOperand(const MCInst *MI, unsigned OpNum, 47 const MCSubtargetInfo &STI, raw_ostream &O); 48 49 void printAddrModeTBB(const MCInst *MI, unsigned OpNum, 50 const MCSubtargetInfo &STI, raw_ostream &O); 51 void printAddrModeTBH(const MCInst *MI, unsigned OpNum, 52 const MCSubtargetInfo &STI, raw_ostream &O); 53 void printAddrMode2Operand(const MCInst *MI, unsigned OpNum, 54 const MCSubtargetInfo &STI, raw_ostream &O); 55 void printAM2PostIndexOp(const MCInst *MI, unsigned OpNum, 56 const MCSubtargetInfo &STI, raw_ostream &O); 57 void printAM2PreOrOffsetIndexOp(const MCInst *MI, unsigned OpNum, 58 const MCSubtargetInfo &STI, raw_ostream &O); 59 void printAddrMode2OffsetOperand(const MCInst *MI, unsigned OpNum, 60 const MCSubtargetInfo &STI, raw_ostream &O); 61 template <bool AlwaysPrintImm0> 62 void printAddrMode3Operand(const MCInst *MI, unsigned OpNum, 63 const MCSubtargetInfo &STI, raw_ostream &O); 64 void printAddrMode3OffsetOperand(const MCInst *MI, unsigned OpNum, 65 const MCSubtargetInfo &STI, raw_ostream &O); 66 void printAM3PreOrOffsetIndexOp(const MCInst *MI, unsigned Op, raw_ostream &O, 67 bool AlwaysPrintImm0); 68 void printPostIdxImm8Operand(const MCInst *MI, unsigned OpNum, 69 const MCSubtargetInfo &STI, raw_ostream &O); 70 void printPostIdxRegOperand(const MCInst *MI, unsigned OpNum, 71 const MCSubtargetInfo &STI, raw_ostream &O); 72 void printPostIdxImm8s4Operand(const MCInst *MI, unsigned OpNum, 73 const MCSubtargetInfo &STI, raw_ostream &O); 74 75 void printLdStmModeOperand(const MCInst *MI, unsigned OpNum, 76 const MCSubtargetInfo &STI, raw_ostream &O); 77 template <bool AlwaysPrintImm0> 78 void printAddrMode5Operand(const MCInst *MI, unsigned OpNum, 79 const MCSubtargetInfo &STI, raw_ostream &O); 80 template <bool AlwaysPrintImm0> 81 void printAddrMode5FP16Operand(const MCInst *MI, unsigned OpNum, 82 const MCSubtargetInfo &STI, raw_ostream &O); 83 void printAddrMode6Operand(const MCInst *MI, unsigned OpNum, 84 const MCSubtargetInfo &STI, raw_ostream &O); 85 void printAddrMode7Operand(const MCInst *MI, unsigned OpNum, 86 const MCSubtargetInfo &STI, raw_ostream &O); 87 void printAddrMode6OffsetOperand(const MCInst *MI, unsigned OpNum, 88 const MCSubtargetInfo &STI, raw_ostream &O); 89 90 void printBitfieldInvMaskImmOperand(const MCInst *MI, unsigned OpNum, 91 const MCSubtargetInfo &STI, 92 raw_ostream &O); 93 void printMemBOption(const MCInst *MI, unsigned OpNum, 94 const MCSubtargetInfo &STI, raw_ostream &O); 95 void printInstSyncBOption(const MCInst *MI, unsigned OpNum, 96 const MCSubtargetInfo &STI, raw_ostream &O); 97 void printTraceSyncBOption(const MCInst *MI, unsigned OpNum, 98 const MCSubtargetInfo &STI, raw_ostream &O); 99 void printShiftImmOperand(const MCInst *MI, unsigned OpNum, 100 const MCSubtargetInfo &STI, raw_ostream &O); 101 void printPKHLSLShiftImm(const MCInst *MI, unsigned OpNum, 102 const MCSubtargetInfo &STI, raw_ostream &O); 103 void printPKHASRShiftImm(const MCInst *MI, unsigned OpNum, 104 const MCSubtargetInfo &STI, raw_ostream &O); 105 106 template <unsigned scale> 107 void printAdrLabelOperand(const MCInst *MI, unsigned OpNum, 108 const MCSubtargetInfo &STI, raw_ostream &O); 109 void printThumbS4ImmOperand(const MCInst *MI, unsigned OpNum, 110 const MCSubtargetInfo &STI, raw_ostream &O); 111 void printThumbSRImm(const MCInst *MI, unsigned OpNum, 112 const MCSubtargetInfo &STI, raw_ostream &O); 113 void printThumbITMask(const MCInst *MI, unsigned OpNum, 114 const MCSubtargetInfo &STI, raw_ostream &O); 115 void printThumbAddrModeRROperand(const MCInst *MI, unsigned OpNum, 116 const MCSubtargetInfo &STI, raw_ostream &O); 117 void printThumbAddrModeImm5SOperand(const MCInst *MI, unsigned OpNum, 118 const MCSubtargetInfo &STI, 119 raw_ostream &O, unsigned Scale); 120 void printThumbAddrModeImm5S1Operand(const MCInst *MI, unsigned OpNum, 121 const MCSubtargetInfo &STI, 122 raw_ostream &O); 123 void printThumbAddrModeImm5S2Operand(const MCInst *MI, unsigned OpNum, 124 const MCSubtargetInfo &STI, 125 raw_ostream &O); 126 void printThumbAddrModeImm5S4Operand(const MCInst *MI, unsigned OpNum, 127 const MCSubtargetInfo &STI, 128 raw_ostream &O); 129 void printThumbAddrModeSPOperand(const MCInst *MI, unsigned OpNum, 130 const MCSubtargetInfo &STI, raw_ostream &O); 131 132 void printT2SOOperand(const MCInst *MI, unsigned OpNum, 133 const MCSubtargetInfo &STI, raw_ostream &O); 134 template <bool AlwaysPrintImm0> 135 void printAddrModeImm12Operand(const MCInst *MI, unsigned OpNum, 136 const MCSubtargetInfo &STI, raw_ostream &O); 137 template <bool AlwaysPrintImm0> 138 void printT2AddrModeImm8Operand(const MCInst *MI, unsigned OpNum, 139 const MCSubtargetInfo &STI, raw_ostream &O); 140 template <bool AlwaysPrintImm0> 141 void printT2AddrModeImm8s4Operand(const MCInst *MI, unsigned OpNum, 142 const MCSubtargetInfo &STI, raw_ostream &O); 143 void printT2AddrModeImm0_1020s4Operand(const MCInst *MI, unsigned OpNum, 144 const MCSubtargetInfo &STI, 145 raw_ostream &O); 146 void printT2AddrModeImm8OffsetOperand(const MCInst *MI, unsigned OpNum, 147 const MCSubtargetInfo &STI, 148 raw_ostream &O); 149 void printT2AddrModeImm8s4OffsetOperand(const MCInst *MI, unsigned OpNum, 150 const MCSubtargetInfo &STI, 151 raw_ostream &O); 152 void printT2AddrModeSoRegOperand(const MCInst *MI, unsigned OpNum, 153 const MCSubtargetInfo &STI, raw_ostream &O); 154 155 void printSetendOperand(const MCInst *MI, unsigned OpNum, 156 const MCSubtargetInfo &STI, raw_ostream &O); 157 void printCPSIMod(const MCInst *MI, unsigned OpNum, 158 const MCSubtargetInfo &STI, raw_ostream &O); 159 void printCPSIFlag(const MCInst *MI, unsigned OpNum, 160 const MCSubtargetInfo &STI, raw_ostream &O); 161 void printMSRMaskOperand(const MCInst *MI, unsigned OpNum, 162 const MCSubtargetInfo &STI, raw_ostream &O); 163 void printBankedRegOperand(const MCInst *MI, unsigned OpNum, 164 const MCSubtargetInfo &STI, raw_ostream &O); 165 void printPredicateOperand(const MCInst *MI, unsigned OpNum, 166 const MCSubtargetInfo &STI, raw_ostream &O); 167 void printMandatoryPredicateOperand(const MCInst *MI, unsigned OpNum, 168 const MCSubtargetInfo &STI, 169 raw_ostream &O); 170 void printSBitModifierOperand(const MCInst *MI, unsigned OpNum, 171 const MCSubtargetInfo &STI, raw_ostream &O); 172 void printRegisterList(const MCInst *MI, unsigned OpNum, 173 const MCSubtargetInfo &STI, raw_ostream &O); 174 void printNoHashImmediate(const MCInst *MI, unsigned OpNum, 175 const MCSubtargetInfo &STI, raw_ostream &O); 176 void printPImmediate(const MCInst *MI, unsigned OpNum, 177 const MCSubtargetInfo &STI, raw_ostream &O); 178 void printCImmediate(const MCInst *MI, unsigned OpNum, 179 const MCSubtargetInfo &STI, raw_ostream &O); 180 void printCoprocOptionImm(const MCInst *MI, unsigned OpNum, 181 const MCSubtargetInfo &STI, raw_ostream &O); 182 void printFPImmOperand(const MCInst *MI, unsigned OpNum, 183 const MCSubtargetInfo &STI, raw_ostream &O); 184 void printNEONModImmOperand(const MCInst *MI, unsigned OpNum, 185 const MCSubtargetInfo &STI, raw_ostream &O); 186 void printImmPlusOneOperand(const MCInst *MI, unsigned OpNum, 187 const MCSubtargetInfo &STI, raw_ostream &O); 188 void printRotImmOperand(const MCInst *MI, unsigned OpNum, 189 const MCSubtargetInfo &STI, raw_ostream &O); 190 void printModImmOperand(const MCInst *MI, unsigned OpNum, 191 const MCSubtargetInfo &STI, raw_ostream &O); 192 void printGPRPairOperand(const MCInst *MI, unsigned OpNum, 193 const MCSubtargetInfo &STI, raw_ostream &O); 194 195 void printPCLabel(const MCInst *MI, unsigned OpNum, 196 const MCSubtargetInfo &STI, raw_ostream &O); 197 void printThumbLdrLabelOperand(const MCInst *MI, unsigned OpNum, 198 const MCSubtargetInfo &STI, raw_ostream &O); 199 void printFBits16(const MCInst *MI, unsigned OpNum, 200 const MCSubtargetInfo &STI, raw_ostream &O); 201 void printFBits32(const MCInst *MI, unsigned OpNum, 202 const MCSubtargetInfo &STI, raw_ostream &O); 203 void printVectorIndex(const MCInst *MI, unsigned OpNum, 204 const MCSubtargetInfo &STI, raw_ostream &O); 205 void printVectorListOne(const MCInst *MI, unsigned OpNum, 206 const MCSubtargetInfo &STI, raw_ostream &O); 207 void printVectorListTwo(const MCInst *MI, unsigned OpNum, 208 const MCSubtargetInfo &STI, raw_ostream &O); 209 void printVectorListTwoSpaced(const MCInst *MI, unsigned OpNum, 210 const MCSubtargetInfo &STI, raw_ostream &O); 211 void printVectorListThree(const MCInst *MI, unsigned OpNum, 212 const MCSubtargetInfo &STI, raw_ostream &O); 213 void printVectorListFour(const MCInst *MI, unsigned OpNum, 214 const MCSubtargetInfo &STI, raw_ostream &O); 215 void printVectorListOneAllLanes(const MCInst *MI, unsigned OpNum, 216 const MCSubtargetInfo &STI, raw_ostream &O); 217 void printVectorListTwoAllLanes(const MCInst *MI, unsigned OpNum, 218 const MCSubtargetInfo &STI, raw_ostream &O); 219 void printVectorListThreeAllLanes(const MCInst *MI, unsigned OpNum, 220 const MCSubtargetInfo &STI, raw_ostream &O); 221 void printVectorListFourAllLanes(const MCInst *MI, unsigned OpNum, 222 const MCSubtargetInfo &STI, raw_ostream &O); 223 void printVectorListTwoSpacedAllLanes(const MCInst *MI, unsigned OpNum, 224 const MCSubtargetInfo &STI, 225 raw_ostream &O); 226 void printVectorListThreeSpacedAllLanes(const MCInst *MI, unsigned OpNum, 227 const MCSubtargetInfo &STI, 228 raw_ostream &O); 229 void printVectorListFourSpacedAllLanes(const MCInst *MI, unsigned OpNum, 230 const MCSubtargetInfo &STI, 231 raw_ostream &O); 232 void printVectorListThreeSpaced(const MCInst *MI, unsigned OpNum, 233 const MCSubtargetInfo &STI, raw_ostream &O); 234 void printVectorListFourSpaced(const MCInst *MI, unsigned OpNum, 235 const MCSubtargetInfo &STI, raw_ostream &O); 236 template<int64_t Angle, int64_t Remainder> 237 void printComplexRotationOp(const MCInst *MI, unsigned OpNum, 238 const MCSubtargetInfo &STI, raw_ostream &O); 239 }; 240 241 } // end namespace llvm 242 243 #endif // LLVM_LIB_TARGET_ARM_INSTPRINTER_ARMINSTPRINTER_H 244