forked from enlightenment/efl
preliminary neon asm support. do NOT use!
SVN revision: 39474
This commit is contained in:
parent
b4465ec30a
commit
eba0aaffd6
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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];
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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
|
|
@ -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];
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue