summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2009-07-20 06:59:32 +0000
committerEvan Cheng <evan.cheng@apple.com>2009-07-20 06:59:32 +0000
commitfa60698c292c1723b1fbfb1b7cfc2748e05a8fad (patch)
tree07c2c27039b18be93e47acb7762e7e0aaf2451b9 /llvm/lib
parent58f9bb2ccda769adbdc5a71e1e8d22465d976771 (diff)
downloadbcm5719-llvm-fa60698c292c1723b1fbfb1b7cfc2748e05a8fad.tar.gz
bcm5719-llvm-fa60698c292c1723b1fbfb1b7cfc2748e05a8fad.zip
Fix PR4567. Thumb1 target was using the wrong instruction to handle sp = sub fp, #c.
llvm-svn: 76401
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/ARM/README-Thumb.txt4
-rw-r--r--llvm/lib/Target/ARM/Thumb1RegisterInfo.cpp14
2 files changed, 15 insertions, 3 deletions
diff --git a/llvm/lib/Target/ARM/README-Thumb.txt b/llvm/lib/Target/ARM/README-Thumb.txt
index cc017945d80..df94312d5f3 100644
--- a/llvm/lib/Target/ARM/README-Thumb.txt
+++ b/llvm/lib/Target/ARM/README-Thumb.txt
@@ -244,3 +244,7 @@ to toggle the 's' bit since they do not set CPSR when they are inside IT blocks.
Make use of hi register variants of cmp: tCMPhir / tCMPZhir.
//===---------------------------------------------------------------------===//
+
+Thumb1 immediate field sometimes keep pre-scaled values. See
+Thumb1RegisterInfo::eliminateFrameIndex. This is inconsistent from ARM and
+Thumb2.
diff --git a/llvm/lib/Target/ARM/Thumb1RegisterInfo.cpp b/llvm/lib/Target/ARM/Thumb1RegisterInfo.cpp
index dfb2774c4e8..b723c853eff 100644
--- a/llvm/lib/Target/ARM/Thumb1RegisterInfo.cpp
+++ b/llvm/lib/Target/ARM/Thumb1RegisterInfo.cpp
@@ -231,8 +231,16 @@ void emitThumbRegPlusImmediate(MachineBasicBlock &MBB,
if (DestReg != BaseReg)
DstNotEqBase = true;
NumBits = 8;
- Opc = isSub ? ARM::tSUBi8 : ARM::tADDi8;
- NeedPred = NeedCC = true;
+ if (DestReg == ARM::SP) {
+ Opc = isSub ? ARM::tSUBspi : ARM::tADDspi;
+ assert(isMul4 && "Thumb sp inc / dec size must be multiple of 4!");
+ NumBits = 7;
+ Scale = 4;
+ } else {
+ Opc = isSub ? ARM::tSUBi8 : ARM::tADDi8;
+ NumBits = 8;
+ NeedPred = NeedCC = true;
+ }
isTwoAddr = true;
}
@@ -447,7 +455,7 @@ void Thumb1RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
removeOperands(MI, i);
MachineInstrBuilder MIB(&MI);
AddDefaultPred(AddDefaultT1CC(MIB).addReg(FrameReg)
- .addImm(Offset/Scale));
+ .addImm(Offset / Scale));
} else {
MI.getOperand(i).ChangeToRegister(FrameReg, false);
MI.getOperand(i+1).ChangeToImmediate(Offset / Scale);
OpenPOWER on IntegriCloud