Patchwork [testsuite] : Check AVX OS support.

login
register
mail settings
Submitter Uros Bizjak
Date July 27, 2011, 12:24 p.m.
Message ID <CAFULd4YhEO5xg09mBAUOqb=U-Ati2w6K+BcBwQbgoN=N+tgFcA@mail.gmail.com>
Download mbox | patch
Permalink /patch/107049/
State New
Headers show

Comments

Uros Bizjak - July 27, 2011, 12:24 p.m.
Hello!

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.

Tested on x86_64-pc-linux-gnu, will be commit to mainline and release branches.

Uros.

Patch

Index: gcc.target/i386/avx-check.h
===================================================================
--- gcc.target/i386/avx-check.h	(revision 176816)
+++ gcc.target/i386/avx-check.h	(working copy)
@@ -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
Index: gcc.target/i386/aes-avx-check.h
===================================================================
--- gcc.target/i386/aes-avx-check.h	(revision 176816)
+++ gcc.target/i386/aes-avx-check.h	(working copy)
@@ -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: gcc.target/i386/avx-os-support.h
===================================================================
--- gcc.target/i386/avx-os-support.h	(revision 0)
+++ gcc.target/i386/avx-os-support.h	(revision 0)
@@ -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: gcc.target/i386/pclmul-avx-check.h
===================================================================
--- gcc.target/i386/pclmul-avx-check.h	(revision 176816)
+++ gcc.target/i386/pclmul-avx-check.h	(working copy)
@@ -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