Neonized rotated 90 display for ARMs.
authornash <nash@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 19 May 2010 08:52:29 +0000 (08:52 +0000)
committernash <nash@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 19 May 2010 08:52:29 +0000 (08:52 +0000)
Share and enjoy.
See my previous neon related commit for more details.

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@48999 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/engines/common/evas_convert_rgb_32.c

index 05ad414..e9ffcba 100644 (file)
@@ -78,17 +78,60 @@ evas_common_convert_rgba_to_32bpp_rgb_8888_rot_270 (DATA32 *src, DATA8 *dst, int
 void
 evas_common_convert_rgba_to_32bpp_rgb_8888_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__)
 {
+#ifndef BUILD_NEONx
    DATA32 *src_ptr;
    DATA32 *dst_ptr;
    int x, y;
 
    dst_ptr = (DATA32 *)dst;
-
    CONVERT_LOOP_START_ROT_90();
 
    *dst_ptr = *src_ptr;
 
    CONVERT_LOOP_END_ROT_90();
+#else
+#define AP     "convert_rgba32_rot_90_"
+   asm volatile (
+       AP"outer:                                               \n\t"
+               // Set up src
+       "       sub             %[s1],          %[src], %[y],lsl #2     \n\t"
+       "       sub             %[s2],          %[src2], %[y],lsl #2    \n\t"
+       "       add             %[y],   #2                      \n\t"
+       "       add             %[x],   %[d1], %[w], lsl #2             \n\t"
+       AP"inner:                                               \n\t"
+       "       vldm            %[s1], {d0}                     \n\t"
+       "       vldm            %[s2], {d1}                     \n\t"
+       "       vtrn.u32        d1,d0                           \n\t"
+       "       vstm            %[d1]!, {d0}                    \n\t"
+       "       vstm            %[d2]!, {d1}                    \n\t"
+       "       add             %[s1],          %[sadv]         \n\t"
+       "       add             %[s2],          %[sadv]         \n\t"
+       "       cmp             %[x],           %[d1]           \n\t"
+       "       bhi             "AP"inner                       \n\t"
+
+       "       add             %[d1], %[djump]                 \n\t"
+       "       add             %[d2], %[djump]                 \n\t"
+       "       cmp             %[y],   %[h]                    \n\t"
+       "       blt             "AP"outer                       \n\t"
+
+
+       : // Out
+       :       [s1] "r" (src),
+               [s2] "r" (src + (h + src_jump) * 4),
+               [d1] "r" (dst),
+               [d2] "r" ((DATA32*)dst + w + dst_jump),
+               [sadv] "r" ((h + 2 * src_jump) * 8),
+               [src] "r" ((DATA32*)src + (h - 1)- 1),
+               [src2] "r" ((DATA32*)src + (h - 1)- 2),
+               [djump] "r" ((w + 2 * dst_jump) * 4),
+               [x] "r" (7),
+               [y] "r" (0),
+               [w] "r" (w),
+               [h] "r" (h)
+       : "q0", "q1", "memory", "cc"// Clober
+   );
+#undef AP
+#endif
    return;
 }
 #endif