Make Complex long long/double/long double work
authorDale Johannesen <dalej@apple.com>
Mon, 17 Mar 2008 17:11:08 +0000 (17:11 +0000)
committerDale Johannesen <dalej@apple.com>
Mon, 17 Mar 2008 17:11:08 +0000 (17:11 +0000)
in ppc64 mode.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48459 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/PowerPC/PPCCallingConv.td
lib/Target/PowerPC/PPCISelLowering.cpp

index 6b6ae0778e8c35e3abe618a4a5648f617461c0c3..9f916f38d5e4936ac30512444cea53278f38b8fb 100644 (file)
@@ -23,7 +23,7 @@ class CCIfSubtarget<string F, CCAction A>
 // Return-value convention for PowerPC
 def RetCC_PPC : CallingConv<[
   CCIfType<[i32], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10]>>,
-  CCIfType<[i64], CCAssignToReg<[X3, X4]>>,
+  CCIfType<[i64], CCAssignToReg<[X3, X4, X5, X6]>>,
   
   CCIfType<[f32], CCAssignToReg<[F1]>>,
   CCIfType<[f64], CCAssignToReg<[F1, F2]>>,
index c6885cf7b8a4b54cef863d6e79e4f9ee7dafe315..88d4b5f63d7d866e2183f77a70b0c3c9a4cbedf6 100644 (file)
@@ -2259,7 +2259,24 @@ SDOperand PPCTargetLowering::LowerCALL(SDOperand Op, SelectionDAG &DAG,
     NodeTys.push_back(MVT::i32);
     break;
   case MVT::i64:
-    if (Op.Val->getValueType(1) == MVT::i64) {
+    if (Op.Val->getNumValues()>=4 && 
+        Op.Val->getValueType(3) == MVT::i64) {
+      Chain = DAG.getCopyFromReg(Chain, PPC::X3, MVT::i64, InFlag).getValue(1);
+      ResultVals[0] = Chain.getValue(0);
+      Chain = DAG.getCopyFromReg(Chain, PPC::X4, MVT::i64,
+                                 Chain.getValue(2)).getValue(1);
+      ResultVals[1] = Chain.getValue(0);
+      Chain = DAG.getCopyFromReg(Chain, PPC::X5, MVT::i64,
+                                 Chain.getValue(2)).getValue(1);
+      ResultVals[2] = Chain.getValue(0);
+      Chain = DAG.getCopyFromReg(Chain, PPC::X6, MVT::i64,
+                                 Chain.getValue(2)).getValue(1);
+      ResultVals[3] = Chain.getValue(0);
+      NumResults = 4;
+      NodeTys.push_back(MVT::i64);
+      NodeTys.push_back(MVT::i64);
+      NodeTys.push_back(MVT::i64);
+    } else if (Op.Val->getValueType(1) == MVT::i64) {
       Chain = DAG.getCopyFromReg(Chain, PPC::X3, MVT::i64, InFlag).getValue(1);
       ResultVals[0] = Chain.getValue(0);
       Chain = DAG.getCopyFromReg(Chain, PPC::X4, MVT::i64,