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 | f4caf69720d807573c50d41aa06bcec1c99bdbbd (patch) | |
tree | bdf33e0c29180acbfd4f2f74dcfd78e3d1866bdf /lib/Target/ARM/Thumb1RegisterInfo.cpp | |
parent | 0c1aec18911f2a67fb37b6593d08f4f8cb7e18ef (diff) | |
download | llvm-f4caf69720d807573c50d41aa06bcec1c99bdbbd.tar.gz llvm-f4caf69720d807573c50d41aa06bcec1c99bdbbd.tar.bz2 llvm-f4caf69720d807573c50d41aa06bcec1c99bdbbd.tar.xz |
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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121747 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM/Thumb1RegisterInfo.cpp')
-rw-r--r-- | lib/Target/ARM/Thumb1RegisterInfo.cpp | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/lib/Target/ARM/Thumb1RegisterInfo.cpp b/lib/Target/ARM/Thumb1RegisterInfo.cpp index 6197d4fd1b..5b086d1a78 100644 --- a/lib/Target/ARM/Thumb1RegisterInfo.cpp +++ b/lib/Target/ARM/Thumb1RegisterInfo.cpp @@ -644,13 +644,11 @@ Thumb1RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, *this, dl); } - MI.setDesc(TII.get(ARM::tLDR)); + MI.setDesc(TII.get(ARM::tLDRr)); MI.getOperand(i).ChangeToRegister(TmpReg, false, false, true); if (UseRR) // Use [reg, reg] addrmode. MI.addOperand(MachineOperand::CreateReg(FrameReg, false)); - else // tLDR has an extra register operand. - MI.addOperand(MachineOperand::CreateReg(0, false)); } else if (Desc.mayStore()) { VReg = MF.getRegInfo().createVirtualRegister(ARM::tGPRRegisterClass); bool UseRR = false; @@ -666,14 +664,13 @@ Thumb1RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, } else emitThumbRegPlusImmediate(MBB, II, VReg, FrameReg, Offset, TII, *this, dl); - MI.setDesc(TII.get(ARM::tSTR)); + MI.setDesc(TII.get(ARM::tSTRr)); MI.getOperand(i).ChangeToRegister(VReg, false, false, true); if (UseRR) // Use [reg, reg] addrmode. MI.addOperand(MachineOperand::CreateReg(FrameReg, false)); - else // tSTR has an extra register operand. - MI.addOperand(MachineOperand::CreateReg(0, false)); - } else + } else { assert(false && "Unexpected opcode!"); + } // Add predicate back if it's needed. if (MI.getDesc().isPredicable()) { |