#ifndef __linux__
#include <sys/types.h>
-#ifndef WIN32
+#ifndef _WIN32
#include <unistd.h>
#include <sys/wait.h>
#include <signal.h>
#ifdef __APPLE__
#include <sys/sysctl.h>
#endif
+#ifdef __ANDROID__
+#include <cpu-features.h>
+#endif
#if defined(__OpenBSD__) && defined(__powerpc__)
#include <sys/param.h>
#if defined (__i386__) || defined (__x86_64__) || defined (__powerpc__) \
|| defined (__ppc__) || defined (__ppc64__) || defined (__powerpc64__)
-# if !defined (WIN32) && !defined (__OS2__)
+# if !defined (_WIN32) && !defined (__OS2__)
static bool vlc_CPU_check (const char *name, void (*func) (void))
{
pid_t pid = fork();
asm volatile ("xorps %%xmm0,%%xmm0\n" : : : "xmm0", "xmm1");
}
#endif
-#if defined (CAN_COMPILE_SSE2) && !defined (__SSE2__)
-VLC_SSE static void SSE2_test (void)
-{
- asm volatile ("movupd %%xmm0, %%xmm0\n" : : : "xmm0", "xmm1");
-}
-#endif
-#if defined (CAN_COMPILE_SSE3) && !defined (__SSE3__)
-VLC_SSE static void SSE3_test (void)
-{
- asm volatile ("movsldup %%xmm1, %%xmm0\n" : : : "xmm0", "xmm1");
-}
-#endif
-#if defined (CAN_COMPILE_SSSE3) && !defined (__SSSE3__)
-VLC_SSE static void SSSE3_test (void)
-{
- asm volatile ("pabsw %%xmm1, %%xmm0\n" : : : "xmm0", "xmm1");
-}
-#endif
-#if defined (CAN_COMPILE_SSE4_1) && !defined (__SSE4_1__)
-VLC_SSE static void SSE4_1_test (void)
-{
- asm volatile ("pmaxsb %%xmm1, %%xmm0\n" : : : "xmm0", "xmm1");
-}
-#endif
-#if defined (CAN_COMPILE_SSE4_2) && !defined (__SSE4_2__)
-VLC_SSE static void SSE4_2_test (void)
-{
- asm volatile ("pcmpgtq %%xmm1, %%xmm0\n" : : : "xmm0", "xmm1");
-}
-#endif
-#if defined (CAN_COMPILE_3DNOW) && !defined (__3dNOW__)
+#if defined (CAN_COMPILE_3DNOW)
VLC_MMX static void ThreeD_Now_test (void)
{
asm volatile ("pfadd %%mm0,%%mm0\n" "femms\n" : : : "mm0");
}
#endif
-#else /* WIN32 || __OS2__ */
+#else /* _WIN32 || __OS2__ */
# define vlc_CPU_check(name, func) (1)
#endif
#endif
if( ! (i_edx & 0x00800000) )
goto out;
# endif
- i_capabilities |= CPU_CAPABILITY_MMX;
+ i_capabilities |= VLC_CPU_MMX;
-# if defined (__SSE__)
- i_capabilities |= CPU_CAPABILITY_MMXEXT | CPU_CAPABILITY_SSE;
-# else
if( i_edx & 0x02000000 )
+ i_capabilities |= VLC_CPU_MMXEXT;
+# if defined (CAN_COMPILE_SSE) && !defined (__SSE__)
+ if (( i_edx & 0x02000000 ) && vlc_CPU_check ("SSE", SSE_test))
+# endif
{
- i_capabilities |= CPU_CAPABILITY_MMXEXT;
-
-# ifdef CAN_COMPILE_SSE
- if (vlc_CPU_check ("SSE", SSE_test))
- i_capabilities |= CPU_CAPABILITY_SSE;
-# endif
+ /*if( i_edx & 0x02000000 )*/
+ i_capabilities |= VLC_CPU_SSE;
+ if (i_edx & 0x04000000)
+ i_capabilities |= VLC_CPU_SSE2;
+ if (i_ecx & 0x00000001)
+ i_capabilities |= VLC_CPU_SSE3;
+ if (i_ecx & 0x00000200)
+ i_capabilities |= VLC_CPU_SSSE3;
+ if (i_ecx & 0x00080000)
+ i_capabilities |= VLC_CPU_SSE4_1;
+ if (i_ecx & 0x00100000)
+ i_capabilities |= VLC_CPU_SSE4_2;
}
-# endif
-
-# if defined (__SSE2__)
- i_capabilities |= CPU_CAPABILITY_SSE2;
-# elif defined (CAN_COMPILE_SSE2)
- if ((i_edx & 0x04000000) && vlc_CPU_check ("SSE2", SSE2_test))
- i_capabilities |= CPU_CAPABILITY_SSE2;
-# endif
-
-# if defined (__SSE3__)
- i_capabilities |= CPU_CAPABILITY_SSE3;
-# elif defined (CAN_COMPILE_SSE3)
- if ((i_ecx & 0x00000001) && vlc_CPU_check ("SSE3", SSE3_test))
- i_capabilities |= CPU_CAPABILITY_SSE3;
-# endif
-
-# if defined (__SSSE3__)
- i_capabilities |= CPU_CAPABILITY_SSSE3;
-# elif defined (CAN_COMPILE_SSSE3)
- if ((i_ecx & 0x00000200) && vlc_CPU_check ("SSSE3", SSSE3_test))
- i_capabilities |= CPU_CAPABILITY_SSSE3;
-# endif
-
-# if defined (__SSE4_1__)
- i_capabilities |= CPU_CAPABILITY_SSE4_1;
-# elif defined (CAN_COMPILE_SSE4_1)
- if ((i_ecx & 0x00080000) && vlc_CPU_check ("SSE4.1", SSE4_1_test))
- i_capabilities |= CPU_CAPABILITY_SSE4_1;
-# endif
-
-# if defined (__SSE4_2__)
- i_capabilities |= CPU_CAPABILITY_SSE4_2;
-# elif defined (CAN_COMPILE_SSE4_2)
- if ((i_ecx & 0x00100000) && vlc_CPU_check ("SSE4.2", SSE4_2_test))
- i_capabilities |= CPU_CAPABILITY_SSE4_2;
-# endif
/* test for additional capabilities */
cpuid( 0x80000000 );
/* list these additional capabilities */
cpuid( 0x80000001 );
-# if defined (__3dNOW__)
- i_capabilities |= CPU_CAPABILITY_3DNOW;
-# elif defined (CAN_COMPILE_3DNOW)
+# if defined (CAN_COMPILE_3DNOW) && !defined (__3dNOW__)
if ((i_edx & 0x80000000) && vlc_CPU_check ("3D Now!", ThreeD_Now_test))
- i_capabilities |= CPU_CAPABILITY_3DNOW;
# endif
+ i_capabilities |= VLC_CPU_3dNOW;
if( b_amd && ( i_edx & 0x00400000 ) )
- {
- i_capabilities |= CPU_CAPABILITY_MMXEXT;
- }
+ i_capabilities |= VLC_CPU_MMXEXT;
out:
#elif defined( __powerpc__ ) || defined( __ppc__ ) || defined( __powerpc64__ ) \
int i_error = sysctl( selectors, 2, &i_has_altivec, &i_length, NULL, 0);
if( i_error == 0 && i_has_altivec != 0 )
- i_capabilities |= CPU_CAPABILITY_ALTIVEC;
+ i_capabilities |= VLC_CPU_ALTIVEC;
# elif defined( CAN_COMPILE_ALTIVEC )
if (vlc_CPU_check ("Altivec", Altivec_test))
- i_capabilities |= CPU_CAPABILITY_ALTIVEC;
+ i_capabilities |= VLC_CPU_ALTIVEC;
# endif
+#elif defined ( __arm__)
+# ifdef __ANDROID__
+ if (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON)
+ i_capabilities |= VLC_CPU_ARM_NEON;
+# endif
+
#endif
cpu_flags = i_capabilities;
{
/* On Windows and OS/2,
* initialized from DllMain() and _DLL_InitTerm() respectively, instead */
-#if !defined(WIN32) && !defined(__OS2__)
+#if !defined(_WIN32) && !defined(__OS2__)
static pthread_once_t once = PTHREAD_ONCE_INIT;
pthread_once (&once, vlc_CPU_init);
#endif
void vlc_CPU_dump (vlc_object_t *obj)
{
- const unsigned flags = vlc_CPU();
char buf[200], *p = buf;
-#define PRINT_CAPABILITY( capability, string ) \
- if (flags & (capability)) \
- p += sprintf (p, "%s ", (string) )
-
#if defined (__i386__) || defined (__x86_64__)
- PRINT_CAPABILITY(CPU_CAPABILITY_MMX, "MMX");
- PRINT_CAPABILITY(CPU_CAPABILITY_3DNOW, "3DNow!");
- PRINT_CAPABILITY(CPU_CAPABILITY_MMXEXT, "MMXEXT");
- PRINT_CAPABILITY(CPU_CAPABILITY_SSE, "SSE");
- PRINT_CAPABILITY(CPU_CAPABILITY_SSE2, "SSE2");
- PRINT_CAPABILITY(CPU_CAPABILITY_SSE3, "SSE3");
- PRINT_CAPABILITY(CPU_CAPABILITY_SSSE3, "SSSE3");
- PRINT_CAPABILITY(CPU_CAPABILITY_SSE4_1, "SSE4.1");
- PRINT_CAPABILITY(CPU_CAPABILITY_SSE4_2, "SSE4.2");
- PRINT_CAPABILITY(CPU_CAPABILITY_SSE4A, "SSE4A");
+ if (vlc_CPU_MMX()) p += sprintf (p, "MMX ");
+ if (vlc_CPU_MMXEXT()) p += sprintf (p, "MMXEXT ");
+ if (vlc_CPU_SSE()) p += sprintf (p, "SSE ");
+ if (vlc_CPU_SSE2()) p += sprintf (p, "SSE2 ");
+ if (vlc_CPU_SSE3()) p += sprintf (p, "SSE3 ");
+ if (vlc_CPU_SSSE3()) p += sprintf (p, "SSSE3 ");
+ if (vlc_CPU_SSE4_1()) p += sprintf (p, "SSE4.1 ");
+ if (vlc_CPU_SSE4_2()) p += sprintf (p, "SSE4.2 ");
+ if (vlc_CPU_SSE4A()) p += sprintf (p, "SSE4A ");
+ if (vlc_CPU_AVX()) p += sprintf (p, "AVX ");
+ if (vlc_CPU_AVX2()) p += sprintf (p, "AVX ");
+ if (vlc_CPU_3dNOW()) p += sprintf (p, "3DNow! ");
+ if (vlc_CPU_XOP()) p += sprintf (p, "XOP ");
+ if (vlc_CPU_FMA4()) p += sprintf (p, "FMA4 ");
#elif defined (__powerpc__) || defined (__ppc__) || defined (__ppc64__)
- PRINT_CAPABILITY(CPU_CAPABILITY_ALTIVEC, "AltiVec");
+ if (vlc_CPU_ALTIVEC()) p += sprintf (p, "AltiVec");
#elif defined (__arm__)
- PRINT_CAPABILITY(CPU_CAPABILITY_NEON, "NEONv1");
-
-#else
- (void) flags;
+ if (vlc_CPU_ARM_NEON()) p += sprintf (p, "ARM_NEON ");
#endif