[llvm-commits] CVS: llvm/lib/Target/ARM/ARMRegisterInfo.cpp
Evan Cheng
evan.cheng at apple.com
Mon Feb 5 22:13:45 PST 2007
Changes in directory llvm/lib/Target/ARM:
ARMRegisterInfo.cpp updated: 1.57 -> 1.58
---
Log message:
foldMemoryOperand() cannot fold tMOVrr sp into load / store in thumb mode. tLDRspi / tSTRspi cannot target / store high registers.
---
Diffs of the changes: (+19 -13)
ARMRegisterInfo.cpp | 32 +++++++++++++++++++-------------
1 files changed, 19 insertions(+), 13 deletions(-)
Index: llvm/lib/Target/ARM/ARMRegisterInfo.cpp
diff -u llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.57 llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.58
--- llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.57 Mon Feb 5 18:23:31 2007
+++ llvm/lib/Target/ARM/ARMRegisterInfo.cpp Tue Feb 6 00:13:29 2007
@@ -185,6 +185,19 @@
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 @@
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 @@
}
}
-/// 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,
More information about the llvm-commits
mailing list