blob: ce11d1ec3b5debba7e85549f946bf9f9a191fc4c [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
Reed Kotler4cdaa7d2014-02-14 19:16:39 +000017#include "Mips16HardFloatInfo.h"
Akira Hatanaka34ee3ff2012-03-28 00:22:50 +000018#include "MipsMCInstLower.h"
Chandler Carruth802d7552012-12-04 07:12:27 +000019#include "MipsMachineFunction.h"
Akira Hatanakaddd12652011-07-07 20:10:52 +000020#include "MipsSubtarget.h"
21#include "llvm/CodeGen/AsmPrinter.h"
22#include "llvm/Support/Compiler.h"
23#include "llvm/Target/TargetMachine.h"
24
25namespace llvm {
26class MCStreamer;
27class MachineInstr;
Akira Hatanakaddd12652011-07-07 20:10:52 +000028class MachineBasicBlock;
Rafael Espindolaa17151a2013-10-08 13:08:17 +000029class MipsTargetStreamer;
Akira Hatanakaddd12652011-07-07 20:10:52 +000030class Module;
Craig Topperb25fda92012-03-17 18:46:09 +000031class raw_ostream;
Akira Hatanakaddd12652011-07-07 20:10:52 +000032
33class LLVM_LIBRARY_VISIBILITY MipsAsmPrinter : public AsmPrinter {
Rafael Espindolaa17151a2013-10-08 13:08:17 +000034 MipsTargetStreamer &getTargetStreamer();
Akira Hatanaka049e9e42011-11-23 22:19:28 +000035
Akira Hatanaka34ee3ff2012-03-28 00:22:50 +000036 void EmitInstrWithMacroNoAT(const MachineInstr *MI);
37
Akira Hatanaka42a35242012-09-27 01:59:07 +000038private:
39 // tblgen'erated function.
40 bool emitPseudoExpansionLowering(MCStreamer &OutStreamer,
41 const MachineInstr *MI);
42
43 // lowerOperand - Convert a MachineOperand into the equivalent MCOperand.
44 bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp);
45
Reed Kotler91ae9822013-10-27 21:57:36 +000046 /// MCP - Keep a pointer to constantpool entries of the current
47 /// MachineFunction.
48 const MachineConstantPool *MCP;
49
50 /// InConstantPool - Maintain state when emitting a sequence of constant
51 /// pool entries so we can properly mark them as data regions.
52 bool InConstantPool;
53
Reed Kotler4cdaa7d2014-02-14 19:16:39 +000054 std::map<const char *, const llvm::Mips16HardFloatInfo::FuncSignature *>
55 StubsNeeded;
56
57 void EmitJal(MCSymbol *Symbol);
58
59 void EmitInstrReg(unsigned Opcode, unsigned Reg);
60
61 void EmitInstrRegReg(unsigned Opcode, unsigned Reg1, unsigned Reg2);
62
63 void EmitInstrRegRegReg(unsigned Opcode, unsigned Reg1, unsigned Reg2,
64 unsigned Reg3);
65
66 void EmitMovFPIntPair(unsigned MovOpc, unsigned Reg1, unsigned Reg2,
67 unsigned FPReg1, unsigned FPReg2, bool LE);
68
69 void EmitSwapFPIntParams(Mips16HardFloatInfo::FPParamVariant, bool LE,
70 bool ToFP);
71
72 void EmitSwapFPIntRetval(Mips16HardFloatInfo::FPReturnVariant, bool LE);
73
74 void EmitFPCallStub(const char *, const Mips16HardFloatInfo::FuncSignature *);
Reed Kotler91ae9822013-10-27 21:57:36 +000075
Sasa Stankovic8c5736b2014-02-28 10:00:38 +000076 void NaClAlignIndirectJumpTargets(MachineFunction &MF);
77
Akira Hatanakaddd12652011-07-07 20:10:52 +000078public:
Akira Hatanaka049e9e42011-11-23 22:19:28 +000079
80 const MipsSubtarget *Subtarget;
Akira Hatanaka34ee3ff2012-03-28 00:22:50 +000081 const MipsFunctionInfo *MipsFI;
82 MipsMCInstLower MCInstLowering;
Akira Hatanaka049e9e42011-11-23 22:19:28 +000083
Akira Hatanakaddd12652011-07-07 20:10:52 +000084 explicit MipsAsmPrinter(TargetMachine &TM, MCStreamer &Streamer)
Craig Toppere73658d2014-04-28 04:05:08 +000085 : AsmPrinter(TM, Streamer), MCP(nullptr), InConstantPool(false),
Reed Kotler91ae9822013-10-27 21:57:36 +000086 MCInstLowering(*this) {
Akira Hatanakaddd12652011-07-07 20:10:52 +000087 Subtarget = &TM.getSubtarget<MipsSubtarget>();
88 }
89
Craig Topper56c590a2014-04-29 07:58:02 +000090 const char *getPassName() const override {
Akira Hatanakaddd12652011-07-07 20:10:52 +000091 return "Mips Assembly Printer";
92 }
93
Craig Topper56c590a2014-04-29 07:58:02 +000094 bool runOnMachineFunction(MachineFunction &MF) override;
Akira Hatanaka34ee3ff2012-03-28 00:22:50 +000095
Craig Topper56c590a2014-04-29 07:58:02 +000096 void EmitConstantPool() override {
Reed Kotler3aeb1d02013-11-26 20:38:40 +000097 bool UsingConstantPools =
98 (Subtarget->inMips16Mode() && Subtarget->useConstantIslands());
Reed Kotler91ae9822013-10-27 21:57:36 +000099 if (!UsingConstantPools)
100 AsmPrinter::EmitConstantPool();
101 // we emit constant pools customly!
102 }
103
Craig Topper56c590a2014-04-29 07:58:02 +0000104 void EmitInstruction(const MachineInstr *MI) override;
Rafael Espindola25fa2912014-01-27 04:33:11 +0000105 void printSavedRegsBitmask();
Akira Hatanakaddd12652011-07-07 20:10:52 +0000106 void emitFrameDirective();
107 const char *getCurrentABIString() const;
Craig Topper56c590a2014-04-29 07:58:02 +0000108 void EmitFunctionEntryLabel() override;
109 void EmitFunctionBodyStart() override;
110 void EmitFunctionBodyEnd() override;
111 bool isBlockOnlyReachableByFallthrough(
112 const MachineBasicBlock* MBB) const override;
Akira Hatanakaddd12652011-07-07 20:10:52 +0000113 bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
114 unsigned AsmVariant, const char *ExtraCode,
Craig Topper56c590a2014-04-29 07:58:02 +0000115 raw_ostream &O) override;
Akira Hatanakaddd12652011-07-07 20:10:52 +0000116 bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum,
117 unsigned AsmVariant, const char *ExtraCode,
Craig Topper56c590a2014-04-29 07:58:02 +0000118 raw_ostream &O) override;
Akira Hatanakaddd12652011-07-07 20:10:52 +0000119 void printOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
120 void printUnsignedImm(const MachineInstr *MI, int opNum, raw_ostream &O);
Daniel Sanders3f6eb542013-11-12 10:45:18 +0000121 void printUnsignedImm8(const MachineInstr *MI, int opNum, raw_ostream &O);
Akira Hatanaka9f6f6f62011-07-07 20:54:20 +0000122 void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
123 void printMemOperandEA(const MachineInstr *MI, int opNum, raw_ostream &O);
Akira Hatanakaddd12652011-07-07 20:10:52 +0000124 void printFCCOperand(const MachineInstr *MI, int opNum, raw_ostream &O,
Craig Toppere73658d2014-04-28 04:05:08 +0000125 const char *Modifier = nullptr);
Craig Topper56c590a2014-04-29 07:58:02 +0000126 void EmitStartOfAsmFile(Module &M) override;
127 void EmitEndOfAsmFile(Module &M) override;
Akira Hatanakaddd12652011-07-07 20:10:52 +0000128 void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);
Akira Hatanakaddd12652011-07-07 20:10:52 +0000129};
130}
131
132#endif
133