[vlc-devel] [PATCH] Detect AVX-enabled processors

Jean-Baptiste Kempf jb at videolan.org
Fri Dec 9 16:28:11 CET 2011


---
 configure.ac      |   22 ++++++++++++++++++++++
 include/vlc_cpu.h |   11 +++++++++++
 src/misc/cpu.c    |   15 +++++++++++++++
 3 files changed, 48 insertions(+), 0 deletions(-)

diff --git a/configure.ac b/configure.ac
index d0538e2..869b9d2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1336,6 +1336,28 @@ AS_IF([test "${ac_cv_3dnow_inline}" != "no"], [
 ])
 AM_CONDITIONAL([HAVE_3DNOW], [test "$have_3dnow" = "yes"])
 
+VLC_SAVE_FLAGS
+CFLAGS="${CFLAGS} -mavx"
+have_avx="no"
+AC_CACHE_CHECK([if $CC groks AVX inline assembly], [ac_cv_avx_inline], [
+  AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[[
+void *p;
+asm volatile("vzeroall"::"r"(p));
+]])
+  ], [
+    ac_cv_avx_inline=yes
+  ], [
+    ac_cv_avx_inline=no
+  ])
+])
+VLC_RESTORE_FLAGS
+AS_IF([test "${ac_cv_avx_inline}" != "no"], [
+  AC_DEFINE(CAN_COMPILE_AVX, 1,
+            [Define to 1 if AVX inline assembly is available.])
+  have_3dnow="yes"
+])
+AM_CONDITIONAL([HAVE_AVX], [test "$have_3dnow" = "yes"])
+
 
 AC_ARG_ENABLE(neon,
   [AS_HELP_STRING([--disable-neon],
diff --git a/include/vlc_cpu.h b/include/vlc_cpu.h
index 63cc978..a4dc66b 100644
--- a/include/vlc_cpu.h
+++ b/include/vlc_cpu.h
@@ -37,6 +37,7 @@
 #  define CPU_CAPABILITY_SSE4_1  (1<<10)
 #  define CPU_CAPABILITY_SSE4_2  (1<<11)
 #  define CPU_CAPABILITY_SSE4A   (1<<12)
+#  define CPU_CAPABILITY_AVX     (1<<13)
 
 # if defined (__MMX__)
 #  define VLC_MMX
@@ -54,6 +55,15 @@
 #  define VLC_SSE VLC_SSE_is_not_implemented_on_this_compiler
 # endif
 
+# if defined (__AVX__)
+#  define VLC_AVX
+# elif VLC_GCC_VERSION(4, 6)
+#  define VLC_AVX __attribute__ ((__target__ ("avx")))
+# else
+#  define VLC_AVX VLC_AVX_is_not_implemented_on_this_compiler
+# endif
+
+
 # else
 #  define CPU_CAPABILITY_MMX     (0)
 #  define CPU_CAPABILITY_3DNOW   (0)
@@ -65,6 +75,7 @@
 #  define CPU_CAPABILITY_SSE4_1  (0)
 #  define CPU_CAPABILITY_SSE4_2  (0)
 #  define CPU_CAPABILITY_SSE4A   (0)
+#  define CPU_CAPABILITY_AVX     (0)
 # endif
 
 # if defined (__ppc__) || defined (__ppc64__) || defined (__powerpc__)
diff --git a/src/misc/cpu.c b/src/misc/cpu.c
index 7c28b25..97826a9 100644
--- a/src/misc/cpu.c
+++ b/src/misc/cpu.c
@@ -125,6 +125,13 @@ VLC_MMX static void ThreeD_Now_test (void)
     asm volatile ("pfadd %%mm0,%%mm0\n" "femms\n" : : : "mm0");
 }
 #endif
+#if defined (CAN_COMPILE_AVX) && !defined (__AVX__)
+VLC_AVX static void AVX_test (void)
+{
+    asm volatile ("vzeroall\n" );
+}
+#endif
+
 
 #if defined (CAN_COMPILE_ALTIVEC)
 static void Altivec_text (void)
@@ -262,6 +269,13 @@ void vlc_CPU_init (void)
         i_capabilities |= CPU_CAPABILITY_SSE4_2;
 # endif
 
+# if defined (__AVX__)
+    i_capabilities |= CPU_CAPABILITY_AVX;
+# elif defined (CAN_COMPILE_AVX)
+    if ((i_ecx & (1 << 28)) && vlc_CPU_check ("AVX", AVX_test))
+        i_capabilities |= CPU_CAPABILITY_AVX;
+# endif
+
     /* test for additional capabilities */
     cpuid( 0x80000000 );
 
@@ -384,6 +398,7 @@ void vlc_CPU_dump (vlc_object_t *obj)
     PRINT_CAPABILITY(CPU_CAPABILITY_SSE4_1, "SSE4.1");
     PRINT_CAPABILITY(CPU_CAPABILITY_SSE4_2, "SSE4.2");
     PRINT_CAPABILITY(CPU_CAPABILITY_SSE4A,  "SSE4A");
+    PRINT_CAPABILITY(CPU_CAPABILITY_AVX,  "AVX");
 
 #elif defined (__powerpc__) || defined (__ppc__) || defined (__ppc64__)
     PRINT_CAPABILITY(CPU_CAPABILITY_ALTIVEC, "AltiVec");
-- 
1.7.8




More information about the vlc-devel mailing list