X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmisc%2Fcpu.c;h=611adad381eb0e313aed1da57c942b6da42f1aa6;hb=681637abe8ad32a07b614a7f3cd797d089e58fc7;hp=4a460307fdb62a2a6a2cc528cb120695e8f2a4e5;hpb=3741a74b854b8c0badaf4fcd8065a93faa2a7a01;p=vlc diff --git a/src/misc/cpu.c b/src/misc/cpu.c index 4a460307fd..611adad381 100644 --- a/src/misc/cpu.c +++ b/src/misc/cpu.c @@ -1,7 +1,7 @@ /***************************************************************************** * cpu.c: CPU detection code ***************************************************************************** - * Copyright (C) 1998-2004 VideoLAN + * Copyright (C) 1998-2004 the VideoLAN team * $Id$ * * Authors: Samuel Hocevar @@ -20,7 +20,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** @@ -33,12 +33,12 @@ # include /* longjmp, setjmp */ #endif -#ifdef SYS_DARWIN +#include "libvlc.h" + +#if defined(__APPLE__) && (defined(__ppc__) || defined(__ppc64__)) #include #endif -#include "vlc_cpu.h" - /***************************************************************************** * Local prototypes *****************************************************************************/ @@ -52,8 +52,8 @@ static void SigHandler ( int ); #ifdef HAVE_SIGNAL_H static jmp_buf env; static int i_illegal; -#if defined( __i386__ ) -static char *psz_capability; +#if defined( __i386__ ) || defined( __x86_64__ ) +static const char *psz_capability; #endif #endif @@ -66,7 +66,7 @@ uint32_t CPUCapabilities( void ) { volatile uint32_t i_capabilities = CPU_CAPABILITY_NONE; -#if defined( SYS_DARWIN ) +#if defined(__APPLE__) && (defined(__ppc__) || defined(__ppc64__)) int selectors[2] = { CTL_HW, HW_VECTORUNIT }; int i_has_altivec = 0; size_t i_length = sizeof( i_has_altivec ); @@ -79,22 +79,34 @@ uint32_t CPUCapabilities( void ) return i_capabilities; -#elif defined( __i386__ ) +#elif defined( __i386__ ) || defined( __x86_64__ ) volatile unsigned int i_eax, i_ebx, i_ecx, i_edx; volatile vlc_bool_t b_amd; /* Needed for x86 CPU capabilities detection */ -# define cpuid( reg ) \ - asm volatile ( "pushl %%ebx\n\t" \ - "cpuid\n\t" \ - "movl %%ebx,%1\n\t" \ - "popl %%ebx\n\t" \ - : "=a" ( i_eax ), \ - "=r" ( i_ebx ), \ - "=c" ( i_ecx ), \ - "=d" ( i_edx ) \ - : "a" ( reg ) \ - : "cc" ); +# if defined( __x86_64__ ) +# define cpuid( reg ) \ + asm volatile ( "cpuid\n\t" \ + "movl %%ebx,%1\n\t" \ + : "=a" ( i_eax ), \ + "=b" ( i_ebx ), \ + "=c" ( i_ecx ), \ + "=d" ( i_edx ) \ + : "a" ( reg ) \ + : "cc" ); +# else +# define cpuid( reg ) \ + asm volatile ( "push %%ebx\n\t" \ + "cpuid\n\t" \ + "movl %%ebx,%1\n\t" \ + "pop %%ebx\n\t" \ + : "=a" ( i_eax ), \ + "=r" ( i_ebx ), \ + "=c" ( i_ecx ), \ + "=d" ( i_edx ) \ + : "a" ( reg ) \ + : "cc" ); +# endif # if defined( CAN_COMPILE_SSE ) || defined ( CAN_COMPILE_3DNOW ) \ && defined( HAVE_SIGNAL_H ) @@ -103,18 +115,19 @@ uint32_t CPUCapabilities( void ) i_capabilities |= CPU_CAPABILITY_FPU; - /* test for a 486 CPU */ - asm volatile ( "pushl %%ebx\n\t" - "pushfl\n\t" - "popl %%eax\n\t" +# if defined( __i386__ ) + /* check if cpuid instruction is supported */ + asm volatile ( "push %%ebx\n\t" + "pushf\n\t" + "pop %%eax\n\t" "movl %%eax, %%ebx\n\t" "xorl $0x200000, %%eax\n\t" - "pushl %%eax\n\t" - "popfl\n\t" - "pushfl\n\t" - "popl %%eax\n\t" + "push %%eax\n\t" + "popf\n\t" + "pushf\n\t" + "pop %%eax\n\t" "movl %%ebx,%1\n\t" - "popl %%ebx\n\t" + "pop %%ebx\n\t" : "=a" ( i_eax ), "=r" ( i_ebx ) : @@ -122,12 +135,15 @@ uint32_t CPUCapabilities( void ) if( i_eax == i_ebx ) { -# if defined( CAN_COMPILE_SSE ) || defined ( CAN_COMPILE_3DNOW ) \ - && defined( HAVE_SIGNAL_H ) +# if defined( CAN_COMPILE_SSE ) || defined ( CAN_COMPILE_3DNOW ) \ + && defined( HAVE_SIGNAL_H ) signal( SIGILL, pf_sigill ); -# endif +# endif return i_capabilities; } +# else + /* x86_64 supports cpuid instruction, so we dont need to check it */ +# endif i_capabilities |= CPU_CAPABILITY_486; @@ -185,9 +201,10 @@ uint32_t CPUCapabilities( void ) } # endif } + if( i_edx & 0x04000000 ) { -# if defined(CAN_COMPILE_SSE) && !defined(SYS_BEOS) +# if defined(CAN_COMPILE_SSE) /* We test if OS supports the SSE instructions */ psz_capability = "SSE2"; i_illegal = 0; @@ -250,7 +267,7 @@ uint32_t CPUCapabilities( void ) # endif return i_capabilities; -#elif defined( __powerpc__ ) +#elif defined( __powerpc__ ) || defined( __ppc__ ) || defined( __ppc64__ ) # ifdef CAN_COMPILE_ALTIVEC && defined( HAVE_SIGNAL_H ) void (*pf_sigill) (int) = signal( SIGILL, SigHandler ); @@ -282,7 +299,7 @@ uint32_t CPUCapabilities( void ) i_capabilities |= CPU_CAPABILITY_FPU; return i_capabilities; -#elif defined( _MSC_VER ) +#elif defined( _MSC_VER ) && !defined( UNDER_CE ) i_capabilities |= CPU_CAPABILITY_FPU; return i_capabilities; @@ -323,3 +340,15 @@ static void SigHandler( int i_signal ) } #endif + +uint32_t cpu_flags = 0; + + +/***************************************************************************** + * vlc_CPU: get pre-computed CPU capability flags + ****************************************************************************/ +unsigned vlc_CPU (void) +{ + return cpu_flags; +} +