diff options
| author | Jim Grosbach <grosbach@apple.com> | 2010-11-01 23:45:50 +0000 |
|---|---|---|
| committer | Jim Grosbach <grosbach@apple.com> | 2010-11-01 23:45:50 +0000 |
| commit | 2ba03aa618712140f6f2cf00bcb831242ea3efea (patch) | |
| tree | efea95d6f4d7bda6106b03e8109b223fa00b76fa | |
| parent | a3efae35f5b75a8b0b0a5bf82ec733663f6b664a (diff) | |
| download | bcm5719-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.cpp | 11 |
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); |

