X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmisc%2Fcpu.c;h=124876d7adfc02cebbb68f343ce2a58baa5fd9cd;hb=d2ac50af2227392073822d82d809d25a7f013152;hp=1a77a032e622d9560deeab84b312581390912239;hpb=85b29bdc288a1573d43bd524908be5748a9b3640;p=vlc diff --git a/src/misc/cpu.c b/src/misc/cpu.c index 1a77a032e6..124876d7ad 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 (Centrale Réseaux) and its contributors + * Copyright (C) 1998-2004 the VideoLAN team * $Id$ * * Authors: Samuel Hocevar @@ -20,25 +20,29 @@ * * 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. *****************************************************************************/ /***************************************************************************** * Preamble *****************************************************************************/ -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include #ifdef HAVE_SIGNAL_H # include /* SIGHUP, SIGINT, SIGKILL */ # 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 *****************************************************************************/ @@ -53,7 +57,7 @@ static void SigHandler ( int ); static jmp_buf env; static int i_illegal; #if defined( __i386__ ) || defined( __x86_64__ ) -static char *psz_capability; +static const char *psz_capability; #endif #endif @@ -66,7 +70,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 ); @@ -81,17 +85,15 @@ uint32_t CPUCapabilities( void ) #elif defined( __i386__ ) || defined( __x86_64__ ) volatile unsigned int i_eax, i_ebx, i_ecx, i_edx; - volatile vlc_bool_t b_amd; + volatile bool b_amd; /* Needed for x86 CPU capabilities detection */ # if defined( __x86_64__ ) # define cpuid( reg ) \ - asm volatile ( "push %%rbx\n\t" \ - "cpuid\n\t" \ + asm volatile ( "cpuid\n\t" \ "movl %%ebx,%1\n\t" \ - "pop %%rbx\n\t" \ : "=a" ( i_eax ), \ - "=r" ( i_ebx ), \ + "=b" ( i_ebx ), \ "=c" ( i_ecx ), \ "=d" ( i_edx ) \ : "a" ( reg ) \ @@ -269,7 +271,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 ); @@ -333,7 +335,7 @@ static void SigHandler( int i_signal ) "operating system.\n", psz_capability ); fprintf( stderr, " some optimizations will be disabled unless " "you upgrade your OS\n" ); -# if defined( SYS_LINUX ) +# if defined( __linux__ ) fprintf( stderr, " (for instance Linux kernel 2.4.x or later)\n" ); # endif #endif @@ -342,3 +344,41 @@ 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; +} + +static vlc_memcpy_t pf_vlc_memcpy = memcpy; +static vlc_memset_t pf_vlc_memset = memset; + +void vlc_fastmem_register (vlc_memcpy_t cpy, vlc_memset_t set) +{ + if (cpy) + pf_vlc_memcpy = cpy; + if (set) + pf_vlc_memset = set; +} + +/** + * vlc_memcpy: fast CPU-dependent memcpy + */ +void *vlc_memcpy (void *tgt, const void *src, size_t n) +{ + return pf_vlc_memcpy (tgt, src, n); +} + +/** + * vlc_memset: fast CPU-dependent memset + */ +void *vlc_memset (void *tgt, int c, size_t n) +{ + return pf_vlc_memset (tgt, c, n); +}