MipsAsmPrinter.h revision c6a4f5e819217e1e12c458aed8e7b122e23a3a58
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
1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "Mips16HardFloatInfo.h"
18f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka#include "MipsMCInstLower.h"
19a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "MipsMachineFunction.h"
20aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka#include "MipsSubtarget.h"
21aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka#include "llvm/CodeGen/AsmPrinter.h"
22aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka#include "llvm/Support/Compiler.h"
23aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka#include "llvm/Target/TargetMachine.h"
24aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka
25aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanakanamespace llvm {
26aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanakaclass MCStreamer;
27aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanakaclass MachineInstr;
28aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanakaclass MachineBasicBlock;
29320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindolaclass MipsTargetStreamer;
30aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanakaclass Module;
3179aa3417eb6f58d668aadfedf075240a41d35a26Craig Topperclass raw_ostream;
32aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka
33aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanakaclass LLVM_LIBRARY_VISIBILITY MipsAsmPrinter : public AsmPrinter {
34320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  MipsTargetStreamer &getTargetStreamer();
35421455f1ea081e2e1767e782ac0d57ca55976e9bAkira Hatanaka
36f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka  void EmitInstrWithMacroNoAT(const MachineInstr *MI);
37f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka
38cc46fe591af10c193c17323547a3dd7cc00c925dAkira Hatanakaprivate:
39cc46fe591af10c193c17323547a3dd7cc00c925dAkira Hatanaka  // tblgen'erated function.
40cc46fe591af10c193c17323547a3dd7cc00c925dAkira Hatanaka  bool emitPseudoExpansionLowering(MCStreamer &OutStreamer,
41cc46fe591af10c193c17323547a3dd7cc00c925dAkira Hatanaka                                   const MachineInstr *MI);
42cc46fe591af10c193c17323547a3dd7cc00c925dAkira Hatanaka
43c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // Emit PseudoReturn, PseudoReturn64, PseudoIndirectBranch,
44c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // and PseudoIndirectBranch64 as a JR, JR_MM, JALR, or JALR64 as appropriate
45c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // for the target.
46c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  void emitPseudoIndirectBranch(MCStreamer &OutStreamer,
47c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                                const MachineInstr *MI);
48c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
49cc46fe591af10c193c17323547a3dd7cc00c925dAkira Hatanaka  // lowerOperand - Convert a MachineOperand into the equivalent MCOperand.
50cc46fe591af10c193c17323547a3dd7cc00c925dAkira Hatanaka  bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp);
51cc46fe591af10c193c17323547a3dd7cc00c925dAkira Hatanaka
52cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler  /// MCP - Keep a pointer to constantpool entries of the current
53cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler  /// MachineFunction.
54cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler  const MachineConstantPool *MCP;
55cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler
56cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler  /// InConstantPool - Maintain state when emitting a sequence of constant
57cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler  /// pool entries so we can properly mark them as data regions.
58cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler  bool InConstantPool;
59cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler
6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::map<const char *, const llvm::Mips16HardFloatInfo::FuncSignature *>
6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  StubsNeeded;
6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void EmitJal(MCSymbol *Symbol);
6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void EmitInstrReg(unsigned Opcode, unsigned Reg);
6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void EmitInstrRegReg(unsigned Opcode, unsigned Reg1, unsigned Reg2);
6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void EmitInstrRegRegReg(unsigned Opcode, unsigned Reg1, unsigned Reg2,
7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                          unsigned Reg3);
7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void EmitMovFPIntPair(unsigned MovOpc, unsigned Reg1, unsigned Reg2,
7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        unsigned FPReg1, unsigned FPReg2, bool LE);
7436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void EmitSwapFPIntParams(Mips16HardFloatInfo::FPParamVariant, bool LE,
7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                           bool ToFP);
7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void EmitSwapFPIntRetval(Mips16HardFloatInfo::FPReturnVariant, bool LE);
7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void EmitFPCallStub(const char *, const Mips16HardFloatInfo::FuncSignature *);
8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void NaClAlignIndirectJumpTargets(MachineFunction &MF);
83cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler
84dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool isLongBranchPseudo(int Opcode) const;
85dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
86aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanakapublic:
87421455f1ea081e2e1767e782ac0d57ca55976e9bAkira Hatanaka
88421455f1ea081e2e1767e782ac0d57ca55976e9bAkira Hatanaka  const MipsSubtarget *Subtarget;
89f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka  const MipsFunctionInfo *MipsFI;
90f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka  MipsMCInstLower MCInstLowering;
91421455f1ea081e2e1767e782ac0d57ca55976e9bAkira Hatanaka
92aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  explicit MipsAsmPrinter(TargetMachine &TM,  MCStreamer &Streamer)
93dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    : AsmPrinter(TM, Streamer), MCP(nullptr), InConstantPool(false),
94cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler      MCInstLowering(*this) {
95aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka    Subtarget = &TM.getSubtarget<MipsSubtarget>();
96aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  }
97aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka
98dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const char *getPassName() const override {
99aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka    return "Mips Assembly Printer";
100aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  }
101aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka
102dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool runOnMachineFunction(MachineFunction &MF) override;
103f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka
104dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitConstantPool() override {
10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    bool UsingConstantPools =
10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      (Subtarget->inMips16Mode() && Subtarget->useConstantIslands());
107cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler    if (!UsingConstantPools)
108cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler      AsmPrinter::EmitConstantPool();
109cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler    // we emit constant pools customly!
110cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler  }
111cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler
112dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitInstruction(const MachineInstr *MI) override;
11336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printSavedRegsBitmask();
114aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  void emitFrameDirective();
115aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  const char *getCurrentABIString() const;
116dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitFunctionEntryLabel() override;
117dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitFunctionBodyStart() override;
118dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitFunctionBodyEnd() override;
119dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool isBlockOnlyReachableByFallthrough(
120dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                   const MachineBasicBlock* MBB) const override;
121aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
122aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka                       unsigned AsmVariant, const char *ExtraCode,
123dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                       raw_ostream &O) override;
124aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum,
125aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka                             unsigned AsmVariant, const char *ExtraCode,
126dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                             raw_ostream &O) override;
127aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  void printOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
128aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  void printUnsignedImm(const MachineInstr *MI, int opNum, raw_ostream &O);
129bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders  void printUnsignedImm8(const MachineInstr *MI, int opNum, raw_ostream &O);
13003236be44af1d98eb8daa57e8eb8b7bdd7884523Akira Hatanaka  void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
13103236be44af1d98eb8daa57e8eb8b7bdd7884523Akira Hatanaka  void printMemOperandEA(const MachineInstr *MI, int opNum, raw_ostream &O);
132aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  void printFCCOperand(const MachineInstr *MI, int opNum, raw_ostream &O,
133dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                       const char *Modifier = nullptr);
134dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitStartOfAsmFile(Module &M) override;
135dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void EmitEndOfAsmFile(Module &M) override;
136aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);
137aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka};
138aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka}
139aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka
140aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka#endif
141aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka
142