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