10b57cec5SDimitry Andric //===- ARMInstPrinter.h - Convert ARM MCInst to assembly syntax -*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This class prints an ARM MCInst to a .s file.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMINSTPRINTER_H
140b57cec5SDimitry Andric #define LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMINSTPRINTER_H
150b57cec5SDimitry Andric 
160b57cec5SDimitry Andric #include "MCTargetDesc/ARMMCTargetDesc.h"
170b57cec5SDimitry Andric #include "llvm/MC/MCInstPrinter.h"
180b57cec5SDimitry Andric 
190b57cec5SDimitry Andric namespace llvm {
200b57cec5SDimitry Andric 
210b57cec5SDimitry Andric class ARMInstPrinter : public MCInstPrinter {
220b57cec5SDimitry Andric public:
230b57cec5SDimitry Andric   ARMInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
240b57cec5SDimitry Andric                  const MCRegisterInfo &MRI);
250b57cec5SDimitry Andric 
260b57cec5SDimitry Andric   bool applyTargetSpecificCLOption(StringRef Opt) override;
270b57cec5SDimitry Andric 
28480093f4SDimitry Andric   void printInst(const MCInst *MI, uint64_t Address, StringRef Annot,
29480093f4SDimitry Andric                  const MCSubtargetInfo &STI, raw_ostream &O) override;
30bdd1243dSDimitry Andric   void printRegName(raw_ostream &OS, MCRegister Reg) const override;
310b57cec5SDimitry Andric 
320b57cec5SDimitry Andric   // Autogenerated by tblgen.
33e8d8bef9SDimitry Andric   std::pair<const char *, uint64_t> getMnemonic(const MCInst *MI) override;
34480093f4SDimitry Andric   void printInstruction(const MCInst *MI, uint64_t Address,
35480093f4SDimitry Andric                         const MCSubtargetInfo &STI, raw_ostream &O);
365ffd83dbSDimitry Andric   virtual bool printAliasInstr(const MCInst *MI, uint64_t Address,
375ffd83dbSDimitry Andric                                const MCSubtargetInfo &STI, raw_ostream &O);
385ffd83dbSDimitry Andric   virtual void printCustomAliasOperand(const MCInst *MI, uint64_t Address,
395ffd83dbSDimitry Andric                                        unsigned OpIdx, unsigned PrintMethodIdx,
400b57cec5SDimitry Andric                                        const MCSubtargetInfo &STI,
410b57cec5SDimitry Andric                                        raw_ostream &O);
42bdd1243dSDimitry Andric   static const char *getRegisterName(MCRegister Reg,
430b57cec5SDimitry Andric                                      unsigned AltIdx = ARM::NoRegAltName);
440b57cec5SDimitry Andric 
450b57cec5SDimitry Andric   void printOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
460b57cec5SDimitry Andric                     raw_ostream &O);
47fe6060f1SDimitry Andric   void printOperand(const MCInst *MI, uint64_t Address, unsigned OpNum,
48fe6060f1SDimitry Andric                     const MCSubtargetInfo &STI, raw_ostream &O);
490b57cec5SDimitry Andric 
500b57cec5SDimitry Andric   void printSORegRegOperand(const MCInst *MI, unsigned OpNum,
510b57cec5SDimitry Andric                             const MCSubtargetInfo &STI, raw_ostream &O);
520b57cec5SDimitry Andric   void printSORegImmOperand(const MCInst *MI, unsigned OpNum,
530b57cec5SDimitry Andric                             const MCSubtargetInfo &STI, raw_ostream &O);
540b57cec5SDimitry Andric 
550b57cec5SDimitry Andric   void printAddrModeTBB(const MCInst *MI, unsigned OpNum,
560b57cec5SDimitry Andric                         const MCSubtargetInfo &STI, raw_ostream &O);
570b57cec5SDimitry Andric   void printAddrModeTBH(const MCInst *MI, unsigned OpNum,
580b57cec5SDimitry Andric                         const MCSubtargetInfo &STI, raw_ostream &O);
590b57cec5SDimitry Andric   void printAddrMode2Operand(const MCInst *MI, unsigned OpNum,
600b57cec5SDimitry Andric                              const MCSubtargetInfo &STI, raw_ostream &O);
610b57cec5SDimitry Andric   void printAM2PostIndexOp(const MCInst *MI, unsigned OpNum,
620b57cec5SDimitry Andric                            const MCSubtargetInfo &STI, raw_ostream &O);
630b57cec5SDimitry Andric   void printAM2PreOrOffsetIndexOp(const MCInst *MI, unsigned OpNum,
640b57cec5SDimitry Andric                                   const MCSubtargetInfo &STI, raw_ostream &O);
650b57cec5SDimitry Andric   void printAddrMode2OffsetOperand(const MCInst *MI, unsigned OpNum,
660b57cec5SDimitry Andric                                    const MCSubtargetInfo &STI, raw_ostream &O);
670b57cec5SDimitry Andric   template <bool AlwaysPrintImm0>
680b57cec5SDimitry Andric   void printAddrMode3Operand(const MCInst *MI, unsigned OpNum,
690b57cec5SDimitry Andric                              const MCSubtargetInfo &STI, raw_ostream &O);
700b57cec5SDimitry Andric   void printAddrMode3OffsetOperand(const MCInst *MI, unsigned OpNum,
710b57cec5SDimitry Andric                                    const MCSubtargetInfo &STI, raw_ostream &O);
720b57cec5SDimitry Andric   void printAM3PreOrOffsetIndexOp(const MCInst *MI, unsigned Op, raw_ostream &O,
730b57cec5SDimitry Andric                                   bool AlwaysPrintImm0);
740b57cec5SDimitry Andric   void printPostIdxImm8Operand(const MCInst *MI, unsigned OpNum,
750b57cec5SDimitry Andric                                const MCSubtargetInfo &STI, raw_ostream &O);
760b57cec5SDimitry Andric   void printPostIdxRegOperand(const MCInst *MI, unsigned OpNum,
770b57cec5SDimitry Andric                               const MCSubtargetInfo &STI, raw_ostream &O);
780b57cec5SDimitry Andric   void printPostIdxImm8s4Operand(const MCInst *MI, unsigned OpNum,
790b57cec5SDimitry Andric                                  const MCSubtargetInfo &STI, raw_ostream &O);
800b57cec5SDimitry Andric 
810b57cec5SDimitry Andric   void printLdStmModeOperand(const MCInst *MI, unsigned OpNum,
820b57cec5SDimitry Andric                              const MCSubtargetInfo &STI, raw_ostream &O);
830b57cec5SDimitry Andric   template <bool AlwaysPrintImm0>
840b57cec5SDimitry Andric   void printAddrMode5Operand(const MCInst *MI, unsigned OpNum,
850b57cec5SDimitry Andric                              const MCSubtargetInfo &STI, raw_ostream &O);
860b57cec5SDimitry Andric   template <bool AlwaysPrintImm0>
870b57cec5SDimitry Andric   void printAddrMode5FP16Operand(const MCInst *MI, unsigned OpNum,
880b57cec5SDimitry Andric                                  const MCSubtargetInfo &STI, raw_ostream &O);
890b57cec5SDimitry Andric   void printAddrMode6Operand(const MCInst *MI, unsigned OpNum,
900b57cec5SDimitry Andric                              const MCSubtargetInfo &STI, raw_ostream &O);
910b57cec5SDimitry Andric   void printAddrMode7Operand(const MCInst *MI, unsigned OpNum,
920b57cec5SDimitry Andric                              const MCSubtargetInfo &STI, raw_ostream &O);
930b57cec5SDimitry Andric   void printAddrMode6OffsetOperand(const MCInst *MI, unsigned OpNum,
940b57cec5SDimitry Andric                                    const MCSubtargetInfo &STI, raw_ostream &O);
950b57cec5SDimitry Andric 
960b57cec5SDimitry Andric   void printBitfieldInvMaskImmOperand(const MCInst *MI, unsigned OpNum,
970b57cec5SDimitry Andric                                       const MCSubtargetInfo &STI,
980b57cec5SDimitry Andric                                       raw_ostream &O);
990b57cec5SDimitry Andric   void printMemBOption(const MCInst *MI, unsigned OpNum,
1000b57cec5SDimitry Andric                        const MCSubtargetInfo &STI, raw_ostream &O);
1010b57cec5SDimitry Andric   void printInstSyncBOption(const MCInst *MI, unsigned OpNum,
1020b57cec5SDimitry Andric                             const MCSubtargetInfo &STI, raw_ostream &O);
1030b57cec5SDimitry Andric   void printTraceSyncBOption(const MCInst *MI, unsigned OpNum,
1040b57cec5SDimitry Andric                              const MCSubtargetInfo &STI, raw_ostream &O);
1050b57cec5SDimitry Andric   void printShiftImmOperand(const MCInst *MI, unsigned OpNum,
1060b57cec5SDimitry Andric                             const MCSubtargetInfo &STI, raw_ostream &O);
1070b57cec5SDimitry Andric   void printPKHLSLShiftImm(const MCInst *MI, unsigned OpNum,
1080b57cec5SDimitry Andric                            const MCSubtargetInfo &STI, raw_ostream &O);
1090b57cec5SDimitry Andric   void printPKHASRShiftImm(const MCInst *MI, unsigned OpNum,
1100b57cec5SDimitry Andric                            const MCSubtargetInfo &STI, raw_ostream &O);
1110b57cec5SDimitry Andric 
1120b57cec5SDimitry Andric   template <unsigned scale>
1130b57cec5SDimitry Andric   void printAdrLabelOperand(const MCInst *MI, unsigned OpNum,
1140b57cec5SDimitry Andric                             const MCSubtargetInfo &STI, raw_ostream &O);
1155ffd83dbSDimitry Andric   template <unsigned scale>
printAdrLabelOperand(const MCInst * MI,uint64_t,unsigned OpNum,const MCSubtargetInfo & STI,raw_ostream & O)1165ffd83dbSDimitry Andric   void printAdrLabelOperand(const MCInst *MI, uint64_t /*Address*/,
1175ffd83dbSDimitry Andric                             unsigned OpNum, const MCSubtargetInfo &STI,
1185ffd83dbSDimitry Andric                             raw_ostream &O) {
1195ffd83dbSDimitry Andric     printAdrLabelOperand<scale>(MI, OpNum, STI, O);
1205ffd83dbSDimitry Andric   }
1210b57cec5SDimitry Andric   void printThumbS4ImmOperand(const MCInst *MI, unsigned OpNum,
1220b57cec5SDimitry Andric                               const MCSubtargetInfo &STI, raw_ostream &O);
1230b57cec5SDimitry Andric   void printThumbSRImm(const MCInst *MI, unsigned OpNum,
1240b57cec5SDimitry Andric                        const MCSubtargetInfo &STI, raw_ostream &O);
1250b57cec5SDimitry Andric   void printThumbITMask(const MCInst *MI, unsigned OpNum,
1260b57cec5SDimitry Andric                         const MCSubtargetInfo &STI, raw_ostream &O);
1270b57cec5SDimitry Andric   void printThumbAddrModeRROperand(const MCInst *MI, unsigned OpNum,
1280b57cec5SDimitry Andric                                    const MCSubtargetInfo &STI, raw_ostream &O);
1290b57cec5SDimitry Andric   void printThumbAddrModeImm5SOperand(const MCInst *MI, unsigned OpNum,
1300b57cec5SDimitry Andric                                       const MCSubtargetInfo &STI,
1310b57cec5SDimitry Andric                                       raw_ostream &O, unsigned Scale);
1320b57cec5SDimitry Andric   void printThumbAddrModeImm5S1Operand(const MCInst *MI, unsigned OpNum,
1330b57cec5SDimitry Andric                                        const MCSubtargetInfo &STI,
1340b57cec5SDimitry Andric                                        raw_ostream &O);
1350b57cec5SDimitry Andric   void printThumbAddrModeImm5S2Operand(const MCInst *MI, unsigned OpNum,
1360b57cec5SDimitry Andric                                        const MCSubtargetInfo &STI,
1370b57cec5SDimitry Andric                                        raw_ostream &O);
1380b57cec5SDimitry Andric   void printThumbAddrModeImm5S4Operand(const MCInst *MI, unsigned OpNum,
1390b57cec5SDimitry Andric                                        const MCSubtargetInfo &STI,
1400b57cec5SDimitry Andric                                        raw_ostream &O);
1410b57cec5SDimitry Andric   void printThumbAddrModeSPOperand(const MCInst *MI, unsigned OpNum,
1420b57cec5SDimitry Andric                                    const MCSubtargetInfo &STI, raw_ostream &O);
1430b57cec5SDimitry Andric 
1440b57cec5SDimitry Andric   void printT2SOOperand(const MCInst *MI, unsigned OpNum,
1450b57cec5SDimitry Andric                         const MCSubtargetInfo &STI, raw_ostream &O);
1460b57cec5SDimitry Andric   template <bool AlwaysPrintImm0>
1470b57cec5SDimitry Andric   void printAddrModeImm12Operand(const MCInst *MI, unsigned OpNum,
1480b57cec5SDimitry Andric                                  const MCSubtargetInfo &STI, raw_ostream &O);
1490b57cec5SDimitry Andric   template <bool AlwaysPrintImm0>
1500b57cec5SDimitry Andric   void printT2AddrModeImm8Operand(const MCInst *MI, unsigned OpNum,
1510b57cec5SDimitry Andric                                   const MCSubtargetInfo &STI, raw_ostream &O);
1520b57cec5SDimitry Andric   template <bool AlwaysPrintImm0>
1530b57cec5SDimitry Andric   void printT2AddrModeImm8s4Operand(const MCInst *MI, unsigned OpNum,
1540b57cec5SDimitry Andric                                     const MCSubtargetInfo &STI, raw_ostream &O);
1550b57cec5SDimitry Andric   void printT2AddrModeImm0_1020s4Operand(const MCInst *MI, unsigned OpNum,
1560b57cec5SDimitry Andric                                          const MCSubtargetInfo &STI,
1570b57cec5SDimitry Andric                                          raw_ostream &O);
1580b57cec5SDimitry Andric   void printT2AddrModeImm8OffsetOperand(const MCInst *MI, unsigned OpNum,
1590b57cec5SDimitry Andric                                         const MCSubtargetInfo &STI,
1600b57cec5SDimitry Andric                                         raw_ostream &O);
1610b57cec5SDimitry Andric   void printT2AddrModeImm8s4OffsetOperand(const MCInst *MI, unsigned OpNum,
1620b57cec5SDimitry Andric                                           const MCSubtargetInfo &STI,
1630b57cec5SDimitry Andric                                           raw_ostream &O);
1640b57cec5SDimitry Andric   void printT2AddrModeSoRegOperand(const MCInst *MI, unsigned OpNum,
1650b57cec5SDimitry Andric                                    const MCSubtargetInfo &STI, raw_ostream &O);
1660b57cec5SDimitry Andric 
1670b57cec5SDimitry Andric   void printSetendOperand(const MCInst *MI, unsigned OpNum,
1680b57cec5SDimitry Andric                           const MCSubtargetInfo &STI, raw_ostream &O);
1690b57cec5SDimitry Andric   void printCPSIMod(const MCInst *MI, unsigned OpNum,
1700b57cec5SDimitry Andric                     const MCSubtargetInfo &STI, raw_ostream &O);
1710b57cec5SDimitry Andric   void printCPSIFlag(const MCInst *MI, unsigned OpNum,
1720b57cec5SDimitry Andric                      const MCSubtargetInfo &STI, raw_ostream &O);
1730b57cec5SDimitry Andric   void printMSRMaskOperand(const MCInst *MI, unsigned OpNum,
1740b57cec5SDimitry Andric                            const MCSubtargetInfo &STI, raw_ostream &O);
1750b57cec5SDimitry Andric   void printBankedRegOperand(const MCInst *MI, unsigned OpNum,
1760b57cec5SDimitry Andric                              const MCSubtargetInfo &STI, raw_ostream &O);
1770b57cec5SDimitry Andric   void printPredicateOperand(const MCInst *MI, unsigned OpNum,
1780b57cec5SDimitry Andric                              const MCSubtargetInfo &STI, raw_ostream &O);
1790b57cec5SDimitry Andric   void printMandatoryPredicateOperand(const MCInst *MI, unsigned OpNum,
1800b57cec5SDimitry Andric                                       const MCSubtargetInfo &STI,
1810b57cec5SDimitry Andric                                       raw_ostream &O);
1820b57cec5SDimitry Andric   void printMandatoryRestrictedPredicateOperand(const MCInst *MI,
1830b57cec5SDimitry Andric                                                 unsigned OpNum,
1840b57cec5SDimitry Andric                                                 const MCSubtargetInfo &STI,
1850b57cec5SDimitry Andric                                                 raw_ostream &O);
1860b57cec5SDimitry Andric   void printMandatoryInvertedPredicateOperand(const MCInst *MI, unsigned OpNum,
1870b57cec5SDimitry Andric                                       const MCSubtargetInfo &STI,
1880b57cec5SDimitry Andric                                       raw_ostream &O);
1890b57cec5SDimitry Andric   void printSBitModifierOperand(const MCInst *MI, unsigned OpNum,
1900b57cec5SDimitry Andric                                 const MCSubtargetInfo &STI, raw_ostream &O);
1910b57cec5SDimitry Andric   void printRegisterList(const MCInst *MI, unsigned OpNum,
1920b57cec5SDimitry Andric                          const MCSubtargetInfo &STI, raw_ostream &O);
1930b57cec5SDimitry Andric   void printNoHashImmediate(const MCInst *MI, unsigned OpNum,
1940b57cec5SDimitry Andric                             const MCSubtargetInfo &STI, raw_ostream &O);
1950b57cec5SDimitry Andric   void printPImmediate(const MCInst *MI, unsigned OpNum,
1960b57cec5SDimitry Andric                        const MCSubtargetInfo &STI, raw_ostream &O);
1970b57cec5SDimitry Andric   void printCImmediate(const MCInst *MI, unsigned OpNum,
1980b57cec5SDimitry Andric                        const MCSubtargetInfo &STI, raw_ostream &O);
1990b57cec5SDimitry Andric   void printCoprocOptionImm(const MCInst *MI, unsigned OpNum,
2000b57cec5SDimitry Andric                             const MCSubtargetInfo &STI, raw_ostream &O);
2010b57cec5SDimitry Andric   void printFPImmOperand(const MCInst *MI, unsigned OpNum,
2020b57cec5SDimitry Andric                          const MCSubtargetInfo &STI, raw_ostream &O);
2038bcb0991SDimitry Andric   void printVMOVModImmOperand(const MCInst *MI, unsigned OpNum,
2040b57cec5SDimitry Andric                               const MCSubtargetInfo &STI, raw_ostream &O);
2050b57cec5SDimitry Andric   void printImmPlusOneOperand(const MCInst *MI, unsigned OpNum,
2060b57cec5SDimitry Andric                               const MCSubtargetInfo &STI, raw_ostream &O);
2070b57cec5SDimitry Andric   void printRotImmOperand(const MCInst *MI, unsigned OpNum,
2080b57cec5SDimitry Andric                           const MCSubtargetInfo &STI, raw_ostream &O);
2090b57cec5SDimitry Andric   void printModImmOperand(const MCInst *MI, unsigned OpNum,
2100b57cec5SDimitry Andric                           const MCSubtargetInfo &STI, raw_ostream &O);
2110b57cec5SDimitry Andric   void printGPRPairOperand(const MCInst *MI, unsigned OpNum,
2120b57cec5SDimitry Andric                            const MCSubtargetInfo &STI, raw_ostream &O);
2130b57cec5SDimitry Andric 
2140b57cec5SDimitry Andric   void printPCLabel(const MCInst *MI, unsigned OpNum,
2150b57cec5SDimitry Andric                     const MCSubtargetInfo &STI, raw_ostream &O);
2160b57cec5SDimitry Andric   void printThumbLdrLabelOperand(const MCInst *MI, unsigned OpNum,
2170b57cec5SDimitry Andric                                  const MCSubtargetInfo &STI, raw_ostream &O);
printThumbLdrLabelOperand(const MCInst * MI,uint64_t,unsigned OpNum,const MCSubtargetInfo & STI,raw_ostream & O)2185ffd83dbSDimitry Andric   void printThumbLdrLabelOperand(const MCInst *MI, uint64_t /*Address*/,
2195ffd83dbSDimitry Andric                                  unsigned OpNum, const MCSubtargetInfo &STI,
2205ffd83dbSDimitry Andric                                  raw_ostream &O) {
2215ffd83dbSDimitry Andric     printThumbLdrLabelOperand(MI, OpNum, STI, O);
2225ffd83dbSDimitry Andric   }
2230b57cec5SDimitry Andric   void printFBits16(const MCInst *MI, unsigned OpNum,
2240b57cec5SDimitry Andric                     const MCSubtargetInfo &STI, raw_ostream &O);
2250b57cec5SDimitry Andric   void printFBits32(const MCInst *MI, unsigned OpNum,
2260b57cec5SDimitry Andric                     const MCSubtargetInfo &STI, raw_ostream &O);
2270b57cec5SDimitry Andric   void printVectorIndex(const MCInst *MI, unsigned OpNum,
2280b57cec5SDimitry Andric                         const MCSubtargetInfo &STI, raw_ostream &O);
2290b57cec5SDimitry Andric   void printVectorListOne(const MCInst *MI, unsigned OpNum,
2300b57cec5SDimitry Andric                           const MCSubtargetInfo &STI, raw_ostream &O);
2310b57cec5SDimitry Andric   void printVectorListTwo(const MCInst *MI, unsigned OpNum,
2320b57cec5SDimitry Andric                           const MCSubtargetInfo &STI, raw_ostream &O);
2330b57cec5SDimitry Andric   void printVectorListTwoSpaced(const MCInst *MI, unsigned OpNum,
2340b57cec5SDimitry Andric                                 const MCSubtargetInfo &STI, raw_ostream &O);
2350b57cec5SDimitry Andric   void printVectorListThree(const MCInst *MI, unsigned OpNum,
2360b57cec5SDimitry Andric                             const MCSubtargetInfo &STI, raw_ostream &O);
2370b57cec5SDimitry Andric   void printVectorListFour(const MCInst *MI, unsigned OpNum,
2380b57cec5SDimitry Andric                            const MCSubtargetInfo &STI, raw_ostream &O);
2390b57cec5SDimitry Andric   void printVectorListOneAllLanes(const MCInst *MI, unsigned OpNum,
2400b57cec5SDimitry Andric                                   const MCSubtargetInfo &STI, raw_ostream &O);
2410b57cec5SDimitry Andric   void printVectorListTwoAllLanes(const MCInst *MI, unsigned OpNum,
2420b57cec5SDimitry Andric                                   const MCSubtargetInfo &STI, raw_ostream &O);
2430b57cec5SDimitry Andric   void printVectorListThreeAllLanes(const MCInst *MI, unsigned OpNum,
2440b57cec5SDimitry Andric                                     const MCSubtargetInfo &STI, raw_ostream &O);
2450b57cec5SDimitry Andric   void printVectorListFourAllLanes(const MCInst *MI, unsigned OpNum,
2460b57cec5SDimitry Andric                                    const MCSubtargetInfo &STI, raw_ostream &O);
2470b57cec5SDimitry Andric   void printVectorListTwoSpacedAllLanes(const MCInst *MI, unsigned OpNum,
2480b57cec5SDimitry Andric                                         const MCSubtargetInfo &STI,
2490b57cec5SDimitry Andric                                         raw_ostream &O);
2500b57cec5SDimitry Andric   void printVectorListThreeSpacedAllLanes(const MCInst *MI, unsigned OpNum,
2510b57cec5SDimitry Andric                                           const MCSubtargetInfo &STI,
2520b57cec5SDimitry Andric                                           raw_ostream &O);
2530b57cec5SDimitry Andric   void printVectorListFourSpacedAllLanes(const MCInst *MI, unsigned OpNum,
2540b57cec5SDimitry Andric                                          const MCSubtargetInfo &STI,
2550b57cec5SDimitry Andric                                          raw_ostream &O);
2560b57cec5SDimitry Andric   void printVectorListThreeSpaced(const MCInst *MI, unsigned OpNum,
2570b57cec5SDimitry Andric                                   const MCSubtargetInfo &STI, raw_ostream &O);
2580b57cec5SDimitry Andric   void printVectorListFourSpaced(const MCInst *MI, unsigned OpNum,
2590b57cec5SDimitry Andric                                  const MCSubtargetInfo &STI, raw_ostream &O);
2600b57cec5SDimitry Andric   template<unsigned NumRegs>
2610b57cec5SDimitry Andric   void printMVEVectorList(const MCInst *MI, unsigned OpNum,
2620b57cec5SDimitry Andric                           const MCSubtargetInfo &STI, raw_ostream &O);
2630b57cec5SDimitry Andric   template<int64_t Angle, int64_t Remainder>
2640b57cec5SDimitry Andric   void printComplexRotationOp(const MCInst *MI, unsigned OpNum,
2650b57cec5SDimitry Andric                               const MCSubtargetInfo &STI, raw_ostream &O);
2660b57cec5SDimitry Andric   // MVE
2670b57cec5SDimitry Andric   void printVPTPredicateOperand(const MCInst *MI, unsigned OpNum,
2680b57cec5SDimitry Andric                                 const MCSubtargetInfo &STI,
2690b57cec5SDimitry Andric                                 raw_ostream &O);
2700b57cec5SDimitry Andric   void printVPTMask(const MCInst *MI, unsigned OpNum,
2710b57cec5SDimitry Andric                     const MCSubtargetInfo &STI, raw_ostream &O);
2720b57cec5SDimitry Andric   template<int shift>
2730b57cec5SDimitry Andric   void printMveAddrModeRQOperand(const MCInst *MI, unsigned OpNum,
2740b57cec5SDimitry Andric                                  const MCSubtargetInfo &STI, raw_ostream &O);
2758bcb0991SDimitry Andric   void printMveSaturateOp(const MCInst *MI, unsigned OpNum,
2768bcb0991SDimitry Andric                          const MCSubtargetInfo &STI, raw_ostream &O);
2770b57cec5SDimitry Andric private:
2780b57cec5SDimitry Andric   unsigned DefaultAltIdx = ARM::NoRegAltName;
2790b57cec5SDimitry Andric };
2800b57cec5SDimitry Andric 
2810b57cec5SDimitry Andric } // end namespace llvm
2820b57cec5SDimitry Andric 
2830b57cec5SDimitry Andric #endif // LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMINSTPRINTER_H
284