aboutsummaryrefslogtreecommitdiff
path: root/libffi/src
diff options
context:
space:
mode:
authorAndreas Tobler <toa@pop.agri.ch>2002-02-21 20:14:28 +0100
committerDavid Edelsohn <dje@gcc.gnu.org>2002-02-21 14:14:28 -0500
commit287dd527bdaedd75aaccec7722a2b509c7a6a06c (patch)
tree3f27bf1a39a610820cbf8a4e771fe08062ffeb44 /libffi/src
parent7ab562744f55b1ddb17b3523fb94c3a49a45e7a1 (diff)
downloadgcc-287dd527bdaedd75aaccec7722a2b509c7a6a06c.zip
gcc-287dd527bdaedd75aaccec7722a2b509c7a6a06c.tar.gz
gcc-287dd527bdaedd75aaccec7722a2b509c7a6a06c.tar.bz2
ffi_darwin.c (ffi_prep_args): Skip appropriate number of GPRs for floating-point arguments.
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
Diffstat (limited to 'libffi/src')
-rw-r--r--libffi/src/powerpc/ffi_darwin.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/libffi/src/powerpc/ffi_darwin.c b/libffi/src/powerpc/ffi_darwin.c
index d4a986d..3cf504c 100644
--- a/libffi/src/powerpc/ffi_darwin.c
+++ b/libffi/src/powerpc/ffi_darwin.c
@@ -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