1 //===- ARMInstPrinter.h - Convert ARM 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 ARM MCInst to a .s file. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMINSTPRINTER_H 14 #define LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMINSTPRINTER_H 15 16 #include "MCTargetDesc/ARMMCTargetDesc.h" 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 bool applyTargetSpecificCLOption(StringRef Opt) override; 27 28 void printInst(const MCInst *MI, uint64_t Address, StringRef Annot, 29 const MCSubtargetInfo &STI, raw_ostream &O) override; 30 void printRegName(raw_ostream &OS, MCRegister Reg) const override; 31 32 // Autogenerated by tblgen. 33 std::pair<const char *, uint64_t> getMnemonic(const MCInst *MI) override; 34 void printInstruction(const MCInst *MI, uint64_t Address, 35 const MCSubtargetInfo &STI, raw_ostream &O); 36 virtual bool printAliasInstr(const MCInst *MI, uint64_t Address, 37 const MCSubtargetInfo &STI, raw_ostream &O); 38 virtual void printCustomAliasOperand(const MCInst *MI, uint64_t Address, 39 unsigned OpIdx, unsigned PrintMethodIdx, 40 const MCSubtargetInfo &STI, 41 raw_ostream &O); 42 static const char *getRegisterName(MCRegister Reg, 43 unsigned AltIdx = ARM::NoRegAltName); 44 45 void printOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, 46 raw_ostream &O); 47 void printOperand(const MCInst *MI, uint64_t Address, unsigned OpNum, 48 const MCSubtargetInfo &STI, raw_ostream &O); 49 50 void printSORegRegOperand(const MCInst *MI, unsigned OpNum, 51 const MCSubtargetInfo &STI, raw_ostream &O); 52 void printSORegImmOperand(const MCInst *MI, unsigned OpNum, 53 const MCSubtargetInfo &STI, raw_ostream &O); 54 55 void printAddrModeTBB(const MCInst *MI, unsigned OpNum, 56 const MCSubtargetInfo &STI, raw_ostream &O); 57 void printAddrModeTBH(const MCInst *MI, unsigned OpNum, 58 const MCSubtargetInfo &STI, raw_ostream &O); 59 void printAddrMode2Operand(const MCInst *MI, unsigned OpNum, 60 const MCSubtargetInfo &STI, raw_ostream &O); 61 void printAM2PostIndexOp(const MCInst *MI, unsigned OpNum, 62 const MCSubtargetInfo &STI, raw_ostream &O); 63 void printAM2PreOrOffsetIndexOp(const MCInst *MI, unsigned OpNum, 64 const MCSubtargetInfo &STI, raw_ostream &O); 65 void printAddrMode2OffsetOperand(const MCInst *MI, unsigned OpNum, 66 const MCSubtargetInfo &STI, raw_ostream &O); 67 template <bool AlwaysPrintImm0> 68 void printAddrMode3Operand(const MCInst *MI, unsigned OpNum, 69 const MCSubtargetInfo &STI, raw_ostream &O); 70 void printAddrMode3OffsetOperand(const MCInst *MI, unsigned OpNum, 71 const MCSubtargetInfo &STI, raw_ostream &O); 72 void printAM3PreOrOffsetIndexOp(const MCInst *MI, unsigned Op, raw_ostream &O, 73 bool AlwaysPrintImm0); 74 void printPostIdxImm8Operand(const MCInst *MI, unsigned OpNum, 75 const MCSubtargetInfo &STI, raw_ostream &O); 76 void printPostIdxRegOperand(const MCInst *MI, unsigned OpNum, 77 const MCSubtargetInfo &STI, raw_ostream &O); 78 void printPostIdxImm8s4Operand(const MCInst *MI, unsigned OpNum, 79 const MCSubtargetInfo &STI, raw_ostream &O); 80 81 void printLdStmModeOperand(const MCInst *MI, unsigned OpNum, 82 const MCSubtargetInfo &STI, raw_ostream &O); 83 template <bool AlwaysPrintImm0> 84 void printAddrMode5Operand(const MCInst *MI, unsigned OpNum, 85 const MCSubtargetInfo &STI, raw_ostream &O); 86 template <bool AlwaysPrintImm0> 87 void printAddrMode5FP16Operand(const MCInst *MI, unsigned OpNum, 88 const MCSubtargetInfo &STI, raw_ostream &O); 89 void printAddrMode6Operand(const MCInst *MI, unsigned OpNum, 90 const MCSubtargetInfo &STI, raw_ostream &O); 91 void printAddrMode7Operand(const MCInst *MI, unsigned OpNum, 92 const MCSubtargetInfo &STI, raw_ostream &O); 93 void printAddrMode6OffsetOperand(const MCInst *MI, unsigned OpNum, 94 const MCSubtargetInfo &STI, raw_ostream &O); 95 96 void printBitfieldInvMaskImmOperand(const MCInst *MI, unsigned OpNum, 97 const MCSubtargetInfo &STI, 98 raw_ostream &O); 99 void printMemBOption(const MCInst *MI, unsigned OpNum, 100 const MCSubtargetInfo &STI, raw_ostream &O); 101 void printInstSyncBOption(const MCInst *MI, unsigned OpNum, 102 const MCSubtargetInfo &STI, raw_ostream &O); 103 void printTraceSyncBOption(const MCInst *MI, unsigned OpNum, 104 const MCSubtargetInfo &STI, raw_ostream &O); 105 void printShiftImmOperand(const MCInst *MI, unsigned OpNum, 106 const MCSubtargetInfo &STI, raw_ostream &O); 107 void printPKHLSLShiftImm(const MCInst *MI, unsigned OpNum, 108 const MCSubtargetInfo &STI, raw_ostream &O); 109 void printPKHASRShiftImm(const MCInst *MI, unsigned OpNum, 110 const MCSubtargetInfo &STI, raw_ostream &O); 111 112 template <unsigned scale> 113 void printAdrLabelOperand(const MCInst *MI, unsigned OpNum, 114 const MCSubtargetInfo &STI, raw_ostream &O); 115 template <unsigned scale> 116 void printAdrLabelOperand(const MCInst *MI, uint64_t /*Address*/, 117 unsigned OpNum, const MCSubtargetInfo &STI, 118 raw_ostream &O) { 119 printAdrLabelOperand<scale>(MI, OpNum, STI, O); 120 } 121 void printThumbS4ImmOperand(const MCInst *MI, unsigned OpNum, 122 const MCSubtargetInfo &STI, raw_ostream &O); 123 void printThumbSRImm(const MCInst *MI, unsigned OpNum, 124 const MCSubtargetInfo &STI, raw_ostream &O); 125 void printThumbITMask(const MCInst *MI, unsigned OpNum, 126 const MCSubtargetInfo &STI, raw_ostream &O); 127 void printThumbAddrModeRROperand(const MCInst *MI, unsigned OpNum, 128 const MCSubtargetInfo &STI, raw_ostream &O); 129 void printThumbAddrModeImm5SOperand(const MCInst *MI, unsigned OpNum, 130 const MCSubtargetInfo &STI, 131 raw_ostream &O, unsigned Scale); 132 void printThumbAddrModeImm5S1Operand(const MCInst *MI, unsigned OpNum, 133 const MCSubtargetInfo &STI, 134 raw_ostream &O); 135 void printThumbAddrModeImm5S2Operand(const MCInst *MI, unsigned OpNum, 136 const MCSubtargetInfo &STI, 137 raw_ostream &O); 138 void printThumbAddrModeImm5S4Operand(const MCInst *MI, unsigned OpNum, 139 const MCSubtargetInfo &STI, 140 raw_ostream &O); 141 void printThumbAddrModeSPOperand(const MCInst *MI, unsigned OpNum, 142 const MCSubtargetInfo &STI, raw_ostream &O); 143 144 void printT2SOOperand(const MCInst *MI, unsigned OpNum, 145 const MCSubtargetInfo &STI, raw_ostream &O); 146 template <bool AlwaysPrintImm0> 147 void printAddrModeImm12Operand(const MCInst *MI, unsigned OpNum, 148 const MCSubtargetInfo &STI, raw_ostream &O); 149 template <bool AlwaysPrintImm0> 150 void printT2AddrModeImm8Operand(const MCInst *MI, unsigned OpNum, 151 const MCSubtargetInfo &STI, raw_ostream &O); 152 template <bool AlwaysPrintImm0> 153 void printT2AddrModeImm8s4Operand(const MCInst *MI, unsigned OpNum, 154 const MCSubtargetInfo &STI, raw_ostream &O); 155 void printT2AddrModeImm0_1020s4Operand(const MCInst *MI, unsigned OpNum, 156 const MCSubtargetInfo &STI, 157 raw_ostream &O); 158 void printT2AddrModeImm8OffsetOperand(const MCInst *MI, unsigned OpNum, 159 const MCSubtargetInfo &STI, 160 raw_ostream &O); 161 void printT2AddrModeImm8s4OffsetOperand(const MCInst *MI, unsigned OpNum, 162 const MCSubtargetInfo &STI, 163 raw_ostream &O); 164 void printT2AddrModeSoRegOperand(const MCInst *MI, unsigned OpNum, 165 const MCSubtargetInfo &STI, raw_ostream &O); 166 167 void printSetendOperand(const MCInst *MI, unsigned OpNum, 168 const MCSubtargetInfo &STI, raw_ostream &O); 169 void printCPSIMod(const MCInst *MI, unsigned OpNum, 170 const MCSubtargetInfo &STI, raw_ostream &O); 171 void printCPSIFlag(const MCInst *MI, unsigned OpNum, 172 const MCSubtargetInfo &STI, raw_ostream &O); 173 void printMSRMaskOperand(const MCInst *MI, unsigned OpNum, 174 const MCSubtargetInfo &STI, raw_ostream &O); 175 void printBankedRegOperand(const MCInst *MI, unsigned OpNum, 176 const MCSubtargetInfo &STI, raw_ostream &O); 177 void printPredicateOperand(const MCInst *MI, unsigned OpNum, 178 const MCSubtargetInfo &STI, raw_ostream &O); 179 void printMandatoryPredicateOperand(const MCInst *MI, unsigned OpNum, 180 const MCSubtargetInfo &STI, 181 raw_ostream &O); 182 void printMandatoryRestrictedPredicateOperand(const MCInst *MI, 183 unsigned OpNum, 184 const MCSubtargetInfo &STI, 185 raw_ostream &O); 186 void printMandatoryInvertedPredicateOperand(const MCInst *MI, unsigned OpNum, 187 const MCSubtargetInfo &STI, 188 raw_ostream &O); 189 void printSBitModifierOperand(const MCInst *MI, unsigned OpNum, 190 const MCSubtargetInfo &STI, raw_ostream &O); 191 void printRegisterList(const MCInst *MI, unsigned OpNum, 192 const MCSubtargetInfo &STI, raw_ostream &O); 193 void printNoHashImmediate(const MCInst *MI, unsigned OpNum, 194 const MCSubtargetInfo &STI, raw_ostream &O); 195 void printPImmediate(const MCInst *MI, unsigned OpNum, 196 const MCSubtargetInfo &STI, raw_ostream &O); 197 void printCImmediate(const MCInst *MI, unsigned OpNum, 198 const MCSubtargetInfo &STI, raw_ostream &O); 199 void printCoprocOptionImm(const MCInst *MI, unsigned OpNum, 200 const MCSubtargetInfo &STI, raw_ostream &O); 201 void printFPImmOperand(const MCInst *MI, unsigned OpNum, 202 const MCSubtargetInfo &STI, raw_ostream &O); 203 void printVMOVModImmOperand(const MCInst *MI, unsigned OpNum, 204 const MCSubtargetInfo &STI, raw_ostream &O); 205 void printImmPlusOneOperand(const MCInst *MI, unsigned OpNum, 206 const MCSubtargetInfo &STI, raw_ostream &O); 207 void printRotImmOperand(const MCInst *MI, unsigned OpNum, 208 const MCSubtargetInfo &STI, raw_ostream &O); 209 void printModImmOperand(const MCInst *MI, unsigned OpNum, 210 const MCSubtargetInfo &STI, raw_ostream &O); 211 void printGPRPairOperand(const MCInst *MI, unsigned OpNum, 212 const MCSubtargetInfo &STI, raw_ostream &O); 213 214 void printPCLabel(const MCInst *MI, unsigned OpNum, 215 const MCSubtargetInfo &STI, raw_ostream &O); 216 void printThumbLdrLabelOperand(const MCInst *MI, unsigned OpNum, 217 const MCSubtargetInfo &STI, raw_ostream &O); 218 void printThumbLdrLabelOperand(const MCInst *MI, uint64_t /*Address*/, 219 unsigned OpNum, const MCSubtargetInfo &STI, 220 raw_ostream &O) { 221 printThumbLdrLabelOperand(MI, OpNum, STI, O); 222 } 223 void printFBits16(const MCInst *MI, unsigned OpNum, 224 const MCSubtargetInfo &STI, raw_ostream &O); 225 void printFBits32(const MCInst *MI, unsigned OpNum, 226 const MCSubtargetInfo &STI, raw_ostream &O); 227 void printVectorIndex(const MCInst *MI, unsigned OpNum, 228 const MCSubtargetInfo &STI, raw_ostream &O); 229 void printVectorListOne(const MCInst *MI, unsigned OpNum, 230 const MCSubtargetInfo &STI, raw_ostream &O); 231 void printVectorListTwo(const MCInst *MI, unsigned OpNum, 232 const MCSubtargetInfo &STI, raw_ostream &O); 233 void printVectorListTwoSpaced(const MCInst *MI, unsigned OpNum, 234 const MCSubtargetInfo &STI, raw_ostream &O); 235 void printVectorListThree(const MCInst *MI, unsigned OpNum, 236 const MCSubtargetInfo &STI, raw_ostream &O); 237 void printVectorListFour(const MCInst *MI, unsigned OpNum, 238 const MCSubtargetInfo &STI, raw_ostream &O); 239 void printVectorListOneAllLanes(const MCInst *MI, unsigned OpNum, 240 const MCSubtargetInfo &STI, raw_ostream &O); 241 void printVectorListTwoAllLanes(const MCInst *MI, unsigned OpNum, 242 const MCSubtargetInfo &STI, raw_ostream &O); 243 void printVectorListThreeAllLanes(const MCInst *MI, unsigned OpNum, 244 const MCSubtargetInfo &STI, raw_ostream &O); 245 void printVectorListFourAllLanes(const MCInst *MI, unsigned OpNum, 246 const MCSubtargetInfo &STI, raw_ostream &O); 247 void printVectorListTwoSpacedAllLanes(const MCInst *MI, unsigned OpNum, 248 const MCSubtargetInfo &STI, 249 raw_ostream &O); 250 void printVectorListThreeSpacedAllLanes(const MCInst *MI, unsigned OpNum, 251 const MCSubtargetInfo &STI, 252 raw_ostream &O); 253 void printVectorListFourSpacedAllLanes(const MCInst *MI, unsigned OpNum, 254 const MCSubtargetInfo &STI, 255 raw_ostream &O); 256 void printVectorListThreeSpaced(const MCInst *MI, unsigned OpNum, 257 const MCSubtargetInfo &STI, raw_ostream &O); 258 void printVectorListFourSpaced(const MCInst *MI, unsigned OpNum, 259 const MCSubtargetInfo &STI, raw_ostream &O); 260 template<unsigned NumRegs> 261 void printMVEVectorList(const MCInst *MI, unsigned OpNum, 262 const MCSubtargetInfo &STI, raw_ostream &O); 263 template<int64_t Angle, int64_t Remainder> 264 void printComplexRotationOp(const MCInst *MI, unsigned OpNum, 265 const MCSubtargetInfo &STI, raw_ostream &O); 266 // MVE 267 void printVPTPredicateOperand(const MCInst *MI, unsigned OpNum, 268 const MCSubtargetInfo &STI, 269 raw_ostream &O); 270 void printVPTMask(const MCInst *MI, unsigned OpNum, 271 const MCSubtargetInfo &STI, raw_ostream &O); 272 template<int shift> 273 void printMveAddrModeRQOperand(const MCInst *MI, unsigned OpNum, 274 const MCSubtargetInfo &STI, raw_ostream &O); 275 void printMveSaturateOp(const MCInst *MI, unsigned OpNum, 276 const MCSubtargetInfo &STI, raw_ostream &O); 277 private: 278 unsigned DefaultAltIdx = ARM::NoRegAltName; 279 }; 280 281 } // end namespace llvm 282 283 #endif // LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMINSTPRINTER_H 284