summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerek Foreman <derekf@osg.samsung.com>2016-09-16 13:05:56 -0500
committerDerek Foreman <derekf@osg.samsung.com>2016-09-16 14:10:49 -0500
commita453599d26336ada2d2e09a86c8baf994b4cae8c (patch)
tree20572c6a87ab61afec8fdfa1f57b0b50d71d0ca6
parent0f98e1c6d324a7d17b6e7bdb7b1b41d3a2db9954 (diff)
downloadefl-a453599d26336ada2d2e09a86c8baf994b4cae8c.tar.gz
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.
-rw-r--r--configure.ac2
-rw-r--r--src/lib/eina/eina_cpu.c21
2 files changed, 22 insertions, 1 deletions
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 <sys/auxv.h>
+# include <asm/hwcap.h>
+#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();