summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJim Grosbach <grosbach@apple.com>2010-11-01 23:45:50 +0000
committerJim Grosbach <grosbach@apple.com>2010-11-01 23:45:50 +0000
commit2ba03aa618712140f6f2cf00bcb831242ea3efea (patch)
treeefea95d6f4d7bda6106b03e8109b223fa00b76fa
parenta3efae35f5b75a8b0b0a5bf82ec733663f6b664a (diff)
downloadbcm5719-llvm-2ba03aa618712140f6f2cf00bcb831242ea3efea.tar.gz
bcm5719-llvm-2ba03aa618712140f6f2cf00bcb831242ea3efea.zip
Explicitly check for non-consant reference in an LDRi12 instruction. Add FIXME
for handling the fixup necessary. llvm-svn: 117978
-rw-r--r--llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp b/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp
index afebadc8189..5757046e993 100644
--- a/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp
+++ b/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp
@@ -178,6 +178,15 @@ unsigned ARMMCCodeEmitter::getAddrModeImm12OpValue(const MCInst &MI,
// {11-0} = imm12
const MCOperand &MO = MI.getOperand(OpIdx);
const MCOperand &MO1 = MI.getOperand(OpIdx + 1);
+ uint32_t Binary = 0;
+
+ // If The first operand isn't a register, we have a label reference.
+ if (!MO.isReg()) {
+ Binary |= ARM::PC << 13; // Rn is PC.
+ // FIXME: Add a fixup referencing the label.
+ return Binary;
+ }
+
unsigned Reg = getARMRegisterNumbering(MO.getReg());
int32_t Imm12 = MO1.getImm();
bool isAdd = Imm12 >= 0;
@@ -187,7 +196,7 @@ unsigned ARMMCCodeEmitter::getAddrModeImm12OpValue(const MCInst &MI,
// Immediate is always encoded as positive. The 'U' bit controls add vs sub.
if (Imm12 < 0)
Imm12 = -Imm12;
- uint32_t Binary = Imm12 & 0xfff;
+ Binary = Imm12 & 0xfff;
if (isAdd)
Binary |= (1 << 12);
Binary |= (Reg << 13);
OpenPOWER on IntegriCloud