diff options
author | Jim Grosbach <grosbach@apple.com> | 2010-12-07 21:50:47 +0000 |
---|---|---|
committer | Jim Grosbach <grosbach@apple.com> | 2010-12-07 21:50:47 +0000 |
commit | 49bcd6ff857e0c3de813ab3731a0fcd79b306f48 (patch) | |
tree | 87669c0b818fda032cb29a33d37b07de944e7604 /llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp | |
parent | 56d8ac4e805771ac4d0b6a2ce2c3c187aa536bf1 (diff) | |
download | bcm5719-llvm-49bcd6ff857e0c3de813ab3731a0fcd79b306f48.tar.gz bcm5719-llvm-49bcd6ff857e0c3de813ab3731a0fcd79b306f48.zip |
Binary encoding for ARM tLDRspi and tSTRspi.
llvm-svn: 121186
Diffstat (limited to 'llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp b/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp index b0113476fa8..0376a16e4b0 100644 --- a/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp +++ b/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp @@ -156,6 +156,11 @@ public: uint32_t getAddrMode3OpValue(const MCInst &MI, unsigned OpIdx, SmallVectorImpl<MCFixup> &Fixups) const; + /// getAddrModeThumbSPOpValue - Return encoding info for 'reg +/- imm12' + /// operand. + uint32_t getAddrModeThumbSPOpValue(const MCInst &MI, unsigned OpIdx, + SmallVectorImpl<MCFixup> &Fixups) const; + /// getAddrModeS4OpValue - Return encoding for t_addrmode_s4 operands. uint32_t getAddrModeS4OpValue(const MCInst &MI, unsigned OpIdx, SmallVectorImpl<MCFixup> &Fixups) const; @@ -656,6 +661,20 @@ getAddrMode3OpValue(const MCInst &MI, unsigned OpIdx, return (Rn << 9) | Imm8 | (isAdd << 8) | (isImm << 13); } +/// getAddrModeThumbSPOpValue- Encode the t_addrmode_sp operands. +uint32_t ARMMCCodeEmitter:: +getAddrModeThumbSPOpValue(const MCInst &MI, unsigned OpIdx, + SmallVectorImpl<MCFixup> &Fixups) const { + // [SP, #imm] + // {7-0} = imm8 + const MCOperand &MO = MI.getOperand(OpIdx); + const MCOperand &MO1 = MI.getOperand(OpIdx + 1); + assert (MO.getReg() == ARM::SP && "Unexpected base register!"); + // The immediate is already shifted for the implicit zeroes, so no change + // here. + return MO1.getImm() & 0xff; +} + /// getAddrModeSOpValue - Encode the t_addrmode_s# operands. static unsigned getAddrModeSOpValue(const MCInst &MI, unsigned OpIdx, unsigned Scale) { |