re PR target/21149 (invalid code generation for _mm_movehl_ps SSE intrisinc)
authorJakub Jelinek <jakub@redhat.com>
Thu, 28 Jul 2005 14:38:13 +0000 (16:38 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 28 Jul 2005 14:38:13 +0000 (16:38 +0200)
PR target/21149
* gcc.target/i386/sse-3.c: New test.

From-SVN: r102482

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/sse-3.c [new file with mode: 0644]

index 46434bf..89f6ea2 100644 (file)
@@ -1,3 +1,8 @@
+2005-07-28  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/21149
+       * gcc.target/i386/sse-3.c: New test.
+
 2005-07-28  Richard Sandiford  <richard@codesourcery.com>
 
        * gcc.target/mips/mips32-dsp.c: Use -march=mips32 instead of -mips32.
diff --git a/gcc/testsuite/gcc.target/i386/sse-3.c b/gcc/testsuite/gcc.target/i386/sse-3.c
new file mode 100644 (file)
index 0000000..b09adda
--- /dev/null
@@ -0,0 +1,53 @@
+/* PR target/21149 */
+/* { dg-do run } */
+/* { dg-options "-O2 -msse" } */
+#include <xmmintrin.h>
+#include "../../gcc.dg/i386-cpuid.h"
+
+extern void abort (void);
+
+void
+__attribute__((noinline))
+check (__m128 x, float a, float b, float c, float d)
+{
+  union { __m128 m; float f[4]; } u;
+  u.m = x;
+  if (u.f[0] != a || u.f[1] != b || u.f[2] != c || u.f[3] != d)
+    abort ();
+}
+
+static inline
+void
+foo (__m128 *x)
+{
+  __m128 y = _mm_setzero_ps ();
+  __m128 v = _mm_movehl_ps (y, *x);
+  __m128 w = _mm_movehl_ps (*x, y);
+  check (*x, 9, 1, 2, -3);
+  check (v, 2, -3, 0, 0);
+  check (w, 0, 0, 2, -3);
+}
+
+void
+__attribute__((noinline))
+run_tests (void)
+{
+  __m128 y = _mm_set_ps (-3, 2, 1, 9);
+  foo (&y);
+}
+
+int
+main ()
+{
+  unsigned long cpu_facilities;
+
+  cpu_facilities = i386_cpuid ();
+
+  if ((cpu_facilities & (bit_MMX | bit_SSE | bit_CMOV))
+      != (bit_MMX | bit_SSE | bit_CMOV))
+    /* If host has no vector support, pass.  */
+    return 0;
+
+  run_tests ();
+  return 0;
+}