The immediate operands of an LDRi12 instruction doesn't need the addrmode2
authorJim Grosbach <grosbach@apple.com>
Wed, 27 Oct 2010 16:50:31 +0000 (16:50 +0000)
committerJim Grosbach <grosbach@apple.com>
Wed, 27 Oct 2010 16:50:31 +0000 (16:50 +0000)
encoding tricks. Handle the 'imm doesn't fit in the insn' case.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@117454 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMBaseInstrInfo.cpp

index 69e10baafbcd64c03f59b8920966759fd583da3f..223cbe75e0b13f7f9f4f8077297e3a07ca84261e 100644 (file)
@@ -1435,8 +1435,12 @@ bool llvm::rewriteARMFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
 
       // Otherwise, it didn't fit. Pull in what we can to simplify the immed.
       ImmedOffset = ImmedOffset & Mask;
-      if (isSub)
-        ImmedOffset |= 1 << NumBits;
+      if (isSub) {
+        if (AddrMode == ARMII::AddrMode_i12)
+          ImmedOffset = -ImmedOffset;
+        else
+          ImmedOffset |= 1 << NumBits;
+      }
       ImmOp.ChangeToImmediate(ImmedOffset);
       Offset &= ~(Mask*Scale);
     }