initial implementation of addressing mode 2
TODO: fix lea_addri


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31552 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/ARM/ARMISelDAGToDAG.cpp b/lib/Target/ARM/ARMISelDAGToDAG.cpp
index 767cf2b..d4f30fc 100644
--- a/lib/Target/ARM/ARMISelDAGToDAG.cpp
+++ b/lib/Target/ARM/ARMISelDAGToDAG.cpp
@@ -754,6 +754,7 @@
   bool SelectAddrRegImm(SDOperand N, SDOperand &Offset, SDOperand &Base);
   bool SelectAddrMode1(SDOperand N, SDOperand &Arg, SDOperand &Shift,
 		       SDOperand &ShiftType);
+  bool SelectAddrMode2(SDOperand N, SDOperand &Arg, SDOperand &Offset);
   bool SelectAddrMode5(SDOperand N, SDOperand &Arg, SDOperand &Offset);
 
   // Include the pieces autogenerated from the target description.
@@ -820,7 +821,7 @@
       int  alignment = 2;
       SDOperand Addr = CurDAG->getTargetConstantPool(C, MVT::i32, alignment);
       SDOperand    Z = CurDAG->getTargetConstant(0,     MVT::i32);
-      SDNode      *n = CurDAG->getTargetNode(ARM::ldr,  MVT::i32, Z, Addr);
+      SDNode      *n = CurDAG->getTargetNode(ARM::LDR,  MVT::i32, Addr, Z);
       Arg            = SDOperand(n, 0);
     } else
       Arg            = CurDAG->getTargetConstant(val,    MVT::i32);
@@ -852,6 +853,35 @@
   return true;
 }
 
+bool ARMDAGToDAGISel::SelectAddrMode2(SDOperand N, SDOperand &Arg,
+                                      SDOperand &Offset) {
+  //TODO: complete and cleanup!
+  SDOperand Zero = CurDAG->getTargetConstant(0, MVT::i32);
+  if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(N)) {
+    Arg    = CurDAG->getTargetFrameIndex(FIN->getIndex(), MVT::i32);
+    Offset = Zero;
+    return true;
+  }
+  if (N.getOpcode() == ISD::ADD) {
+    short imm = 0;
+    if (isInt12Immediate(N.getOperand(1), imm)) {
+      Offset = CurDAG->getTargetConstant(imm, MVT::i32);
+      if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(N.getOperand(0))) {
+	Arg = CurDAG->getTargetFrameIndex(FI->getIndex(), N.getValueType());
+      } else {
+	Arg = N.getOperand(0);
+      }
+      return true; // [r+i]
+    }
+  }
+  Offset = Zero;
+  if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(N))
+    Arg = CurDAG->getTargetFrameIndex(FI->getIndex(), N.getValueType());
+  else
+    Arg = N;
+  return true;
+}
+
 bool ARMDAGToDAGISel::SelectAddrMode5(SDOperand N, SDOperand &Arg,
                                       SDOperand &Offset) {
   //TODO: detect offset