diff options
author | Evan Cheng <evan.cheng@apple.com> | 2007-02-06 06:13:29 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2007-02-06 06:13:29 +0000 |
commit | ea3308aef010bb63a1c08de213108dcd6aa9e96b (patch) | |
tree | 67133da6131bf672098eb974219169312b0b58cd /llvm/lib/Target/ARM/ARMRegisterInfo.cpp | |
parent | 1b4b054cbaf4a270b29c3f5b4b93c1d575d47857 (diff) | |
download | bcm5719-llvm-ea3308aef010bb63a1c08de213108dcd6aa9e96b.tar.gz bcm5719-llvm-ea3308aef010bb63a1c08de213108dcd6aa9e96b.zip |
foldMemoryOperand() cannot fold tMOVrr sp into load / store in thumb mode. tLDRspi / tSTRspi cannot target / store high registers.
llvm-svn: 33958
Diffstat (limited to 'llvm/lib/Target/ARM/ARMRegisterInfo.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/ARMRegisterInfo.cpp | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/llvm/lib/Target/ARM/ARMRegisterInfo.cpp b/llvm/lib/Target/ARM/ARMRegisterInfo.cpp index ef54124b1bd..90fc84ffe5b 100644 --- a/llvm/lib/Target/ARM/ARMRegisterInfo.cpp +++ b/llvm/lib/Target/ARM/ARMRegisterInfo.cpp @@ -185,6 +185,19 @@ void ARMRegisterInfo::copyRegToReg(MachineBasicBlock &MBB, abort(); } +/// isLowRegister - Returns true if the register is low register r0-r7. +/// +static bool isLowRegister(unsigned Reg) { + using namespace ARM; + switch (Reg) { + case R0: case R1: case R2: case R3: + case R4: case R5: case R6: case R7: + return true; + default: + return false; + } +} + MachineInstr *ARMRegisterInfo::foldMemoryOperand(MachineInstr *MI, unsigned OpNum, int FI) const { unsigned Opc = MI->getOpcode(); @@ -206,10 +219,16 @@ MachineInstr *ARMRegisterInfo::foldMemoryOperand(MachineInstr *MI, case ARM::tMOVrr: { if (OpNum == 0) { // move -> store unsigned SrcReg = MI->getOperand(1).getReg(); + if (!isLowRegister(SrcReg)) + // tSTRspi cannot take a high register operand. + break; NewMI = BuildMI(TII.get(ARM::tSTRspi)).addReg(SrcReg).addFrameIndex(FI) .addImm(0); } else { // move -> load unsigned DstReg = MI->getOperand(0).getReg(); + if (!isLowRegister(DstReg)) + // tLDRspi cannot target a high register operand. + break; NewMI = BuildMI(TII.get(ARM::tLDRspi), DstReg).addFrameIndex(FI) .addImm(0); } @@ -316,19 +335,6 @@ void emitARMRegPlusImmediate(MachineBasicBlock &MBB, } } -/// isLowRegister - Returns true if the register is low register r0-r7. -/// -static bool isLowRegister(unsigned Reg) { - using namespace ARM; - switch (Reg) { - case R0: case R1: case R2: case R3: - case R4: case R5: case R6: case R7: - return true; - default: - return false; - } -} - /// calcNumMI - Returns the number of instructions required to materialize /// the specific add / sub r, c instruction. static unsigned calcNumMI(int Opc, int ExtraOpc, unsigned Bytes, |