MipsAsmPrinter.h revision 36b56886974eae4f9c5ebc96befd3e7bfe5de338
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
43cc46fe591af10c193c17323547a3dd7cc00c925dAkira Hatanaka  // lowerOperand - Convert a MachineOperand into the equivalent MCOperand.
44cc46fe591af10c193c17323547a3dd7cc00c925dAkira Hatanaka  bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp);
45cc46fe591af10c193c17323547a3dd7cc00c925dAkira Hatanaka
46cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler  /// MCP - Keep a pointer to constantpool entries of the current
47cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler  /// MachineFunction.
48cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler  const MachineConstantPool *MCP;
49cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler
50cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler  /// InConstantPool - Maintain state when emitting a sequence of constant
51cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler  /// pool entries so we can properly mark them as data regions.
52cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler  bool InConstantPool;
53cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::map<const char *, const llvm::Mips16HardFloatInfo::FuncSignature *>
5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  StubsNeeded;
5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void EmitJal(MCSymbol *Symbol);
5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void EmitInstrReg(unsigned Opcode, unsigned Reg);
6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void EmitInstrRegReg(unsigned Opcode, unsigned Reg1, unsigned Reg2);
6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void EmitInstrRegRegReg(unsigned Opcode, unsigned Reg1, unsigned Reg2,
6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                          unsigned Reg3);
6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void EmitMovFPIntPair(unsigned MovOpc, unsigned Reg1, unsigned Reg2,
6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        unsigned FPReg1, unsigned FPReg2, bool LE);
6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void EmitSwapFPIntParams(Mips16HardFloatInfo::FPParamVariant, bool LE,
7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                           bool ToFP);
7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void EmitSwapFPIntRetval(Mips16HardFloatInfo::FPReturnVariant, bool LE);
7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
7436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void EmitFPCallStub(const char *, const Mips16HardFloatInfo::FuncSignature *);
7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void NaClAlignIndirectJumpTargets(MachineFunction &MF);
77cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler
78aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanakapublic:
79421455f1ea081e2e1767e782ac0d57ca55976e9bAkira Hatanaka
80421455f1ea081e2e1767e782ac0d57ca55976e9bAkira Hatanaka  const MipsSubtarget *Subtarget;
81f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka  const MipsFunctionInfo *MipsFI;
82f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka  MipsMCInstLower MCInstLowering;
83421455f1ea081e2e1767e782ac0d57ca55976e9bAkira Hatanaka
84aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  explicit MipsAsmPrinter(TargetMachine &TM,  MCStreamer &Streamer)
85cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler    : AsmPrinter(TM, Streamer), MCP(0), InConstantPool(false),
86cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler      MCInstLowering(*this) {
87aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka    Subtarget = &TM.getSubtarget<MipsSubtarget>();
88aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  }
89aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka
90aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  virtual const char *getPassName() const {
91aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka    return "Mips Assembly Printer";
92aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  }
93aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka
94f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka  virtual bool runOnMachineFunction(MachineFunction &MF);
95f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka
9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual void EmitConstantPool() override {
9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    bool UsingConstantPools =
9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      (Subtarget->inMips16Mode() && Subtarget->useConstantIslands());
99cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler    if (!UsingConstantPools)
100cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler      AsmPrinter::EmitConstantPool();
101cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler    // we emit constant pools customly!
102cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler  }
103cb2280e4c7c5a07104306cc73265ff64fa8dd973Reed Kotler
104aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  void EmitInstruction(const MachineInstr *MI);
10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printSavedRegsBitmask();
106aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  void emitFrameDirective();
107aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  const char *getCurrentABIString() const;
108aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  virtual void EmitFunctionEntryLabel();
109aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  virtual void EmitFunctionBodyStart();
110aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  virtual void EmitFunctionBodyEnd();
111aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  virtual bool isBlockOnlyReachableByFallthrough(const MachineBasicBlock*
112aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka                                                 MBB) const;
113aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
114aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka                       unsigned AsmVariant, const char *ExtraCode,
115aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka                       raw_ostream &O);
116aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum,
117aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka                             unsigned AsmVariant, const char *ExtraCode,
118aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka                             raw_ostream &O);
119aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  void printOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
120aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  void printUnsignedImm(const MachineInstr *MI, int opNum, raw_ostream &O);
121bb47fd04c9b1616c0371eb2c488c5f0f665c25f8Daniel Sanders  void printUnsignedImm8(const MachineInstr *MI, int opNum, raw_ostream &O);
12203236be44af1d98eb8daa57e8eb8b7bdd7884523Akira Hatanaka  void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
12303236be44af1d98eb8daa57e8eb8b7bdd7884523Akira Hatanaka  void printMemOperandEA(const MachineInstr *MI, int opNum, raw_ostream &O);
124aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  void printFCCOperand(const MachineInstr *MI, int opNum, raw_ostream &O,
125aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka                       const char *Modifier = 0);
126aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  void EmitStartOfAsmFile(Module &M);
127c91cbb9b0c90a480299cc7deaef166d47a61d9dfJack Carter  void EmitEndOfAsmFile(Module &M);
128aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka  void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);
129aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka};
130aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka}
131aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka
132aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka#endif
133aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka
134