blob: b3060ad93067ad941a22efb3f02a2848b2af8d76 [file] [log] [blame]
Jia Liudd6c1cd2012-02-17 01:23:50 +00001//===-- MipsAsmPrinter.h - Mips LLVM Assembly Printer ----------*- C++ -*--===//
Akira Hatanakaddd12652011-07-07 20:10:52 +00002//
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// Mips Assembly printer class.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef MIPSASMPRINTER_H
15#define MIPSASMPRINTER_H
16
Akira Hatanaka34ee3ff2012-03-28 00:22:50 +000017#include "MipsMCInstLower.h"
Chandler Carruth802d7552012-12-04 07:12:27 +000018#include "MipsMachineFunction.h"
Akira Hatanakaddd12652011-07-07 20:10:52 +000019#include "MipsSubtarget.h"
20#include "llvm/CodeGen/AsmPrinter.h"
21#include "llvm/Support/Compiler.h"
22#include "llvm/Target/TargetMachine.h"
23
24namespace llvm {
25class MCStreamer;
26class MachineInstr;
Akira Hatanakaddd12652011-07-07 20:10:52 +000027class MachineBasicBlock;
Rafael Espindolaa17151a2013-10-08 13:08:17 +000028class MipsTargetStreamer;
Akira Hatanakaddd12652011-07-07 20:10:52 +000029class Module;
Craig Topperb25fda92012-03-17 18:46:09 +000030class raw_ostream;
Akira Hatanakaddd12652011-07-07 20:10:52 +000031
32class LLVM_LIBRARY_VISIBILITY MipsAsmPrinter : public AsmPrinter {
Rafael Espindolaa17151a2013-10-08 13:08:17 +000033 MipsTargetStreamer &getTargetStreamer();
Akira Hatanaka049e9e42011-11-23 22:19:28 +000034
Akira Hatanaka34ee3ff2012-03-28 00:22:50 +000035 void EmitInstrWithMacroNoAT(const MachineInstr *MI);
36
Akira Hatanaka42a35242012-09-27 01:59:07 +000037private:
38 // tblgen'erated function.
39 bool emitPseudoExpansionLowering(MCStreamer &OutStreamer,
40 const MachineInstr *MI);
41
42 // lowerOperand - Convert a MachineOperand into the equivalent MCOperand.
43 bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp);
44
Reed Kotler91ae9822013-10-27 21:57:36 +000045 /// MCP - Keep a pointer to constantpool entries of the current
46 /// MachineFunction.
47 const MachineConstantPool *MCP;
48
49 /// InConstantPool - Maintain state when emitting a sequence of constant
50 /// pool entries so we can properly mark them as data regions.
51 bool InConstantPool;
52
Reed Kotler91ae9822013-10-27 21:57:36 +000053
Akira Hatanakaddd12652011-07-07 20:10:52 +000054public:
Akira Hatanaka049e9e42011-11-23 22:19:28 +000055
56 const MipsSubtarget *Subtarget;
Akira Hatanaka34ee3ff2012-03-28 00:22:50 +000057 const MipsFunctionInfo *MipsFI;
58 MipsMCInstLower MCInstLowering;
Akira Hatanaka049e9e42011-11-23 22:19:28 +000059
Akira Hatanakaddd12652011-07-07 20:10:52 +000060 explicit MipsAsmPrinter(TargetMachine &TM, MCStreamer &Streamer)
Reed Kotler91ae9822013-10-27 21:57:36 +000061 : AsmPrinter(TM, Streamer), MCP(0), InConstantPool(false),
62 MCInstLowering(*this) {
Akira Hatanakaddd12652011-07-07 20:10:52 +000063 Subtarget = &TM.getSubtarget<MipsSubtarget>();
64 }
65
66 virtual const char *getPassName() const {
67 return "Mips Assembly Printer";
68 }
69
Akira Hatanaka34ee3ff2012-03-28 00:22:50 +000070 virtual bool runOnMachineFunction(MachineFunction &MF);
71
Reed Kotler91ae9822013-10-27 21:57:36 +000072 virtual void EmitConstantPool() LLVM_OVERRIDE {
Reed Kotler3aeb1d02013-11-26 20:38:40 +000073 bool UsingConstantPools =
74 (Subtarget->inMips16Mode() && Subtarget->useConstantIslands());
Reed Kotler91ae9822013-10-27 21:57:36 +000075 if (!UsingConstantPools)
76 AsmPrinter::EmitConstantPool();
77 // we emit constant pools customly!
78 }
79
Akira Hatanakaddd12652011-07-07 20:10:52 +000080 void EmitInstruction(const MachineInstr *MI);
81 void printSavedRegsBitmask(raw_ostream &O);
82 void printHex32(unsigned int Value, raw_ostream &O);
83 void emitFrameDirective();
84 const char *getCurrentABIString() const;
85 virtual void EmitFunctionEntryLabel();
86 virtual void EmitFunctionBodyStart();
87 virtual void EmitFunctionBodyEnd();
88 virtual bool isBlockOnlyReachableByFallthrough(const MachineBasicBlock*
89 MBB) const;
90 bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
91 unsigned AsmVariant, const char *ExtraCode,
92 raw_ostream &O);
93 bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum,
94 unsigned AsmVariant, const char *ExtraCode,
95 raw_ostream &O);
96 void printOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
97 void printUnsignedImm(const MachineInstr *MI, int opNum, raw_ostream &O);
Daniel Sanders3f6eb542013-11-12 10:45:18 +000098 void printUnsignedImm8(const MachineInstr *MI, int opNum, raw_ostream &O);
Akira Hatanaka9f6f6f62011-07-07 20:54:20 +000099 void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
100 void printMemOperandEA(const MachineInstr *MI, int opNum, raw_ostream &O);
Akira Hatanakaddd12652011-07-07 20:10:52 +0000101 void printFCCOperand(const MachineInstr *MI, int opNum, raw_ostream &O,
102 const char *Modifier = 0);
103 void EmitStartOfAsmFile(Module &M);
Jack Carterc1b17ed2013-01-18 21:20:38 +0000104 void EmitEndOfAsmFile(Module &M);
Akira Hatanakaddd12652011-07-07 20:10:52 +0000105 void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);
106};
107}
108
109#endif
110