ffi.c (ffi_prep_args64): Correct long double handling.

* src/powerpc/ffi.c (ffi_prep_args64): Correct long double handling.
	(ffi_closure_helper_LINUX64): Fix typo.
	* testsuite/libffi.call/cls_align_longdouble.c: Pass -mlong-double-128
	for powerpc64-*-*.
	* testsuite/libffi.call/float.c: Likewise.
	* testsuite/libffi.call/float2.c: Likewise.

From-SVN: r77522
This commit is contained in:
Alan Modra 2004-02-09 03:39:48 +00:00 committed by Alan Modra
parent 3b4b85c945
commit 4243752ca1
5 changed files with 48 additions and 19 deletions

View File

@ -1,3 +1,12 @@
2004-02-09 Alan Modra <amodra@bigpond.net.au>
* src/powerpc/ffi.c (ffi_prep_args64): Correct long double handling.
(ffi_closure_helper_LINUX64): Fix typo.
* testsuite/libffi.call/cls_align_longdouble.c: Pass -mlong-double-128
for powerpc64-*-*.
* testsuite/libffi.call/float.c: Likewise.
* testsuite/libffi.call/float2.c: Likewise.
2004-02-08 Alan Modra <amodra@bigpond.net.au>
* src/powerpc/ffi.c (ffi_prep_cif_machdep <FFI_LINUX64>): Correct

View File

@ -369,10 +369,27 @@ void hidden ffi_prep_args64(extended_cif *ecif, unsigned long *const stack)
FFI_ASSERT(flags & FLAG_FP_ARGUMENTS);
break;
case FFI_TYPE_STRUCT:
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
case FFI_TYPE_LONGDOUBLE:
double_tmp = ((double *) *p_argv)[0];
*(double *) next_arg = double_tmp;
if (++next_arg == gpr_end)
next_arg = rest;
if (fparg_count < NUM_FPR_ARG_REGISTERS64)
*fpr_base++ = double_tmp;
fparg_count++;
double_tmp = ((double *) *p_argv)[1];
*(double *) next_arg = double_tmp;
if (++next_arg == gpr_end)
next_arg = rest;
if (fparg_count < NUM_FPR_ARG_REGISTERS64)
*fpr_base++ = double_tmp;
fparg_count++;
FFI_ASSERT(flags & FLAG_FP_ARGUMENTS);
break;
#endif
case FFI_TYPE_STRUCT:
words = ((*ptr)->size + 7) / 8;
if (next_arg >= gpr_base && next_arg + words > gpr_end)
{
@ -1079,7 +1096,7 @@ ffi_closure_helper_LINUX64 (ffi_closure *closure, void *rvalue,
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
case FFI_TYPE_LONGDOUBLE:
if (prf + 1 < end_pfr)
if (pfr + 1 < end_pfr)
{
avalue[i] = pfr;
pfr += 2;

View File

@ -5,6 +5,8 @@
Originator: <hos@tamanegi.org> 20031203 */
/* { dg-do run { xfail mips*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
/* { dg-options -mlong-double-128 { target powerpc64*-*-* } } */
#include "ffitest.h"
typedef struct cls_struct_align {

View File

@ -5,6 +5,8 @@
Originator: From the original ffitest.c */
/* { dg-do run } */
/* { dg-options -mlong-double-128 { target powerpc64*-*-* } } */
#include "ffitest.h"
static int floating(int a, float b, double c, long double d, int e)
@ -29,8 +31,6 @@ int main (void)
long double ld;
signed int si2;
args[0] = &ffi_type_sint;
values[0] = &si1;
args[1] = &ffi_type_float;
@ -62,4 +62,3 @@ int main (void)
exit (0);
}

View File

@ -5,6 +5,8 @@
Originator: From the original ffitest.c */
/* { dg-do run } */
/* { dg-options -mlong-double-128 { target powerpc64*-*-* } } */
#include "ffitest.h"
#include "float.h"