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