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