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