[vlc-commits] vlc_CPU_init: factorize altivec check by using asm input

Rafaël Carré git at videolan.org
Fri Aug 26 06:23:44 CEST 2011


vlc | branch: master | Rafaël Carré <rafael.carre at gmail.com> | Thu Aug 25 23:44:37 2011 -0400| [806505a4fb14af2198da573a20caedea03d46502] | committer: Rafaël Carré

vlc_CPU_init: factorize altivec check by using asm input

also simplify arm neon preprocessor checks

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=806505a4fb14af2198da573a20caedea03d46502
---

 src/misc/cpu.c |   63 ++++++++++++++++++++++---------------------------------
 1 files changed, 25 insertions(+), 38 deletions(-)

diff --git a/src/misc/cpu.c b/src/misc/cpu.c
index 24da34b..490fe5c 100644
--- a/src/misc/cpu.c
+++ b/src/misc/cpu.c
@@ -73,21 +73,21 @@ static bool check_OS_capability( const char *psz_capability, pid_t pid )
     return false;
 }
 
-#  define check_capability(name, flag, code)   \
-     do {                                      \
-        pid_t pid = fork();                    \
-        if( pid == 0 )                         \
-        {                                      \
-            signal(SIGILL, SIG_DFL);           \
-            __asm__ __volatile__ ( code : : ); \
-            _exit(0);                          \
-        }                                      \
-        if( check_OS_capability((name), pid )) \
-            i_capabilities |= (flag);          \
+#  define check_capability(name, flag, code, input)     \
+     do {                                               \
+        pid_t pid = fork();                             \
+        if( pid == 0 )                                  \
+        {                                               \
+            signal(SIGILL, SIG_DFL);                    \
+            __asm__ __volatile__ ( code : : input );    \
+            _exit(0);                                   \
+        }                                               \
+        if( check_OS_capability((name), pid ))          \
+            i_capabilities |= (flag);                   \
      } while(0)
 
 # else /* WIN32 */
-#  define check_capability(name, flag, code)   \
+#  define check_capability(name, flag, code, input)   \
         i_capabilities |= (flag);
 # endif
 #endif
@@ -184,7 +184,7 @@ void vlc_CPU_init (void)
 
 #   ifdef CAN_COMPILE_SSE
         check_capability( "SSE", CPU_CAPABILITY_SSE,
-                          "xorps %%xmm0,%%xmm0\n" );
+                          "xorps %%xmm0,%%xmm0\n", );
 #   endif
     }
 # endif
@@ -194,7 +194,7 @@ void vlc_CPU_init (void)
 # elif defined (CAN_COMPILE_SSE2)
     if( i_edx & 0x04000000 )
         check_capability( "SSE2", CPU_CAPABILITY_SSE2,
-                          "movupd %%xmm0, %%xmm0\n" );
+                          "movupd %%xmm0, %%xmm0\n", );
 # endif
 
 # if defined (__SSE3__)
@@ -202,7 +202,7 @@ void vlc_CPU_init (void)
 # elif defined (CAN_COMPILE_SSE3)
     if( i_ecx & 0x00000001 )
         check_capability( "SSE3", CPU_CAPABILITY_SSE3,
-                          "movsldup %%xmm1, %%xmm0\n" );
+                          "movsldup %%xmm1, %%xmm0\n", );
 # endif
 
 # if defined (__SSSE3__)
@@ -210,7 +210,7 @@ void vlc_CPU_init (void)
 # elif defined (CAN_COMPILE_SSSE3)
     if( i_ecx & 0x00000200 )
         check_capability( "SSSE3", CPU_CAPABILITY_SSSE3,
-                          "pabsw %%xmm1, %%xmm0\n" );
+                          "pabsw %%xmm1, %%xmm0\n", );
 # endif
 
 # if defined (__SSE4_1__)
@@ -218,7 +218,7 @@ void vlc_CPU_init (void)
 # elif defined (CAN_COMPILE_SSE4_1)
     if( i_ecx & 0x00080000 )
         check_capability( "SSE4.1", CPU_CAPABILITY_SSE4_1,
-                          "pmaxsb %%xmm1, %%xmm0\n" );
+                          "pmaxsb %%xmm1, %%xmm0\n", );
 # endif
 
 # if defined (__SSE4_2__)
@@ -226,7 +226,7 @@ void vlc_CPU_init (void)
 # elif defined (CAN_COMPILE_SSE4_2)
     if( i_ecx & 0x00100000 )
         check_capability( "SSE4.2", CPU_CAPABILITY_SSE4_2,
-                          "pcmpgtq %%xmm1, %%xmm0\n" );
+                          "pcmpgtq %%xmm1, %%xmm0\n", );
 # endif
 
     /* test for additional capabilities */
@@ -243,7 +243,7 @@ void vlc_CPU_init (void)
 # elif defined (CAN_COMPILE_3DNOW)
     if( i_edx & 0x80000000 )
         check_capability( "3D Now!", CPU_CAPABILITY_3DNOW,
-                          "pfadd %%mm0,%%mm0\n" "femms\n" );
+                          "pfadd %%mm0,%%mm0\n" "femms\n", );
 # endif
 
     if( b_amd && ( i_edx & 0x00400000 ) )
@@ -257,10 +257,6 @@ out:
 # if defined (__ARM_NEON__)
     i_capabilities |= CPU_CAPABILITY_NEON;
 # elif defined (CAN_COMPILE_NEON)
-#  define NEED_RUNTIME_CPU_CHECK 1
-# endif
-
-# ifdef NEED_RUNTIME_CPU_CHECK
 #  if defined (__linux__)
     FILE *info = fopen ("/proc/cpuinfo", "rt");
     if (info != NULL)
@@ -274,11 +270,11 @@ out:
 
              if (strncmp (line, "Features\t:", 10))
                  continue;
-#   if defined (CAN_COMPILE_NEON) && !defined (__ARM_NEON__)
+
              cap = strstr (line + 10, " neon");
              if (cap != NULL && (cap[5] == '\0' || cap[5] == ' '))
                  i_capabilities |= CPU_CAPABILITY_NEON;
-#   endif
+
              break;
         }
         fclose (info);
@@ -306,19 +302,10 @@ out:
         i_capabilities |= CPU_CAPABILITY_ALTIVEC;
 
 #   elif defined( CAN_COMPILE_ALTIVEC )
-    pid_t pid = fork();
-    if( pid == 0 )
-    {
-        signal(SIGILL, SIG_DFL);
-        asm volatile ("mtspr 256, %0\n\t"
-                      "vand %%v0, %%v0, %%v0"
-                      :
-                      : "r" (-1));
-        _exit(0);
-    }
-
-    if( check_OS_capability( "Altivec", pid ) )
-        i_capabilities |= CPU_CAPABILITY_ALTIVEC;
+    check_capability( "Altivec", CPU_CAPABILITY_ALTIVEC,
+        "mtspr 256, %0\n\t"
+        "vand %%v0, %%v0, %%v0",
+                      "r" (-1));
 
 #   endif
 



More information about the vlc-commits mailing list