summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-10-19 22:23:04 +0000
committerChris Lattner <sabre@nondot.org>2009-10-19 22:23:04 +0000
commitadd5749ac8509a22df19149e2317cb6e74e26231 (patch)
treec69223490b92932e2535090cee05bab19b12cda8 /llvm/lib
parent02b319ce18c31666beec2df69c47c5863af80a1d (diff)
downloadbcm5719-llvm-add5749ac8509a22df19149e2317cb6e74e26231.tar.gz
bcm5719-llvm-add5749ac8509a22df19149e2317cb6e74e26231.zip
add MCInstLower support for lowering ARM::PICADD, a pseudo op for pic stuffola.
llvm-svn: 84553
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp25
-rw-r--r--llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp7
-rw-r--r--llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.h7
3 files changed, 34 insertions, 5 deletions
diff --git a/llvm/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp b/llvm/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
index 4685c0e2e37..139477221a4 100644
--- a/llvm/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
+++ b/llvm/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
@@ -1313,6 +1313,7 @@ extern "C" void LLVMInitializeARMAsmPrinter() {
void ARMAsmPrinter::printInstructionThroughMCStreamer(const MachineInstr *MI) {
ARMMCInstLower MCInstLowering(OutContext, *Mang, getFunctionNumber(), *MAI);
switch (MI->getOpcode()) {
+ default: break;
case TargetInstrInfo::DBG_LABEL:
case TargetInstrInfo::EH_LABEL:
case TargetInstrInfo::GC_LABEL:
@@ -1327,7 +1328,29 @@ void ARMAsmPrinter::printInstructionThroughMCStreamer(const MachineInstr *MI) {
case TargetInstrInfo::IMPLICIT_DEF:
printImplicitDef(MI);
return;
- default: break;
+ case ARM::PICADD: { // FIXME: Remove asm string from td file.
+ // This is a pseudo op for a label + instruction sequence, which looks like:
+ // LPC0:
+ // add r0, pc, r0
+ // This adds the address of LPC0 to r0.
+
+ // Emit the label.
+ // FIXME: MOVE TO SHARED PLACE.
+ SmallString<60> Name;
+ int Id = (int)MI->getOperand(2).getImm();
+ raw_svector_ostream(Name) << MAI->getPrivateGlobalPrefix() << "PC" << Id;
+ OutStreamer.EmitLabel(OutContext.GetOrCreateSymbol(Name.str()));
+
+
+ // Form and emit tha dd.
+ MCInst AddInst;
+ AddInst.setOpcode(ARM::ADDrr);
+ AddInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg()));
+ AddInst.addOperand(MCOperand::CreateReg(ARM::PC));
+ AddInst.addOperand(MCOperand::CreateReg(MI->getOperand(1).getReg()));
+ printMCInst(&AddInst);
+ return;
+ }
}
MCInst TmpInst;
diff --git a/llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp b/llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp
index 6738bbf27ca..4d9c592e64b 100644
--- a/llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp
+++ b/llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp
@@ -157,3 +157,10 @@ void ARMInstPrinter::printRegisterList(const MCInst *MI, unsigned OpNum) {
}
O << "}";
}
+
+
+
+void ARMInstPrinter::printPCLabel(const MCInst *MI, unsigned OpNum) {
+ // FIXME: remove this.
+ abort();
+}
diff --git a/llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.h b/llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.h
index 4f744c400cb..d4f6033152c 100644
--- a/llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.h
+++ b/llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.h
@@ -71,7 +71,6 @@ public:
void printPredicateOperand(const MCInst *MI, unsigned OpNum) {}
void printSBitModifierOperand(const MCInst *MI, unsigned OpNum) {}
- void printPCLabel(const MCInst *MI, unsigned OpNum) {}
void printRegisterList(const MCInst *MI, unsigned OpNum);
void printCPInstOperand(const MCInst *MI, unsigned OpNum,
const char *Modifier) {}
@@ -79,9 +78,9 @@ public:
void printJT2BlockOperand(const MCInst *MI, unsigned OpNum) {}
void printTBAddrMode(const MCInst *MI, unsigned OpNum) {}
void printNoHashImmediate(const MCInst *MI, unsigned OpNum) {}
-
-
- // FIXME:
+
+ void printPCLabel(const MCInst *MI, unsigned OpNum);
+ // FIXME: Implement.
void PrintSpecial(const MCInst *MI, const char *Kind) {}
};
OpenPOWER on IntegriCloud