Commit b830aae4 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Check for ARM NEON at build-time if possible

parent 6def94fd
......@@ -1330,7 +1330,6 @@ asm volatile("ssat r0, #1, r0":::"r0"); /* assume ARMv6 */
VLC_RESTORE_FLAGS
AS_IF([test "$ac_cv_neon_inline" != "no"], [
NEON_CFLAGS="$ac_cv_neon_inline"
AC_DEFINE([CAN_COMPILE_NEON], 1, [Define to 1 if NEON (and ARMv6) assembly is available with NEON_CFLAGS.])
])
], [
ac_cv_neon_inline="no"
......
......@@ -67,7 +67,13 @@ VLC_API unsigned vlc_CPU(void);
# else
# define HAVE_FPU 0
# endif
# define CPU_CAPABILITY_NEON (1<<24)
# define VLC_CPU_ARM_NEON 2
# ifdef __ARM_NEON__
# define vlc_CPU_ARM_NEON() (1)
# else
# define vlc_CPU_ARM_NEON() ((vlc_CPU() & VLC_CPU_ARM_NEON) != 0)
# endif
# elif defined (__sparc__)
# define HAVE_FPU 1
......
......@@ -45,7 +45,7 @@ static int Open (vlc_object_t *obj)
{
filter_t *filter = (filter_t *)obj;
if (!(vlc_CPU() & CPU_CAPABILITY_NEON))
if (!vlc_CPU_ARM_NEON())
return VLC_EGENERIC;
if (!AOUT_FMTS_SIMILAR (&filter->fmt_in.audio, &filter->fmt_out.audio))
return VLC_EGENERIC;
......
......@@ -162,7 +162,7 @@ static int Open (vlc_object_t *obj)
{
filter_t *filter = (filter_t *)obj;
if (!(vlc_CPU() & CPU_CAPABILITY_NEON))
if (!vlc_CPU_ARM_NEON())
return VLC_EGENERIC;
if ((filter->fmt_in.video.i_width != filter->fmt_out.video.i_width)
|| (filter->fmt_in.video.i_height != filter->fmt_out.video.i_height))
......
......@@ -125,7 +125,7 @@ static int Open (vlc_object_t *obj)
{
filter_t *filter = (filter_t *)obj;
if (!(vlc_CPU() & CPU_CAPABILITY_NEON))
if (!vlc_CPU_ARM_NEON())
return VLC_EGENERIC;
if (((filter->fmt_in.video.i_width | filter->fmt_in.video.i_height) & 1)
......
......@@ -208,7 +208,7 @@ static int OpenDecoder( vlc_object_t *p_this )
i_accel |= MPEG2_ACCEL_ARM;
# endif
# ifdef MPEG2_ACCEL_ARM_NEON
if( vlc_CPU() & CPU_CAPABILITY_NEON )
if( vlc_CPU_ARM_NEON() )
i_accel |= MPEG2_ACCEL_ARM_NEON;
# endif
......
......@@ -660,7 +660,7 @@ int Open( vlc_object_t *p_this )
else
#endif
#if defined __ARM_NEON__ // FIXME: runtime detect support
if( chroma->pixel_size == 1 && (vlc_CPU() & CPU_CAPABILITY_NEON) )
if( chroma->pixel_size == 1 && vlc_CPU_ARM_NEON() )
{
p_sys->pf_merge = MergeNEON;
p_sys->pf_end_merge = NULL;
......
......@@ -317,14 +317,11 @@ out:
# endif
#elif defined ( __arm__)
#ifdef __ARM_NEON__
i_capabilities |= CPU_CAPABILITY_NEON;
#elif defined (CAN_COMPILE_NEON)
#ifdef __ANDROID__
# ifdef __ANDROID__
if (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON)
i_capabilities |= CPU_CAPABILITY_NEON;
#endif
#endif
i_capabilities |= VLC_CPU_ARM_NEON;
# endif
#endif
cpu_flags = i_capabilities;
......@@ -347,14 +344,14 @@ unsigned vlc_CPU (void)
void vlc_CPU_dump (vlc_object_t *obj)
{
const unsigned flags = vlc_CPU();
char buf[200], *p = buf;
#if defined (__i386__) || defined (__x86_64__)
const unsigned flags = vlc_CPU();
#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");
......@@ -367,13 +364,11 @@ void vlc_CPU_dump (vlc_object_t *obj)
PRINT_CAPABILITY(CPU_CAPABILITY_SSE4A, "SSE4A");
#elif defined (__powerpc__) || defined (__ppc__) || defined (__ppc64__)
PRINT_CAPABILITY(CPU_CAPABILITY_ALTIVEC, "AltiVec");
if (vlc_CPU() & CPU_CAPABILITY_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
......
......@@ -63,10 +63,8 @@ static void vlc_CPU_init (void)
while ((cap = strsep (&p, " ")) != NULL)
{
#if defined (__arm__)
# ifndef __ARM_NEON__
if (!strcmp (cap, "neon"))
core_caps |= CPU_CAPABILITY_NEON;
# endif
core_caps |= VLC_CPU_ARM_NEON;
#elif defined (__i386__) || defined (__x86_64__)
# ifndef __MMX__
......@@ -122,12 +120,7 @@ static void vlc_CPU_init (void)
all_caps = 0; /* Do not assume any capability! */
/* Always enable capabilities that were forced during compilation */
#if defined (__arm__)
# ifdef __ARM_NEON__
all_caps |= CPU_CAPABILITY_NEON;
# endif
#elif defined (__i386__) || defined (__x86_64__)
#if defined (__i386__) || defined (__x86_64__)
# ifdef __MMX__
all_caps |= CPU_CAPABILITY_MMX;
# endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment