AArch64InstPrinter.h revision 272461
167754Smsmith//===-- AArch64InstPrinter.h - Convert AArch64 MCInst to assembly syntax --===// 267754Smsmith// 367754Smsmith// The LLVM Compiler Infrastructure 4128212Snjl// 567754Smsmith// This file is distributed under the University of Illinois Open Source 667754Smsmith// License. See LICENSE.TXT for details. 767754Smsmith// 867754Smsmith//===----------------------------------------------------------------------===// 967754Smsmith// 1067754Smsmith// This class prints an AArch64 MCInst to a .s file. 1167754Smsmith// 12126372Snjl//===----------------------------------------------------------------------===// 1370243Smsmith 1467754Smsmith#ifndef LLVM_AARCH64INSTPRINTER_H 1567754Smsmith#define LLVM_AARCH64INSTPRINTER_H 1667754Smsmith 1767754Smsmith#include "MCTargetDesc/AArch64MCTargetDesc.h" 1867754Smsmith#include "Utils/AArch64BaseInfo.h" 1967754Smsmith#include "llvm/MC/MCInstPrinter.h" 2067754Smsmith#include "llvm/MC/MCSubtargetInfo.h" 2167754Smsmith 2267754Smsmithnamespace llvm { 2367754Smsmith 2467754Smsmithclass MCOperand; 2567754Smsmith 2667754Smsmithclass AArch64InstPrinter : public MCInstPrinter { 2767754Smsmithpublic: 2867754Smsmith AArch64InstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII, 2967754Smsmith const MCRegisterInfo &MRI, const MCSubtargetInfo &STI); 3067754Smsmith 3167754Smsmith // Autogenerated by tblgen 3267754Smsmith void printInstruction(const MCInst *MI, raw_ostream &O); 3367754Smsmith bool printAliasInstr(const MCInst *MI, raw_ostream &O); 3467754Smsmith static const char *getRegisterName(unsigned RegNo); 3567754Smsmith static const char *getInstructionName(unsigned Opcode); 3667754Smsmith 3767754Smsmith void printRegName(raw_ostream &O, unsigned RegNum) const; 3867754Smsmith 3967754Smsmith template<unsigned MemSize, unsigned RmSize> 4067754Smsmith void printAddrRegExtendOperand(const MCInst *MI, unsigned OpNum, 4167754Smsmith raw_ostream &O) { 4267754Smsmith printAddrRegExtendOperand(MI, OpNum, O, MemSize, RmSize); 4367754Smsmith } 4467754Smsmith 4567754Smsmith 4667754Smsmith void printAddrRegExtendOperand(const MCInst *MI, unsigned OpNum, 4767754Smsmith raw_ostream &O, unsigned MemSize, 4867754Smsmith unsigned RmSize); 4967754Smsmith 5067754Smsmith void printAddSubImmLSL0Operand(const MCInst *MI, 5167754Smsmith unsigned OpNum, raw_ostream &O); 5267754Smsmith void printAddSubImmLSL12Operand(const MCInst *MI, 5367754Smsmith unsigned OpNum, raw_ostream &O); 5467754Smsmith 5567754Smsmith void printBareImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O); 5667754Smsmith 5767754Smsmith template<unsigned RegWidth> 5867754Smsmith void printBFILSBOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O); 5967754Smsmith void printBFIWidthOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O); 6067754Smsmith void printBFXWidthOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O); 6167754Smsmith 6267754Smsmith 6367754Smsmith void printCondCodeOperand(const MCInst *MI, unsigned OpNum, 6467754Smsmith raw_ostream &O); 6567754Smsmith 6667754Smsmith void printCRxOperand(const MCInst *MI, unsigned OpNum, 6767754Smsmith raw_ostream &O); 6867754Smsmith 6967754Smsmith void printCVTFixedPosOperand(const MCInst *MI, unsigned OpNum, 7067754Smsmith raw_ostream &O); 7167754Smsmith 7267754Smsmith void printFPImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &o); 7367754Smsmith 7467754Smsmith void printFPZeroOperand(const MCInst *MI, unsigned OpNum, raw_ostream &o); 7567754Smsmith 7667754Smsmith template<int MemScale> 7767754Smsmith void printOffsetUImm12Operand(const MCInst *MI, 7867754Smsmith unsigned OpNum, raw_ostream &o) { 7967754Smsmith printOffsetUImm12Operand(MI, OpNum, o, MemScale); 8067754Smsmith } 8167754Smsmith 8267754Smsmith void printOffsetUImm12Operand(const MCInst *MI, unsigned OpNum, 8367754Smsmith raw_ostream &o, int MemScale); 8467754Smsmith 8567754Smsmith template<unsigned field_width, unsigned scale> 8667754Smsmith void printLabelOperand(const MCInst *MI, unsigned OpNum, 8767754Smsmith raw_ostream &O); 8867754Smsmith 8967754Smsmith template<unsigned RegWidth> 9067754Smsmith void printLogicalImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O); 9167754Smsmith 9267754Smsmith template<typename SomeNamedImmMapper> 9367754Smsmith void printNamedImmOperand(const MCInst *MI, unsigned OpNum, 9467754Smsmith raw_ostream &O) { 9567754Smsmith printNamedImmOperand(SomeNamedImmMapper(), MI, OpNum, O); 9667754Smsmith } 9767754Smsmith 9867754Smsmith void printNamedImmOperand(const NamedImmMapper &Mapper, 9967754Smsmith const MCInst *MI, unsigned OpNum, 10067754Smsmith raw_ostream &O); 10167754Smsmith 10267754Smsmith void printSysRegOperand(const A64SysReg::SysRegMapper &Mapper, 10367754Smsmith const MCInst *MI, unsigned OpNum, 10467754Smsmith raw_ostream &O); 10567754Smsmith 10667754Smsmith void printMRSOperand(const MCInst *MI, unsigned OpNum, 10767754Smsmith raw_ostream &O) { 10867754Smsmith printSysRegOperand(A64SysReg::MRSMapper(), MI, OpNum, O); 10967754Smsmith } 11067754Smsmith 11167754Smsmith void printMSROperand(const MCInst *MI, unsigned OpNum, 11267754Smsmith raw_ostream &O) { 11367754Smsmith printSysRegOperand(A64SysReg::MSRMapper(), MI, OpNum, O); 11467754Smsmith } 11567754Smsmith 11667754Smsmith void printShiftOperand(const char *name, const MCInst *MI, 11767754Smsmith unsigned OpIdx, raw_ostream &O); 11867754Smsmith 11967754Smsmith void printLSLOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O); 12067754Smsmith 12167754Smsmith void printLSROperand(const MCInst *MI, unsigned OpNum, raw_ostream &O) { 12267754Smsmith printShiftOperand("lsr", MI, OpNum, O); 123114237Snjl } 12467754Smsmith void printASROperand(const MCInst *MI, unsigned OpNum, raw_ostream &O) { 12567754Smsmith printShiftOperand("asr", MI, OpNum, O); 12677424Smsmith } 12791116Smsmith void printROROperand(const MCInst *MI, unsigned OpNum, raw_ostream &O) { 12867754Smsmith printShiftOperand("ror", MI, OpNum, O); 12967754Smsmith } 13067754Smsmith 13167754Smsmith template<A64SE::ShiftExtSpecifiers Shift> 13267754Smsmith void printShiftOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O) { 13367754Smsmith printShiftOperand(MI, OpNum, O, Shift); 13471867Smsmith } 13567754Smsmith 13667754Smsmith void printShiftOperand(const MCInst *MI, unsigned OpNum, 13767754Smsmith raw_ostream &O, A64SE::ShiftExtSpecifiers Sh); 13867754Smsmith 13967754Smsmith 14067754Smsmith void printMoveWideImmOperand(const MCInst *MI, unsigned OpNum, 14167754Smsmith raw_ostream &O); 14267754Smsmith 14387031Smsmith template<int MemSize> void 14487031Smsmith printSImm7ScaledOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O); 14587031Smsmith 14687031Smsmith void printOffsetSImm9Operand(const MCInst *MI, unsigned OpNum, 14787031Smsmith raw_ostream &O); 14887031Smsmith 14967754Smsmith void printPRFMOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O); 15067754Smsmith 15199679Siwasaki template<A64SE::ShiftExtSpecifiers EXT> 15267754Smsmith void printRegExtendOperand(const MCInst *MI, unsigned OpNum, 15367754Smsmith raw_ostream &O) { 15467754Smsmith printRegExtendOperand(MI, OpNum, O, EXT); 15567754Smsmith } 15667754Smsmith 15767754Smsmith void printRegExtendOperand(const MCInst *MI, unsigned OpNum, 15891116Smsmith raw_ostream &O, A64SE::ShiftExtSpecifiers Ext); 15967754Smsmith 16067754Smsmith void printVPRRegister(const MCInst *MI, unsigned OpNo, raw_ostream &O); 16167754Smsmith void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O); 16267754Smsmith virtual void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot); 163114237Snjl 16467754Smsmith bool isStackReg(unsigned RegNo) { 165117521Snjl return RegNo == AArch64::XSP || RegNo == AArch64::WSP; 166117521Snjl } 16799146Siwasaki 16899146Siwasaki template <A64SE::ShiftExtSpecifiers Ext, bool IsHalf> 16999146Siwasaki void printNeonMovImmShiftOperand(const MCInst *MI, unsigned OpNum, 17099146Siwasaki raw_ostream &O); 17167754Smsmith void printNeonUImm0Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O); 17267754Smsmith void printUImmHexOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O); 17367754Smsmith void printUImmBareOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O); 17467754Smsmith void printNeonUImm64MaskOperand(const MCInst *MI, unsigned OpNum, 175114237Snjl raw_ostream &O); 17667754Smsmith 177117521Snjl template <A64Layout::VectorLayout Layout, unsigned Count> 178117521Snjl void printVectorList(const MCInst *MI, unsigned OpNum, raw_ostream &O); 17967754Smsmith}; 18099146Siwasaki} 18199146Siwasaki 18299146Siwasaki#endif 18399146Siwasaki