1e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes//===-- HexagonInstPrinter.h - Convert Hexagon MCInst to assembly syntax --===//
2e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes//
3e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes//                     The LLVM Compiler Infrastructure
4e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes//
5e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes// This file is distributed under the University of Illinois Open Source
6e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes// License. See LICENSE.TXT for details.
7e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes//
8e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes//===----------------------------------------------------------------------===//
9e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes//
10e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes// This class prints an Hexagon MCInst to a .s file.
11e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes//
12e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes//===----------------------------------------------------------------------===//
13e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes
14e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes#ifndef HEXAGONINSTPRINTER_H
15e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes#define HEXAGONINSTPRINTER_H
16e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes
17e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes#include "llvm/MC/MCInstPrinter.h"
18d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma#include "llvm/MC/MCInstrInfo.h"
19e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes
20e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezesnamespace llvm {
21d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma  class HexagonMCInst;
22d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma
23e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes  class HexagonInstPrinter : public MCInstPrinter {
24e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes  public:
25e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    explicit HexagonInstPrinter(const MCAsmInfo &MAI,
26e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes                                const MCInstrInfo &MII,
27e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes                                const MCRegisterInfo &MRI)
28d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma      : MCInstPrinter(MAI, MII, MRI), MII(MII) {}
29e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes
30dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot) override;
3126f61a158b3cce69252c05cc0e79f500d6c3d92eSirish Pande    void printInst(const HexagonMCInst *MI, raw_ostream &O, StringRef Annot);
32e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    virtual StringRef getOpcodeName(unsigned Opcode) const;
33e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    void printInstruction(const MCInst *MI, raw_ostream &O);
34e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    StringRef getRegName(unsigned RegNo) const;
35e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    static const char *getRegisterName(unsigned RegNo);
36e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes
37e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O) const;
38e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    void printImmOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O) const;
39e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    void printExtOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O) const;
4026f61a158b3cce69252c05cc0e79f500d6c3d92eSirish Pande    void printUnsignedImmOperand(const MCInst *MI, unsigned OpNo,
4126f61a158b3cce69252c05cc0e79f500d6c3d92eSirish Pande                                 raw_ostream &O) const;
42e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    void printNegImmOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O)
43e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes           const;
44e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    void printNOneImmOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O)
45e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes           const;
46e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    void printMEMriOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O)
47e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes           const;
4826f61a158b3cce69252c05cc0e79f500d6c3d92eSirish Pande    void printFrameIndexOperand(const MCInst *MI, unsigned OpNo,
4926f61a158b3cce69252c05cc0e79f500d6c3d92eSirish Pande                                raw_ostream &O) const;
50e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    void printBranchOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O)
51e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes           const;
52e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    void printCallOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O)
53e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes           const;
54e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    void printAbsAddrOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O)
55e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes           const;
56e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    void printPredicateOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O)
57e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes           const;
58e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    void printGlobalOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O)
59e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes           const;
60e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    void printJumpTable(const MCInst *MI, unsigned OpNo, raw_ostream &O) const;
61e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes
6226f61a158b3cce69252c05cc0e79f500d6c3d92eSirish Pande    void printConstantPool(const MCInst *MI, unsigned OpNo,
6326f61a158b3cce69252c05cc0e79f500d6c3d92eSirish Pande                           raw_ostream &O) const;
64e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes
65e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    void printSymbolHi(const MCInst *MI, unsigned OpNo, raw_ostream &O) const
66e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes      { printSymbol(MI, OpNo, O, true); }
67e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    void printSymbolLo(const MCInst *MI, unsigned OpNo, raw_ostream &O) const
68e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes      { printSymbol(MI, OpNo, O, false); }
69e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes
70d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma    const MCInstrInfo &getMII() const {
71d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma      return MII;
72d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma    }
73d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma
74e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes  protected:
75e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    void printSymbol(const MCInst *MI, unsigned OpNo, raw_ostream &O, bool hi)
76e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes           const;
77d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma
78d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma    static const char PacketPadding;
79d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma
80d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma  private:
81d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma    const MCInstrInfo &MII;
82d6c98ae63824854ea2175b362a10985cac7cfb32Jyotsna Verma
83e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes  };
84e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes
85e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes} // end namespace llvm
86e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes
87e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes#endif
88