mirror of
https://github.com/RPCSX/llvm.git
synced 2025-03-04 02:47:25 +00:00
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:
parent
68992caa2e
commit
113747defd
@ -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);
|
||||||
|
@ -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 *);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user