mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-13 09:50:15 +08:00
ffi.c (ffi_prep_args, [...]): Add long double handling.
2007-02-13 Andreas Krebbel <krebbel1@de.ibm.com> * src/s390/ffi.c (ffi_prep_args, ffi_prep_cif_machdep, ffi_closure_helper_SYSV): Add long double handling. From-SVN: r121879
This commit is contained in:
parent
9606c9dd5e
commit
7a23933bdd
@ -1,3 +1,8 @@
|
||||
2007-02-13 Andreas Krebbel <krebbel1@de.ibm.com>
|
||||
|
||||
* src/s390/ffi.c (ffi_prep_args, ffi_prep_cif_machdep,
|
||||
ffi_closure_helper_SYSV): Add long double handling.
|
||||
|
||||
2007-02-02 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* src/powerpc/linux64.S (ffi_call_LINUX64): Move restore of r2
|
||||
|
@ -207,6 +207,12 @@ ffi_prep_args (unsigned char *stack, extended_cif *ecif)
|
||||
void *arg = *p_argv;
|
||||
int type = (*ptr)->type;
|
||||
|
||||
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
|
||||
/* 16-byte long double is passed like a struct. */
|
||||
if (type == FFI_TYPE_LONGDOUBLE)
|
||||
type = FFI_TYPE_STRUCT;
|
||||
#endif
|
||||
|
||||
/* Check how a structure type is passed. */
|
||||
if (type == FFI_TYPE_STRUCT)
|
||||
{
|
||||
@ -364,6 +370,12 @@ ffi_prep_cif_machdep(ffi_cif *cif)
|
||||
cif->flags = FFI390_RET_DOUBLE;
|
||||
break;
|
||||
|
||||
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
|
||||
case FFI_TYPE_LONGDOUBLE:
|
||||
cif->flags = FFI390_RET_STRUCT;
|
||||
n_gpr++;
|
||||
break;
|
||||
#endif
|
||||
/* Integer values are returned in gpr 2 (and gpr 3
|
||||
for 64-bit values on 31-bit machines). */
|
||||
case FFI_TYPE_UINT64:
|
||||
@ -400,6 +412,12 @@ ffi_prep_cif_machdep(ffi_cif *cif)
|
||||
{
|
||||
int type = (*ptr)->type;
|
||||
|
||||
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
|
||||
/* 16-byte long double is passed like a struct. */
|
||||
if (type == FFI_TYPE_LONGDOUBLE)
|
||||
type = FFI_TYPE_STRUCT;
|
||||
#endif
|
||||
|
||||
/* Check how a structure type is passed. */
|
||||
if (type == FFI_TYPE_STRUCT)
|
||||
{
|
||||
@ -562,6 +580,12 @@ ffi_closure_helper_SYSV (ffi_closure *closure,
|
||||
int deref_struct_pointer = 0;
|
||||
int type = (*ptr)->type;
|
||||
|
||||
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
|
||||
/* 16-byte long double is passed like a struct. */
|
||||
if (type == FFI_TYPE_LONGDOUBLE)
|
||||
type = FFI_TYPE_STRUCT;
|
||||
#endif
|
||||
|
||||
/* Check how a structure type is passed. */
|
||||
if (type == FFI_TYPE_STRUCT)
|
||||
{
|
||||
@ -662,6 +686,9 @@ ffi_closure_helper_SYSV (ffi_closure *closure,
|
||||
/* Void is easy, and so is struct. */
|
||||
case FFI_TYPE_VOID:
|
||||
case FFI_TYPE_STRUCT:
|
||||
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
|
||||
case FFI_TYPE_LONGDOUBLE:
|
||||
#endif
|
||||
break;
|
||||
|
||||
/* Floating point values are returned in fpr 0. */
|
||||
|
Loading…
Reference in New Issue
Block a user