1*9880d681SAndroid Build Coastguard Worker //===-- AArch64InstPrinter.h - Convert AArch64 MCInst to assembly syntax --===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker // This class prints an AArch64 MCInst to a .s file. 11*9880d681SAndroid Build Coastguard Worker // 12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_AARCH64_INSTPRINTER_AARCH64INSTPRINTER_H 15*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_AARCH64_INSTPRINTER_AARCH64INSTPRINTER_H 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker #include "MCTargetDesc/AArch64MCTargetDesc.h" 18*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCInstPrinter.h" 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker namespace llvm { 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker class AArch64InstPrinter : public MCInstPrinter { 23*9880d681SAndroid Build Coastguard Worker public: 24*9880d681SAndroid Build Coastguard Worker AArch64InstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII, 25*9880d681SAndroid Build Coastguard Worker const MCRegisterInfo &MRI); 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot, 28*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI) override; 29*9880d681SAndroid Build Coastguard Worker void printRegName(raw_ostream &OS, unsigned RegNo) const override; 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker // Autogenerated by tblgen. 32*9880d681SAndroid Build Coastguard Worker virtual void printInstruction(const MCInst *MI, const MCSubtargetInfo &STI, 33*9880d681SAndroid Build Coastguard Worker raw_ostream &O); 34*9880d681SAndroid Build Coastguard Worker virtual bool printAliasInstr(const MCInst *MI, const MCSubtargetInfo &STI, 35*9880d681SAndroid Build Coastguard Worker raw_ostream &O); 36*9880d681SAndroid Build Coastguard Worker virtual void printCustomAliasOperand(const MCInst *MI, unsigned OpIdx, 37*9880d681SAndroid Build Coastguard Worker unsigned PrintMethodIdx, 38*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, 39*9880d681SAndroid Build Coastguard Worker raw_ostream &O); getRegName(unsigned RegNo)40*9880d681SAndroid Build Coastguard Worker virtual StringRef getRegName(unsigned RegNo) const { 41*9880d681SAndroid Build Coastguard Worker return getRegisterName(RegNo); 42*9880d681SAndroid Build Coastguard Worker } 43*9880d681SAndroid Build Coastguard Worker static const char *getRegisterName(unsigned RegNo, 44*9880d681SAndroid Build Coastguard Worker unsigned AltIdx = AArch64::NoRegAltName); 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker protected: 47*9880d681SAndroid Build Coastguard Worker bool printSysAlias(const MCInst *MI, const MCSubtargetInfo &STI, 48*9880d681SAndroid Build Coastguard Worker raw_ostream &O); 49*9880d681SAndroid Build Coastguard Worker // Operand printers 50*9880d681SAndroid Build Coastguard Worker void printOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, 51*9880d681SAndroid Build Coastguard Worker raw_ostream &O); 52*9880d681SAndroid Build Coastguard Worker void printImm(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, 53*9880d681SAndroid Build Coastguard Worker raw_ostream &O); 54*9880d681SAndroid Build Coastguard Worker void printImmHex(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, 55*9880d681SAndroid Build Coastguard Worker raw_ostream &O); 56*9880d681SAndroid Build Coastguard Worker void printPostIncOperand(const MCInst *MI, unsigned OpNo, unsigned Imm, 57*9880d681SAndroid Build Coastguard Worker raw_ostream &O); 58*9880d681SAndroid Build Coastguard Worker template <int Amount> printPostIncOperand(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)59*9880d681SAndroid Build Coastguard Worker void printPostIncOperand(const MCInst *MI, unsigned OpNo, 60*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O) { 61*9880d681SAndroid Build Coastguard Worker printPostIncOperand(MI, OpNo, Amount, O); 62*9880d681SAndroid Build Coastguard Worker } 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker void printVRegOperand(const MCInst *MI, unsigned OpNo, 65*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O); 66*9880d681SAndroid Build Coastguard Worker void printSysCROperand(const MCInst *MI, unsigned OpNo, 67*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O); 68*9880d681SAndroid Build Coastguard Worker void printAddSubImm(const MCInst *MI, unsigned OpNum, 69*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O); 70*9880d681SAndroid Build Coastguard Worker void printLogicalImm32(const MCInst *MI, unsigned OpNum, 71*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O); 72*9880d681SAndroid Build Coastguard Worker void printLogicalImm64(const MCInst *MI, unsigned OpNum, 73*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O); 74*9880d681SAndroid Build Coastguard Worker void printShifter(const MCInst *MI, unsigned OpNum, 75*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O); 76*9880d681SAndroid Build Coastguard Worker void printShiftedRegister(const MCInst *MI, unsigned OpNum, 77*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O); 78*9880d681SAndroid Build Coastguard Worker void printExtendedRegister(const MCInst *MI, unsigned OpNum, 79*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O); 80*9880d681SAndroid Build Coastguard Worker void printArithExtend(const MCInst *MI, unsigned OpNum, 81*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O); 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker void printMemExtend(const MCInst *MI, unsigned OpNum, raw_ostream &O, 84*9880d681SAndroid Build Coastguard Worker char SrcRegKind, unsigned Width); 85*9880d681SAndroid Build Coastguard Worker template <char SrcRegKind, unsigned Width> printMemExtend(const MCInst * MI,unsigned OpNum,const MCSubtargetInfo & STI,raw_ostream & O)86*9880d681SAndroid Build Coastguard Worker void printMemExtend(const MCInst *MI, unsigned OpNum, 87*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O) { 88*9880d681SAndroid Build Coastguard Worker printMemExtend(MI, OpNum, O, SrcRegKind, Width); 89*9880d681SAndroid Build Coastguard Worker } 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker void printCondCode(const MCInst *MI, unsigned OpNum, 92*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O); 93*9880d681SAndroid Build Coastguard Worker void printInverseCondCode(const MCInst *MI, unsigned OpNum, 94*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O); 95*9880d681SAndroid Build Coastguard Worker void printAlignedLabel(const MCInst *MI, unsigned OpNum, 96*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O); 97*9880d681SAndroid Build Coastguard Worker void printUImm12Offset(const MCInst *MI, unsigned OpNum, unsigned Scale, 98*9880d681SAndroid Build Coastguard Worker raw_ostream &O); 99*9880d681SAndroid Build Coastguard Worker void printAMIndexedWB(const MCInst *MI, unsigned OpNum, unsigned Scale, 100*9880d681SAndroid Build Coastguard Worker raw_ostream &O); 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker template <int Scale> printUImm12Offset(const MCInst * MI,unsigned OpNum,const MCSubtargetInfo & STI,raw_ostream & O)103*9880d681SAndroid Build Coastguard Worker void printUImm12Offset(const MCInst *MI, unsigned OpNum, 104*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O) { 105*9880d681SAndroid Build Coastguard Worker printUImm12Offset(MI, OpNum, Scale, O); 106*9880d681SAndroid Build Coastguard Worker } 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker template <int BitWidth> printAMIndexedWB(const MCInst * MI,unsigned OpNum,const MCSubtargetInfo & STI,raw_ostream & O)109*9880d681SAndroid Build Coastguard Worker void printAMIndexedWB(const MCInst *MI, unsigned OpNum, 110*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O) { 111*9880d681SAndroid Build Coastguard Worker printAMIndexedWB(MI, OpNum, BitWidth / 8, O); 112*9880d681SAndroid Build Coastguard Worker } 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker void printAMNoIndex(const MCInst *MI, unsigned OpNum, 115*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O); 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Worker template <int Scale> 118*9880d681SAndroid Build Coastguard Worker void printImmScale(const MCInst *MI, unsigned OpNum, 119*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O); 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker void printPrefetchOp(const MCInst *MI, unsigned OpNum, 122*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O); 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker void printPSBHintOp(const MCInst *MI, unsigned OpNum, 125*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O); 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker void printFPImmOperand(const MCInst *MI, unsigned OpNum, 128*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O); 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker void printVectorList(const MCInst *MI, unsigned OpNum, 131*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O, 132*9880d681SAndroid Build Coastguard Worker StringRef LayoutSuffix); 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker /// Print a list of vector registers where the type suffix is implicit 135*9880d681SAndroid Build Coastguard Worker /// (i.e. attached to the instruction rather than the registers). 136*9880d681SAndroid Build Coastguard Worker void printImplicitlyTypedVectorList(const MCInst *MI, unsigned OpNum, 137*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, 138*9880d681SAndroid Build Coastguard Worker raw_ostream &O); 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker template <unsigned NumLanes, char LaneKind> 141*9880d681SAndroid Build Coastguard Worker void printTypedVectorList(const MCInst *MI, unsigned OpNum, 142*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O); 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker void printVectorIndex(const MCInst *MI, unsigned OpNum, 145*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O); 146*9880d681SAndroid Build Coastguard Worker void printAdrpLabel(const MCInst *MI, unsigned OpNum, 147*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O); 148*9880d681SAndroid Build Coastguard Worker void printBarrierOption(const MCInst *MI, unsigned OpNum, 149*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O); 150*9880d681SAndroid Build Coastguard Worker void printMSRSystemRegister(const MCInst *MI, unsigned OpNum, 151*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O); 152*9880d681SAndroid Build Coastguard Worker void printMRSSystemRegister(const MCInst *MI, unsigned OpNum, 153*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O); 154*9880d681SAndroid Build Coastguard Worker void printSystemPStateField(const MCInst *MI, unsigned OpNum, 155*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O); 156*9880d681SAndroid Build Coastguard Worker void printSIMDType10Operand(const MCInst *MI, unsigned OpNum, 157*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, raw_ostream &O); 158*9880d681SAndroid Build Coastguard Worker template<unsigned size> 159*9880d681SAndroid Build Coastguard Worker void printGPRSeqPairsClassOperand(const MCInst *MI, unsigned OpNum, 160*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, 161*9880d681SAndroid Build Coastguard Worker raw_ostream &O); 162*9880d681SAndroid Build Coastguard Worker }; 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Worker class AArch64AppleInstPrinter : public AArch64InstPrinter { 165*9880d681SAndroid Build Coastguard Worker public: 166*9880d681SAndroid Build Coastguard Worker AArch64AppleInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII, 167*9880d681SAndroid Build Coastguard Worker const MCRegisterInfo &MRI); 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Worker void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot, 170*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI) override; 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Worker void printInstruction(const MCInst *MI, const MCSubtargetInfo &STI, 173*9880d681SAndroid Build Coastguard Worker raw_ostream &O) override; 174*9880d681SAndroid Build Coastguard Worker bool printAliasInstr(const MCInst *MI, const MCSubtargetInfo &STI, 175*9880d681SAndroid Build Coastguard Worker raw_ostream &O) override; 176*9880d681SAndroid Build Coastguard Worker void printCustomAliasOperand(const MCInst *MI, unsigned OpIdx, 177*9880d681SAndroid Build Coastguard Worker unsigned PrintMethodIdx, 178*9880d681SAndroid Build Coastguard Worker const MCSubtargetInfo &STI, 179*9880d681SAndroid Build Coastguard Worker raw_ostream &O) override; getRegName(unsigned RegNo)180*9880d681SAndroid Build Coastguard Worker StringRef getRegName(unsigned RegNo) const override { 181*9880d681SAndroid Build Coastguard Worker return getRegisterName(RegNo); 182*9880d681SAndroid Build Coastguard Worker } 183*9880d681SAndroid Build Coastguard Worker static const char *getRegisterName(unsigned RegNo, 184*9880d681SAndroid Build Coastguard Worker unsigned AltIdx = AArch64::NoRegAltName); 185*9880d681SAndroid Build Coastguard Worker }; 186*9880d681SAndroid Build Coastguard Worker } 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Worker #endif 189