avx-os-support.h: New.
authorUros Bizjak <ubizjak@gmail.com>
Wed, 27 Jul 2011 15:39:58 +0000 (17:39 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Wed, 27 Jul 2011 15:39:58 +0000 (17:39 +0200)
* gcc.target/i386/avx-os-support.h: New.
* gcc.target/i386/avx-check.h: Include avx-os-support.h
(main): Check avx_os_support before the test is run.
* gcc.target/i386/aes-avx-check.h: Ditto.
* gcc.target/i386/pclmul-avx-check.h: Ditto.

From-SVN: r176829

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/aes-avx-check.h
gcc/testsuite/gcc.target/i386/avx-check.h
gcc/testsuite/gcc.target/i386/avx-os-support.h [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pclmul-avx-check.h

index a90a639d9334ec339841811baad9923783bf2b8e..9beb225f3cc83e02b98dcf5dbeb3a811d0237cc6 100644 (file)
@@ -1,3 +1,11 @@
+2011-07-27  Uros Bizjak  <ubizjak@gmail.com>
+
+       * gcc.target/i386/avx-os-support.h: New.
+       * gcc.target/i386/avx-check.h: Include avx-os-support.h
+       (main): Check avx_os_support before the test is run.
+       * gcc.target/i386/aes-avx-check.h: Ditto.
+       * gcc.target/i386/pclmul-avx-check.h: Ditto.
+
 2011-07-27  Kai Tietz  <ktietz@redhat.com>
 
        * gcc.target/i386/aggregate-ret3.c: New test.
index 36a038ea341c7d901ddfbdaa2cd4498a01fa9fee..f2a4ead401450434c364e0b3b6c8007f3869ddc8 100644 (file)
@@ -3,6 +3,7 @@
 #endif
 #include <stdlib.h>
 #include "cpuid.h"
+#include "avx-os-support.h"
 
 static void aes_avx_test (void);
 
@@ -22,8 +23,9 @@ main ()
     return 0;
 
   /* Run AES + AVX test only if host has AES + AVX support.  */
-  if ((ecx & (bit_AVX | bit_OSXSAVE | bit_AES))
-      == (bit_AVX | bit_OSXSAVE | bit_AES))
+  if (((ecx & (bit_AVX | bit_OSXSAVE | bit_AES))
+       == (bit_AVX | bit_OSXSAVE | bit_AES))
+      && avx_os_support ())
     {
       do_test ();
 #ifdef DEBUG
index b15584ad274e875a7d1976e0c4dc84f8cb83e594..7ddca9d7b809b2e54f128bd9f81726dfd8092351 100644 (file)
@@ -1,6 +1,7 @@
 #include <stdlib.h>
 #include "cpuid.h"
 #include "m256-check.h"
+#include "avx-os-support.h"
 
 static void avx_test (void);
 
@@ -20,7 +21,8 @@ main ()
     return 0;
 
   /* Run AVX test only if host has AVX support.  */
-  if ((ecx & (bit_AVX | bit_OSXSAVE)) == (bit_AVX | bit_OSXSAVE))
+  if (((ecx & (bit_AVX | bit_OSXSAVE)) == (bit_AVX | bit_OSXSAVE))
+      && avx_os_support ())
     {
       do_test ();
 #ifdef DEBUG
diff --git a/gcc/testsuite/gcc.target/i386/avx-os-support.h b/gcc/testsuite/gcc.target/i386/avx-os-support.h
new file mode 100644 (file)
index 0000000..21d332f
--- /dev/null
@@ -0,0 +1,10 @@
+/* Check if the OS supports executing AVX instructions.  */
+
+static int
+avx_os_support (void)
+{
+  unsigned int eax, edx;
+
+  __asm__ ("xgetbv" : "=a" (eax), "=d" (edx) : "c" (0));
+  return (eax & 6) == 6;
+}
index 750e25c5069cdd0eed031084c37ebf8d3ca91dd4..5eed2e2203cf5ad37be0cc2ff9dcf6cab2d44c0d 100644 (file)
@@ -3,6 +3,7 @@
 #endif
 #include <stdlib.h>
 #include "cpuid.h"
+#include "avx-os-support.h"
 
 static void pclmul_avx_test (void);
 
@@ -22,8 +23,9 @@ main ()
     return 0;
 
   /* Run PCLMUL + AVX test only if host has PCLMUL + AVX support.  */
-  if ((ecx & (bit_AVX | bit_OSXSAVE | bit_PCLMUL))
-      == (bit_AVX | bit_OSXSAVE | bit_PCLMUL))
+  if (((ecx & (bit_AVX | bit_OSXSAVE | bit_PCLMUL))
+       == (bit_AVX | bit_OSXSAVE | bit_PCLMUL))
+      && avx_os_support ())
     {
       do_test ();
 #ifdef DEBUG