From a453599d26336ada2d2e09a86c8baf994b4cae8c Mon Sep 17 00:00:00 2001 From: Derek Foreman Date: Fri, 16 Sep 2016 13:05:56 -0500 Subject: [PATCH] eina_cpu: Detect NEON if available We may have a few conditionals around that think this has actually been set at some point, let's surprise them by actually doing that. --- configure.ac | 2 ++ src/lib/eina/eina_cpu.c | 21 ++++++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 924ceaad39..d0b9962823 100644 --- a/configure.ac +++ b/configure.ac @@ -449,6 +449,8 @@ sys/types.h \ sys/param.h \ sys/mman.h \ netinet/in.h \ +sys/auxv.h \ +asm/hwcap.h \ ]) EFL_CHECK_PATH_MAX diff --git a/src/lib/eina/eina_cpu.c b/src/lib/eina/eina_cpu.c index fe3986111b..1de86d8387 100644 --- a/src/lib/eina/eina_cpu.c +++ b/src/lib/eina/eina_cpu.c @@ -53,6 +53,11 @@ #include "eina_cpu_private.h" +#if defined(HAVE_SYS_AUXV_H) && defined(HAVE_ASM_HWCAP_H) && defined(__arm__) && defined(__linux__) +# include +# include +#endif + /*============================================================================* * Local * *============================================================================*/ @@ -129,6 +134,19 @@ void _x86_simd(Eina_Cpu_Features *features) } #endif +#if defined(HAVE_SYS_AUXV_H) && defined(HAVE_ASM_HWCAP_H) && defined(__arm__) && defined(__linux__) +static void +_arm_cpu_features(Eina_Cpu_Features *features) +{ + unsigned long aux; + + aux = getauxval(AT_HWCAP); + + if (aux & HWCAP_NEON) + *features |= EINA_CPU_NEON; +} +#endif + /*============================================================================* * Global * *============================================================================*/ @@ -147,8 +165,9 @@ eina_cpu_init(void) { #if defined(__i386__) || defined(__x86_64__) _x86_simd(&eina_cpu_features); +#elif defined(HAVE_SYS_AUXV_H) && defined(HAVE_ASM_HWCAP_H) && defined(__arm__) && defined(__linux__) + _arm_cpu_features(&eina_cpu_features); #endif - // FIXME: Handle NEON and friends // Figure out the page size for this system _eina_page_size();