diff options
author | Jim Grosbach <grosbach@apple.com> | 2010-09-16 17:43:25 +0000 |
---|---|---|
committer | Jim Grosbach <grosbach@apple.com> | 2010-09-16 17:43:25 +0000 |
commit | 5c858c88cc35391d076280f8f9227b212467d822 (patch) | |
tree | 7b58de01fba220dd36b203422f4d0886b50ec5c5 /lib/Target | |
parent | ec961d7f4fcc2b9172c1eec42c1e09fca56ad18d (diff) | |
download | external_llvm-5c858c88cc35391d076280f8f9227b212467d822.zip external_llvm-5c858c88cc35391d076280f8f9227b212467d822.tar.gz external_llvm-5c858c88cc35391d076280f8f9227b212467d822.tar.bz2 |
MC-ization of the PICLDR pseudo. Next up, adding the other variants
(PICLDRB, et. al.) and PICSTR*
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@114098 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target')
-rw-r--r-- | lib/Target/ARM/ARMAsmPrinter.cpp | 29 | ||||
-rw-r--r-- | lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp | 5 |
2 files changed, 33 insertions, 1 deletions
diff --git a/lib/Target/ARM/ARMAsmPrinter.cpp b/lib/Target/ARM/ARMAsmPrinter.cpp index cea9fd5..df75ff2 100644 --- a/lib/Target/ARM/ARMAsmPrinter.cpp +++ b/lib/Target/ARM/ARMAsmPrinter.cpp @@ -1351,6 +1351,35 @@ void ARMAsmPrinter::printInstructionThroughMCStreamer(const MachineInstr *MI) { OutStreamer.EmitInstruction(AddInst); return; } + case ARM::PICLDR: { + // This is a pseudo op for a label + instruction sequence, which looks like: + // LPC0: + // ldr r0, [pc, r0] + // The LCP0 label is referenced by a constant pool entry in order to get + // a PC-relative address at the ldr instruction. + + // Emit the label. + // FIXME: MOVE TO SHARED PLACE. + unsigned Id = (unsigned)MI->getOperand(2).getImm(); + const char *Prefix = MAI->getPrivateGlobalPrefix(); + MCSymbol *Label =OutContext.GetOrCreateSymbol(Twine(Prefix) + + "PC" + Twine(getFunctionNumber()) + "_" + Twine(Id)); + OutStreamer.EmitLabel(Label); + + // Form and emit the load + MCInst LdrInst; + LdrInst.setOpcode(ARM::LDR); + LdrInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); + LdrInst.addOperand(MCOperand::CreateReg(ARM::PC)); + LdrInst.addOperand(MCOperand::CreateReg(MI->getOperand(1).getReg())); + LdrInst.addOperand(MCOperand::CreateImm(0)); + // Add predicate operands. + LdrInst.addOperand(MCOperand::CreateImm(MI->getOperand(3).getImm())); + LdrInst.addOperand(MCOperand::CreateReg(MI->getOperand(4).getReg())); + OutStreamer.EmitInstruction(LdrInst); + + return; + } case ARM::CONSTPOOL_ENTRY: { // FIXME: Remove asm string from td file. /// CONSTPOOL_ENTRY - This instruction represents a floating constant pool /// in the function. The first operand is the ID# for this instruction, the diff --git a/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp b/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp index 37c4f75..2e48905 100644 --- a/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp +++ b/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp @@ -384,7 +384,10 @@ void ARMInstPrinter::printAddrMode6OffsetOperand(const MCInst *MI, void ARMInstPrinter::printAddrModePCOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O, const char *Modifier) { - assert(0 && "FIXME: Implement printAddrModePCOperand"); + // All instructions using addrmodepc are pseudos and should have been + // handled explicitly in printInstructionThroughMCStreamer(). If one got + // here, it wasn't, so something's wrong. + assert(0 && "Unhandled addrmodepc operand!"); } void ARMInstPrinter::printBitfieldInvMaskImmOperand(const MCInst *MI, |