Commit 7a23933b by Andreas Krebbel Committed by Andreas Krebbel

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
parent 9606c9dd
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> 2007-02-02 Jakub Jelinek <jakub@redhat.com>
* src/powerpc/linux64.S (ffi_call_LINUX64): Move restore of r2 * src/powerpc/linux64.S (ffi_call_LINUX64): Move restore of r2
......
...@@ -207,6 +207,12 @@ ffi_prep_args (unsigned char *stack, extended_cif *ecif) ...@@ -207,6 +207,12 @@ ffi_prep_args (unsigned char *stack, extended_cif *ecif)
void *arg = *p_argv; void *arg = *p_argv;
int type = (*ptr)->type; 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. */ /* Check how a structure type is passed. */
if (type == FFI_TYPE_STRUCT) if (type == FFI_TYPE_STRUCT)
{ {
...@@ -364,6 +370,12 @@ ffi_prep_cif_machdep(ffi_cif *cif) ...@@ -364,6 +370,12 @@ ffi_prep_cif_machdep(ffi_cif *cif)
cif->flags = FFI390_RET_DOUBLE; cif->flags = FFI390_RET_DOUBLE;
break; 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 /* Integer values are returned in gpr 2 (and gpr 3
for 64-bit values on 31-bit machines). */ for 64-bit values on 31-bit machines). */
case FFI_TYPE_UINT64: case FFI_TYPE_UINT64:
...@@ -400,6 +412,12 @@ ffi_prep_cif_machdep(ffi_cif *cif) ...@@ -400,6 +412,12 @@ ffi_prep_cif_machdep(ffi_cif *cif)
{ {
int type = (*ptr)->type; 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. */ /* Check how a structure type is passed. */
if (type == FFI_TYPE_STRUCT) if (type == FFI_TYPE_STRUCT)
{ {
...@@ -562,6 +580,12 @@ ffi_closure_helper_SYSV (ffi_closure *closure, ...@@ -562,6 +580,12 @@ ffi_closure_helper_SYSV (ffi_closure *closure,
int deref_struct_pointer = 0; int deref_struct_pointer = 0;
int type = (*ptr)->type; 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. */ /* Check how a structure type is passed. */
if (type == FFI_TYPE_STRUCT) if (type == FFI_TYPE_STRUCT)
{ {
...@@ -662,6 +686,9 @@ ffi_closure_helper_SYSV (ffi_closure *closure, ...@@ -662,6 +686,9 @@ ffi_closure_helper_SYSV (ffi_closure *closure,
/* Void is easy, and so is struct. */ /* Void is easy, and so is struct. */
case FFI_TYPE_VOID: case FFI_TYPE_VOID:
case FFI_TYPE_STRUCT: case FFI_TYPE_STRUCT:
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
case FFI_TYPE_LONGDOUBLE:
#endif
break; break;
/* Floating point values are returned in fpr 0. */ /* Floating point values are returned in fpr 0. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment