Have the MipsAsmPrinter fp stub emission code take a custom

MCSubtargetInfo as the MachineFunction has gone away and we need
to emit code at the module level.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230133 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eric Christopher 2015-02-21 08:48:22 +00:00
parent 68992caa2e
commit 113747defd
2 changed files with 59 additions and 43 deletions

View File

@ -773,22 +773,24 @@ void MipsAsmPrinter::emitInlineAsmEnd(const MCSubtargetInfo &StartInfo,
getTargetStreamer().emitDirectiveSetPop(); getTargetStreamer().emitDirectiveSetPop();
} }
void MipsAsmPrinter::EmitJal(MCSymbol *Symbol) { void MipsAsmPrinter::EmitJal(const MCSubtargetInfo &STI, MCSymbol *Symbol) {
MCInst I; MCInst I;
I.setOpcode(Mips::JAL); I.setOpcode(Mips::JAL);
I.addOperand( I.addOperand(
MCOperand::CreateExpr(MCSymbolRefExpr::Create(Symbol, OutContext))); MCOperand::CreateExpr(MCSymbolRefExpr::Create(Symbol, OutContext)));
OutStreamer.EmitInstruction(I, getSubtargetInfo()); OutStreamer.EmitInstruction(I, STI);
} }
void MipsAsmPrinter::EmitInstrReg(unsigned Opcode, unsigned Reg) { void MipsAsmPrinter::EmitInstrReg(const MCSubtargetInfo &STI, unsigned Opcode,
unsigned Reg) {
MCInst I; MCInst I;
I.setOpcode(Opcode); I.setOpcode(Opcode);
I.addOperand(MCOperand::CreateReg(Reg)); I.addOperand(MCOperand::CreateReg(Reg));
OutStreamer.EmitInstruction(I, getSubtargetInfo()); OutStreamer.EmitInstruction(I, STI);
} }
void MipsAsmPrinter::EmitInstrRegReg(unsigned Opcode, unsigned Reg1, void MipsAsmPrinter::EmitInstrRegReg(const MCSubtargetInfo &STI,
unsigned Opcode, unsigned Reg1,
unsigned Reg2) { unsigned Reg2) {
MCInst I; MCInst I;
// //
@ -804,20 +806,22 @@ void MipsAsmPrinter::EmitInstrRegReg(unsigned Opcode, unsigned Reg1,
I.setOpcode(Opcode); I.setOpcode(Opcode);
I.addOperand(MCOperand::CreateReg(Reg1)); I.addOperand(MCOperand::CreateReg(Reg1));
I.addOperand(MCOperand::CreateReg(Reg2)); I.addOperand(MCOperand::CreateReg(Reg2));
OutStreamer.EmitInstruction(I, getSubtargetInfo()); OutStreamer.EmitInstruction(I, STI);
} }
void MipsAsmPrinter::EmitInstrRegRegReg(unsigned Opcode, unsigned Reg1, void MipsAsmPrinter::EmitInstrRegRegReg(const MCSubtargetInfo &STI,
unsigned Opcode, unsigned Reg1,
unsigned Reg2, unsigned Reg3) { unsigned Reg2, unsigned Reg3) {
MCInst I; MCInst I;
I.setOpcode(Opcode); I.setOpcode(Opcode);
I.addOperand(MCOperand::CreateReg(Reg1)); I.addOperand(MCOperand::CreateReg(Reg1));
I.addOperand(MCOperand::CreateReg(Reg2)); I.addOperand(MCOperand::CreateReg(Reg2));
I.addOperand(MCOperand::CreateReg(Reg3)); I.addOperand(MCOperand::CreateReg(Reg3));
OutStreamer.EmitInstruction(I, getSubtargetInfo()); OutStreamer.EmitInstruction(I, STI);
} }
void MipsAsmPrinter::EmitMovFPIntPair(unsigned MovOpc, unsigned Reg1, void MipsAsmPrinter::EmitMovFPIntPair(const MCSubtargetInfo &STI,
unsigned MovOpc, unsigned Reg1,
unsigned Reg2, unsigned FPReg1, unsigned Reg2, unsigned FPReg1,
unsigned FPReg2, bool LE) { unsigned FPReg2, bool LE) {
if (!LE) { if (!LE) {
@ -825,59 +829,60 @@ void MipsAsmPrinter::EmitMovFPIntPair(unsigned MovOpc, unsigned Reg1,
Reg1 = Reg2; Reg1 = Reg2;
Reg2 = temp; Reg2 = temp;
} }
EmitInstrRegReg(MovOpc, Reg1, FPReg1); EmitInstrRegReg(STI, MovOpc, Reg1, FPReg1);
EmitInstrRegReg(MovOpc, Reg2, FPReg2); EmitInstrRegReg(STI, MovOpc, Reg2, FPReg2);
} }
void MipsAsmPrinter::EmitSwapFPIntParams(Mips16HardFloatInfo::FPParamVariant PV, void MipsAsmPrinter::EmitSwapFPIntParams(const MCSubtargetInfo &STI,
Mips16HardFloatInfo::FPParamVariant PV,
bool LE, bool ToFP) { bool LE, bool ToFP) {
using namespace Mips16HardFloatInfo; using namespace Mips16HardFloatInfo;
unsigned MovOpc = ToFP ? Mips::MTC1 : Mips::MFC1; unsigned MovOpc = ToFP ? Mips::MTC1 : Mips::MFC1;
switch (PV) { switch (PV) {
case FSig: case FSig:
EmitInstrRegReg(MovOpc, Mips::A0, Mips::F12); EmitInstrRegReg(STI, MovOpc, Mips::A0, Mips::F12);
break; break;
case FFSig: case FFSig:
EmitMovFPIntPair(MovOpc, Mips::A0, Mips::A1, Mips::F12, Mips::F14, LE); EmitMovFPIntPair(STI, MovOpc, Mips::A0, Mips::A1, Mips::F12, Mips::F14, LE);
break; break;
case FDSig: case FDSig:
EmitInstrRegReg(MovOpc, Mips::A0, Mips::F12); EmitInstrRegReg(STI, MovOpc, Mips::A0, Mips::F12);
EmitMovFPIntPair(MovOpc, Mips::A2, Mips::A3, Mips::F14, Mips::F15, LE); EmitMovFPIntPair(STI, MovOpc, Mips::A2, Mips::A3, Mips::F14, Mips::F15, LE);
break; break;
case DSig: case DSig:
EmitMovFPIntPair(MovOpc, Mips::A0, Mips::A1, Mips::F12, Mips::F13, LE); EmitMovFPIntPair(STI, MovOpc, Mips::A0, Mips::A1, Mips::F12, Mips::F13, LE);
break; break;
case DDSig: case DDSig:
EmitMovFPIntPair(MovOpc, Mips::A0, Mips::A1, Mips::F12, Mips::F13, LE); EmitMovFPIntPair(STI, MovOpc, Mips::A0, Mips::A1, Mips::F12, Mips::F13, LE);
EmitMovFPIntPair(MovOpc, Mips::A2, Mips::A3, Mips::F14, Mips::F15, LE); EmitMovFPIntPair(STI, MovOpc, Mips::A2, Mips::A3, Mips::F14, Mips::F15, LE);
break; break;
case DFSig: case DFSig:
EmitMovFPIntPair(MovOpc, Mips::A0, Mips::A1, Mips::F12, Mips::F13, LE); EmitMovFPIntPair(STI, MovOpc, Mips::A0, Mips::A1, Mips::F12, Mips::F13, LE);
EmitInstrRegReg(MovOpc, Mips::A2, Mips::F14); EmitInstrRegReg(STI, MovOpc, Mips::A2, Mips::F14);
break; break;
case NoSig: case NoSig:
return; return;
} }
} }
void void MipsAsmPrinter::EmitSwapFPIntRetval(
MipsAsmPrinter::EmitSwapFPIntRetval(Mips16HardFloatInfo::FPReturnVariant RV, const MCSubtargetInfo &STI, Mips16HardFloatInfo::FPReturnVariant RV,
bool LE) { bool LE) {
using namespace Mips16HardFloatInfo; using namespace Mips16HardFloatInfo;
unsigned MovOpc = Mips::MFC1; unsigned MovOpc = Mips::MFC1;
switch (RV) { switch (RV) {
case FRet: case FRet:
EmitInstrRegReg(MovOpc, Mips::V0, Mips::F0); EmitInstrRegReg(STI, MovOpc, Mips::V0, Mips::F0);
break; break;
case DRet: case DRet:
EmitMovFPIntPair(MovOpc, Mips::V0, Mips::V1, Mips::F0, Mips::F1, LE); EmitMovFPIntPair(STI, MovOpc, Mips::V0, Mips::V1, Mips::F0, Mips::F1, LE);
break; break;
case CFRet: case CFRet:
EmitMovFPIntPair(MovOpc, Mips::V0, Mips::V1, Mips::F0, Mips::F1, LE); EmitMovFPIntPair(STI, MovOpc, Mips::V0, Mips::V1, Mips::F0, Mips::F1, LE);
break; break;
case CDRet: case CDRet:
EmitMovFPIntPair(MovOpc, Mips::V0, Mips::V1, Mips::F0, Mips::F1, LE); EmitMovFPIntPair(STI, MovOpc, Mips::V0, Mips::V1, Mips::F0, Mips::F1, LE);
EmitMovFPIntPair(MovOpc, Mips::A0, Mips::A1, Mips::F2, Mips::F3, LE); EmitMovFPIntPair(STI, MovOpc, Mips::A0, Mips::A1, Mips::F2, Mips::F3, LE);
break; break;
case NoFPRet: case NoFPRet:
break; break;
@ -889,6 +894,13 @@ void MipsAsmPrinter::EmitFPCallStub(
MCSymbol *MSymbol = OutContext.GetOrCreateSymbol(StringRef(Symbol)); MCSymbol *MSymbol = OutContext.GetOrCreateSymbol(StringRef(Symbol));
using namespace Mips16HardFloatInfo; using namespace Mips16HardFloatInfo;
bool LE = getDataLayout().isLittleEndian(); bool LE = getDataLayout().isLittleEndian();
// Construct a local MCSubtargetInfo here.
// This is because the MachineFunction won't exist (but have not yet been
// freed) and since we're at the global level we can use the default
// constructed subtarget.
std::unique_ptr<MCSubtargetInfo> STI(TM.getTarget().createMCSubtargetInfo(
TM.getTargetTriple(), TM.getTargetCPU(), TM.getTargetFeatureString()));
// //
// .global xxxx // .global xxxx
// //
@ -996,22 +1008,22 @@ void MipsAsmPrinter::EmitFPCallStub(
// //
// Mov $18, $31 // Mov $18, $31
EmitInstrRegRegReg(Mips::ADDu, Mips::S2, Mips::RA, Mips::ZERO); EmitInstrRegRegReg(*STI, Mips::ADDu, Mips::S2, Mips::RA, Mips::ZERO);
EmitSwapFPIntParams(Signature->ParamSig, LE, true); EmitSwapFPIntParams(*STI, Signature->ParamSig, LE, true);
// Jal xxxx // Jal xxxx
// //
EmitJal(MSymbol); EmitJal(*STI, MSymbol);
// fix return values // fix return values
EmitSwapFPIntRetval(Signature->RetSig, LE); EmitSwapFPIntRetval(*STI, Signature->RetSig, LE);
// //
// do the return // do the return
// if (Signature->RetSig == NoFPRet) // if (Signature->RetSig == NoFPRet)
// llvm_unreachable("should not be any stubs here with no return value"); // llvm_unreachable("should not be any stubs here with no return value");
// else // else
EmitInstrReg(Mips::JR, Mips::S2); EmitInstrReg(*STI, Mips::JR, Mips::S2);
MCSymbol *Tmp = OutContext.CreateTempSymbol(); MCSymbol *Tmp = OutContext.CreateTempSymbol();
OutStreamer.EmitLabel(Tmp); OutStreamer.EmitLabel(Tmp);

View File

@ -65,22 +65,26 @@ private:
void emitInlineAsmEnd(const MCSubtargetInfo &StartInfo, void emitInlineAsmEnd(const MCSubtargetInfo &StartInfo,
const MCSubtargetInfo *EndInfo) const override; const MCSubtargetInfo *EndInfo) const override;
void EmitJal(MCSymbol *Symbol); void EmitJal(const MCSubtargetInfo &STI, MCSymbol *Symbol);
void EmitInstrReg(unsigned Opcode, unsigned Reg); void EmitInstrReg(const MCSubtargetInfo &STI, unsigned Opcode, unsigned Reg);
void EmitInstrRegReg(unsigned Opcode, unsigned Reg1, unsigned Reg2); void EmitInstrRegReg(const MCSubtargetInfo &STI, unsigned Opcode,
unsigned Reg1, unsigned Reg2);
void EmitInstrRegRegReg(unsigned Opcode, unsigned Reg1, unsigned Reg2, void EmitInstrRegRegReg(const MCSubtargetInfo &STI, unsigned Opcode,
unsigned Reg3); unsigned Reg1, unsigned Reg2, unsigned Reg3);
void EmitMovFPIntPair(unsigned MovOpc, unsigned Reg1, unsigned Reg2, void EmitMovFPIntPair(const MCSubtargetInfo &STI, unsigned MovOpc,
unsigned FPReg1, unsigned FPReg2, bool LE); unsigned Reg1, unsigned Reg2, unsigned FPReg1,
unsigned FPReg2, bool LE);
void EmitSwapFPIntParams(Mips16HardFloatInfo::FPParamVariant, bool LE, void EmitSwapFPIntParams(const MCSubtargetInfo &STI,
Mips16HardFloatInfo::FPParamVariant, bool LE,
bool ToFP); bool ToFP);
void EmitSwapFPIntRetval(Mips16HardFloatInfo::FPReturnVariant, bool LE); void EmitSwapFPIntRetval(const MCSubtargetInfo &STI,
Mips16HardFloatInfo::FPReturnVariant, bool LE);
void EmitFPCallStub(const char *, const Mips16HardFloatInfo::FuncSignature *); void EmitFPCallStub(const char *, const Mips16HardFloatInfo::FuncSignature *);