]> git.sesse.net Git - vlc/commitdiff
* Altivec instructions autodetection.
authorSam Hocevar <sam@videolan.org>
Tue, 20 Mar 2001 23:18:38 +0000 (23:18 +0000)
committerSam Hocevar <sam@videolan.org>
Tue, 20 Mar 2001 23:18:38 +0000 (23:18 +0000)
include/tests.h
src/interface/main.c

index 88ec4f0627e4d48c00041db0720fbdf016b8af43..7443dfb63aae39b5eb9174fa95b2d07d3c2b74c2 100644 (file)
 /*****************************************************************************
  * TestVersion: tests if the given string equals the current version
  *****************************************************************************/
-int TestVersion( char * psz_version );
-int TestProgram( char * psz_program );
-int TestMethod( char * psz_var, char * psz_method );
-int TestCPU( int i_capabilities );
-
-/*****************************************************************************
- * CPUCapabilities: list the processors MMX support and other capabilities
- *****************************************************************************
- * This function is called to list extensions the CPU may have.
- *****************************************************************************/
-static __inline__ int CPUCapabilities( void )
-{
-#ifdef SYS_BEOS
-    return( CPU_CAPABILITY_NONE
-            | CPU_CAPABILITY_486
-            | CPU_CAPABILITY_586
-            | CPU_CAPABILITY_MMX );
-#else
-    int           i_capabilities = CPU_CAPABILITY_NONE;
-#ifdef __i386__
-    unsigned int  i_eax, i_ebx, i_ecx, i_edx;
-    boolean_t     b_amd;
-
-#define cpuid( a )                 \
-    asm volatile ( "cpuid"         \
-                 : "=a" ( i_eax ), \
-                   "=b" ( i_ebx ), \
-                   "=c" ( i_ecx ), \
-                   "=d" ( i_edx )  \
-                 : "a"  ( a )      \
-                 : "cc" );         \
-
-    /* test for a 486 CPU */
-    asm volatile ( "pushfl
-                    popl %%eax
-                    movl %%eax, %%ebx
-                    xorl $0x200000, %%eax
-                    pushl %%eax
-                    popfl
-                    pushfl
-                    popl %%eax"
-                 : "=a" ( i_eax ),
-                   "=b" ( i_ebx )
-                 :
-                 : "cc" );
-
-    if( i_eax == i_ebx )
-    {
-        return( i_capabilities );
-    }
-
-    i_capabilities |= CPU_CAPABILITY_486;
-
-    /* the CPU supports the CPUID instruction - get its level */
-    cpuid( 0x00000000 );
-
-    if( !i_eax )
-    {
-        return( i_capabilities );
-    }
-
-    /* FIXME: this isn't correct, since some 486s have cpuid */
-    i_capabilities |= CPU_CAPABILITY_586;
-
-    /* borrowed from mpeg2dec */
-    b_amd = ( i_ebx == 0x68747541 ) && ( i_ecx == 0x444d4163 )
-                    && ( i_edx == 0x69746e65 );
-
-    /* test for the MMX flag */
-    cpuid( 0x00000001 );
-
-    if( ! (i_edx & 0x00800000) )
-    {
-        return( i_capabilities );
-    }
-
-    i_capabilities |= CPU_CAPABILITY_MMX;
-
-    if( i_edx & 0x02000000 )
-    {
-        i_capabilities |= CPU_CAPABILITY_MMXEXT;
-    }
-    
-    /* test for additional capabilities */
-    cpuid( 0x80000000 );
-
-    if( i_eax < 0x80000001 )
-    {
-        return( i_capabilities );
-    }
-
-    /* list these additional capabilities */
-    cpuid( 0x80000001 );
-
-    if( i_edx & 0x80000000 )
-    {
-        i_capabilities |= CPU_CAPABILITY_3DNOW;
-    }
-
-    if( b_amd && ( i_edx & 0x00400000 ) )
-    {
-        i_capabilities |= CPU_CAPABILITY_MMXEXT;
-    }
-#endif /* __i386__ */
-
-    return( i_capabilities );
-#endif /* SYS_BEOS */
-}
+int TestVersion  ( char * psz_version );
+int TestProgram  ( char * psz_program );
+int TestMethod   ( char * psz_var, char * psz_method );
+int TestCPU      ( int i_capabilities );
 
index 8ff8144bbaea01f63eb018e5f90a7f14fa1a32c8..84a67160bb8f769633ab718a47074bbc2645137e 100644 (file)
 #include <getopt.h>                                              /* getopt() */
 #endif
 
+#ifdef SYS_DARWIN1_3
+#include <Carbon/Carbon.h>                              /* Altivec detection */
+#endif
+
 #include <unistd.h>
 #include <errno.h>                                                 /* ENOMEM */
 #include <stdlib.h>                                  /* getenv(), strtol(),  */
@@ -180,6 +184,8 @@ static void InitSignalHandler       ( void );
 static void SimpleSignalHandler     ( int i_signal );
 static void FatalSignalHandler      ( int i_signal );
 
+static int  CPUCapabilities         ( void );
+
 /*****************************************************************************
  * main: parse command line, start interface and spawn threads
  *****************************************************************************
@@ -878,3 +884,121 @@ static void FatalSignalHandler( int i_signal )
     p_main->p_intf->b_die = 1;
 }
 
+/*****************************************************************************
+ * CPUCapabilities: list the processors MMX support and other capabilities
+ *****************************************************************************
+ * This function is called to list extensions the CPU may have.
+ *****************************************************************************/
+static int CPUCapabilities( void )
+{
+    int i_capabilities = CPU_CAPABILITY_NONE;
+
+#if defined( SYS_BEOS )
+    i_capabilities |= CPU_CAPABILITY_486
+                      | CPU_CAPABILITY_586
+                      | CPU_CAPABILITY_MMX;
+
+#elif defined( SYS_DARWIN1_3 )
+    OSErr err;
+    long l_attributes = 0;
+
+    err = Gestalt( gestaltPowerPCProcessorFeatures, &l_attributes );
+
+    if( err == noErr &&
+         ( (1 << gestaltPowerPCHasVectorInstructions) & l_attributes ) )
+    {
+        i_capabilities |= CPU_CAPABILITY_ALTIVEC;
+    }
+
+#elif defined( __i386__ )
+    unsigned int  i_eax, i_ebx, i_ecx, i_edx;
+    boolean_t     b_amd;
+
+#   define cpuid( a )              \
+    asm volatile ( "cpuid"         \
+                 : "=a" ( i_eax ), \
+                   "=b" ( i_ebx ), \
+                   "=c" ( i_ecx ), \
+                   "=d" ( i_edx )  \
+                 : "a"  ( a )      \
+                 : "cc" );         \
+
+    /* test for a 486 CPU */
+    asm volatile ( "pushfl
+                    popl %%eax
+                    movl %%eax, %%ebx
+                    xorl $0x200000, %%eax
+                    pushl %%eax
+                    popfl
+                    pushfl
+                    popl %%eax"
+                 : "=a" ( i_eax ),
+                   "=b" ( i_ebx )
+                 :
+                 : "cc" );
+
+    if( i_eax == i_ebx )
+    {
+        return( i_capabilities );
+    }
+
+    i_capabilities |= CPU_CAPABILITY_486;
+
+    /* the CPU supports the CPUID instruction - get its level */
+    cpuid( 0x00000000 );
+
+    if( !i_eax )
+    {
+        return( i_capabilities );
+    }
+
+    /* FIXME: this isn't correct, since some 486s have cpuid */
+    i_capabilities |= CPU_CAPABILITY_586;
+
+    /* borrowed from mpeg2dec */
+    b_amd = ( i_ebx == 0x68747541 ) && ( i_ecx == 0x444d4163 )
+                    && ( i_edx == 0x69746e65 );
+
+    /* test for the MMX flag */
+    cpuid( 0x00000001 );
+
+    if( ! (i_edx & 0x00800000) )
+    {
+        return( i_capabilities );
+    }
+
+    i_capabilities |= CPU_CAPABILITY_MMX;
+
+    if( i_edx & 0x02000000 )
+    {
+        i_capabilities |= CPU_CAPABILITY_MMXEXT;
+    }
+    
+    /* test for additional capabilities */
+    cpuid( 0x80000000 );
+
+    if( i_eax < 0x80000001 )
+    {
+        return( i_capabilities );
+    }
+
+    /* list these additional capabilities */
+    cpuid( 0x80000001 );
+
+    if( i_edx & 0x80000000 )
+    {
+        i_capabilities |= CPU_CAPABILITY_3DNOW;
+    }
+
+    if( b_amd && ( i_edx & 0x00400000 ) )
+    {
+        i_capabilities |= CPU_CAPABILITY_MMXEXT;
+    }
+
+#else
+    /* default behaviour */
+
+#endif
+    return( i_capabilities );
+}
+