OSDN Git Service

* src/sh/sysv.S (ffi_call_SYSV): Don't align for double data.
authorkkojima <kkojima@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 21 Oct 2004 06:00:41 +0000 (06:00 +0000)
committerkkojima <kkojima@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 21 Oct 2004 06:00:41 +0000 (06:00 +0000)
* testsuite/libffi.call/float3.c: New test case.

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

libffi/ChangeLog
libffi/src/sh/sysv.S
libffi/testsuite/libffi.call/float3.c [new file with mode: 0644]

index bcf20c2..bae5f1b 100644 (file)
@@ -1,3 +1,8 @@
+2004-10-20  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+       * src/sh/sysv.S (ffi_call_SYSV): Don't align for double data.
+       * testsuite/libffi.call/float3.c: New test case.
+
 2004-10-18  Kaz Kojima  <kkojima@gcc.gnu.org>
 
        * src/sh/ffi.c (ffi_prep_closure): Set T bit in trampoline for
index d0a5ae2..887137d 100644 (file)
@@ -117,12 +117,6 @@ L_pass_d:
        bt      1f
        add     #1,r3
 1:
-       mov     r15,r0
-       and     #7,r0
-       tst     r0,r0
-       bt      2f
-       add     #4,r15
-2:
        mov     #12,r0
        cmp/hs  r0,r3
        bt/s    3f
diff --git a/libffi/testsuite/libffi.call/float3.c b/libffi/testsuite/libffi.call/float3.c
new file mode 100644 (file)
index 0000000..27933c3
--- /dev/null
@@ -0,0 +1,73 @@
+/* Area:       ffi_call
+   Purpose:    Check float arguments with different orders.
+   Limitations:        none.
+   PR:         none.
+   Originator: From the original ffitest.c  */
+
+/* { dg-do run } */
+/* { dg-options -mlong-double-128 { target powerpc64*-*-* } } */
+
+#include "ffitest.h"
+#include "float.h"
+
+static double floating_1(float a, double b, long double c)
+{
+  return (double) a + b + (double) c;
+}
+
+static double floating_2(long double a, double b, float c)
+{
+  return (double) a + b + (double) c;
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  double rd;
+
+  float f;
+  double d;
+  long double ld;
+
+  args[0] = &ffi_type_float;
+  values[0] = &f;
+  args[1] = &ffi_type_double;
+  values[1] = &d;
+  args[2] = &ffi_type_longdouble;
+  values[2] = &ld;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3,
+                    &ffi_type_double, args) == FFI_OK);
+
+  f = 3.14159;
+  d = (double)1.0/(double)3.0;
+  ld = 2.71828182846L;
+
+  floating_1 (f, d, ld);
+
+  ffi_call(&cif, FFI_FN(floating_1), &rd, values);
+
+  CHECK(rd - floating_1(f, d, ld) < DBL_EPSILON);
+
+  args[0] = &ffi_type_longdouble;
+  values[0] = &ld;
+  args[1] = &ffi_type_double;
+  values[1] = &d;
+  args[2] = &ffi_type_float;
+  values[2] = &f;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3,
+                    &ffi_type_double, args) == FFI_OK);
+
+  floating_2 (ld, d, f);
+
+  ffi_call(&cif, FFI_FN(floating_2), &rd, values);
+
+  CHECK(rd - floating_2(ld, d, f) < DBL_EPSILON);
+
+  exit (0);
+}