ffi_darwin.c (ffi_prep_args): Skip appropriate number of GPRs for floating-point...
authorAndreas Tobler <toa@pop.agri.ch>
Thu, 21 Feb 2002 19:14:28 +0000 (20:14 +0100)
committerDavid Edelsohn <dje@gcc.gnu.org>
Thu, 21 Feb 2002 19:14:28 +0000 (14:14 -0500)
2002-02-21  Andreas Tobler  <toa@pop.agri.ch>

        * src/powerpc/ffi_darwin.c (ffi_prep_args): Skip appropriate
        number of GPRs for floating-point arguments.

From-SVN: r49934

libffi/ChangeLog
libffi/src/powerpc/ffi_darwin.c

index 2c59c6a3e43d5c48718ba7f5797aa35a6ad6620c..f98ef9f9924e8178a9feb70aafc6006f8fbc5898 100644 (file)
@@ -1,3 +1,8 @@
+2002-02-21  Andreas Tobler  <toa@pop.agri.ch>
+
+       * src/powerpc/ffi_darwin.c (ffi_prep_args): Skip appropriate
+       number of GPRs for floating-point arguments.
+
 2002-01-31  Anthony Green  <green@redhat.com>
 
        * configure: Rebuilt.
index d4a986dbbd3c3da2b20c572be0f5a2309aac6039..3cf504cf150ff7903660a9dbcce49e78adc2513e 100644 (file)
@@ -6,7 +6,7 @@
    Darwin ABI support (c) 2001 John Hornkvist
    AIX ABI support (c) 2002 Free Software Foundation, Inc.
 
-   $Id: ffi_darwin.c,v 1.1 2002/01/16 05:32:15 bryce Exp $
+   $Id: ffi_darwin.c,v 1.2 2002/01/17 16:04:21 dje Exp $
 
    Permission is hereby granted, free of charge, to any person obtaining
    a copy of this software and associated documentation files (the
@@ -121,13 +121,21 @@ void ffi_prep_args(extended_cif *ecif, unsigned *const stack)
     {
       switch ((*ptr)->type)
        {
+       /* If a floating-point parameter appears before all of the general-
+          purpose registers are filled, the corresponding GPRs that match
+          the size of the floating-point parameter are skipped.  */
        case FFI_TYPE_FLOAT:
-       case FFI_TYPE_DOUBLE:
-         if ((*ptr)->type == FFI_TYPE_FLOAT)
-           double_tmp = *(float *)*p_argv;
+         double_tmp = *(float *)*p_argv;
+         if (fparg_count >= NUM_FPR_ARG_REGISTERS)
+            *(double *)next_arg = double_tmp;
          else
-           double_tmp = *(double *)*p_argv;
-
+            *fpr_base++ = double_tmp;
+          next_arg++;
+         fparg_count++;
+         FFI_ASSERT(flags & FLAG_FP_ARGUMENTS);
+         break;
+       case FFI_TYPE_DOUBLE:
+         double_tmp = *(double *)*p_argv;
          if (fparg_count >= NUM_FPR_ARG_REGISTERS)
             *(double *)next_arg = double_tmp;
          else