on ppc64, float arguments take 8-byte stack slots not 4-byte stack slots.
authorChris Lattner <sabre@nondot.org>
Sat, 18 Nov 2006 01:57:19 +0000 (01:57 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 18 Nov 2006 01:57:19 +0000 (01:57 +0000)
Also, valist should create a pointer RC reg class value, not a GPRC value.

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

lib/Target/PowerPC/PPCISelLowering.cpp

index e96550085a16f6c29205236087e5d99be73ab56d..f85033dadad8dbe973b3ca9372106af7ee146d76 100644 (file)
@@ -1155,13 +1155,13 @@ static SDOperand LowerFORMAL_ARGUMENTS(SDOperand Op, SelectionDAG &DAG,
     case MVT::f32:
     case MVT::f64:
       // All FP arguments reserve stack space.
-      ArgOffset += ObjSize;
+      ArgOffset += isPPC64 ? 8 : ObjSize;
 
       // Every 4 bytes of argument space consumes one of the GPRs available for
       // argument passing.
       if (GPR_idx != Num_GPR_Regs) {
         ++GPR_idx;
-        if (ObjSize == 8 && GPR_idx != Num_GPR_Regs)
+        if (ObjSize == 8 && GPR_idx != Num_GPR_Regs && !isPPC64)
           ++GPR_idx;
       }
       if (FPR_idx != Num_FPR_Regs) {
@@ -1226,7 +1226,12 @@ static SDOperand LowerFORMAL_ARGUMENTS(SDOperand Op, SelectionDAG &DAG,
     // result of va_next.
     SmallVector<SDOperand, 8> MemOps;
     for (; GPR_idx != Num_GPR_Regs; ++GPR_idx) {
-      unsigned VReg = RegMap->createVirtualRegister(&PPC::GPRCRegClass);
+      unsigned VReg;
+      if (isPPC64)
+        VReg = RegMap->createVirtualRegister(&PPC::G8RCRegClass);
+      else
+        VReg = RegMap->createVirtualRegister(&PPC::GPRCRegClass);
+
       MF.addLiveIn(GPR[GPR_idx], VReg);
       SDOperand Val = DAG.getCopyFromReg(Root, VReg, PtrVT);
       SDOperand Store = DAG.getStore(Val.getValue(1), Val, FIN, NULL, 0);