mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
reimplement ppc asmprinter "toc" handling to use a VariantKind
on the operand, required for .o file writing and fixing the PowerPC/mult-alt-generic-powerpc64.ll failure with the new instprinter. llvm-svn: 119087
This commit is contained in:
parent
8cb5c07514
commit
fc626aa37d
@ -141,6 +141,7 @@ public:
|
||||
VK_TLSLDM,
|
||||
VK_TPOFF,
|
||||
VK_DTPOFF,
|
||||
VK_TLVP, // Mach-O thread local variable relocation
|
||||
VK_ARM_HI16, // The R_ARM_MOVT_ABS relocation (:upper16: in the .s file)
|
||||
VK_ARM_LO16, // The R_ARM_MOVW_ABS_NC relocation (:lower16: in the .w file)
|
||||
// FIXME: We'd really like to use the generic Kinds listed above for these.
|
||||
@ -150,7 +151,8 @@ public:
|
||||
VK_ARM_GOTOFF,
|
||||
VK_ARM_TPOFF,
|
||||
VK_ARM_GOTTPOFF,
|
||||
VK_TLVP // Mach-O thread local variable relocation
|
||||
|
||||
VK_PPC_TOC
|
||||
};
|
||||
|
||||
private:
|
||||
|
@ -187,6 +187,7 @@ StringRef MCSymbolRefExpr::getVariantKindName(VariantKind Kind) {
|
||||
case VK_TLSLDM: return "TLSLDM";
|
||||
case VK_TPOFF: return "TPOFF";
|
||||
case VK_DTPOFF: return "DTPOFF";
|
||||
case VK_TLVP: return "TLVP";
|
||||
case VK_ARM_HI16: return ":upper16:";
|
||||
case VK_ARM_LO16: return ":lower16:";
|
||||
case VK_ARM_PLT: return "(PLT)";
|
||||
@ -195,7 +196,7 @@ StringRef MCSymbolRefExpr::getVariantKindName(VariantKind Kind) {
|
||||
case VK_ARM_TPOFF: return "(tpoff)";
|
||||
case VK_ARM_GOTTPOFF: return "(gottpoff)";
|
||||
case VK_ARM_TLSGD: return "(tldgd)";
|
||||
case VK_TLVP: return "TLVP";
|
||||
case VK_PPC_TOC: return "toc";
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -560,6 +560,32 @@ void PPCAsmPrinter::EmitInstruction(const MachineInstr *MI) {
|
||||
switch (MI->getOpcode()) {
|
||||
default: break;
|
||||
|
||||
case PPC::LDtoc: {
|
||||
// Transform %X3 = LDtoc <ga:@min1>, %X2
|
||||
LowerPPCMachineInstrToMCInst(MI, TmpInst, *this);
|
||||
|
||||
// Change the opcode to LD, and the global address operand to be a
|
||||
// reference to the TOC entry we will synthesize later.
|
||||
TmpInst.setOpcode(PPC::LD);
|
||||
const MachineOperand &MO = MI->getOperand(1);
|
||||
assert(MO.isGlobal());
|
||||
|
||||
// Map symbol -> label of TOC entry.
|
||||
MCSymbol *&TOCEntry = TOC[Mang->getSymbol(MO.getGlobal())];
|
||||
if (TOCEntry == 0) {
|
||||
TOCEntry = OutContext.
|
||||
GetOrCreateSymbol(StringRef(MAI->getPrivateGlobalPrefix()) +
|
||||
"C" + Twine(LabelID++));
|
||||
}
|
||||
|
||||
const MCExpr *Exp =
|
||||
MCSymbolRefExpr::Create(TOCEntry, MCSymbolRefExpr::VK_PPC_TOC,
|
||||
OutContext);
|
||||
TmpInst.getOperand(1) = MCOperand::CreateExpr(Exp);
|
||||
OutStreamer.EmitInstruction(TmpInst);
|
||||
return;
|
||||
}
|
||||
|
||||
case PPC::MFCRpseud:
|
||||
// Transform: %R3 = MFCRpseud %CR7
|
||||
// Into: %R3 = MFCR ;; cr7
|
||||
|
@ -566,7 +566,7 @@ def LDinto_toc: DSForm_1<58, 0, (outs), (ins G8RC:$reg),
|
||||
let RST = 2, DS = 40, RA = 1 in
|
||||
def LDtoc_restore : DSForm_1<58, 0, (outs), (ins),
|
||||
"ld 2, 40(1)", LdStLD,
|
||||
[]>, isPPC64;
|
||||
[(PPCtoc_restore)]>, isPPC64;
|
||||
def LDX : XForm_1<31, 21, (outs G8RC:$rD), (ins memrr:$src),
|
||||
"ldx $rD, $src", LdStLD,
|
||||
[(set G8RC:$rD, (load xaddr:$src))]>, isPPC64;
|
||||
@ -579,8 +579,6 @@ def LDU : DSForm_1<58, 1, (outs G8RC:$rD, ptr_rc:$ea_result), (ins memrix:$addr
|
||||
|
||||
}
|
||||
|
||||
def : Pat<(PPCtoc_restore),
|
||||
(LDtoc_restore)>;
|
||||
def : Pat<(PPCload ixaddr:$src),
|
||||
(LD ixaddr:$src)>;
|
||||
def : Pat<(PPCload xaddr:$src),
|
||||
|
Loading…
x
Reference in New Issue
Block a user