some call work
authorAndrew Lenharth <andrewl@lenharth.org>
Mon, 27 Jun 2005 23:59:51 +0000 (23:59 +0000)
committerAndrew Lenharth <andrewl@lenharth.org>
Mon, 27 Jun 2005 23:59:51 +0000 (23:59 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22303 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Sparc/SparcV8ISelPattern.cpp
lib/Target/SparcV8/SparcV8ISelPattern.cpp

index 98d4f93049439bf73186bb7e701f5e21fe28e2df..e19e14c12b340976e0e3725789545326c72c6f6c 100644 (file)
@@ -119,7 +119,8 @@ static unsigned AddLiveIn(MachineFunction &MF, unsigned PReg,
 std::vector<SDOperand>
 V8TargetLowering::LowerArguments(Function &F, SelectionDAG &DAG)
 {
-  //FIXME
+  static const unsigned IncomingArgRegs[] = 
+    { V8::I0, V8::I1, V8::I2, V8::I3, V8::I4, V8::I5 };
   std::vector<SDOperand> ArgValues;
 
   MachineFunction &MF = DAG.getMachineFunction();
@@ -127,6 +128,68 @@ V8TargetLowering::LowerArguments(Function &F, SelectionDAG &DAG)
 
   MachineBasicBlock& BB = MF.front();
 
+  unsigned ArgNo = 0;
+  unsigned ArgOffset = 92;
+  for (Function::arg_iterator I = F.arg_begin(), E = F.arg_end();
+       I != E; ++I, ++ArgNo) {
+    MVT::ValueType VT = getValueType(I->getType());
+    SDOperand argt;
+    if (ArgNo < 6) {
+      switch(VT) {
+      default:
+        std::cerr << "Unknown Type " << VT << "\n";
+        abort();
+      case MVT::f64:
+      case MVT::i64:
+        //FIXME: figure out the build pair thing
+        assert(0 && "doubles and longs not supported yet");
+      case MVT::f32:
+        argt = DAG.getCopyFromReg(AddLiveIn(MF, IncomingArgRegs[ArgNo],
+                                            MVT::i32),
+                                  VT, DAG.getRoot());
+        //copy out of Int reg
+        argt = DAG.getNode(ISD::FP_TO_UINT, MVT::f32, argt);
+        break;
+      case MVT::i1:
+      case MVT::i8:
+      case MVT::i16:
+      case MVT::i32:
+        argt = DAG.getCopyFromReg(AddLiveIn(MF, IncomingArgRegs[ArgNo], 
+                                            getRegClassFor(MVT::i32)), 
+                                  VT, DAG.getRoot());
+        if (VT != MVT::i32)
+          argt = DAG.getNode(ISD::TRUNCATE, VT, argt);
+        break;
+      }
+      DAG.setRoot(argt.getValue(1));
+    } else {
+      //stack passed
+      switch(VT) {
+      default:
+        std::cerr << "Unknown Type " << VT << "\n";
+        abort();
+      case MVT::f64:
+      case MVT::i64:
+        //FIXME: figure out the build pair thing
+        assert(0 && "doubles and longs not supported yet");
+      case MVT::f32:
+      case MVT::i1:
+      case MVT::i8:
+      case MVT::i16:
+      case MVT::i32:
+      // Create the frame index object for this incoming parameter...
+      int FI = MFI->CreateFixedObject(4, ArgOffset);
+      argt = DAG.getLoad(VT,
+                         DAG.getEntryNode(),
+                         DAG.getFramIndex(FI, MVT::i32),
+                         DAG.getSrcValue(NULL));
+      ArgOffset += 4;
+      break;
+      }
+      ArgValues.push_back(argt);
+    }
+  }
+
   //return the arguments
   return ArgValues;
 }
index 98d4f93049439bf73186bb7e701f5e21fe28e2df..e19e14c12b340976e0e3725789545326c72c6f6c 100644 (file)
@@ -119,7 +119,8 @@ static unsigned AddLiveIn(MachineFunction &MF, unsigned PReg,
 std::vector<SDOperand>
 V8TargetLowering::LowerArguments(Function &F, SelectionDAG &DAG)
 {
-  //FIXME
+  static const unsigned IncomingArgRegs[] = 
+    { V8::I0, V8::I1, V8::I2, V8::I3, V8::I4, V8::I5 };
   std::vector<SDOperand> ArgValues;
 
   MachineFunction &MF = DAG.getMachineFunction();
@@ -127,6 +128,68 @@ V8TargetLowering::LowerArguments(Function &F, SelectionDAG &DAG)
 
   MachineBasicBlock& BB = MF.front();
 
+  unsigned ArgNo = 0;
+  unsigned ArgOffset = 92;
+  for (Function::arg_iterator I = F.arg_begin(), E = F.arg_end();
+       I != E; ++I, ++ArgNo) {
+    MVT::ValueType VT = getValueType(I->getType());
+    SDOperand argt;
+    if (ArgNo < 6) {
+      switch(VT) {
+      default:
+        std::cerr << "Unknown Type " << VT << "\n";
+        abort();
+      case MVT::f64:
+      case MVT::i64:
+        //FIXME: figure out the build pair thing
+        assert(0 && "doubles and longs not supported yet");
+      case MVT::f32:
+        argt = DAG.getCopyFromReg(AddLiveIn(MF, IncomingArgRegs[ArgNo],
+                                            MVT::i32),
+                                  VT, DAG.getRoot());
+        //copy out of Int reg
+        argt = DAG.getNode(ISD::FP_TO_UINT, MVT::f32, argt);
+        break;
+      case MVT::i1:
+      case MVT::i8:
+      case MVT::i16:
+      case MVT::i32:
+        argt = DAG.getCopyFromReg(AddLiveIn(MF, IncomingArgRegs[ArgNo], 
+                                            getRegClassFor(MVT::i32)), 
+                                  VT, DAG.getRoot());
+        if (VT != MVT::i32)
+          argt = DAG.getNode(ISD::TRUNCATE, VT, argt);
+        break;
+      }
+      DAG.setRoot(argt.getValue(1));
+    } else {
+      //stack passed
+      switch(VT) {
+      default:
+        std::cerr << "Unknown Type " << VT << "\n";
+        abort();
+      case MVT::f64:
+      case MVT::i64:
+        //FIXME: figure out the build pair thing
+        assert(0 && "doubles and longs not supported yet");
+      case MVT::f32:
+      case MVT::i1:
+      case MVT::i8:
+      case MVT::i16:
+      case MVT::i32:
+      // Create the frame index object for this incoming parameter...
+      int FI = MFI->CreateFixedObject(4, ArgOffset);
+      argt = DAG.getLoad(VT,
+                         DAG.getEntryNode(),
+                         DAG.getFramIndex(FI, MVT::i32),
+                         DAG.getSrcValue(NULL));
+      ArgOffset += 4;
+      break;
+      }
+      ArgValues.push_back(argt);
+    }
+  }
+
   //return the arguments
   return ArgValues;
 }