more neon infra - just for "copies" right now. only 1 func filled in.
authorraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 16 Mar 2009 10:50:37 +0000 (10:50 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 16 Mar 2009 10:50:37 +0000 (10:50 +0000)
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@39502 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/canvas/evas_object_textblock.c
src/lib/engines/common/evas_op_copy/Makefile.am
src/lib/engines/common/evas_op_copy/op_copy_color_neon.c
src/lib/engines/common/evas_op_copy/op_copy_mask_color_neon.c [new file with mode: 0644]
src/lib/engines/common/evas_op_copy/op_copy_pixel_color_neon.c [new file with mode: 0644]
src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_neon.c [new file with mode: 0644]
src/lib/engines/common/evas_op_copy/op_copy_pixel_neon.c [new file with mode: 0644]
src/lib/engines/common/evas_op_copy_main_.c

index 316ff49..00b87e3 100644 (file)
@@ -2279,7 +2279,7 @@ _find_layout_item_line_match(Evas_Object *obj, Evas_Object_Textblock_Node *n, in
               {
                  *lnr = ln;
                  /* FIXME: Is that really what we want ? */
-                 *itr = fit;
+                 *itr = (Evas_Object_Textblock_Item *)fit;
                  return;
               }
          }
index faa3501..9f11a04 100644 (file)
@@ -6,9 +6,12 @@ op_copy_color_i386.c \
 op_copy_color_neon.c \
 op_copy_mask_color_.c \
 op_copy_mask_color_i386.c \
+op_copy_mask_color_neon.c \
 op_copy_pixel_.c \
 op_copy_pixel_color_.c \
 op_copy_pixel_color_i386.c \
+op_copy_pixel_color_neon.c \
 op_copy_pixel_i386.c \
 op_copy_pixel_mask_.c \
-op_copy_pixel_mask_i386.c
+op_copy_pixel_mask_i386.c \
+op_copy_pixel_mask_neon.c
index d6b593d..d276bc0 100644 (file)
@@ -4,9 +4,9 @@
 #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
+   // handle unaligned stores - stores not aligned to 16bytes may suck
    if (dalign > 0)
      {
         dalign = 16 - dalign;
@@ -20,7 +20,9 @@ _op_copy_c_dp_neon(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
      }
    e = d + l;
    e -= 15;
+   // expand the color in c to a 128 bit register as "cccc" i.e 4 pixels of c
    uint32x4_t col = vdupq_n_u32(c);
+   // fill a run of 4x4 (16) pixels with the color
    for (; d < e; d += 16) {
       vst1q_u32(d+0, col); // OP
       vst1q_u32(d+4, col); // OP
@@ -28,6 +30,7 @@ _op_copy_c_dp_neon(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
       vst1q_u32(d+12, col); // OP
    }
    e += 15;
+   // fixup any leftover pixels in the run
    for (; d < e; d++) {
       *d = c; // OP
    }
@@ -60,7 +63,7 @@ init_copy_color_span_funcs_neon(void)
 #ifdef BUILD_NEON
 static void
 _op_copy_pt_c_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
-     *d = c;
+   *d = c;
 }
 
 #define _op_copy_pt_cn_dp_neon _op_copy_pt_c_dp_neon
@@ -128,8 +131,8 @@ init_copy_rel_color_span_funcs_neon(void)
 #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);
+   s = 1 + (*d >> 24);
+   *d = MUL_256(s, c);
 }
 
 
diff --git a/src/lib/engines/common/evas_op_copy/op_copy_mask_color_neon.c b/src/lib/engines/common/evas_op_copy/op_copy_mask_color_neon.c
new file mode 100644 (file)
index 0000000..e2f3bdb
--- /dev/null
@@ -0,0 +1,171 @@
+
+/* copy mask x color -> dst */
+
+#ifdef BUILD_NEON
+static void
+_op_copy_mas_c_dp_neon(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   // FIXME: neon-it
+   DATA32 *e;
+   int color;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        color = *m;
+                        switch(color)
+                          {
+                          case 0:
+                             break;
+                          case 255:
+                             *d = c;
+                             break;
+                          default:
+                             color++;
+                             *d = INTERP_256(color, c, *d);
+                             break;
+                          }
+                        m++;  d++;
+                     });
+}
+
+#define _op_copy_mas_cn_dp_neon _op_copy_mas_c_dp_neon
+#define _op_copy_mas_can_dp_neon _op_copy_mas_c_dp_neon
+#define _op_copy_mas_caa_dp_neon _op_copy_mas_c_dp_neon
+
+#define _op_copy_mas_c_dpan_neon _op_copy_mas_c_dp_neon
+#define _op_copy_mas_cn_dpan_neon _op_copy_mas_c_dpan_neon
+#define _op_copy_mas_can_dpan_neon _op_copy_mas_c_dpan_neon
+#define _op_copy_mas_caa_dpan_neon _op_copy_mas_c_dpan_neon
+
+static void
+init_copy_mask_color_span_funcs_neon(void)
+{
+   op_copy_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_mas_cn_dp_neon;
+   op_copy_span_funcs[SP_N][SM_AS][SC][DP][CPU_NEON] = _op_copy_mas_c_dp_neon;
+   op_copy_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_NEON] = _op_copy_mas_can_dp_neon;
+   op_copy_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_NEON] = _op_copy_mas_caa_dp_neon;
+
+   op_copy_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_mas_cn_dpan_neon;
+   op_copy_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_NEON] = _op_copy_mas_c_dpan_neon;
+   op_copy_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_NEON] = _op_copy_mas_can_dpan_neon;
+   op_copy_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_NEON] = _op_copy_mas_caa_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void
+_op_copy_pt_mas_c_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+   *d = INTERP_256(m + 1, c, *d);
+}
+
+#define _op_copy_pt_mas_cn_dp_neon _op_copy_pt_mas_c_dp_neon
+#define _op_copy_pt_mas_can_dp_neon _op_copy_pt_mas_c_dp_neon
+#define _op_copy_pt_mas_caa_dp_neon _op_copy_pt_mas_c_dp_neon
+
+#define _op_copy_pt_mas_c_dpan_neon _op_copy_pt_mas_c_dp_neon
+#define _op_copy_pt_mas_cn_dpan_neon _op_copy_pt_mas_c_dpan_neon
+#define _op_copy_pt_mas_can_dpan_neon _op_copy_pt_mas_c_dpan_neon
+#define _op_copy_pt_mas_caa_dpan_neon _op_copy_pt_mas_c_dpan_neon
+
+static void
+init_copy_mask_color_pt_funcs_neon(void)
+{
+   op_copy_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_pt_mas_cn_dp_neon;
+   op_copy_pt_funcs[SP_N][SM_AS][SC][DP][CPU_NEON] = _op_copy_pt_mas_c_dp_neon;
+   op_copy_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_NEON] = _op_copy_pt_mas_can_dp_neon;
+   op_copy_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_NEON] = _op_copy_pt_mas_caa_dp_neon;
+
+   op_copy_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_pt_mas_cn_dpan_neon;
+   op_copy_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_NEON] = _op_copy_pt_mas_c_dpan_neon;
+   op_copy_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_NEON] = _op_copy_pt_mas_can_dpan_neon;
+   op_copy_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_NEON] = _op_copy_pt_mas_caa_dpan_neon;
+}
+#endif
+
+/*-----*/
+
+/* copy_rel mask x color -> dst */
+
+#ifdef BUILD_NEON
+static void
+_op_copy_rel_mas_c_dp_neon(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) {
+   // FIXME: neon-it
+   DATA32 *e;
+   int color;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        color = *m;
+                        switch(color)
+                          {
+                          case 0:
+                             break;
+                          case 255:
+                             color = 1 + (*d >> 24);
+                             *d = MUL_256(color, c);
+                             break;
+                          default:
+                               {
+                                  DATA32 da = 1 + (*d >> 24);
+                                  da = MUL_256(da, c);
+                                  color++;
+                                  *d = INTERP_256(color, da, *d);
+                               }
+                             break;
+                          }
+                        m++;  d++;
+                     });
+}
+
+#define _op_copy_rel_mas_cn_dp_neon _op_copy_rel_mas_c_dp_neon
+#define _op_copy_rel_mas_can_dp_neon _op_copy_rel_mas_c_dp_neon
+#define _op_copy_rel_mas_caa_dp_neon _op_copy_rel_mas_c_dp_neon
+
+#define _op_copy_rel_mas_c_dpan_neon _op_copy_mas_c_dpan_neon
+#define _op_copy_rel_mas_cn_dpan_neon _op_copy_mas_cn_dpan_neon
+#define _op_copy_rel_mas_can_dpan_neon _op_copy_mas_can_dpan_neon
+#define _op_copy_rel_mas_caa_dpan_neon _op_copy_mas_caa_dpan_neon
+
+static void
+init_copy_rel_mask_color_span_funcs_neon(void)
+{
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_rel_mas_cn_dp_neon;
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC][DP][CPU_NEON] = _op_copy_rel_mas_c_dp_neon;
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_NEON] = _op_copy_rel_mas_can_dp_neon;
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_NEON] = _op_copy_rel_mas_caa_dp_neon;
+
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_mas_cn_dpan_neon;
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_NEON] = _op_copy_rel_mas_c_dpan_neon;
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_mas_can_dpan_neon;
+   op_copy_rel_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_mas_caa_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void
+_op_copy_rel_pt_mas_c_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+   s = 1 + (*d >> 24);
+   s = MUL_256(s, c);
+   *d = INTERP_256(m + 1, s, *d);
+}
+
+#define _op_copy_rel_pt_mas_cn_dp_neon _op_copy_rel_pt_mas_c_dp_neon
+#define _op_copy_rel_pt_mas_can_dp_neon _op_copy_rel_pt_mas_c_dp_neon
+#define _op_copy_rel_pt_mas_caa_dp_neon _op_copy_rel_pt_mas_c_dp_neon
+
+#define _op_copy_rel_pt_mas_c_dpan_neon _op_copy_pt_mas_c_dpan_neon
+#define _op_copy_rel_pt_mas_cn_dpan_neon _op_copy_pt_mas_cn_dpan_neon
+#define _op_copy_rel_pt_mas_can_dpan_neon _op_copy_pt_mas_can_dpan_neon
+#define _op_copy_rel_pt_mas_caa_dpan_neon _op_copy_pt_mas_caa_dpan_neon
+
+static void
+init_copy_rel_mask_color_pt_funcs_neon(void)
+{
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_rel_pt_mas_cn_dp_neon;
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC][DP][CPU_NEON] = _op_copy_rel_pt_mas_c_dp_neon;
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_NEON] = _op_copy_rel_pt_mas_can_dp_neon;
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_NEON] = _op_copy_rel_pt_mas_caa_dp_neon;
+
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pt_mas_cn_dpan_neon;
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_NEON] = _op_copy_rel_pt_mas_c_dpan_neon;
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_pt_mas_can_dpan_neon;
+   op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_pt_mas_caa_dpan_neon;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_neon.c b/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_neon.c
new file mode 100644 (file)
index 0000000..af8e9e0
--- /dev/null
@@ -0,0 +1,239 @@
+
+/* copy pixel x color --> dst */
+
+#ifdef BUILD_NEON
+static void
+_op_copy_p_c_dp_neon(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   // FIXME: neon-it
+   DATA32 *e;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        *d = MUL4_SYM(c, *s);
+                        d++;
+                        s++;
+                     });
+}
+
+
+static void
+_op_copy_p_caa_dp_neon(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {   // FIXME: neon-it
+   // FIXME: neon-it
+   DATA32 *e;
+   c = 1 + (c >> 24);
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        *d = MUL_256(c, *s);
+                        d++;
+                        s++;
+                     });
+}
+
+
+#define _op_copy_pas_c_dp_neon _op_copy_p_c_dp_neon
+#define _op_copy_pan_c_dp_neon _op_copy_p_c_dp_neon
+#define _op_copy_p_can_dp_neon _op_copy_p_c_dp_neon
+#define _op_copy_pas_can_dp_neon _op_copy_pas_c_dp_neon
+#define _op_copy_pan_can_dp_neon _op_copy_pan_c_dp_neon
+#define _op_copy_pas_caa_dp_neon _op_copy_p_caa_dp_neon
+#define _op_copy_pan_caa_dp_neon _op_copy_p_caa_dp_neon
+
+#define _op_copy_p_c_dpan_neon _op_copy_p_c_dp_neon
+#define _op_copy_pas_c_dpan_neon _op_copy_pas_c_dp_neon
+#define _op_copy_pan_c_dpan_neon _op_copy_pan_c_dp_neon
+#define _op_copy_p_can_dpan_neon _op_copy_p_can_dp_neon
+#define _op_copy_pas_can_dpan_neon _op_copy_pas_can_dp_neon
+#define _op_copy_pan_can_dpan_neon _op_copy_pan_can_dp_neon
+#define _op_copy_p_caa_dpan_neon _op_copy_p_caa_dp_neon
+#define _op_copy_pas_caa_dpan_neon _op_copy_pas_caa_dp_neon
+#define _op_copy_pan_caa_dpan_neon _op_copy_pan_caa_dp_neon
+
+static void
+init_copy_pixel_color_span_funcs_neon(void)
+{
+   op_copy_span_funcs[SP][SM_N][SC][DP][CPU_NEON] = _op_copy_p_c_dp_neon;
+   op_copy_span_funcs[SP_AS][SM_N][SC][DP][CPU_NEON] = _op_copy_pas_c_dp_neon;
+   op_copy_span_funcs[SP_AN][SM_N][SC][DP][CPU_NEON] = _op_copy_pan_c_dp_neon;
+   op_copy_span_funcs[SP][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_p_can_dp_neon;
+   op_copy_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_pas_can_dp_neon;
+   op_copy_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_pan_can_dp_neon;
+   op_copy_span_funcs[SP][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_p_caa_dp_neon;
+   op_copy_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_pas_caa_dp_neon;
+   op_copy_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_pan_caa_dp_neon;
+
+   op_copy_span_funcs[SP][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_p_c_dpan_neon;
+   op_copy_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_pas_c_dpan_neon;
+   op_copy_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_pan_c_dpan_neon;
+   op_copy_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_p_can_dpan_neon;
+   op_copy_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_pas_can_dpan_neon;
+   op_copy_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_pan_can_dpan_neon;
+   op_copy_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_p_caa_dpan_neon;
+   op_copy_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_pas_caa_dpan_neon;
+   op_copy_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_pan_caa_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void
+_op_copy_pt_p_c_dp_neon(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+   *d = MUL4_SYM(c, s);
+}
+
+#define _op_copy_pt_pas_c_dp_neon _op_copy_pt_p_c_dp_neon
+#define _op_copy_pt_pan_c_dp_neon _op_copy_pt_p_c_dp_neon
+#define _op_copy_pt_p_can_dp_neon _op_copy_pt_p_c_dp_neon
+#define _op_copy_pt_pas_can_dp_neon _op_copy_pt_p_c_dp_neon
+#define _op_copy_pt_pan_can_dp_neon _op_copy_pt_p_c_dp_neon
+#define _op_copy_pt_p_caa_dp_neon _op_copy_pt_p_c_dp_neon
+#define _op_copy_pt_pas_caa_dp_neon _op_copy_pt_p_c_dp_neon
+#define _op_copy_pt_pan_caa_dp_neon _op_copy_pt_p_c_dp_neon
+
+#define _op_copy_pt_p_c_dpan_neon _op_copy_pt_p_c_dp_neon
+#define _op_copy_pt_pas_c_dpan_neon _op_copy_pt_pas_c_dp_neon
+#define _op_copy_pt_pan_c_dpan_neon _op_copy_pt_pan_c_dp_neon
+#define _op_copy_pt_p_can_dpan_neon _op_copy_pt_p_can_dp_neon
+#define _op_copy_pt_pas_can_dpan_neon _op_copy_pt_pas_can_dp_neon
+#define _op_copy_pt_pan_can_dpan_neon _op_copy_pt_pan_can_dp_neon
+#define _op_copy_pt_p_caa_dpan_neon _op_copy_pt_p_caa_dp_neon
+#define _op_copy_pt_pas_caa_dpan_neon _op_copy_pt_pas_caa_dp_neon
+#define _op_copy_pt_pan_caa_dpan_neon _op_copy_pt_pan_caa_dp_neon
+
+static void
+init_copy_pixel_color_pt_funcs_neon(void)
+{
+   op_copy_pt_funcs[SP][SM_N][SC][DP][CPU_NEON] = _op_copy_pt_p_c_dp_neon;
+   op_copy_pt_funcs[SP_AS][SM_N][SC][DP][CPU_NEON] = _op_copy_pt_pas_c_dp_neon;
+   op_copy_pt_funcs[SP_AN][SM_N][SC][DP][CPU_NEON] = _op_copy_pt_pan_c_dp_neon;
+   op_copy_pt_funcs[SP][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_pt_p_can_dp_neon;
+   op_copy_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_pt_pas_can_dp_neon;
+   op_copy_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_pt_pan_can_dp_neon;
+   op_copy_pt_funcs[SP][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_pt_p_caa_dp_neon;
+   op_copy_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_pt_pas_caa_dp_neon;
+   op_copy_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_pt_pan_caa_dp_neon;
+
+   op_copy_pt_funcs[SP][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_pt_p_c_dpan_neon;
+   op_copy_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_pt_pas_c_dpan_neon;
+   op_copy_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_pt_pan_c_dpan_neon;
+   op_copy_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_pt_p_can_dpan_neon;
+   op_copy_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_pt_pas_can_dpan_neon;
+   op_copy_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_pt_pan_can_dpan_neon;
+   op_copy_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_pt_p_caa_dpan_neon;
+   op_copy_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_pt_pas_caa_dpan_neon;
+   op_copy_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_pt_pan_caa_dpan_neon;
+}
+#endif
+
+/*-----*/
+
+/* copy_rel pixel x color --> dst */
+
+#ifdef BUILD_NEON
+static void
+_op_copy_rel_p_c_dp_neon(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) {
+   // FIXME: neon-it
+   DATA32 *e;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        DATA32 cs = MUL4_SYM(c, *s);
+                        *d = MUL_SYM(*d >> 24, cs);
+                        d++;
+                        s++;
+                     });
+}
+
+
+#define _op_copy_rel_pas_c_dp_neon _op_copy_rel_p_c_dp_neon
+#define _op_copy_rel_pan_c_dp_neon _op_copy_rel_p_c_dp_neon
+#define _op_copy_rel_p_can_dp_neon _op_copy_rel_p_c_dp_neon
+#define _op_copy_rel_pas_can_dp_neon _op_copy_rel_p_c_dp_neon
+#define _op_copy_rel_pan_can_dp_neon _op_copy_rel_p_c_dp_neon
+#define _op_copy_rel_p_caa_dp_neon _op_copy_rel_p_c_dp_neon
+#define _op_copy_rel_pas_caa_dp_neon _op_copy_rel_p_c_dp_neon
+#define _op_copy_rel_pan_caa_dp_neon _op_copy_rel_p_c_dp_neon
+
+#define _op_copy_rel_p_c_dpan_neon _op_copy_p_c_dpan_neon
+#define _op_copy_rel_pas_c_dpan_neon _op_copy_pas_c_dpan_neon
+#define _op_copy_rel_pan_c_dpan_neon _op_copy_pan_c_dpan_neon
+#define _op_copy_rel_p_can_dpan_neon _op_copy_p_can_dpan_neon
+#define _op_copy_rel_pas_can_dpan_neon _op_copy_pas_can_dpan_neon
+#define _op_copy_rel_pan_can_dpan_neon _op_copy_pan_can_dpan_neon
+#define _op_copy_rel_p_caa_dpan_neon _op_copy_p_caa_dpan_neon
+#define _op_copy_rel_pas_caa_dpan_neon _op_copy_pas_caa_dpan_neon
+#define _op_copy_rel_pan_caa_dpan_neon _op_copy_pan_caa_dpan_neon
+
+static void
+init_copy_rel_pixel_color_span_funcs_neon(void)
+{
+   op_copy_rel_span_funcs[SP][SM_N][SC][DP][CPU_NEON] = _op_copy_rel_p_c_dp_neon;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC][DP][CPU_NEON] = _op_copy_rel_pas_c_dp_neon;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC][DP][CPU_NEON] = _op_copy_rel_pan_c_dp_neon;
+   op_copy_rel_span_funcs[SP][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_rel_p_can_dp_neon;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_rel_pas_can_dp_neon;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_rel_pan_can_dp_neon;
+   op_copy_rel_span_funcs[SP][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_rel_p_caa_dp_neon;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_rel_pas_caa_dp_neon;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_rel_pan_caa_dp_neon;
+
+   op_copy_rel_span_funcs[SP][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_rel_p_c_dpan_neon;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_rel_pas_c_dpan_neon;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_rel_pan_c_dpan_neon;
+   op_copy_rel_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_p_can_dpan_neon;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_pas_can_dpan_neon;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_pan_can_dpan_neon;
+   op_copy_rel_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_p_caa_dpan_neon;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_pas_caa_dpan_neon;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_pan_caa_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void
+_op_copy_rel_pt_p_c_dp_neon(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+   s = MUL4_SYM(c, s);
+   *d = MUL_SYM(*d >> 24, s);
+}
+
+
+#define _op_copy_rel_pt_pas_c_dp_neon _op_copy_rel_pt_p_c_dp_neon
+#define _op_copy_rel_pt_pan_c_dp_neon _op_copy_rel_pt_p_c_dp_neon
+#define _op_copy_rel_pt_p_can_dp_neon _op_copy_rel_pt_p_c_dp_neon
+#define _op_copy_rel_pt_pas_can_dp_neon _op_copy_rel_pt_p_c_dp_neon
+#define _op_copy_rel_pt_pan_can_dp_neon _op_copy_rel_pt_p_c_dp_neon
+#define _op_copy_rel_pt_p_caa_dp_neon _op_copy_rel_pt_p_c_dp_neon
+#define _op_copy_rel_pt_pas_caa_dp_neon _op_copy_rel_pt_p_c_dp_neon
+#define _op_copy_rel_pt_pan_caa_dp_neon _op_copy_rel_pt_p_c_dp_neon
+
+#define _op_copy_rel_pt_p_c_dpan_neon _op_copy_pt_p_c_dpan_neon
+#define _op_copy_rel_pt_pas_c_dpan_neon _op_copy_pt_pas_c_dpan_neon
+#define _op_copy_rel_pt_pan_c_dpan_neon _op_copy_pt_pan_c_dpan_neon
+#define _op_copy_rel_pt_p_can_dpan_neon _op_copy_pt_p_can_dpan_neon
+#define _op_copy_rel_pt_pas_can_dpan_neon _op_copy_pt_pas_can_dpan_neon
+#define _op_copy_rel_pt_pan_can_dpan_neon _op_copy_pt_pan_can_dpan_neon
+#define _op_copy_rel_pt_p_caa_dpan_neon _op_copy_pt_p_caa_dpan_neon
+#define _op_copy_rel_pt_pas_caa_dpan_neon _op_copy_pt_pas_caa_dpan_neon
+#define _op_copy_rel_pt_pan_caa_dpan_neon _op_copy_pt_pan_caa_dpan_neon
+
+
+static void
+init_copy_rel_pixel_color_pt_funcs_neon(void)
+{
+   op_copy_rel_pt_funcs[SP][SM_N][SC][DP][CPU_NEON] = _op_copy_rel_pt_p_c_dp_neon;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC][DP][CPU_NEON] = _op_copy_rel_pt_pas_c_dp_neon;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC][DP][CPU_NEON] = _op_copy_rel_pt_pan_c_dp_neon;
+   op_copy_rel_pt_funcs[SP][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_rel_pt_p_can_dp_neon;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_rel_pt_pas_can_dp_neon;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_rel_pt_pan_can_dp_neon;
+   op_copy_rel_pt_funcs[SP][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_rel_pt_p_caa_dp_neon;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_rel_pt_pas_caa_dp_neon;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_rel_pt_pan_caa_dp_neon;
+
+   op_copy_rel_pt_funcs[SP][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_rel_pt_p_c_dpan_neon;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_rel_pt_pas_c_dpan_neon;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_rel_pt_pan_c_dpan_neon;
+   op_copy_rel_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_pt_p_can_dpan_neon;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_pt_pas_can_dpan_neon;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_pt_pan_can_dpan_neon;
+   op_copy_rel_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_pt_p_caa_dpan_neon;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_pt_pas_caa_dpan_neon;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_pt_pan_caa_dpan_neon;
+}
+#endif
diff --git a/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_neon.c b/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_neon.c
new file mode 100644 (file)
index 0000000..3d89ff8
--- /dev/null
@@ -0,0 +1,152 @@
+
+/* copy pixel x mask --> dst */
+
+#ifdef BUILD_NEON
+static void
+_op_copy_p_mas_dp_neon(DATA32 *s, DATA8 *m, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   // FIXME: neon-it
+   DATA32 *e;
+   int color;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        color = *m;
+                        switch(color)
+                          {
+                          case 0:
+                             break;
+                          case 255:
+                             *d = *s;
+                             break;
+                          default:
+                             color++;
+                             *d = INTERP_256(color, *s, *d);
+                             break;
+                          }
+                        m++;  s++;  d++;
+                     });
+}
+
+#define _op_copy_pan_mas_dp_neon _op_copy_p_mas_dp_neon
+#define _op_copy_pas_mas_dp_neon _op_copy_p_mas_dp_neon
+
+#define _op_copy_p_mas_dpan_neon _op_copy_p_mas_dp_neon
+#define _op_copy_pan_mas_dpan_neon _op_copy_p_mas_dpan_neon
+#define _op_copy_pas_mas_dpan_neon _op_copy_p_mas_dpan_neon
+
+static void
+init_copy_pixel_mask_span_funcs_neon(void)
+{
+   op_copy_span_funcs[SP][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_p_mas_dp_neon;
+   op_copy_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_pan_mas_dp_neon;
+   op_copy_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_pas_mas_dp_neon;
+
+   op_copy_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_p_mas_dpan_neon;
+   op_copy_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_pan_mas_dpan_neon;
+   op_copy_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_pas_mas_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void
+_op_copy_pt_p_mas_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+   *d = INTERP_256(m + 1, s, *d);
+}
+
+#define _op_copy_pt_pan_mas_dp_neon _op_copy_pt_p_mas_dp_neon
+#define _op_copy_pt_pas_mas_dp_neon _op_copy_pt_p_mas_dp_neon
+
+#define _op_copy_pt_p_mas_dpan_neon _op_copy_pt_p_mas_dp_neon
+#define _op_copy_pt_pan_mas_dpan_neon _op_copy_pt_p_mas_dpan_neon
+#define _op_copy_pt_pas_mas_dpan_neon _op_copy_pt_p_mas_dpan_neon
+
+static void
+init_copy_pixel_mask_pt_funcs_neon(void)
+{
+   op_copy_pt_funcs[SP][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_pt_p_mas_dp_neon;
+   op_copy_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_pt_pan_mas_dp_neon;
+   op_copy_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_pt_pas_mas_dp_neon;
+
+   op_copy_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_pt_p_mas_dpan_neon;
+   op_copy_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_pt_pan_mas_dpan_neon;
+   op_copy_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_pt_pas_mas_dpan_neon;
+}
+#endif
+
+/*-----*/
+
+/* copy_rel pixel x mask --> dst */
+
+#ifdef BUILD_NEON
+static void 
+_op_copy_rel_p_mas_dp_neon(DATA32 *s, DATA8 *m, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   // FIXME: neon-it
+   DATA32 *e;
+   int color;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        color = *m;
+                        switch(color)
+                          {
+                          case 0:
+                             break;
+                          case 255:
+                             *d = MUL_SYM(*d >> 24, *s);
+                             break;
+                          default:
+                             c = MUL_SYM(*d >> 24, *s);
+                             l++;
+                             *d = INTERP_256(l, c, *d);
+                             break;
+                          }
+                        m++;  s++;  d++;
+                     });
+}
+
+#define _op_copy_rel_pan_mas_dp_neon _op_copy_rel_p_mas_dp_neon
+#define _op_copy_rel_pas_mas_dp_neon _op_copy_rel_p_mas_dp_neon
+
+#define _op_copy_rel_p_mas_dpan_neon _op_copy_p_mas_dpan_neon
+#define _op_copy_rel_pan_mas_dpan_neon _op_copy_pan_mas_dpan_neon
+#define _op_copy_rel_pas_mas_dpan_neon _op_copy_pas_mas_dpan_neon
+
+static void
+init_copy_rel_pixel_mask_span_funcs_neon(void)
+{
+   op_copy_rel_span_funcs[SP][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_rel_p_mas_dp_neon;
+   op_copy_rel_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_rel_pan_mas_dp_neon;
+   op_copy_rel_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_rel_pas_mas_dp_neon;
+
+   op_copy_rel_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_p_mas_dpan_neon;
+   op_copy_rel_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pan_mas_dpan_neon;
+   op_copy_rel_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pas_mas_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void 
+_op_copy_rel_pt_p_mas_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
+   c = MUL_SYM(*d >> 24, s);
+   *d = INTERP_256(m + 1, c, *d);
+}
+
+
+#define _op_copy_rel_pt_pan_mas_dp_neon _op_copy_rel_pt_p_mas_dp_neon
+#define _op_copy_rel_pt_pas_mas_dp_neon _op_copy_rel_pt_p_mas_dp_neon
+
+#define _op_copy_rel_pt_p_mas_dpan_neon _op_copy_pt_p_mas_dpan_neon
+#define _op_copy_rel_pt_pan_mas_dpan_neon _op_copy_pt_pan_mas_dpan_neon
+#define _op_copy_rel_pt_pas_mas_dpan_neon _op_copy_pt_pas_mas_dpan_neon
+
+static void
+init_copy_rel_pixel_mask_pt_funcs_neon(void)
+{
+   op_copy_rel_pt_funcs[SP][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_rel_pt_p_mas_dp_neon;
+   op_copy_rel_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_rel_pt_pan_mas_dp_neon;
+   op_copy_rel_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_rel_pt_pas_mas_dp_neon;
+
+   op_copy_rel_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pt_p_mas_dpan_neon;
+   op_copy_rel_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pt_pan_mas_dpan_neon;
+   op_copy_rel_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pt_pas_mas_dpan_neon;
+}
+#endif
+
diff --git a/src/lib/engines/common/evas_op_copy/op_copy_pixel_neon.c b/src/lib/engines/common/evas_op_copy/op_copy_pixel_neon.c
new file mode 100644 (file)
index 0000000..2b6b35b
--- /dev/null
@@ -0,0 +1,118 @@
+
+/* copy pixel --> dst */
+
+#ifdef BUILD_NEON
+static void
+_op_copy_p_dp_neon(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   memcpy(d, s, l * sizeof(DATA32));
+}
+
+#define _op_copy_pan_dp_neon _op_copy_p_dp_neon
+#define _op_copy_pas_dp_neon _op_copy_p_dp_neon
+
+#define _op_copy_p_dpan_neon _op_copy_p_dp_neon
+#define _op_copy_pan_dpan_neon _op_copy_pan_dp_neon
+#define _op_copy_pas_dpan_neon _op_copy_pas_dp_neon
+
+static void
+init_copy_pixel_span_funcs_neon(void)
+{
+   op_copy_span_funcs[SP][SM_N][SC_N][DP][CPU_NEON] = _op_copy_p_dp_neon;
+   op_copy_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_NEON] = _op_copy_pan_dp_neon;
+   op_copy_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_NEON] = _op_copy_pas_dp_neon;
+
+   op_copy_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_p_dpan_neon;
+   op_copy_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_pan_dpan_neon;
+   op_copy_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_pas_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void
+_op_copy_pt_p_dp_neon(DATA32 s, DATA8 m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d) {
+   *d = s;
+}
+
+#define _op_copy_pt_pan_dp_neon _op_copy_pt_p_dp_neon
+#define _op_copy_pt_pas_dp_neon _op_copy_pt_p_dp_neon
+
+#define _op_copy_pt_p_dpan_neon _op_copy_pt_p_dp_neon
+#define _op_copy_pt_pan_dpan_neon _op_copy_pt_pan_dp_neon
+#define _op_copy_pt_pas_dpan_neon _op_copy_pt_pas_dp_neon
+
+static void
+init_copy_pixel_pt_funcs_neon(void)
+{
+   op_copy_pt_funcs[SP][SM_N][SC_N][DP][CPU_NEON] = _op_copy_pt_p_dp_neon;
+   op_copy_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_NEON] = _op_copy_pt_pan_dp_neon;
+   op_copy_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_NEON] = _op_copy_pt_pas_dp_neon;
+
+   op_copy_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_pt_p_dpan_neon;
+   op_copy_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_pt_pan_dpan_neon;
+   op_copy_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_pt_pas_dpan_neon;
+}
+#endif
+
+/*-----*/
+
+/* copy_rel pixel --> dst */
+
+#ifdef BUILD_NEON
+static void
+_op_copy_rel_p_dp_neon(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) {
+   DATA32 *e;
+   UNROLL8_PLD_WHILE(d, l, e,
+                     {
+                        *d = MUL_SYM(*d >> 24, c);
+                        d++;
+                     });
+}
+
+
+#define _op_copy_rel_pas_dp_neon _op_copy_rel_p_dp_neon
+#define _op_copy_rel_pan_dp_neon _op_copy_rel_p_dp_neon
+
+#define _op_copy_rel_p_dpan_neon _op_copy_p_dpan_neon
+#define _op_copy_rel_pan_dpan_neon _op_copy_pan_dpan_neon
+#define _op_copy_rel_pas_dpan_neon _op_copy_pas_dpan_neon
+
+static void
+init_copy_rel_pixel_span_funcs_neon(void)
+{
+   op_copy_rel_span_funcs[SP][SM_N][SC_N][DP][CPU_NEON] = _op_copy_rel_p_dp_neon;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_NEON] = _op_copy_rel_pan_dp_neon;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_NEON] = _op_copy_rel_pas_dp_neon;
+
+   op_copy_rel_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_p_dpan_neon;
+   op_copy_rel_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pan_dpan_neon;
+   op_copy_rel_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pas_dpan_neon;
+}
+#endif
+
+#ifdef BUILD_NEON
+static void
+_op_copy_rel_pt_p_dp_neon(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) {
+   s = 1 + (*d >> 24);
+   *d = MUL_256(s, c);
+}
+
+
+#define _op_copy_rel_pt_pan_dp_neon _op_copy_rel_pt_p_dp_neon
+#define _op_copy_rel_pt_pas_dp_neon _op_copy_rel_pt_p_dp_neon
+
+#define _op_copy_rel_pt_p_dpan_neon _op_copy_pt_p_dpan_neon
+#define _op_copy_rel_pt_pan_dpan_neon _op_copy_pt_pan_dpan_neon
+#define _op_copy_rel_pt_pas_dpan_neon _op_copy_pt_pas_dpan_neon
+
+static void
+init_copy_rel_pixel_pt_funcs_neon(void)
+{
+   op_copy_rel_pt_funcs[SP][SM_N][SC_N][DP][CPU_NEON] = _op_copy_rel_pt_p_dp_neon;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_NEON] = _op_copy_rel_pt_pan_dp_neon;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_NEON] = _op_copy_rel_pt_pas_dp_neon;
+
+   op_copy_rel_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pt_p_dpan_neon;
+   op_copy_rel_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pt_pan_dpan_neon;
+   op_copy_rel_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pt_pas_dpan_neon;
+}
+#endif
index 2491fad..2c7c318 100644 (file)
@@ -89,12 +89,12 @@ 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_pixel_neon.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"
+# include "./evas_op_copy/op_copy_pixel_color_neon.c"
+# include "./evas_op_copy/op_copy_pixel_mask_neon.c"
+# include "./evas_op_copy/op_copy_mask_color_neon.c"
+//# include "./evas_op_copy/op_copy_pixel_mask_color_neon.c"
 
 
 static void
@@ -129,11 +129,11 @@ op_copy_init(void)
    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_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_mask_color_span_funcs_neon();
 
 //   init_copy_pixel_pt_funcs_neon();
 //   init_copy_pixel_color_pt_funcs_neon();