1e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes//===-- HexagonAsmPrinter.h - Print machine code to an Hexagon .s file ----===//
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// Hexagon Assembly printer class.
11e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes//
12e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes//===----------------------------------------------------------------------===//
13e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes
1437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_LIB_TARGET_HEXAGON_HEXAGONASMPRINTER_H
1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_LIB_TARGET_HEXAGON_HEXAGONASMPRINTER_H
16e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes
17e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes#include "Hexagon.h"
18e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes#include "HexagonTargetMachine.h"
19e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes#include "llvm/CodeGen/AsmPrinter.h"
20e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes#include "llvm/Support/Compiler.h"
21e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes#include "llvm/Support/raw_ostream.h"
22e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes
23e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezesnamespace llvm {
24e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes  class HexagonAsmPrinter : public AsmPrinter {
25e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    const HexagonSubtarget *Subtarget;
26e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes
27e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes  public:
28ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    explicit HexagonAsmPrinter(TargetMachine &TM,
29ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                               std::unique_ptr<MCStreamer> Streamer);
30ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
31ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    bool runOnMachineFunction(MachineFunction &Fn) override {
32ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      Subtarget = &Fn.getSubtarget<HexagonSubtarget>();
33ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      return AsmPrinter::runOnMachineFunction(Fn);
34e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    }
35e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes
36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    const char *getPassName() const override {
37e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes      return "Hexagon Assembly Printer";
38e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    }
39e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes
40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    bool isBlockOnlyReachableByFallthrough(
41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                   const MachineBasicBlock *MBB) const override;
42e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes
43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    void EmitInstruction(const MachineInstr *MI) override;
44e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes
45cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    void HexagonProcessInstruction(MCInst &Inst,
46cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar                                   const MachineInstr &MBB);
47cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
48cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar
49e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    void printOperand(const MachineInstr *MI, unsigned OpNo, raw_ostream &O);
50e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
51e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes                         unsigned AsmVariant, const char *ExtraCode,
52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                         raw_ostream &OS) override;
53e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
54e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes                               unsigned AsmVariant, const char *ExtraCode,
55dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                               raw_ostream &OS) override;
56e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes
57e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes    static const char *getRegisterName(unsigned RegNo);
58e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes  };
59e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes
60e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes} // end of llvm namespace
61e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes
62e5041e6fa8fa74a26e031b7487be1912257c87f1Evandro Menezes#endif
63