2007-02-13 Andreas Krebbel <krebbel1@de.ibm.com>
authorkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 13 Feb 2007 07:54:40 +0000 (07:54 +0000)
committerkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 13 Feb 2007 07:54:40 +0000 (07:54 +0000)
* src/s390/ffi.c (ffi_prep_args, ffi_prep_cif_machdep,
ffi_closure_helper_SYSV): Add long double handling.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@121879 138bc75d-0d04-0410-961f-82ee72b054a4

libffi/ChangeLog
libffi/src/s390/ffi.c

index 4b3c509..5a67ccd 100644 (file)
@@ -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
index 399fa2a..2809aa3 100644 (file)
@@ -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.  */