implement load effective address similar to the alpha backend
remove lea_addri and the now unused memri addressing mode


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31592 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/ARM/ARMISelDAGToDAG.cpp b/lib/Target/ARM/ARMISelDAGToDAG.cpp
index d49427d..a7e4703 100644
--- a/lib/Target/ARM/ARMISelDAGToDAG.cpp
+++ b/lib/Target/ARM/ARMISelDAGToDAG.cpp
@@ -751,8 +751,6 @@
 
   SDNode *Select(SDOperand Op);
   virtual void InstructionSelectBasicBlock(SelectionDAG &DAG);
-  bool SelectAddrRegImm(SDOperand Op, SDOperand N, SDOperand &Offset,
-                        SDOperand &Base);
   bool SelectAddrMode1(SDOperand Op, SDOperand N, SDOperand &Arg,
                        SDOperand &Shift, SDOperand &ShiftType);
   bool SelectAddrMode2(SDOperand Op, SDOperand N, SDOperand &Arg,
@@ -895,37 +893,6 @@
   return true;
 }
 
-//register plus/minus 12 bit offset
-bool ARMDAGToDAGISel::SelectAddrRegImm(SDOperand Op,
-                                      SDOperand N, SDOperand &Offset,
-				    SDOperand &Base) {
-  if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(N)) {
-    Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), MVT::i32);
-    Offset = CurDAG->getTargetConstant(0, MVT::i32);
-    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))) {
-	Base = CurDAG->getTargetFrameIndex(FI->getIndex(), N.getValueType());
-      } else {
-	Base = N.getOperand(0);
-      }
-      return true; // [r+i]
-    }
-  }
-
-  Offset = CurDAG->getTargetConstant(0, MVT::i32);
-  if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(N)) {
-    Base = CurDAG->getTargetFrameIndex(FI->getIndex(), N.getValueType());
-  }
-  else
-    Base = N;
-  return true;      //any address fits in a register
-}
-
 SDNode *ARMDAGToDAGISel::Select(SDOperand Op) {
   SDNode *N = Op.Val;
 
@@ -933,8 +900,18 @@
   default:
     return SelectCode(Op);
     break;
+  case ISD::FrameIndex: {
+    int FI = cast<FrameIndexSDNode>(N)->getIndex();
+    SDOperand Ops[] = {CurDAG->getTargetFrameIndex(FI, MVT::i32),
+                       CurDAG->getTargetConstant(0, MVT::i32),
+                       CurDAG->getTargetConstant(0, MVT::i32),
+                       CurDAG->getTargetConstant(ARMShift::LSL, MVT::i32)};
+
+    return CurDAG->SelectNodeTo(N, ARM::ADD, MVT::i32, Ops,
+                                sizeof(Ops)/sizeof(SDOperand));
+    break;
   }
-  return NULL;
+  }
 }
 
 }  // end anonymous namespace