summaryrefslogtreecommitdiffstats
path: root/libffi
diff options
context:
space:
mode:
authorschwab <schwab@138bc75d-0d04-0410-961f-82ee72b054a4>2004-03-11 14:25:44 +0000
committerschwab <schwab@138bc75d-0d04-0410-961f-82ee72b054a4>2004-03-11 14:25:44 +0000
commit52cee448941b43b9fa80cacdc347408435567de2 (patch)
treeba689ff75b31513162adabcf47e243128c66fba1 /libffi
parentf706c513574e21e18171b9f53df05b0a4027290e (diff)
downloadppe42-gcc-52cee448941b43b9fa80cacdc347408435567de2.tar.gz
ppe42-gcc-52cee448941b43b9fa80cacdc347408435567de2.zip
* src/ia64/ffi.c (ffi_prep_incoming_args_UNIX): Get floating point
arguments from fp registers only for the first 8 parameter slots. Don't convert a float parameter when passed in memory. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@79323 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libffi')
-rw-r--r--libffi/ChangeLog6
-rw-r--r--libffi/src/ia64/ffi.c15
2 files changed, 13 insertions, 8 deletions
diff --git a/libffi/ChangeLog b/libffi/ChangeLog
index 2d3a1e8f301..4b966cdd806 100644
--- a/libffi/ChangeLog
+++ b/libffi/ChangeLog
@@ -1,3 +1,9 @@
+2004-03-11 Andreas Schwab <schwab@suse.de>
+
+ * src/ia64/ffi.c (ffi_prep_incoming_args_UNIX): Get floating point
+ arguments from fp registers only for the first 8 parameter slots.
+ Don't convert a float parameter when passed in memory.
+
2004-03-09 Hans-Peter Nilsson <hp@axis.com>
* configure: Regenerate for config/accross.m4 correction.
diff --git a/libffi/src/ia64/ffi.c b/libffi/src/ia64/ffi.c
index c846f6e1338..1dc27dbce4f 100644
--- a/libffi/src/ia64/ffi.c
+++ b/libffi/src/ia64/ffi.c
@@ -196,7 +196,7 @@ ffi_prep_args(struct ia64_args *stack, extended_cif *ecif, int bytes)
*fp_argp++ = *(float *)(* p_argv);
}
/* Also put it into the integer registers or memory: */
- *(UINT64 *) argp = *(UINT32 *)(* p_argv);
+ *(UINT64 *) argp = *(UINT32 *)(* p_argv);
break;
case FFI_TYPE_DOUBLE:
@@ -204,7 +204,7 @@ ffi_prep_args(struct ia64_args *stack, extended_cif *ecif, int bytes)
if (fp_argp - stack->fp_regs < 8)
*fp_argp++ = *(double *)(* p_argv);
/* Also put it into the integer registers or memory: */
- *(double *) argp = *(double *)(* p_argv);
+ *(double *) argp = *(double *)(* p_argv);
break;
case FFI_TYPE_STRUCT:
@@ -547,7 +547,7 @@ ffi_prep_incoming_args_UNIX(struct ia64_args *args, void **rvalue,
register unsigned int i;
register unsigned int avn;
register void **p_argv;
- register unsigned long *argp = args -> out_regs;
+ register long *argp = args -> out_regs;
unsigned fp_reg_num = 0;
register ffi_type **p_arg;
@@ -576,17 +576,15 @@ ffi_prep_incoming_args_UNIX(struct ia64_args *args, void **rvalue,
case FFI_TYPE_FLOAT:
z = 1;
/* Convert argument back to float in place from the saved value */
- if (fp_reg_num < 8) {
+ if (argp - args->out_regs < 8 && fp_reg_num < 8) {
*(float *)argp = args -> fp_regs[fp_reg_num++];
- } else {
- *(float *)argp = *(double *)argp;
}
*p_argv = (void *)argp;
break;
case FFI_TYPE_DOUBLE:
z = 1;
- if (fp_reg_num < 8) {
+ if (argp - args->out_regs < 8 && fp_reg_num < 8) {
*p_argv = args -> fp_regs + fp_reg_num++;
} else {
*p_argv = (void *)argp;
@@ -598,7 +596,8 @@ ffi_prep_incoming_args_UNIX(struct ia64_args *args, void **rvalue,
size_t sz = (*p_arg)->size;
unsigned short element_type;
z = ((*p_arg)->size + FFI_SIZEOF_ARG - 1)/FFI_SIZEOF_ARG;
- if (is_homogeneous_fp_aggregate(*p_arg, 8, &element_type)) {
+ if (argp - args->out_regs < 8
+ && is_homogeneous_fp_aggregate(*p_arg, 8, &element_type)) {
int nelements = sz/float_type_size(element_type);
if (nelements + fp_reg_num >= 8) {
/* hard case NYI. */
OpenPOWER on IntegriCloud