[llvm-commits] CVS: llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp

Chris Lattner lattner at cs.uiuc.edu
Sat Dec 17 00:03:36 PST 2005



Changes in directory llvm/lib/Target/SparcV8:

SparcV8ISelDAGToDAG.cpp updated: 1.1 -> 1.2
---
Log message:

Implement LowerArguments, at least for the first 6 integer args


---
Diffs of the changes:  (+63 -2)

 SparcV8ISelDAGToDAG.cpp |   65 ++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 63 insertions(+), 2 deletions(-)


Index: llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp
diff -u llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp:1.1 llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp:1.2
--- llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp:1.1	Sat Dec 17 01:47:01 2005
+++ llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp	Sat Dec 17 02:03:24 2005
@@ -13,8 +13,11 @@
 
 #include "SparcV8.h"
 #include "SparcV8TargetMachine.h"
+#include "llvm/Function.h"
+#include "llvm/CodeGen/MachineFunction.h"
 #include "llvm/CodeGen/SelectionDAG.h"
 #include "llvm/CodeGen/SelectionDAGISel.h"
+#include "llvm/CodeGen/SSARegMap.h"
 #include "llvm/Target/TargetLowering.h"
 #include "llvm/Support/Debug.h"
 #include <iostream>
@@ -63,8 +66,66 @@
 
 std::vector<SDOperand>
 SparcV8TargetLowering::LowerArguments(Function &F, SelectionDAG &DAG) {
-  assert(0 && "Unimp");
-  abort();
+  MachineFunction &MF = DAG.getMachineFunction();
+  SSARegMap *RegMap = MF.getSSARegMap();
+  std::vector<SDOperand> ArgValues;
+  
+  static const unsigned GPR[] = {
+    V8::I0, V8::I1, V8::I2, V8::I3, V8::I4, V8::I5
+  };
+  unsigned ArgNo = 0;
+  for (Function::arg_iterator I = F.arg_begin(), E = F.arg_end(); I != E; ++I) {
+    MVT::ValueType ObjectVT = getValueType(I->getType());
+    assert(ArgNo < 6 && "Only args in regs for now");
+    
+    switch (ObjectVT) {
+    default: assert(0 && "Unhandled argument type!");
+    // TODO: MVT::i64 & FP
+    case MVT::i1:
+    case MVT::i8:
+    case MVT::i16:
+    case MVT::i32: {
+      unsigned VReg = RegMap->createVirtualRegister(&V8::IntRegsRegClass);
+      MF.addLiveIn(GPR[ArgNo++], VReg);
+      SDOperand Arg = DAG.getCopyFromReg(DAG.getRoot(), VReg, MVT::i32);
+      DAG.setRoot(Arg.getValue(1));
+      if (ObjectVT != MVT::i32) {
+        unsigned AssertOp = I->getType()->isSigned() ? ISD::AssertSext 
+                                                     : ISD::AssertZext;
+        Arg = DAG.getNode(AssertOp, MVT::i32, Arg, 
+                          DAG.getValueType(ObjectVT));
+        Arg = DAG.getNode(ISD::TRUNCATE, ObjectVT, Arg);
+      }
+      ArgValues.push_back(Arg);
+    }
+    }
+  }
+  
+  assert(!F.isVarArg() && "Unimp");
+  
+  // Finally, inform the code generator which regs we return values in.
+  switch (getValueType(F.getReturnType())) {
+  default: assert(0 && "Unknown type!");
+  case MVT::isVoid: break;
+  case MVT::i1:
+  case MVT::i8:
+  case MVT::i16:
+  case MVT::i32:
+    MF.addLiveOut(V8::I0);
+    break;
+  case MVT::i64:
+    MF.addLiveOut(V8::I0);
+    MF.addLiveOut(V8::I1);
+    break;
+  case MVT::f32:
+    MF.addLiveOut(V8::F0);
+    break;
+  case MVT::f64:
+    MF.addLiveOut(V8::D0);
+    break;
+  }
+  
+  return ArgValues;
 }
 
 std::pair<SDOperand, SDOperand>






More information about the llvm-commits mailing list