OSDN Git Service

* src/types.c (double, longdouble): Merge identical SH and ARM
authoramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 11 Sep 2003 05:17:57 +0000 (05:17 +0000)
committeramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 11 Sep 2003 05:17:57 +0000 (05:17 +0000)
typedefs, and add POWERPC64.
* src/powerpc/ffi.c (ffi_prep_args64): Correct next_arg calc for
struct split over gpr and rest.
(ffi_prep_cif_machdep): Correct intarg_count for structures.
* src/powerpc/linux64.S (ffi_call_LINUX64): Fix gpr offsets.

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

libffi/ChangeLog
libffi/src/powerpc/ffi.c
libffi/src/powerpc/linux64.S
libffi/src/types.c

index bc9f28a..2efe64b 100644 (file)
@@ -1,3 +1,12 @@
+2003-09-11  Alan Modra  <amodra@bigpond.net.au>
+
+       * src/types.c (double, longdouble): Merge identical SH and ARM
+       typedefs, and add POWERPC64.
+       * src/powerpc/ffi.c (ffi_prep_args64): Correct next_arg calc for
+       struct split over gpr and rest.
+       (ffi_prep_cif_machdep): Correct intarg_count for structures.
+       * src/powerpc/linux64.S (ffi_call_LINUX64): Fix gpr offsets.
+
 2003-09-09  Andreas Tobler  <a.tobler@schweiz.ch>
 
        * src/powerpc/ffi.c (ffi_closure_helper_SYSV) Handle struct
index 010050f..9ad85ea 100644 (file)
@@ -376,11 +376,11 @@ void hidden ffi_prep_args64(extended_cif *ecif, unsigned long *const stack)
          words = ((*ptr)->size + 7) / 8;
          if (next_arg >= gpr_base && next_arg + words > gpr_end)
            {
-             unsigned int first = (char *) gpr_end - (char *) next_arg;
+             size_t first = (char *) gpr_end - (char *) next_arg;
              memcpy((char *) next_arg, (char *) *p_argv, first);
              memcpy((char *) rest, (char *) *p_argv + first,
                     (*ptr)->size - first);
-             next_arg = rest + words * 8 - first;
+             next_arg = (unsigned long *) ((char *) rest + words * 8 - first);
            }
          else
            {
@@ -591,7 +591,7 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
 #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
          case FFI_TYPE_LONGDOUBLE:
 #endif
-           intarg_count += ((*ptr)->size + 7) & ~7;
+           intarg_count += ((*ptr)->size + 7) / 8;
            break;
 
          default:
index d8af13b..2207980 100644 (file)
@@ -73,10 +73,10 @@ ffi_call_LINUX64:
        ld      %r5, -32-(6*8)(%r28)
        ld      %r6, -32-(5*8)(%r28)
        bf-     5, 1f
-       ld      %r7, -32-(4*4)(%r28)
-       ld      %r8, -32-(3*4)(%r28)
-       ld      %r9, -32-(2*4)(%r28)
-       ld      %r10, -32-(1*4)(%r28)
+       ld      %r7, -32-(4*8)(%r28)
+       ld      %r8, -32-(3*8)(%r28)
+       ld      %r9, -32-(2*8)(%r28)
+       ld      %r10, -32-(1*8)(%r28)
 1:
 
        /* Load all the FP registers.  */
index ae52f11..7d4d0a0 100644 (file)
@@ -76,12 +76,7 @@ FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64);
 FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
 FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE);
 
-#elif defined ARM
-
-FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
-FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE);
-
-#elif defined SH
+#elif defined ARM || defined SH || defined POWERPC64
 
 FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
 FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE);