diff options
| author | Owen Anderson <resistor@mac.com> | 2010-12-10 22:11:13 +0000 |
|---|---|---|
| committer | Owen Anderson <resistor@mac.com> | 2010-12-10 22:11:13 +0000 |
| commit | b0fa127f605c383e4ba334edc835aa0a86c009df (patch) | |
| tree | b16f3b650d6bf59f6c2f4ed84fedec27adc1ce8f | |
| parent | c4a0c29edb641d32c4890a52fe8f5fb95073f3fc (diff) | |
| download | bcm5719-llvm-b0fa127f605c383e4ba334edc835aa0a86c009df.tar.gz bcm5719-llvm-b0fa127f605c383e4ba334edc835aa0a86c009df.zip | |
Fix encoding of Thumb1 LDRB and STRB.
llvm-svn: 121581
| -rw-r--r-- | llvm/lib/Target/ARM/ARMCodeEmitter.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrThumb.td | 1 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp | 15 |
3 files changed, 18 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM/ARMCodeEmitter.cpp b/llvm/lib/Target/ARM/ARMCodeEmitter.cpp index dc9f52488cf..823947395f2 100644 --- a/llvm/lib/Target/ARM/ARMCodeEmitter.cpp +++ b/llvm/lib/Target/ARM/ARMCodeEmitter.cpp @@ -191,6 +191,8 @@ namespace { const { return 0; } unsigned getSORegOpValue(const MachineInstr &MI, unsigned Op) const { return 0; } + unsigned getTAddrModeRegRegOpValue(const MachineInstr &MI, unsigned Op) + const { return 0; } unsigned getT2AddrModeImm12OpValue(const MachineInstr &MI, unsigned Op) const { return 0; } unsigned getT2AddrModeImm8OpValue(const MachineInstr &MI, unsigned Op) diff --git a/llvm/lib/Target/ARM/ARMInstrThumb.td b/llvm/lib/Target/ARM/ARMInstrThumb.td index e25e9cc9d90..c1192910113 100644 --- a/llvm/lib/Target/ARM/ARMInstrThumb.td +++ b/llvm/lib/Target/ARM/ARMInstrThumb.td @@ -103,6 +103,7 @@ def MemModeThumbAsmOperand : AsmOperandClass { // def t_addrmode_rr : Operand<i32>, ComplexPattern<i32, 2, "SelectThumbAddrModeRR", []> { + let EncoderMethod = "getTAddrModeRegRegOpValue"; let PrintMethod = "printThumbAddrModeRROperand"; let MIOperandInfo = (ops tGPR:$base, tGPR:$offsreg); } diff --git a/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp b/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp index f63d2f3be1e..e4f3288c82d 100644 --- a/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp +++ b/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp @@ -129,6 +129,10 @@ public: uint32_t getAddrModeImm12OpValue(const MCInst &MI, unsigned OpIdx, SmallVectorImpl<MCFixup> &Fixups) const; + /// getTAddrModeRegRegOpValue - Return encoding for 'reg + reg' operand. + uint32_t getTAddrModeRegRegOpValue(const MCInst &MI, unsigned OpIdx, + SmallVectorImpl<MCFixup> &Fixups) const; + /// getT2AddrModeImm8s4OpValue - Return encoding info for 'reg +/- imm8<<2' /// operand. uint32_t getT2AddrModeImm8s4OpValue(const MCInst &MI, unsigned OpIdx, @@ -504,6 +508,17 @@ getAdrLabelOpValue(const MCInst &MI, unsigned OpIdx, Fixups); } +/// getTAddrModeRegRegOpValue - Return encoding info for 'reg + reg' operand. +uint32_t ARMMCCodeEmitter:: +getTAddrModeRegRegOpValue(const MCInst &MI, unsigned OpIdx, + SmallVectorImpl<MCFixup> &Fixups) const { + const MCOperand &MO1 = MI.getOperand(OpIdx); + const MCOperand &MO2 = MI.getOperand(OpIdx+1); + unsigned Rn = getARMRegisterNumbering(MO1.getReg()); + unsigned Rm = getARMRegisterNumbering(MO2.getReg()); + return (Rm << 3) | Rn; +} + /// getAddrModeImm12OpValue - Return encoding info for 'reg +/- imm12' operand. uint32_t ARMMCCodeEmitter:: getAddrModeImm12OpValue(const MCInst &MI, unsigned OpIdx, |

