11d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//==- SystemZInstPrinter.h - Convert SystemZ MCInst to assembly --*- C++ -*-==//
21d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
31d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//                     The LLVM Compiler Infrastructure
41d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
51d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// This file is distributed under the University of Illinois Open Source
61d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// License. See LICENSE.TXT for details.
71d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
81d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//===----------------------------------------------------------------------===//
91d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
101d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// This class prints a SystemZ MCInst to a .s file.
111d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
121d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//===----------------------------------------------------------------------===//
131d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
141d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#ifndef LLVM_SYSTEMZINSTPRINTER_H
151d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#define LLVM_SYSTEMZINSTPRINTER_H
161d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
171d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/MC/MCInstPrinter.h"
181d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/Support/Compiler.h"
191d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
201d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandnamespace llvm {
211d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandclass MCOperand;
221d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
231d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandclass SystemZInstPrinter : public MCInstPrinter {
241d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandpublic:
251d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SystemZInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
261d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                     const MCRegisterInfo &MRI)
271d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    : MCInstPrinter(MAI, MII, MRI) {}
281d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
291d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  // Automatically generated by tblgen.
301d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  void printInstruction(const MCInst *MI, raw_ostream &O);
311d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  static const char *getRegisterName(unsigned RegNo);
321d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
331d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  // Print an address with the given base, displacement and index.
341d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  static void printAddress(unsigned Base, int64_t Disp, unsigned Index,
351d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                           raw_ostream &O);
361d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
371d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  // Print the given operand.
381d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  static void printOperand(const MCOperand &MO, raw_ostream &O);
391d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
401d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  // Override MCInstPrinter.
4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printRegName(raw_ostream &O, unsigned RegNo) const override;
4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot) override;
431d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
441d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandprivate:
451d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  // Print various types of operand.
461d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  void printOperand(const MCInst *MI, int OpNum, raw_ostream &O);
471d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  void printBDAddrOperand(const MCInst *MI, int OpNum, raw_ostream &O);
481d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  void printBDXAddrOperand(const MCInst *MI, int OpNum, raw_ostream &O);
499188443a2d35352c4e8a2cffd1b4d31d47843b26Richard Sandiford  void printBDLAddrOperand(const MCInst *MI, int OpNum, raw_ostream &O);
501d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  void printU4ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
511d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  void printU6ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
521d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  void printS8ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
531d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  void printU8ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
541d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  void printS16ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
551d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  void printU16ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
561d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  void printS32ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
571d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  void printU32ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
58c3b20c260ee17a66c6306f81293c75681d8ea0aaRichard Sandiford  void printPCRelOperand(const MCInst *MI, int OpNum, raw_ostream &O);
591d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  void printAccessRegOperand(const MCInst *MI, int OpNum, raw_ostream &O);
601d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
611d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  // Print the mnemonic for a condition-code mask ("ne", "lh", etc.)
621d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  // This forms part of the instruction name rather than the operand list.
631d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  void printCond4Operand(const MCInst *MI, int OpNum, raw_ostream &O);
641d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand};
651d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand} // end namespace llvm
661d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
671d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#endif
68