From: H.J. Lu Date: Fri, 21 May 2004 00:13:04 +0000 (+0000) Subject: re PR target/15301 ([3.3/3.4 only] gcc does not pass __m128 arguments correctly) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d05aa0afd8969e6c6e58f63795ffb0ffd89b5378;p=gcc.git re PR target/15301 ([3.3/3.4 only] gcc does not pass __m128 arguments correctly) 2004-05-20 H.J. Lu PR target/15301 * gcc.dg/compat/union-m128-1.h: New file. * gcc.dg/compat/union-m128-1_main.c: Likewise. * gcc.dg/compat/union-m128-1_x.c: Likewise. * gcc.dg/compat/union-m128-1_y.c: Likewise. From-SVN: r82077 --- diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f2fa8f4a0e0..99dcf889ec0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2004-05-20 H.J. Lu + + PR target/15301 + * gcc.dg/compat/union-m128-1.h: New file. + * gcc.dg/compat/union-m128-1_main.c: Likewise. + * gcc.dg/compat/union-m128-1_x.c: Likewise. + * gcc.dg/compat/union-m128-1_y.c: Likewise. + 2004-05-20 H.J. Lu PR target/15302 diff --git a/gcc/testsuite/gcc.dg/compat/union-m128-1.h b/gcc/testsuite/gcc.dg/compat/union-m128-1.h new file mode 100644 index 00000000000..56d80cbfb91 --- /dev/null +++ b/gcc/testsuite/gcc.dg/compat/union-m128-1.h @@ -0,0 +1,17 @@ +#include + +typedef struct +{ + __m128 x; +} SS_struct_mi128; + +typedef union +{ + __m128 x; +} SS_union_mi128; + +typedef union +{ + __m128 x; + unsigned long long u[2]; +} union_mi128; diff --git a/gcc/testsuite/gcc.dg/compat/union-m128-1_main.c b/gcc/testsuite/gcc.dg/compat/union-m128-1_main.c new file mode 100644 index 00000000000..69dd34dce57 --- /dev/null +++ b/gcc/testsuite/gcc.dg/compat/union-m128-1_main.c @@ -0,0 +1,21 @@ +/* { dg-options "-O" } */ + +#ifdef __x86_64__ +/* Test function argument passing. PR target/15301. */ + +extern void union_m128_1_x (void); +extern void exit (int); + +int +main () +{ + union_m128_1_x (); + exit (0); +} +#else +int +main () +{ + return 0; +} +#endif diff --git a/gcc/testsuite/gcc.dg/compat/union-m128-1_x.c b/gcc/testsuite/gcc.dg/compat/union-m128-1_x.c new file mode 100644 index 00000000000..0a6f8860d09 --- /dev/null +++ b/gcc/testsuite/gcc.dg/compat/union-m128-1_x.c @@ -0,0 +1,26 @@ +/* { dg-options "-O" } */ + +#ifdef __x86_64__ +#include "union-m128-1.h" + +SS_union_mi128 un; +SS_struct_mi128 st; + +extern void bar (); +extern void foo (); + +void +union_m128_1_x () +{ + union_mi128 x; + + x.u [0] = 0x123456789abcedf0LL; + x.u [1] = 0xfedcba9876543210LL; + un.x = x.x; + st.x = x.x; + bar(un); + bar(st); + foo(un); + foo(st); +} +#endif diff --git a/gcc/testsuite/gcc.dg/compat/union-m128-1_y.c b/gcc/testsuite/gcc.dg/compat/union-m128-1_y.c new file mode 100644 index 00000000000..153ed7d7440 --- /dev/null +++ b/gcc/testsuite/gcc.dg/compat/union-m128-1_y.c @@ -0,0 +1,29 @@ +/* { dg-options "-O" } */ + +#ifdef __x86_64__ +#include + +#include "union-m128-1.h" + +void +bar (SS_union_mi128 un) +{ + union_mi128 x; + + x.x = un.x; + if (x.u [0] != 0x123456789abcedf0LL + || x.u [1] != 0xfedcba9876543210LL) + abort (); +} + +void +foo (SS_struct_mi128 st) +{ + union_mi128 x; + + x.x = st.x; + if (x.u [0] != 0x123456789abcedf0LL + || x.u [1] != 0xfedcba9876543210LL) + abort (); +} +#endif