aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target
diff options
context:
space:
mode:
authorJim Grosbach <grosbach@apple.com>2010-09-16 17:43:25 +0000
committerJim Grosbach <grosbach@apple.com>2010-09-16 17:43:25 +0000
commit5c858c88cc35391d076280f8f9227b212467d822 (patch)
tree7b58de01fba220dd36b203422f4d0886b50ec5c5 /lib/Target
parentec961d7f4fcc2b9172c1eec42c1e09fca56ad18d (diff)
downloadexternal_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.cpp29
-rw-r--r--lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp5
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,