LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
HexagonAsmPrinter.h
Go to the documentation of this file.
1 //===-- HexagonAsmPrinter.h - Print machine code to an Hexagon .s file ----===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // Hexagon Assembly printer class.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef HEXAGONASMPRINTER_H
15 #define HEXAGONASMPRINTER_H
16 
17 #include "Hexagon.h"
18 #include "HexagonTargetMachine.h"
20 #include "llvm/Support/Compiler.h"
22 
23 namespace llvm {
24  class HexagonAsmPrinter : public AsmPrinter {
25  const HexagonSubtarget *Subtarget;
26 
27  public:
29  : AsmPrinter(TM, Streamer) {
30  Subtarget = &TM.getSubtarget<HexagonSubtarget>();
31  }
32 
33  virtual const char *getPassName() const {
34  return "Hexagon Assembly Printer";
35  }
36 
38 
39  virtual void EmitInstruction(const MachineInstr *MI);
40  virtual void EmitAlignment(unsigned NumBits,
41  const GlobalValue *GV = 0) const;
42 
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,
46  raw_ostream &OS);
47  bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
48  unsigned AsmVariant, const char *ExtraCode,
49  raw_ostream &OS);
50 
51  /// printInstruction - This method is automatically generated by tablegen
52  /// from the instruction set description. This method returns true if the
53  /// machine instruction was sufficiently described to print it, otherwise it
54  /// returns false.
56 
57  // void printMachineInstruction(const MachineInstr *MI);
58  void printOp(const MachineOperand &MO, raw_ostream &O);
59 
60  /// printRegister - Print register according to target requirements.
61  ///
62  void printRegister(const MachineOperand &MO, bool R0AsZero,
63  raw_ostream &O) {
64  unsigned RegNo = MO.getReg();
65  assert(TargetRegisterInfo::isPhysicalRegister(RegNo) && "Not physreg??");
66  O << getRegisterName(RegNo);
67  }
68 
69  void printImmOperand(const MachineInstr *MI, unsigned OpNo,
70  raw_ostream &O) {
71  int value = MI->getOperand(OpNo).getImm();
72  O << value;
73  }
74 
75  void printNegImmOperand(const MachineInstr *MI, unsigned OpNo,
76  raw_ostream &O) {
77  int value = MI->getOperand(OpNo).getImm();
78  O << -value;
79  }
80 
81  void printMEMriOperand(const MachineInstr *MI, unsigned OpNo,
82  raw_ostream &O) {
83  const MachineOperand &MO1 = MI->getOperand(OpNo);
84  const MachineOperand &MO2 = MI->getOperand(OpNo+1);
85 
86  O << getRegisterName(MO1.getReg())
87  << " + #"
88  << (int) MO2.getImm();
89  }
90 
91  void printFrameIndexOperand(const MachineInstr *MI, unsigned OpNo,
92  raw_ostream &O) {
93  const MachineOperand &MO1 = MI->getOperand(OpNo);
94  const MachineOperand &MO2 = MI->getOperand(OpNo+1);
95 
96  O << getRegisterName(MO1.getReg())
97  << ", #"
98  << MO2.getImm();
99  }
100 
101  void printBranchOperand(const MachineInstr *MI, unsigned OpNo,
102  raw_ostream &O) {
103  // Branches can take an immediate operand. This is used by the branch
104  // selection pass to print $+8, an eight byte displacement from the PC.
105  if (MI->getOperand(OpNo).isImm()) {
106  O << "$+" << MI->getOperand(OpNo).getImm()*4;
107  } else {
108  printOp(MI->getOperand(OpNo), O);
109  }
110  }
111 
112  void printCallOperand(const MachineInstr *MI, unsigned OpNo,
113  raw_ostream &O) {
114  }
115 
116  void printAbsAddrOperand(const MachineInstr *MI, unsigned OpNo,
117  raw_ostream &O) {
118  }
119 
120  void printSymbolHi(const MachineInstr *MI, unsigned OpNo, raw_ostream &O) {
121  O << "#HI(";
122  if (MI->getOperand(OpNo).isImm()) {
123  printImmOperand(MI, OpNo, O);
124  }
125  else {
126  printOp(MI->getOperand(OpNo), O);
127  }
128  O << ")";
129  }
130 
131  void printSymbolLo(const MachineInstr *MI, unsigned OpNo, raw_ostream &O) {
132  O << "#HI(";
133  if (MI->getOperand(OpNo).isImm()) {
134  printImmOperand(MI, OpNo, O);
135  }
136  else {
137  printOp(MI->getOperand(OpNo), O);
138  }
139  O << ")";
140  }
141 
142  void printPredicateOperand(const MachineInstr *MI, unsigned OpNo,
143  raw_ostream &O);
144 
145 #if 0
146  void printModuleLevelGV(const GlobalVariable* GVar, raw_ostream &O);
147 #endif
148 
149  void printAddrModeBasePlusOffset(const MachineInstr *MI, int OpNo,
150  raw_ostream &O);
151 
152  void printGlobalOperand(const MachineInstr *MI, int OpNo, raw_ostream &O);
153  void printJumpTable(const MachineInstr *MI, int OpNo, raw_ostream &O);
154  void printConstantPool(const MachineInstr *MI, int OpNo, raw_ostream &O);
155 
156  static const char *getRegisterName(unsigned RegNo);
157 
158 #if 0
159  void EmitStartOfAsmFile(Module &M);
160 #endif
161  };
162 
163 } // end of llvm namespace
164 
165 #endif
virtual void EmitStartOfAsmFile(Module &)
Definition: AsmPrinter.h:254
bool isBlockOnlyReachableByFallthrough(const MachineBasicBlock *MBB) const
virtual void EmitAlignment(unsigned NumBits, const GlobalValue *GV=0) const
The main container class for the LLVM Intermediate Representation.
Definition: Module.h:112
void printMEMriOperand(const MachineInstr *MI, unsigned OpNo, raw_ostream &O)
void printOp(const MachineOperand &MO, raw_ostream &O)
virtual const char * getPassName() const
void printGlobalOperand(const MachineInstr *MI, int OpNo, raw_ostream &O)
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, unsigned AsmVariant, const char *ExtraCode, raw_ostream &OS)
void printJumpTable(const MachineInstr *MI, int OpNo, raw_ostream &O)
void printSymbolHi(const MachineInstr *MI, unsigned OpNo, raw_ostream &O)
int64_t getImm() const
void printCallOperand(const MachineInstr *MI, unsigned OpNo, raw_ostream &O)
static const char * getRegisterName(unsigned RegNo)
void printPredicateOperand(const MachineInstr *MI, unsigned OpNo, raw_ostream &O)
const MachineOperand & getOperand(unsigned i) const
Definition: MachineInstr.h:267
TargetMachine & TM
Definition: AsmPrinter.h:62
void printSymbolLo(const MachineInstr *MI, unsigned OpNo, raw_ostream &O)
void printConstantPool(const MachineInstr *MI, int OpNo, raw_ostream &O)
void printBranchOperand(const MachineInstr *MI, unsigned OpNo, raw_ostream &O)
void printOperand(const MachineInstr *MI, unsigned OpNo, raw_ostream &O)
const STC & getSubtarget() const
void printNegImmOperand(const MachineInstr *MI, unsigned OpNo, raw_ostream &O)
HexagonAsmPrinter(TargetMachine &TM, MCStreamer &Streamer)
void printInstruction(const MachineInstr *MI, raw_ostream &O)
static bool isPhysicalRegister(unsigned Reg)
virtual void EmitInstruction(const MachineInstr *MI)
void printFrameIndexOperand(const MachineInstr *MI, unsigned OpNo, raw_ostream &O)
void printImmOperand(const MachineInstr *MI, unsigned OpNo, raw_ostream &O)
void printRegister(const MachineOperand &MO, bool R0AsZero, raw_ostream &O)
unsigned getReg() const
getReg - Returns the register number.
void printAddrModeBasePlusOffset(const MachineInstr *MI, int OpNo, raw_ostream &O)
void printAbsAddrOperand(const MachineInstr *MI, unsigned OpNo, raw_ostream &O)
bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, unsigned AsmVariant, const char *ExtraCode, raw_ostream &OS)