create the raddr addressing mode that matches any register and the frame index
[oota-llvm.git] / lib / Target / ARM / ARMISelDAGToDAG.cpp
index 413ca5959a113bc3099c0de3bd43b873601b750b..33413d6c5b507aa2a31cb1c88d4a5c8a4f055e45 100644 (file)
@@ -95,8 +95,7 @@ static SDOperand LowerFORMAL_ARGUMENT(SDOperand Op, SelectionDAG &DAG,
     // If the argument is actually used, emit a load from the right stack
       // slot.
     if (!Op.Val->hasNUsesOfValue(0, ArgNo)) {
-      //hack
-      unsigned ArgOffset = 0;
+      unsigned ArgOffset = (ArgNo - num_regs) * 4;
 
       MachineFrameInfo *MFI = MF.getFrameInfo();
       unsigned ObjSize = MVT::getSizeInBits(ObjectVT)/8;
@@ -165,6 +164,7 @@ public:
 
   void Select(SDOperand &Result, SDOperand Op);
   virtual void InstructionSelectBasicBlock(SelectionDAG &DAG);
+  bool SelectAddrReg(SDOperand N, SDOperand &Base);
 
   // Include the pieces autogenerated from the target description.
 #include "ARMGenDAGISel.inc"
@@ -183,12 +183,13 @@ void ARMDAGToDAGISel::InstructionSelectBasicBlock(SelectionDAG &DAG) {
   ScheduleAndEmitDAG(DAG);
 }
 
-static void SelectFrameIndex(SelectionDAG *CurDAG, SDOperand &Result, SDNode *N, SDOperand Op) {
-  int FI = cast<FrameIndexSDNode>(N)->getIndex();
-
-  SDOperand TFI = CurDAG->getTargetFrameIndex(FI, Op.getValueType());
-
-  Result = CurDAG->SelectNodeTo(N, ARM::movri, Op.getValueType(), TFI);
+bool ARMDAGToDAGISel::SelectAddrReg(SDOperand N, SDOperand &Base) {
+  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
 }
 
 void ARMDAGToDAGISel::Select(SDOperand &Result, SDOperand Op) {
@@ -198,10 +199,6 @@ void ARMDAGToDAGISel::Select(SDOperand &Result, SDOperand Op) {
   default:
     SelectCode(Result, Op);
     break;
-
-  case ISD::FrameIndex:
-    SelectFrameIndex(CurDAG, Result, N, Op);
-    break;
   }
 }