preliminary neon asm support. do NOT use!

SVN revision: 39474
This commit is contained in:
Carsten Haitzler 2009-03-14 06:48:25 +00:00
parent b4465ec30a
commit eba0aaffd6
10 changed files with 490 additions and 4 deletions

View File

@ -610,10 +610,38 @@ if test "x$build_cpu_altivec" = "xyes"; then
AC_DEFINE(BUILD_ALTIVEC, 1, [Build Altivec Code])
fi
fi
AC_MSG_RESULT($altivec_cflags)
AC_MSG_RESULT($altivec_cflags)
CFLAGS="$CFLAGS $altivec_cflags"
fi
#######################################
## NEON
build_cpu_neon="no"
case $host_cpu in
armv7*)
build_cpu_neon="yes"
;;
esac
AC_MSG_CHECKING(whether to build neon code)
AC_ARG_ENABLE(cpu-neon,
AC_HELP_STRING([--enable-cpu-neon], [enable neon code]),
[
if test "x$enableval" = "xyes" ; then
AC_MSG_RESULT(yes)
AC_DEFINE(BUILD_NEON, 1, [Build NEON Code])
build_cpu_neon="yes"
else
AC_MSG_RESULT(no)
build_cpu_neon="no"
fi
],
[
AC_MSG_RESULT($build_cpu_neon)
if test "x$build_cpu_neon" = "xyes" ; then
AC_DEFINE(BUILD_NEON, 1, [Build NEON Code])
fi
]
)
#######################################
## C
@ -1069,6 +1097,7 @@ echo " Fallback C Code.........: $build_cpu_c"
echo " MMX.....................: $build_cpu_mmx"
echo " SSE.....................: $build_cpu_sse"
echo " ALTIVEC.................: $build_cpu_altivec"
echo " NEON....................: $build_cpu_neon"
echo " Thread Support..........: $build_pthreads"
echo " MAGIC_DEBUG.............: $want_evas_magic_debug"
echo

View File

@ -76,6 +76,18 @@ evas_common_cpu_altivec_test(void)
#endif /* __POWERPC__ */
}
void
evas_common_cpu_neon_test(void)
{
#if defined(__ARM_ARCH__) && (__ARM_ARCH__ >= 70)
#ifdef BUILD_NEON
asm volatile (
"vqadd.u8 d0, d1, d0\n"
);
#endif
#endif
}
void
evas_common_cpu_vis_test(void)
{
@ -159,6 +171,13 @@ evas_common_cpu_init(void)
if (getenv("EVAS_CPU_NO_VIS"))
cpu_feature_mask &= ~CPU_FEATURE_VIS;
#endif /* __SPARC__ */
#if defined(__ARM_ARCH__) && (__ARM_ARCH__ >= 70)
#ifdef BUILD_NEON
cpu_feature_mask |= CPU_FEATURE_NEON *
evas_common_cpu_feature_test(evas_common_cpu_neon_test);
evas_common_cpu_end_opt();
#endif
#endif
}
int

View File

@ -10,4 +10,5 @@ op_blend_pixel_color_.c \
op_blend_pixel_color_i386.c \
op_blend_pixel_i386.c \
op_blend_pixel_mask_.c \
op_blend_pixel_mask_i386.c
op_blend_pixel_mask_i386.c \
op_blend_pixel_neon.c

View File

@ -0,0 +1,155 @@
/* blend pixel --> dst */
#ifdef BUILD_NEON
static void
_op_blend_p_dp_neon(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
DATA32 *e = d + l;
while (d < e) {
l = 256 - (*s >> 24);
*d = *s++ + MUL_256(l, *d);
d++;
}
}
static void
_op_blend_pas_dp_neon(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
DATA32 *e = d + l;
// this one... first
while (d < e)
{
switch (*s & 0xff000000)
{
case 0:
break;
case 0xff000000:
*d = *s;
break;
default :
l = 256 - (*s >> 24);
*d = *s + MUL_256(l, *d);
break;
}
s++; d++;
}
}
#define _op_blend_pan_dp_neon NULL
#define _op_blend_p_dpan_neon _op_blend_p_dp_neon
#define _op_blend_pas_dpan_neon _op_blend_pas_dp_neon
#define _op_blend_pan_dpan_neon _op_blend_pan_dp_neon
static void
init_blend_pixel_span_funcs_neon(void)
{
op_blend_span_funcs[SP][SM_N][SC_N][DP][CPU_NEON] = _op_blend_p_dp_neon;
op_blend_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_NEON] = _op_blend_pas_dp_neon;
op_blend_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_NEON] = _op_blend_pan_dp_neon;
op_blend_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_p_dpan_neon;
op_blend_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_pas_dpan_neon;
op_blend_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_pan_dpan_neon;
}
#endif
#ifdef BUILD_NEON
static void
_op_blend_pt_p_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
c = 256 - (s >> 24);
*d = s + MUL_256(c, *d);
}
#define _op_blend_pt_pan_dp_neon NULL
#define _op_blend_pt_pas_dp_neon _op_blend_pt_p_dp_neon
#define _op_blend_pt_p_dpan_neon _op_blend_pt_p_dp_neon
#define _op_blend_pt_pan_dpan_neon _op_blend_pt_pan_dp_neon
#define _op_blend_pt_pas_dpan_neon _op_blend_pt_pas_dp_neon
static void
init_blend_pixel_pt_funcs_neon(void)
{
op_blend_pt_funcs[SP][SM_N][SC_N][DP][CPU_NEON] = _op_blend_pt_p_dp_neon;
op_blend_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_NEON] = _op_blend_pt_pas_dp_neon;
op_blend_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_NEON] = _op_blend_pt_pan_dp_neon;
op_blend_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_pt_p_dpan_neon;
op_blend_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_pt_pas_dpan_neon;
op_blend_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_pt_pan_dpan_neon;
}
#endif
/*-----*/
/* blend_rel pixel -> dst */
#ifdef BUILD_NEON
static void
_op_blend_rel_p_dp_neon(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
DATA32 *e = d + l;
while (d < e) {
l = 256 - (*s >> 24);
c = 1 + (*d >> 24);
*d = MUL_256(c, *s) + MUL_256(l, *d);
d++;
s++;
}
}
static void
_op_blend_rel_pan_dp_neon(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
DATA32 *e = d + l;
while (d < e) {
c = 1 + (*d >> 24);
*d++ = MUL_256(c, *s);
s++;
}
}
#define _op_blend_rel_pas_dp_neon _op_blend_rel_p_dp_neon
#define _op_blend_rel_p_dpan_neon _op_blend_p_dpan_neon
#define _op_blend_rel_pan_dpan_neon _op_blend_pan_dpan_neon
#define _op_blend_rel_pas_dpan_neon _op_blend_pas_dpan_neon
static void
init_blend_rel_pixel_span_funcs_neon(void)
{
op_blend_rel_span_funcs[SP][SM_N][SC_N][DP][CPU_NEON] = _op_blend_rel_p_dp_neon;
op_blend_rel_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_NEON] = _op_blend_rel_pas_dp_neon;
op_blend_rel_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_NEON] = _op_blend_rel_pan_dp_neon;
op_blend_rel_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_p_dpan_neon;
op_blend_rel_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pas_dpan_neon;
op_blend_rel_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pan_dpan_neon;
}
#endif
#ifdef BUILD_NEON
static void
_op_blend_rel_pt_p_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
c = 256 - (s >> 24);
*d = MUL_SYM(*d >> 24, s) + MUL_256(c, *d);
}
#define _op_blend_rel_pt_pas_dp_neon _op_blend_rel_pt_p_dp_neon
#define _op_blend_rel_pt_pan_dp_neon _op_blend_rel_pt_p_dp_neon
#define _op_blend_rel_pt_p_dpan_neon _op_blend_pt_p_dpan_neon
#define _op_blend_rel_pt_pas_dpan_neon _op_blend_pt_pas_dpan_neon
#define _op_blend_rel_pt_pan_dpan_neon _op_blend_pt_pan_dpan_neon
static void
init_blend_rel_pixel_pt_funcs_neon(void)
{
op_blend_rel_pt_funcs[SP][SM_N][SC_N][DP][CPU_NEON] = _op_blend_rel_pt_p_dp_neon;
op_blend_rel_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_NEON] = _op_blend_rel_pt_pas_dp_neon;
op_blend_rel_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_NEON] = _op_blend_rel_pt_pan_dp_neon;
op_blend_rel_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pt_p_dpan_neon;
op_blend_rel_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pt_pas_dpan_neon;
op_blend_rel_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pt_pan_dpan_neon;
}
#endif

View File

@ -84,6 +84,13 @@ evas_common_gfx_compositor_blend_rel_get(void)
# include "./evas_op_blend/op_blend_mask_color_i386.c"
//# include "./evas_op_blend/op_blend_pixel_mask_color_i386.c"
# include "./evas_op_blend/op_blend_pixel_neon.c"
//# include "./evas_op_blend/op_blend_color_neon.c"
//# include "./evas_op_blend/op_blend_pixel_color_neon.c"
//# include "./evas_op_blend/op_blend_pixel_mask_neon.c"
//# include "./evas_op_blend/op_blend_mask_color_neon.c"
////# include "./evas_op_blend/op_blend_pixel_mask_color_neon.c"
static void
op_blend_init(void)
{
@ -115,6 +122,19 @@ op_blend_init(void)
init_blend_color_pt_funcs_c();
init_blend_mask_color_pt_funcs_c();
#endif
#ifdef BUILD_NEON
init_blend_pixel_span_funcs_neon();
// init_blend_pixel_color_span_funcs_neon();
// init_blend_pixel_mask_span_funcs_neon();
// init_blend_color_span_funcs_neon();
// init_blend_mask_color_span_funcs_neon();
init_blend_pixel_pt_funcs_neon();
// init_blend_pixel_color_pt_funcs_neon();
// init_blend_pixel_mask_pt_funcs_neon();
// init_blend_color_pt_funcs_neon();
// init_blend_mask_color_pt_funcs_neon();
#endif
}
static void
@ -135,6 +155,14 @@ blend_gfx_span_func_cpu(int s, int m, int c, int d)
if (func) return func;
}
#endif
#ifdef BUILD_NEON
if (evas_common_cpu_has_feature(CPU_FEATURE_NEON))
{
cpu = CPU_NEON;
func = op_blend_span_funcs[s][m][c][d][cpu];
if (func) return func;
}
#endif
#ifdef BUILD_C
cpu = CPU_C;
func = op_blend_span_funcs[s][m][c][d][cpu];

View File

@ -3,6 +3,7 @@ MAINTAINERCLEANFILES = Makefile.in
EXTRA_DIST = \
op_copy_color_.c \
op_copy_color_i386.c \
op_copy_color_neon.c \
op_copy_mask_color_.c \
op_copy_mask_color_i386.c \
op_copy_pixel_.c \

View File

@ -0,0 +1,158 @@
/* copy color --> dst */
#ifdef BUILD_NEON
static void
_op_copy_c_dp_neon(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
// FIXME: handle unaligned stores - stores not aligned to 16bytes may suck
uint32_t *e;
uint32_t dalign = ((uint32_t)d) & 0xf; // get alignment
if (dalign > 0)
{
dalign = 16 - dalign;
if (l < dalign) dalign = l;
l -= dalign;
e = d + dalign;
for (; d < e; d++) {
*d = c; // OP
}
if (l <= 0) return;
}
e = d + l;
e -= 15;
uint32x4_t col = vdupq_n_u32(c);
for (; d < e; d += 16) {
vst1q_u32(d+0, col); // OP
vst1q_u32(d+4, col); // OP
vst1q_u32(d+8, col); // OP
vst1q_u32(d+12, col); // OP
}
e += 15;
for (; d < e; d++) {
*d = c; // OP
}
}
#define _op_copy_cn_dp_neon _op_copy_c_dp_neon
#define _op_copy_can_dp_neon _op_copy_c_dp_neon
#define _op_copy_caa_dp_neon _op_copy_c_dp_neon
#define _op_copy_cn_dpan_neon _op_copy_c_dp_neon
#define _op_copy_c_dpan_neon _op_copy_c_dp_neon
#define _op_copy_can_dpan_neon _op_copy_c_dp_neon
#define _op_copy_caa_dpan_neon _op_copy_c_dp_neon
static void
init_copy_color_span_funcs_neon(void)
{
op_copy_span_funcs[SP_N][SM_N][SC_N][DP][CPU_NEON] = _op_copy_cn_dp_neon;
op_copy_span_funcs[SP_N][SM_N][SC][DP][CPU_NEON] = _op_copy_c_dp_neon;
op_copy_span_funcs[SP_N][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_can_dp_neon;
op_copy_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_caa_dp_neon;
op_copy_span_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_cn_dpan_neon;
op_copy_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_c_dpan_neon;
op_copy_span_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_can_dpan_neon;
op_copy_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_caa_dpan_neon;
}
#endif
#ifdef BUILD_NEON
static void
_op_copy_pt_c_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
*d = c;
}
#define _op_copy_pt_cn_dp_neon _op_copy_pt_c_dp_neon
#define _op_copy_pt_can_dp_neon _op_copy_pt_c_dp_neon
#define _op_copy_pt_caa_dp_neon _op_copy_pt_c_dp_neon
#define _op_copy_pt_cn_dpan_neon _op_copy_pt_c_dp_neon
#define _op_copy_pt_c_dpan_neon _op_copy_pt_c_dp_neon
#define _op_copy_pt_can_dpan_neon _op_copy_pt_c_dp_neon
#define _op_copy_pt_caa_dpan_neon _op_copy_pt_c_dp_neon
static void
init_copy_color_pt_funcs_neon(void)
{
op_copy_pt_funcs[SP_N][SM_N][SC_N][DP][CPU_NEON] = _op_copy_pt_cn_dp_neon;
op_copy_pt_funcs[SP_N][SM_N][SC][DP][CPU_NEON] = _op_copy_pt_c_dp_neon;
op_copy_pt_funcs[SP_N][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_pt_can_dp_neon;
op_copy_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_pt_caa_dp_neon;
op_copy_pt_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_pt_cn_dpan_neon;
op_copy_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_pt_c_dpan_neon;
op_copy_pt_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_pt_can_dpan_neon;
op_copy_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_pt_caa_dpan_neon;
}
#endif
/*-----*/
/* copy_rel color --> dst */
#ifdef BUILD_NEON
static void
_op_copy_rel_c_dp_neon(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
// FIXME: neon-it
DATA32 *e = d + l;
for (; d < e; d++) {
*d = MUL_SYM(*d >> 24, c);
}
}
#define _op_copy_rel_cn_dp_neon _op_copy_rel_c_dp_neon
#define _op_copy_rel_can_dp_neon _op_copy_rel_c_dp_neon
#define _op_copy_rel_caa_dp_neon _op_copy_rel_c_dp_neon
#define _op_copy_rel_cn_dpan_neon _op_copy_cn_dpan_neon
#define _op_copy_rel_c_dpan_neon _op_copy_c_dpan_neon
#define _op_copy_rel_can_dpan_neon _op_copy_can_dpan_neon
#define _op_copy_rel_caa_dpan_neon _op_copy_caa_dpan_neon
static void
init_copy_rel_color_span_funcs_neon(void)
{
op_copy_rel_span_funcs[SP_N][SM_N][SC_N][DP][CPU_NEON] = _op_copy_rel_cn_dp_neon;
op_copy_rel_span_funcs[SP_N][SM_N][SC][DP][CPU_NEON] = _op_copy_rel_c_dp_neon;
op_copy_rel_span_funcs[SP_N][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_rel_can_dp_neon;
op_copy_rel_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_rel_caa_dp_neon;
op_copy_rel_span_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_cn_dpan_neon;
op_copy_rel_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_rel_c_dpan_neon;
op_copy_rel_span_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_can_dpan_neon;
op_copy_rel_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_caa_dpan_neon;
}
#endif
#ifdef BUILD_NEON
static void
_op_copy_rel_pt_c_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
s = 1 + (*d >> 24);
*d = MUL_256(s, c);
}
#define _op_copy_rel_pt_cn_dp_neon _op_copy_rel_pt_c_dp_neon
#define _op_copy_rel_pt_can_dp_neon _op_copy_rel_pt_c_dp_neon
#define _op_copy_rel_pt_caa_dp_neon _op_copy_rel_pt_c_dp_neon
#define _op_copy_rel_pt_cn_dpan_neon _op_copy_pt_cn_dpan_neon
#define _op_copy_rel_pt_c_dpan_neon _op_copy_pt_c_dpan_neon
#define _op_copy_rel_pt_can_dpan_neon _op_copy_pt_can_dpan_neon
#define _op_copy_rel_pt_caa_dpan_neon _op_copy_pt_caa_dpan_neon
static void
init_copy_rel_color_pt_funcs_neon(void)
{
op_copy_rel_pt_funcs[SP_N][SM_N][SC_N][DP][CPU_NEON] = _op_copy_rel_pt_cn_dp_neon;
op_copy_rel_pt_funcs[SP_N][SM_N][SC][DP][CPU_NEON] = _op_copy_rel_pt_c_dp_neon;
op_copy_rel_pt_funcs[SP_N][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_rel_pt_can_dp_neon;
op_copy_rel_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_rel_pt_caa_dp_neon;
op_copy_rel_pt_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pt_cn_dpan_neon;
op_copy_rel_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_rel_pt_c_dpan_neon;
op_copy_rel_pt_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_pt_can_dpan_neon;
op_copy_rel_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_pt_caa_dpan_neon;
}
#endif

View File

@ -89,6 +89,13 @@ evas_common_gfx_compositor_copy_rel_get(void)
# include "./evas_op_copy/op_copy_mask_color_i386.c"
//# include "./evas_op_copy/op_copy_pixel_mask_color_i386.c"
//# include "./evas_op_copy/op_copy_pixel_i386.c"
# include "./evas_op_copy/op_copy_color_neon.c"
//# include "./evas_op_copy/op_copy_pixel_color_i386.c"
//# include "./evas_op_copy/op_copy_pixel_mask_i386.c"
//# include "./evas_op_copy/op_copy_mask_color_i386.c"
////# include "./evas_op_copy/op_copy_pixel_mask_color_i386.c"
static void
op_copy_init(void)
@ -121,6 +128,19 @@ op_copy_init(void)
init_copy_color_pt_funcs_c();
init_copy_mask_color_pt_funcs_c();
#endif
#ifdef BUILD_NEON
// init_copy_pixel_span_funcs_neon();
// init_copy_pixel_color_span_funcs_neon();
// init_copy_pixel_mask_span_funcs_neon();
init_copy_color_span_funcs_neon();
// init_copy_mask_color_span_funcs_neon();
// init_copy_pixel_pt_funcs_neon();
// init_copy_pixel_color_pt_funcs_neon();
// init_copy_pixel_mask_pt_funcs_neon();
init_copy_color_pt_funcs_neon();
// init_copy_mask_color_pt_funcs_neon();
#endif
}
static void
@ -141,6 +161,14 @@ copy_gfx_span_func_cpu(int s, int m, int c, int d)
if (func) return func;
}
#endif
#ifdef BUILD_NEON
if (evas_common_cpu_has_feature(CPU_FEATURE_NEON))
{
cpu = CPU_NEON;
func = op_copy_span_funcs[s][m][c][d][cpu];
if (func) return func;
}
#endif
#ifdef BUILD_C
cpu = CPU_C;
func = op_copy_span_funcs[s][m][c][d][cpu];

View File

@ -66,7 +66,9 @@
/* cpu SSE2 */
#define CPU_SSE2 4
/* cpu flags count */
#define CPU_LAST 5
#define CPU_NEON 5
/* cpu flags count */
#define CPU_LAST 6
/* some useful constants */

View File

@ -16,6 +16,64 @@
#include "evas_options.h"
#if defined(__ARM_ARCH_3M__)
# define __ARM_ARCH__ 40
#endif
#if defined(__ARM_ARCH_4__)
# define __ARM_ARCH__ 40
#endif
#if defined(__ARM_ARCH_4T__)
# define __ARM_ARCH__ 41
#endif
#if defined(__ARM_ARCH_5__)
# define __ARM_ARCH__ 50
#endif
#if defined(__ARM_ARCH_5T__)
# define __ARM_ARCH__ 51
#endif
#if defined(__ARM_ARCH_5E__)
# define __ARM_ARCH__ 52
#endif
#if defined(__ARM_ARCH_5TE__)
# define __ARM_ARCH__ 53
#endif
#if defined(__ARM_ARCH_5TEJ__)
# define __ARM_ARCH__ 54
#endif
#if defined(__ARM_ARCH_6__)
# define __ARM_ARCH__ 60
#endif
#if defined(__ARM_ARCH_6J__)
# define __ARM_ARCH__ 61
#endif
#if defined(__ARM_ARCH_6K__)
# define __ARM_ARCH__ 62
#endif
#if defined(__ARM_ARCH_6Z__)
# define __ARM_ARCH__ 63
#endif
#if defined(__ARM_ARCH_6ZK__)
# define __ARM_ARCH__ 64
#endif
#if defined(__ARM_ARCH_6T2__)
# define __ARM_ARCH__ 65
#endif
#if defined(__ARM_ARCH_7__)
# define __ARM_ARCH__ 70
#endif
#if defined(__ARM_ARCH_7A__)
# define __ARM_ARCH__ 71
#endif
#if defined(__ARM_ARCH_7R__)
# define __ARM_ARCH__ 72
#endif
#if defined(__ARM_ARCH_7M__)
# define __ARM_ARCH__ 73
#endif
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
@ -324,7 +382,8 @@ typedef enum _CPU_Features
CPU_FEATURE_SSE = (1 << 2),
CPU_FEATURE_ALTIVEC = (1 << 3),
CPU_FEATURE_VIS = (1 << 4),
CPU_FEATURE_VIS2 = (1 << 5)
CPU_FEATURE_VIS2 = (1 << 5),
CPU_FEATURE_NEON = (1 << 6)
} CPU_Features;
typedef enum _Font_Hint_Flags
@ -1053,6 +1112,12 @@ void evas_font_dir_cache_free(void);
/*****************************************************************************/
#if defined(__ARM_ARCH__) && (__ARM_ARCH__ >= 70)
#ifdef BUILD_NEON
# include <arm_neon.h>
#endif
#endif
#ifdef __cplusplus
}
#endif