ARM: SIMD optimizations updated to use common assembly calling conventions
authorSiarhei Siamashka <siarhei.siamashka@nokia.com>
Mon, 22 Mar 2010 17:51:00 +0000 (19:51 +0200)
committerSiarhei Siamashka <siarhei.siamashka@nokia.com>
Mon, 22 Mar 2010 18:17:14 +0000 (20:17 +0200)
pixman/pixman-arm-simd.c

index 09a2888..f110753 100644 (file)
 #endif
 
 #include "pixman-private.h"
-
-static void
-arm_composite_add_8000_8000 (pixman_implementation_t * impl,
-                            pixman_op_t               op,
-                            pixman_image_t *          src_image,
-                            pixman_image_t *          mask_image,
-                            pixman_image_t *          dst_image,
-                            int32_t                   src_x,
-                            int32_t                   src_y,
-                            int32_t                   mask_x,
-                            int32_t                   mask_y,
-                            int32_t                   dest_x,
-                            int32_t                   dest_y,
-                            int32_t                   width,
-                            int32_t                   height)
+#include "pixman-arm-common.h"
+
+void
+pixman_composite_add_8000_8000_asm_armv6 (int32_t  width,
+                                          int32_t  height,
+                                          uint8_t *dst_line,
+                                          int32_t  dst_stride,
+                                          uint8_t *src_line,
+                                          int32_t  src_stride)
 {
-    uint8_t     *dst_line, *dst;
-    uint8_t     *src_line, *src;
-    int dst_stride, src_stride;
+    uint8_t *dst, *src;
     int32_t w;
     uint8_t s, d;
 
-    PIXMAN_IMAGE_GET_LINE (src_image, src_x, src_y, uint8_t, src_stride, src_line, 1);
-    PIXMAN_IMAGE_GET_LINE (dst_image, dest_x, dest_y, uint8_t, dst_stride, dst_line, 1);
-
     while (height--)
     {
        dst = dst_line;
@@ -101,32 +90,21 @@ arm_composite_add_8000_8000 (pixman_implementation_t * impl,
 
 }
 
-static void
-arm_composite_over_8888_8888 (pixman_implementation_t * impl,
-                             pixman_op_t               op,
-                             pixman_image_t *          src_image,
-                             pixman_image_t *          mask_image,
-                             pixman_image_t *          dst_image,
-                             int32_t                   src_x,
-                             int32_t                   src_y,
-                             int32_t                   mask_x,
-                             int32_t                   mask_y,
-                             int32_t                   dest_x,
-                             int32_t                   dest_y,
-                             int32_t                   width,
-                             int32_t                   height)
+void
+pixman_composite_over_8888_8888_asm_armv6 (int32_t   width,
+                                           int32_t   height,
+                                           uint32_t *dst_line,
+                                           int32_t   dst_stride,
+                                           uint32_t *src_line,
+                                           int32_t   src_stride)
 {
-    uint32_t    *dst_line, *dst;
-    uint32_t    *src_line, *src;
-    int dst_stride, src_stride;
+    uint32_t    *dst;
+    uint32_t    *src;
     int32_t w;
     uint32_t component_half = 0x800080;
     uint32_t upper_component_mask = 0xff00ff00;
     uint32_t alpha_mask = 0xff;
 
-    PIXMAN_IMAGE_GET_LINE (dst_image, dest_x, dest_y, uint32_t, dst_stride, dst_line, 1);
-    PIXMAN_IMAGE_GET_LINE (src_image, src_x, src_y, uint32_t, src_stride, src_line, 1);
-
     while (height--)
     {
        dst = dst_line;
@@ -194,33 +172,21 @@ arm_composite_over_8888_8888 (pixman_implementation_t * impl,
     }
 }
 
-static void
-arm_composite_over_8888_n_8888 (pixman_implementation_t * impl,
-                               pixman_op_t               op,
-                               pixman_image_t *          src_image,
-                               pixman_image_t *          mask_image,
-                               pixman_image_t *          dst_image,
-                               int32_t                   src_x,
-                               int32_t                   src_y,
-                               int32_t                   mask_x,
-                               int32_t                   mask_y,
-                               int32_t                   dest_x,
-                               int32_t                   dest_y,
-                               int32_t                   width,
-                               int32_t                   height)
+void
+pixman_composite_over_8888_n_8888_asm_armv6 (int32_t   width,
+                                             int32_t   height,
+                                             uint32_t *dst_line,
+                                             int32_t   dst_stride,
+                                             uint32_t *src_line,
+                                             int32_t   src_stride,
+                                             uint32_t  mask)
 {
-    uint32_t *dst_line, *dst;
-    uint32_t *src_line, *src;
-    uint32_t mask;
-    int dst_stride, src_stride;
+    uint32_t *dst;
+    uint32_t *src;
     int32_t w;
     uint32_t component_half = 0x800080;
     uint32_t alpha_mask = 0xff;
 
-    PIXMAN_IMAGE_GET_LINE (dst_image, dest_x, dest_y, uint32_t, dst_stride, dst_line, 1);
-    PIXMAN_IMAGE_GET_LINE (src_image, src_x, src_y, uint32_t, src_stride, src_line, 1);
-
-    mask = _pixman_image_get_solid (mask_image, PIXMAN_a8r8g8b8);
     mask = (mask) >> 24;
 
     while (height--)
@@ -303,33 +269,22 @@ arm_composite_over_8888_n_8888 (pixman_implementation_t * impl,
     }
 }
 
-static void
-arm_composite_over_n_8_8888 (pixman_implementation_t * impl,
-                            pixman_op_t               op,
-                            pixman_image_t *          src_image,
-                            pixman_image_t *          mask_image,
-                            pixman_image_t *          dst_image,
-                            int32_t                   src_x,
-                            int32_t                   src_y,
-                            int32_t                   mask_x,
-                            int32_t                   mask_y,
-                            int32_t                   dest_x,
-                            int32_t                   dest_y,
-                            int32_t                   width,
-                            int32_t                   height)
+void
+pixman_composite_over_n_8_8888_asm_armv6 (int32_t   width,
+                                          int32_t   height,
+                                          uint32_t *dst_line,
+                                          int32_t   dst_stride,
+                                          uint32_t  src,
+                                          int32_t   unused,
+                                          uint8_t  *mask_line,
+                                          int32_t   mask_stride)
 {
-    uint32_t src, srca;
-    uint32_t *dst_line, *dst;
-    uint8_t  *mask_line, *mask;
-    int dst_stride, mask_stride;
+    uint32_t  srca;
+    uint32_t *dst;
+    uint8_t  *mask;
     int32_t w;
 
-    src = _pixman_image_get_solid (src_image, dst_image->bits.format);
-
-    /* bail out if fully transparent */
     srca = src >> 24;
-    if (src == 0)
-       return;
 
     uint32_t component_mask = 0xff00ff;
     uint32_t component_half = 0x800080;
@@ -337,9 +292,6 @@ arm_composite_over_n_8_8888 (pixman_implementation_t * impl,
     uint32_t src_hi = (src >> 8) & component_mask;
     uint32_t src_lo = src & component_mask;
 
-    PIXMAN_IMAGE_GET_LINE (dst_image, dest_x, dest_y, uint32_t, dst_stride, dst_line, 1);
-    PIXMAN_IMAGE_GET_LINE (mask_image, mask_x, mask_y, uint8_t, mask_stride, mask_line, 1);
-
     while (height--)
     {
        dst = dst_line;
@@ -419,21 +371,34 @@ arm_composite_over_n_8_8888 (pixman_implementation_t * impl,
     }
 }
 
+PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, add_8000_8000,
+                                   uint8_t, 1, uint8_t, 1)
+PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, over_8888_8888,
+                                   uint32_t, 1, uint32_t, 1)
+
+PIXMAN_ARM_BIND_FAST_PATH_SRC_N_DST (armv6, over_8888_n_8888,
+                                     uint32_t, 1, uint32_t, 1)
+
+PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (armv6, over_n_8_8888,
+                                      uint8_t, 1, uint32_t, 1)
+
 static const pixman_fast_path_t arm_simd_fast_paths[] =
 {
-    PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, a8r8g8b8, arm_composite_over_8888_8888),
-    PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, x8r8g8b8, arm_composite_over_8888_8888),
-    PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, a8b8g8r8, arm_composite_over_8888_8888),
-    PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, x8b8g8r8, arm_composite_over_8888_8888),
-    PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid, a8r8g8b8, arm_composite_over_8888_n_8888),
-    PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid, x8r8g8b8, arm_composite_over_8888_n_8888),
-
-    PIXMAN_STD_FAST_PATH (ADD, a8, null, a8, arm_composite_add_8000_8000),
-
-    PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8r8g8b8, arm_composite_over_n_8_8888),
-    PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8r8g8b8, arm_composite_over_n_8_8888),
-    PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8b8g8r8, arm_composite_over_n_8_8888),
-    PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8b8g8r8, arm_composite_over_n_8_8888),
+    PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, a8r8g8b8, armv6_composite_over_8888_8888),
+    PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, x8r8g8b8, armv6_composite_over_8888_8888),
+    PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, a8b8g8r8, armv6_composite_over_8888_8888),
+    PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, x8b8g8r8, armv6_composite_over_8888_8888),
+    PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid, a8r8g8b8, armv6_composite_over_8888_n_8888),
+    PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid, x8r8g8b8, armv6_composite_over_8888_n_8888),
+    PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, solid, a8b8g8r8, armv6_composite_over_8888_n_8888),
+    PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, solid, x8b8g8r8, armv6_composite_over_8888_n_8888),
+
+    PIXMAN_STD_FAST_PATH (ADD, a8, null, a8, armv6_composite_add_8000_8000),
+
+    PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8r8g8b8, armv6_composite_over_n_8_8888),
+    PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8r8g8b8, armv6_composite_over_n_8_8888),
+    PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8b8g8r8, armv6_composite_over_n_8_8888),
+    PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8b8g8r8, armv6_composite_over_n_8_8888),
 
     { PIXMAN_OP_NONE },
 };