18f5e8c1cd69fa77bea20140a7132ee2dea166c6dJia Liu//===-- MipsAsmPrinter.h - Mips LLVM Assembly Printer ----------*- C++ -*--===//
2aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka//
3aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka//                     The LLVM Compiler Infrastructure
4aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka//
5aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka// This file is distributed under the University of Illinois Open Source
6aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka// License. See LICENSE.TXT for details.
7aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka//
8aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka//===----------------------------------------------------------------------===//
9aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka//
10aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka// Mips Assembly printer class.
11aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka//
12aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka//===----------------------------------------------------------------------===//
13aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka
14aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka#ifndef MIPSASMPRINTER_H
15aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka#define MIPSASMPRINTER_H
16aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka
17f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka#include "MipsMachineFunction.h"
18f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka#include "MipsMCInstLower.h"
19aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka#include "MipsSubtarget.h"
20aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka#include "llvm/CodeGen/AsmPrinter.h"
21aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka#include "llvm/Support/Compiler.h"
22aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka#include "llvm/Target/TargetMachine.h"
23aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka
24aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanakanamespace llvm {
25aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanakaclass MCStreamer;
26aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanakaclass MachineInstr;
27aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanakaclass MachineBasicBlock;
28aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanakaclass Module;
2979aa3417eb6f58d668aadfedf075240a41d35a26Craig Topperclass raw_ostream;
30aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka
31aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanakaclass LLVM_LIBRARY_VISIBILITY MipsAsmPrinter : public AsmPrinter {
32421455f1ea081e2e1767e782ac0d57ca55976e9bAkira Hatanaka
33f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka  void EmitInstrWithMacroNoAT(const MachineInstr *MI);
34f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka
35aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanakapublic:
36421455f1ea081e2e1767e782ac0d57ca55976e9bAkira Hatanaka
37421455f1ea081e2e1767e782ac0d57ca55976e9bAkira Hatanaka  const MipsSubtarget *Subtarget;
38f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka  const MipsFunctionInfo *MipsFI;
39f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka  MipsMCInstLower MCInstLowering;
40421455f1ea081e2e1767e782ac0d57ca55976e9bAkira Hatanaka
41aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  explicit MipsAsmPrinter(TargetMachine &TM,  MCStreamer &Streamer)
42f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka    : AsmPrinter(TM, Streamer), MCInstLowering(*this) {
43aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka    Subtarget = &TM.getSubtarget<MipsSubtarget>();
44aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  }
45aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka
46aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  virtual const char *getPassName() const {
47aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka    return "Mips Assembly Printer";
48aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  }
49aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka
50f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka  virtual bool runOnMachineFunction(MachineFunction &MF);
51f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka
52aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  void EmitInstruction(const MachineInstr *MI);
53aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  void printSavedRegsBitmask(raw_ostream &O);
54aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  void printHex32(unsigned int Value, raw_ostream &O);
55aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  void emitFrameDirective();
56aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  const char *getCurrentABIString() const;
57aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  virtual void EmitFunctionEntryLabel();
58aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  virtual void EmitFunctionBodyStart();
59aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  virtual void EmitFunctionBodyEnd();
60aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  virtual bool isBlockOnlyReachableByFallthrough(const MachineBasicBlock*
61aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka                                                 MBB) const;
62aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
63aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka                       unsigned AsmVariant, const char *ExtraCode,
64aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka                       raw_ostream &O);
65aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum,
66aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka                             unsigned AsmVariant, const char *ExtraCode,
67aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka                             raw_ostream &O);
68aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  void printOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
69aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  void printUnsignedImm(const MachineInstr *MI, int opNum, raw_ostream &O);
7003236be44af1d98eb8daa57e8eb8b7bdd7884523Akira Hatanaka  void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
7103236be44af1d98eb8daa57e8eb8b7bdd7884523Akira Hatanaka  void printMemOperandEA(const MachineInstr *MI, int opNum, raw_ostream &O);
72aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  void printFCCOperand(const MachineInstr *MI, int opNum, raw_ostream &O,
73aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka                       const char *Modifier = 0);
74aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  void EmitStartOfAsmFile(Module &M);
75aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  virtual MachineLocation getDebugValueLocation(const MachineInstr *MI) const;
76aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);
77aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka};
78aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka}
79aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka
80aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka#endif
81aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka
82