diff options
author | Andreas Tobler <toa@pop.agri.ch> | 2002-02-21 20:14:28 +0100 |
---|---|---|
committer | David Edelsohn <dje@gcc.gnu.org> | 2002-02-21 14:14:28 -0500 |
commit | 287dd527bdaedd75aaccec7722a2b509c7a6a06c (patch) | |
tree | 3f27bf1a39a610820cbf8a4e771fe08062ffeb44 /libffi/src | |
parent | 7ab562744f55b1ddb17b3523fb94c3a49a45e7a1 (diff) | |
download | gcc-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.c | 20 |
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 |