[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp

Nate Begeman natebegeman at mac.com
Sun Apr 3 16:11:28 PDT 2005



Changes in directory llvm/lib/Target/PowerPC:

PPC32ISelPattern.cpp updated: 1.38 -> 1.39
---
Log message:

Full varargs support.  All of UnitTests now passes


---
Diffs of the changes:  (+15 -5)

 PPC32ISelPattern.cpp |   20 +++++++++++++++-----
 1 files changed, 15 insertions(+), 5 deletions(-)


Index: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp
diff -u llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.38 llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.39
--- llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.38	Sun Apr  3 17:22:56 2005
+++ llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp	Sun Apr  3 18:11:17 2005
@@ -194,12 +194,22 @@
   // the start of the first vararg value... for expansion of llvm.va_start.
   if (F.isVarArg()) {
     VarArgsFrameIndex = MFI->CreateFixedObject(4, ArgOffset);
-    // If this function is vararg, store r4-r10 to their spots on the stack so
-    // that they may be loaded by dereferencing va_next
     SDOperand FIN = DAG.getFrameIndex(VarArgsFrameIndex, MVT::i32);
-    SDOperand Val = DAG.getCopyFromReg(PPC::R4, MVT::i32, DAG.getRoot());
-    SDOperand Store = DAG.getNode(ISD::STORE, MVT::Other, Val.getValue(1), Val, FIN);
-    DAG.setRoot(Store);
+    // If this function is vararg, store any remaining integer argument regs
+    // to their spots on the stack so that they may be loaded by deferencing the
+    // result of va_next.
+    std::vector<SDOperand> MemOps;
+    for (; GPR_remaining > 0; --GPR_remaining, ++GPR_idx) {
+      BuildMI(&BB, PPC::IMPLICIT_DEF, 0, GPR[GPR_idx]);
+      SDOperand Val = DAG.getCopyFromReg(GPR[GPR_idx], MVT::i32, DAG.getRoot());
+      SDOperand Store = DAG.getNode(ISD::STORE, MVT::Other, Val.getValue(1), 
+                                    Val, FIN);
+      MemOps.push_back(Store);
+      // Increment the address by four for the next argument to store
+      SDOperand PtrOff = DAG.getConstant(4, getPointerTy());
+      FIN = DAG.getNode(ISD::ADD, MVT::i32, FIN, PtrOff);
+    }
+    DAG.setRoot(DAG.getNode(ISD::TokenFactor, MVT::Other, MemOps));
   }
 
   return ArgValues;






More information about the llvm-commits mailing list