1 //===-- HexagonAsmPrinter.h - Print machine code to an Hexagon .s file ----===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // Hexagon Assembly printer class.
12 //===----------------------------------------------------------------------===//
14 #ifndef HEXAGONASMPRINTER_H
15 #define HEXAGONASMPRINTER_H
18 #include "HexagonTargetMachine.h"
19 #include "llvm/CodeGen/AsmPrinter.h"
20 #include "llvm/Support/Compiler.h"
21 #include "llvm/Support/raw_ostream.h"
24 class HexagonAsmPrinter : public AsmPrinter {
25 const HexagonSubtarget *Subtarget;
28 explicit HexagonAsmPrinter(TargetMachine &TM, MCStreamer &Streamer)
29 : AsmPrinter(TM, Streamer) {
30 Subtarget = &TM.getSubtarget<HexagonSubtarget>();
33 virtual const char *getPassName() const {
34 return "Hexagon Assembly Printer";
37 bool isBlockOnlyReachableByFallthrough(const MachineBasicBlock *MBB) const;
39 virtual void EmitInstruction(const MachineInstr *MI);
40 virtual void EmitAlignment(unsigned NumBits,
41 const GlobalValue *GV = 0) const;
43 void printOperand(const MachineInstr *MI, unsigned OpNo, raw_ostream &O);
44 bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
45 unsigned AsmVariant, const char *ExtraCode,
47 bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
48 unsigned AsmVariant, const char *ExtraCode,
51 // void printMachineInstruction(const MachineInstr *MI);
52 void printOp(const MachineOperand &MO, raw_ostream &O);
54 /// printRegister - Print register according to target requirements.
56 void printRegister(const MachineOperand &MO, bool R0AsZero,
58 unsigned RegNo = MO.getReg();
59 assert(TargetRegisterInfo::isPhysicalRegister(RegNo) && "Not physreg??");
60 O << getRegisterName(RegNo);
63 void printImmOperand(const MachineInstr *MI, unsigned OpNo,
65 int value = MI->getOperand(OpNo).getImm();
69 void printNegImmOperand(const MachineInstr *MI, unsigned OpNo,
71 int value = MI->getOperand(OpNo).getImm();
75 void printMEMriOperand(const MachineInstr *MI, unsigned OpNo,
77 const MachineOperand &MO1 = MI->getOperand(OpNo);
78 const MachineOperand &MO2 = MI->getOperand(OpNo+1);
80 O << getRegisterName(MO1.getReg())
82 << (int) MO2.getImm();
85 void printFrameIndexOperand(const MachineInstr *MI, unsigned OpNo,
87 const MachineOperand &MO1 = MI->getOperand(OpNo);
88 const MachineOperand &MO2 = MI->getOperand(OpNo+1);
90 O << getRegisterName(MO1.getReg())
95 void printBranchOperand(const MachineInstr *MI, unsigned OpNo,
97 // Branches can take an immediate operand. This is used by the branch
98 // selection pass to print $+8, an eight byte displacement from the PC.
99 if (MI->getOperand(OpNo).isImm()) {
100 O << "$+" << MI->getOperand(OpNo).getImm()*4;
102 printOp(MI->getOperand(OpNo), O);
106 void printCallOperand(const MachineInstr *MI, unsigned OpNo,
110 void printAbsAddrOperand(const MachineInstr *MI, unsigned OpNo,
114 void printSymbolHi(const MachineInstr *MI, unsigned OpNo, raw_ostream &O) {
116 if (MI->getOperand(OpNo).isImm()) {
117 printImmOperand(MI, OpNo, O);
120 printOp(MI->getOperand(OpNo), O);
125 void printSymbolLo(const MachineInstr *MI, unsigned OpNo, raw_ostream &O) {
127 if (MI->getOperand(OpNo).isImm()) {
128 printImmOperand(MI, OpNo, O);
131 printOp(MI->getOperand(OpNo), O);
136 void printPredicateOperand(const MachineInstr *MI, unsigned OpNo,
140 void printModuleLevelGV(const GlobalVariable* GVar, raw_ostream &O);
143 void printAddrModeBasePlusOffset(const MachineInstr *MI, int OpNo,
146 void printGlobalOperand(const MachineInstr *MI, int OpNo, raw_ostream &O);
147 void printJumpTable(const MachineInstr *MI, int OpNo, raw_ostream &O);
148 void printConstantPool(const MachineInstr *MI, int OpNo, raw_ostream &O);
150 static const char *getRegisterName(unsigned RegNo);
153 void EmitStartOfAsmFile(Module &M);
157 } // end of llvm namespace