1234353Sdim//===-- MipsAsmPrinter.h - Mips LLVM Assembly Printer ----------*- C++ -*--===//
2224133Sdim//
3224133Sdim//                     The LLVM Compiler Infrastructure
4224133Sdim//
5224133Sdim// This file is distributed under the University of Illinois Open Source
6224133Sdim// License. See LICENSE.TXT for details.
7224133Sdim//
8224133Sdim//===----------------------------------------------------------------------===//
9224133Sdim//
10224133Sdim// Mips Assembly printer class.
11224133Sdim//
12224133Sdim//===----------------------------------------------------------------------===//
13224133Sdim
14224133Sdim#ifndef MIPSASMPRINTER_H
15224133Sdim#define MIPSASMPRINTER_H
16224133Sdim
17249423Sdim#include "MipsMCInstLower.h"
18234353Sdim#include "MipsMachineFunction.h"
19224133Sdim#include "MipsSubtarget.h"
20224133Sdim#include "llvm/CodeGen/AsmPrinter.h"
21224133Sdim#include "llvm/Support/Compiler.h"
22224133Sdim#include "llvm/Target/TargetMachine.h"
23224133Sdim
24224133Sdimnamespace llvm {
25224133Sdimclass MCStreamer;
26224133Sdimclass MachineInstr;
27224133Sdimclass MachineBasicBlock;
28263508Sdimclass MipsTargetStreamer;
29224133Sdimclass Module;
30234353Sdimclass raw_ostream;
31224133Sdim
32224133Sdimclass LLVM_LIBRARY_VISIBILITY MipsAsmPrinter : public AsmPrinter {
33263508Sdim  MipsTargetStreamer &getTargetStreamer();
34234353Sdim
35234353Sdim  void EmitInstrWithMacroNoAT(const MachineInstr *MI);
36234353Sdim
37243830Sdimprivate:
38243830Sdim  // tblgen'erated function.
39243830Sdim  bool emitPseudoExpansionLowering(MCStreamer &OutStreamer,
40243830Sdim                                   const MachineInstr *MI);
41243830Sdim
42243830Sdim  // lowerOperand - Convert a MachineOperand into the equivalent MCOperand.
43243830Sdim  bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp);
44243830Sdim
45263508Sdim  /// MCP - Keep a pointer to constantpool entries of the current
46263508Sdim  /// MachineFunction.
47263508Sdim  const MachineConstantPool *MCP;
48263508Sdim
49263508Sdim  /// InConstantPool - Maintain state when emitting a sequence of constant
50263508Sdim  /// pool entries so we can properly mark them as data regions.
51263508Sdim  bool InConstantPool;
52263508Sdim
53263508Sdim  bool UsingConstantPools;
54263508Sdim
55234353Sdimpublic:
56234353Sdim
57224133Sdim  const MipsSubtarget *Subtarget;
58234353Sdim  const MipsFunctionInfo *MipsFI;
59234353Sdim  MipsMCInstLower MCInstLowering;
60234353Sdim
61224133Sdim  explicit MipsAsmPrinter(TargetMachine &TM,  MCStreamer &Streamer)
62263508Sdim    : AsmPrinter(TM, Streamer), MCP(0), InConstantPool(false),
63263508Sdim      MCInstLowering(*this) {
64224133Sdim    Subtarget = &TM.getSubtarget<MipsSubtarget>();
65263508Sdim    UsingConstantPools =
66263508Sdim      (Subtarget->inMips16Mode() && Subtarget->useConstantIslands());
67224133Sdim  }
68224133Sdim
69224133Sdim  virtual const char *getPassName() const {
70224133Sdim    return "Mips Assembly Printer";
71224133Sdim  }
72224133Sdim
73234353Sdim  virtual bool runOnMachineFunction(MachineFunction &MF);
74234353Sdim
75263508Sdim  virtual void EmitConstantPool() LLVM_OVERRIDE {
76263508Sdim    if (!UsingConstantPools)
77263508Sdim      AsmPrinter::EmitConstantPool();
78263508Sdim    // we emit constant pools customly!
79263508Sdim  }
80263508Sdim
81224133Sdim  void EmitInstruction(const MachineInstr *MI);
82224133Sdim  void printSavedRegsBitmask(raw_ostream &O);
83224133Sdim  void printHex32(unsigned int Value, raw_ostream &O);
84224133Sdim  void emitFrameDirective();
85224133Sdim  const char *getCurrentABIString() const;
86224133Sdim  virtual void EmitFunctionEntryLabel();
87224133Sdim  virtual void EmitFunctionBodyStart();
88224133Sdim  virtual void EmitFunctionBodyEnd();
89224133Sdim  virtual bool isBlockOnlyReachableByFallthrough(const MachineBasicBlock*
90224133Sdim                                                 MBB) const;
91224133Sdim  bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
92224133Sdim                       unsigned AsmVariant, const char *ExtraCode,
93224133Sdim                       raw_ostream &O);
94224133Sdim  bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum,
95224133Sdim                             unsigned AsmVariant, const char *ExtraCode,
96224133Sdim                             raw_ostream &O);
97224133Sdim  void printOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
98224133Sdim  void printUnsignedImm(const MachineInstr *MI, int opNum, raw_ostream &O);
99263508Sdim  void printUnsignedImm8(const MachineInstr *MI, int opNum, raw_ostream &O);
100224133Sdim  void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
101224133Sdim  void printMemOperandEA(const MachineInstr *MI, int opNum, raw_ostream &O);
102224133Sdim  void printFCCOperand(const MachineInstr *MI, int opNum, raw_ostream &O,
103224133Sdim                       const char *Modifier = 0);
104224133Sdim  void EmitStartOfAsmFile(Module &M);
105249423Sdim  void EmitEndOfAsmFile(Module &M);
106224133Sdim  void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);
107224133Sdim};
108224133Sdim}
109224133Sdim
110224133Sdim#endif
111224133Sdim
112