From: Andreas Tobler Date: Thu, 21 Feb 2002 19:14:28 +0000 (+0100) Subject: ffi_darwin.c (ffi_prep_args): Skip appropriate number of GPRs for floating-point... X-Git-Tag: prereleases/libstdc++-3.0.97~238 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=287dd527bdaedd75aaccec7722a2b509c7a6a06c;p=thirdparty%2Fgcc.git ffi_darwin.c (ffi_prep_args): Skip appropriate number of GPRs for floating-point arguments. 2002-02-21 Andreas Tobler * src/powerpc/ffi_darwin.c (ffi_prep_args): Skip appropriate number of GPRs for floating-point arguments. From-SVN: r49934 --- diff --git a/libffi/ChangeLog b/libffi/ChangeLog index 2c59c6a3e43d..f98ef9f9924e 100644 --- a/libffi/ChangeLog +++ b/libffi/ChangeLog @@ -1,3 +1,8 @@ +2002-02-21 Andreas Tobler + + * src/powerpc/ffi_darwin.c (ffi_prep_args): Skip appropriate + number of GPRs for floating-point arguments. + 2002-01-31 Anthony Green * configure: Rebuilt. diff --git a/libffi/src/powerpc/ffi_darwin.c b/libffi/src/powerpc/ffi_darwin.c index d4a986dbbd3c..3cf504cf150f 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