From 2d9c5743d6e8b054b7fbbc8a881c94b45b12053f Mon Sep 17 00:00:00 2001
From: Alan Modra <amodra@bigpond.net.au>
Date: Thu, 25 Aug 2005 00:54:54 +0000
Subject: [PATCH] re PR target/23404 (gij trashes args of functions with more
 than 8 fp args)

	PR target/23404
	* src/powerpc/ffi.c (ffi_prep_args_SYSV): Correct placement of stack
	homed fp args.
	(ffi_status ffi_prep_cif_machdep): Correct stack sizing for same.

From-SVN: r103462
---
 libffi/ChangeLog         | 7 +++++++
 libffi/src/powerpc/ffi.c | 6 ++++--
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/libffi/ChangeLog b/libffi/ChangeLog
index 33fe14ae3322..fd61c4b80d6e 100644
--- a/libffi/ChangeLog
+++ b/libffi/ChangeLog
@@ -1,3 +1,10 @@
+2005-08-25  Alan Modra  <amodra@bigpond.net.au>
+
+	PR target/23404
+	* src/powerpc/ffi.c (ffi_prep_args_SYSV): Correct placement of stack
+	homed fp args.
+	(ffi_status ffi_prep_cif_machdep): Correct stack sizing for same.
+
 2005-08-11  Jakub Jelinek  <jakub@redhat.com>
 
 	* configure.ac (HAVE_HIDDEN_VISIBILITY_ATTRIBUTE): New test.
diff --git a/libffi/src/powerpc/ffi.c b/libffi/src/powerpc/ffi.c
index ed02bf38d560..cc410bc6bdc9 100644
--- a/libffi/src/powerpc/ffi.c
+++ b/libffi/src/powerpc/ffi.c
@@ -155,7 +155,8 @@ void ffi_prep_args_SYSV(extended_cif *ecif, unsigned *const stack)
 
 	  if (fparg_count >= NUM_FPR_ARG_REGISTERS)
 	    {
-	      if (intarg_count%2 != 0)
+	      if (intarg_count >= NUM_GPR_ARG_REGISTERS
+		  && intarg_count % 2 != 0)
 		{
 		  intarg_count++;
 		  next_arg++;
@@ -575,7 +576,8 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
 	    /* If this FP arg is going on the stack, it must be
 	       8-byte-aligned.  */
 	    if (fparg_count > NUM_FPR_ARG_REGISTERS
-		&& intarg_count%2 != 0)
+		&& intarg_count >= NUM_GPR_ARG_REGISTERS
+		&& intarg_count % 2 != 0)
 	      intarg_count++;
 	    break;
 
-- 
GitLab