From f7ba8bf376b8f418a1c89cce0ac3aba22565e78c Mon Sep 17 00:00:00 2001 From: Laurent Aimar Date: Mon, 23 Nov 2009 21:24:07 +0100 Subject: [PATCH] Added SSSE3/SSE4.1/SSE4.2 support to libvlc. --- src/libvlc-module.c | 20 ++++++++++++++++++++ src/libvlc.c | 10 ++++++++++ src/misc/cpu.c | 24 ++++++++++++++++++++++++ 3 files changed, 54 insertions(+) diff --git a/src/libvlc-module.c b/src/libvlc-module.c index ec901beaa8..00cc63fc69 100644 --- a/src/libvlc-module.c +++ b/src/libvlc-module.c @@ -1044,6 +1044,20 @@ static const char *const ppsz_clock_descriptions[] = "If your processor supports the SSE3 instructions set, VLC can take " \ "advantage of them.") +#define SSSE3_TEXT N_("Enable CPU SSSE3 support") +#define SSSE3_LONGTEXT N_( \ + "If your processor supports the SSSE3 instructions set, VLC can take " \ + "advantage of them.") + +#define SSE4_1_TEXT N_("Enable CPU SSE4.1 support") +#define SSE4_1_LONGTEXT N_( \ + "If your processor supports the SSE4.1 instructions set, VLC can take " \ + "advantage of them.") + +#define SSE4_2_TEXT N_("Enable CPU SSE4.2 support") +#define SSE4_2_LONGTEXT N_( \ + "If your processor supports the SSE4.2 instructions set, VLC can take " \ + "advantage of them.") #define ALTIVEC_TEXT N_("Enable CPU AltiVec support") #define ALTIVEC_LONGTEXT N_( \ @@ -1980,6 +1994,12 @@ vlc_module_begin () change_need_restart () add_bool( "sse3", 1, NULL, SSE3_TEXT, SSE3_LONGTEXT, true ) change_need_restart () + add_bool( "ssse3", 1, NULL, SSSE3_TEXT, SSSE3_LONGTEXT, true ) + change_need_restart () + add_bool( "sse41", 1, NULL, SSE4_1_TEXT, SSE4_1_LONGTEXT, true ) + change_need_restart () + add_bool( "sse42", 1, NULL, SSE4_2_TEXT, SSE4_2_LONGTEXT, true ) + change_need_restart () #endif #if defined( __powerpc__ ) || defined( __ppc__ ) || defined( __ppc64__ ) add_bool( "altivec", 1, NULL, ALTIVEC_TEXT, ALTIVEC_LONGTEXT, true ) diff --git a/src/libvlc.c b/src/libvlc.c index fcc2f47e77..04eaaf952c 100644 --- a/src/libvlc.c +++ b/src/libvlc.c @@ -750,6 +750,12 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, cpu_flags &= ~CPU_CAPABILITY_SSE2; if( !config_GetInt( p_libvlc, "sse3" ) ) cpu_flags &= ~CPU_CAPABILITY_SSE3; + if( !config_GetInt( p_libvlc, "ssse3" ) ) + cpu_flags &= ~CPU_CAPABILITY_SSSE3; + if( !config_GetInt( p_libvlc, "sse41" ) ) + cpu_flags &= ~CPU_CAPABILITY_SSE4_1; + if( !config_GetInt( p_libvlc, "sse42" ) ) + cpu_flags &= ~CPU_CAPABILITY_SSE4_2; PRINT_CAPABILITY( CPU_CAPABILITY_MMX, "MMX" ); PRINT_CAPABILITY( CPU_CAPABILITY_3DNOW, "3DNow!" ); @@ -757,6 +763,10 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, PRINT_CAPABILITY( CPU_CAPABILITY_SSE, "SSE" ); PRINT_CAPABILITY( CPU_CAPABILITY_SSE2, "SSE2" ); PRINT_CAPABILITY( CPU_CAPABILITY_SSE3, "SSE3" ); + PRINT_CAPABILITY( CPU_CAPABILITY_SSE3, "SSSE3" ); + PRINT_CAPABILITY( CPU_CAPABILITY_SSE4_1, "SSE4.1" ); + PRINT_CAPABILITY( CPU_CAPABILITY_SSE4_2, "SSE4.2" ); + PRINT_CAPABILITY( CPU_CAPABILITY_SSE4A, "SSE4A" ); #elif defined( __powerpc__ ) || defined( __ppc__ ) || defined( __ppc64__ ) if( !config_GetInt( p_libvlc, "altivec" ) ) diff --git a/src/misc/cpu.c b/src/misc/cpu.c index 3dfdb05371..5b46fa9f78 100644 --- a/src/misc/cpu.c +++ b/src/misc/cpu.c @@ -201,6 +201,30 @@ uint32_t CPUCapabilities( void ) "movsldup %%xmm1, %%xmm0\n" ); # endif +# if defined (__SSSE3__) + i_capabilities |= CPU_CAPABILITY_SSSE3; +# elif defined (CAN_COMPILE_SSSE3) + if( i_ecx & 0x00000200 ) + check_capability( "SSSE3", CPU_CAPABILITY_SSSE3, + "pabsw %%xmm1, %%xmm0\n" ); +# endif + +# if defined (__SSE4_1__) + i_capabilities |= CPU_CAPABILITY_SSE4_1; +# elif defined (CAN_COMPILE_SSE4_1) + if( i_ecx & 0x00080000 ) + check_capability( "SSE4.1", CPU_CAPABILITY_SSE4_1, + "pmaxsb %%xmm1, %%xmm0\n" ); +# endif + +# if defined (__SSE4_2__) + i_capabilities |= CPU_CAPABILITY_SSE4_2; +# elif defined (CAN_COMPILE_SSE4_2) + if( i_ecx & 0x00100000 ) + check_capability( "SSE4.2", CPU_CAPABILITY_SSE4_2, + "pcmpgtq %%xmm1, %%xmm0\n" ); +# endif + /* test for additional capabilities */ cpuid( 0x80000000 ); -- 2.39.2