diff options
author | Bill Wendling <isanbard@gmail.com> | 2010-12-14 03:36:38 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2010-12-14 03:36:38 +0000 |
commit | 092a7bdf9f15d31e72856b2823babed90d88c6ac (patch) | |
tree | 7d4f38905577188bce6c26c49441106a4b56d50e /llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp | |
parent | c17781375532ce9974cb83408b03d88e47d1b3a8 (diff) | |
download | bcm5719-llvm-092a7bdf9f15d31e72856b2823babed90d88c6ac.tar.gz bcm5719-llvm-092a7bdf9f15d31e72856b2823babed90d88c6ac.zip |
The tLDR et al instructions were emitting either a reg/reg or reg/imm
instruction based on the t_addrmode_s# mode and what it returned. There is some
obvious badness to this. In particular, it's hard to do MC-encoding when the
instruction may change out from underneath you after the t_addrmode_s# variable
is finally resolved.
The solution is to revert a long-ago change that merged the reg/reg and reg/imm
versions. There is the addition of several new addressing modes. They no longer
have extraneous operands associated with them. I.e., if it's reg/reg we don't
have to have a dummy zero immediate tacked on to the SDNode.
There are some obvious cleanups here, which will happen shortly.
llvm-svn: 121747
Diffstat (limited to 'llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp | 40 |
1 files changed, 17 insertions, 23 deletions
diff --git a/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp b/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp index 8dca2c35c65..b82d38ed725 100644 --- a/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp +++ b/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp @@ -144,9 +144,9 @@ 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; + /// getThumbAddrModeRegRegOpValue - Return encoding for 'reg + reg' operand. + uint32_t getThumbAddrModeRegRegOpValue(const MCInst &MI, unsigned OpIdx, + SmallVectorImpl<MCFixup> &Fixups)const; /// getT2AddrModeImm8s4OpValue - Return encoding info for 'reg +/- imm8<<2' /// operand. @@ -207,9 +207,9 @@ public: uint32_t getAddrModeThumbSPOpValue(const MCInst &MI, unsigned OpIdx, SmallVectorImpl<MCFixup> &Fixups) const; - /// getAddrModeSOpValue - Encode the t_addrmode_s# operands. - uint32_t getAddrModeSOpValue(const MCInst &MI, unsigned OpIdx, - SmallVectorImpl<MCFixup> &) const; + /// getAddrModeISOpValue - Encode the t_addrmode_is# operands. + uint32_t getAddrModeISOpValue(const MCInst &MI, unsigned OpIdx, + SmallVectorImpl<MCFixup> &) const; /// getAddrModePCOpValue - Return encoding for t_addrmode_pc operands. uint32_t getAddrModePCOpValue(const MCInst &MI, unsigned OpIdx, @@ -559,12 +559,16 @@ getT2AdrLabelOpValue(const MCInst &MI, unsigned OpIdx, Fixups); } -/// getTAddrModeRegRegOpValue - Return encoding info for 'reg + reg' operand. +/// getThumbAddrModeRegRegOpValue - Return encoding info for 'reg + reg' +/// operand. uint32_t ARMMCCodeEmitter:: -getTAddrModeRegRegOpValue(const MCInst &MI, unsigned OpIdx, - SmallVectorImpl<MCFixup> &Fixups) const { +getThumbAddrModeRegRegOpValue(const MCInst &MI, unsigned OpIdx, + SmallVectorImpl<MCFixup> &) const { + // [Rn, Rm] + // {5-3} = Rm + // {2-0} = Rn const MCOperand &MO1 = MI.getOperand(OpIdx); - const MCOperand &MO2 = MI.getOperand(OpIdx+1); + const MCOperand &MO2 = MI.getOperand(OpIdx + 1); unsigned Rn = getARMRegisterNumbering(MO1.getReg()); unsigned Rm = getARMRegisterNumbering(MO2.getReg()); return (Rm << 3) | Rn; @@ -796,27 +800,17 @@ getAddrModeThumbSPOpValue(const MCInst &MI, unsigned OpIdx, return MO1.getImm() & 0xff; } -/// getAddrModeSOpValue - Encode the t_addrmode_s# operands. +/// getAddrModeISOpValue - Encode the t_addrmode_is# operands. uint32_t ARMMCCodeEmitter:: -getAddrModeSOpValue(const MCInst &MI, unsigned OpIdx, - SmallVectorImpl<MCFixup> &) const { - // [Rn, Rm] - // {5-3} = Rm - // {2-0} = Rn - // +getAddrModeISOpValue(const MCInst &MI, unsigned OpIdx, + SmallVectorImpl<MCFixup> &) const { // [Rn, #imm] // {7-3} = imm5 // {2-0} = Rn const MCOperand &MO = MI.getOperand(OpIdx); const MCOperand &MO1 = MI.getOperand(OpIdx + 1); - const MCOperand &MO2 = MI.getOperand(OpIdx + 2); unsigned Rn = getARMRegisterNumbering(MO.getReg()); unsigned Imm5 = MO1.getImm(); - - if (MO2.getReg() != 0) - // Is an immediate. - Imm5 = getARMRegisterNumbering(MO2.getReg()); - return ((Imm5 & 0x1f) << 3) | Rn; } |