ARMInstPrinter.h 16 KB

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