summaryrefslogtreecommitdiff
path: root/packages/xorg-lib/pixman/pixman-arm.patch
diff options
context:
space:
mode:
authorKoen Kooi <koen@openembedded.org>2008-08-31 10:47:45 +0000
committerKoen Kooi <koen@openembedded.org>2008-08-31 10:47:45 +0000
commit7295970a757953665c36f0e7f957cd19b9cb743b (patch)
treead507619b37ccb04cff191daa28bbc0934db7532 /packages/xorg-lib/pixman/pixman-arm.patch
parent99614be76e48a6b917e1c3680dc0ad8298da0635 (diff)
pixman 0.11.8: add more arm asm
Diffstat (limited to 'packages/xorg-lib/pixman/pixman-arm.patch')
-rw-r--r--packages/xorg-lib/pixman/pixman-arm.patch680
1 files changed, 447 insertions, 233 deletions
diff --git a/packages/xorg-lib/pixman/pixman-arm.patch b/packages/xorg-lib/pixman/pixman-arm.patch
index 224b612548..6520a52d68 100644
--- a/packages/xorg-lib/pixman/pixman-arm.patch
+++ b/packages/xorg-lib/pixman/pixman-arm.patch
@@ -1,76 +1,97 @@
-commit 23a7d5dea599efec1f459bac64cf9edc4bd5ae11
-Author: Ilpo Ruotsalainen <ilpo.ruotsalainen@movial.fi>
-Date: Thu Nov 29 12:29:59 2007 +0000
+commit 44d4231272bdf08fac077cdcaeaac1aec0dd1500
+Author: Jeff Muizelaar <jmuizelaar@mozilla.com>
+Date: Thu Aug 28 13:02:17 2008 -0400
- Implement ARM optimized version of fill routines.
+ arm-simd
diff --git a/configure.ac b/configure.ac
-index 22a91ef..3ac2a40 100644
+index 702bed0..7f24db5 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -148,6 +148,32 @@ fi
- AM_CONDITIONAL(USE_SSE, test $have_sse_intrinsics = yes)
+@@ -301,6 +301,44 @@ AC_SUBST(VMX_CFLAGS)
- dnl ========================================================
-+
-+dnl Test for architechture specific optimizations for this platform
+ AM_CONDITIONAL(USE_VMX, test $have_vmx_intrinsics = yes)
+
++dnl Check for ARM
+
-+AC_MSG_CHECKING(for architechture specific optimizations)
++have_armv5_simd=no
++AC_MSG_CHECKING(whether to use ARM assembler)
++xserver_save_CFLAGS=$CFLAGS
++CFLAGS="$CFLAGS $ARM_CFLAGS"
++AC_COMPILE_IFELSE([
++int main () {
++ asm("uqadd8 r1, r1, r2");
++ return 0;
++}], have_armv5_simd=yes)
++CFLAGS=$xserver_save_CFLAGS
+
-+use_arch_opts=no
++AC_ARG_ENABLE(arm,
++ [AC_HELP_STRING([--disable-arm],
++ [disable ARM fast paths])],
++ [enable_arm=$enableval], [enable_arm=auto])
+
-+case "$host_cpu" in
-+arm)
-+ if test "$GCC" = "yes" ; then
-+ use_arch_opts=yes
-+ ARCH_OPT_SOURCES='pixman-arch-arm.lo'
-+ fi
-+ ;;
-+esac
++if test $enable_arm = no ; then
++ have_armv5_simd=disabled
++fi
+
-+AC_MSG_RESULT($use_arch_opts)
++if test $have_armv5_simd = yes ; then
++ AC_DEFINE(USE_ARM, 1, [use ARM compiler intrinsics])
++else
++ ARM_CFLAGS=
++fi
+
-+if test $use_arch_opts = yes ; then
-+ AC_DEFINE(USE_ARCH_OPTS, 1, [use architechture specific optimizations])
++AC_MSG_RESULT($have_armv5_simd)
++if test $enable_arm = yes && test $have_armv5_simd = no ; then
++ AC_MSG_ERROR([ARM intrinsics not detected])
+fi
+
-+AC_SUBST([ARCH_OPT_SOURCES])
-+AM_CONDITIONAL(USE_ARCH_OPTS, test $use_arch_opts = yes)
++AC_SUBST(ARM_CFLAGS)
+
-+dnl ========================================================
- AC_SUBST(MMX_CFLAGS)
-
- PKG_CHECK_MODULES(GTK, [gtk+-2.0], [HAVE_GTK=yes], [HAVE_GTK=no])
++AM_CONDITIONAL(USE_ARM, test $have_armv5_simd = yes)
++
++
+ AC_ARG_ENABLE(gtk,
+ [AC_HELP_STRING([--enable-gtk],
+ [enable tests using GTK+ [default=auto]])],
diff --git a/pixman/Makefile.am b/pixman/Makefile.am
-index 66283a2..dab6363 100644
+index 4f046f1..2cad71a 100644
--- a/pixman/Makefile.am
+++ b/pixman/Makefile.am
-@@ -20,6 +20,11 @@ libpixman_1_la_SOURCES = \
- libpixmanincludedir = $(includedir)/pixman-1/
- libpixmaninclude_HEADERS = pixman.h
+@@ -77,3 +77,16 @@ libpixman_sse_la_LIBADD = $(DEP_LIBS)
+ libpixman_1_la_LIBADD += libpixman-sse.la
+ endif
-+if USE_ARCH_OPTS
-+libpixman_1_la_LIBADD += $(ARCH_OPT_SOURCES)
-+libpixman_1_la_DEPENDENCIES = $(ARCH_OPT_SOURCES)
++# arm code
++if USE_ARM
++noinst_LTLIBRARIES += libpixman-arm.la
++libpixman_arm_la_SOURCES = \
++ pixman-arm.c \
++ pixman-arm.h \
++ pixman-combine32.h
++libpixman_arm_la_CFLAGS = $(DEP_CFLAGS) $(ARM_CFLAGS)
++libpixman_arm_la_LIBADD = $(DEP_LIBS)
++libpixman_1_la_LIBADD += libpixman-arm.la
+endif
+
- # mmx code
- if USE_MMX
- noinst_LTLIBRARIES = libpixman-mmx.la
-diff --git a/pixman/pixman-arch-arm.c b/pixman/pixman-arch-arm.c
++
+diff --git a/pixman/pixman-arm.c b/pixman/pixman-arm.c
new file mode 100644
-index 0000000..655092c
+index 0000000..9750730
--- /dev/null
-+++ b/pixman/pixman-arch-arm.c
-@@ -0,0 +1,205 @@
++++ b/pixman/pixman-arm.c
+@@ -0,0 +1,312 @@
+/*
-+ * Copyright © 2007 Movial Creative Technologies Inc
++ * Copyright © 2008 Mozilla Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
-+ * documentation.
++ * documentation, and that the name of Mozilla Corporation not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission. Mozilla Corporation makes no
++ * representations about the suitability of this software for any purpose. It
++ * is provided "as is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
@@ -81,230 +102,423 @@ index 0000000..655092c
+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ *
-+ * Author: Ilpo Ruotsalainen <ilpo.ruotsalainen@movial.fi>
++ * Author: Jeff Muizelaar (jeff@infidigm.net)
++ *
+ */
-+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
-+#include "pixman.h"
-+#include "pixman-private.h"
++#include "pixman-arm.h"
++#include "pixman-combine32.h"
+
-+static void
-+pixman_fill8 (uint32_t *bits,
-+ int stride,
-+ int x,
-+ int y,
-+ int width,
-+ int height,
-+ uint32_t xor)
++void
++fbCompositeSrcAdd_8000x8000arm (pixman_op_t op,
++ pixman_image_t * pSrc,
++ pixman_image_t * pMask,
++ pixman_image_t * pDst,
++ int16_t xSrc,
++ int16_t ySrc,
++ int16_t xMask,
++ int16_t yMask,
++ int16_t xDst,
++ int16_t yDst,
++ uint16_t width,
++ uint16_t height)
+{
-+ int byte_stride = stride * sizeof (uint32_t);
-+ uint8_t *dst = (uint8_t *) bits;
-+ uint8_t v = xor & 0xff;
-+
-+ xor = v | (v << 8);
-+ xor |= xor << 16;
++ uint8_t *dstLine, *dst;
++ uint8_t *srcLine, *src;
++ int dstStride, srcStride;
++ uint16_t w;
++ uint8_t s, d;
++ uint16_t t;
+
-+ dst = dst + y * byte_stride + x;
++ fbComposeGetStart (pSrc, xSrc, ySrc, uint8_t, srcStride, srcLine, 1);
++ fbComposeGetStart (pDst, xDst, yDst, uint8_t, dstStride, dstLine, 1);
+
+ while (height--)
+ {
-+ uint32_t dummy1, dummy2;
-+
-+ asm volatile(
-+ /* Check if the fill width is very small */
-+ " cmp %0, #8\n"
-+ " bcc 2f\n"
-+ /* Output single pixels until aligned to word boundary */
-+ "1: tst %1, #3\n"
-+ " strneb %4, [%1], #1\n"
-+ " subne %0, %0, #1\n"
-+ " bne 1b\n"
-+ /* Output up to 16 pixels per iteration */
-+ "1: subs %0, %0, #8\n"
-+ " strcs %4, [%1], #4\n"
-+ " strcs %4, [%1], #4\n"
-+ " subcss %0, %0, #8\n"
-+ " strcs %4, [%1], #4\n"
-+ " strcs %4, [%1], #4\n"
-+ " bcs 1b\n"
-+ /* Finish up any remaining pixels */
-+ " and %0, %0, #7\n"
-+ "2: subs %0, %0, #1\n"
-+ " strcsb %4, [%1], #1\n"
-+ " subcss %0, %0, #1\n"
-+ " strcsb %4, [%1], #1\n"
-+ " bcs 2b\n"
-+ : "=r" (dummy1), "=r" (dummy2)
-+ : "0" (width), "1" (dst), "r" (xor)
-+ : "cc", "memory"
-+ );
-+
-+ dst += byte_stride;
-+ }
-+}
++ dst = dstLine;
++ dstLine += dstStride;
++ src = srcLine;
++ srcLine += srcStride;
++ w = width;
+
-+static void
-+pixman_fill16 (uint32_t *bits,
-+ int stride,
-+ int x,
-+ int y,
-+ int width,
-+ int height,
-+ uint32_t xor)
-+{
-+ int short_stride = (stride * sizeof (uint32_t)) / sizeof (uint16_t);
-+ uint16_t *dst = (uint16_t *)bits;
-+ uint16_t v = xor & 0xffff;
++ while (w && (unsigned long)dst & 3)
++ {
++ s = *src;
++ d = *dst;
++ t = d + s;
++ /* s = t | (0 - (t >> 8)); */
++ asm("usat %0, #8, %1" : "=r"(s) : "r"(t));
++ *dst = s;
+
-+ xor = v | v << 16;
++ dst++;
++ src++;
++ w--;
++ }
+
-+ dst = dst + y * short_stride + x;
++ while (w >= 4)
++ {
++ asm("uqadd8 %0, %1, %2" : "=r"(*(uint32_t*)dst) : "r"(*(uint32_t*)src), "r"(*(uint32_t*)dst));
++ dst += 4;
++ src += 4;
++ w -= 4;
++ }
+
-+ while (height--)
-+ {
-+ uint32_t dummy1, dummy2;
-+
-+ asm volatile(
-+ /* Check if the fill width is very small */
-+ " cmp %0, #4\n"
-+ " bcc 2f\n"
-+ /* Output single pixels until aligned to word boundary */
-+ "1: tst %1, #2\n"
-+ " strneh %4, [%1], #2\n"
-+ " subne %0, %0, #1\n"
-+ " bne 1b\n"
-+ /* Output up to 8 pixels per iteration */
-+ "1: subs %0, %0, #4\n"
-+ " strcs %4, [%1], #4\n"
-+ " strcs %4, [%1], #4\n"
-+ " subcss %0, %0, #4\n"
-+ " strcs %4, [%1], #4\n"
-+ " strcs %4, [%1], #4\n"
-+ " bcs 1b\n"
-+ /* Finish up any remaining pixels */
-+ " and %0, %0, #3\n"
-+ "2: subs %0, %0, #1\n"
-+ " strcsh %4, [%1], #2\n"
-+ " bcs 2b\n"
-+ : "=r" (dummy1), "=r" (dummy2)
-+ : "0" (width), "1" (dst), "r" (xor)
-+ : "cc", "memory"
-+ );
-+
-+ dst += short_stride;
++ while (w)
++ {
++ s = *src;
++ d = *dst;
++ t = d + s;
++ /* s = t | (0 - (t >> 8)); */
++ asm("usat %0, #8, %1" : "=r"(s) : "r"(t));
++ *dst = s;
++
++ dst++;
++ src++;
++ w--;
++ }
+ }
++
+}
+
-+static void
-+pixman_fill32 (uint32_t *bits,
-+ int stride,
-+ int x,
-+ int y,
-+ int width,
-+ int height,
-+ uint32_t xor)
++void
++fbCompositeSrc_8888x8888arm (pixman_op_t op,
++ pixman_image_t * pSrc,
++ pixman_image_t * pMask,
++ pixman_image_t * pDst,
++ int16_t xSrc,
++ int16_t ySrc,
++ int16_t xMask,
++ int16_t yMask,
++ int16_t xDst,
++ int16_t yDst,
++ uint16_t width,
++ uint16_t height)
+{
-+ bits = bits + y * stride + x;
-+
++ uint32_t *dstLine, *dst;
++ uint32_t *srcLine, *src;
++ int dstStride, srcStride;
++ uint16_t w;
++ uint32_t component_mask = 0xff00ff;
++ uint32_t component_half = 0x800080;
++
++ fbComposeGetStart (pDst, xDst, yDst, uint32_t, dstStride, dstLine, 1);
++ fbComposeGetStart (pSrc, xSrc, ySrc, uint32_t, srcStride, srcLine, 1);
++
+ while (height--)
+ {
-+ uint32_t dummy1, dummy2;
-+
-+ asm volatile(
-+ /* Check if the fill width is very small */
-+ " cmp %0, #2\n"
-+ " bcc 2f\n"
-+ /* Output up to 4 pixels per iteration */
-+ "1: subs %0, %0, #2\n"
-+ " strcs %4, [%1], #4\n"
-+ " strcs %4, [%1], #4\n"
-+ " subcss %0, %0, #2\n"
-+ " strcs %4, [%1], #4\n"
-+ " strcs %4, [%1], #4\n"
-+ " bcs 1b\n"
-+ /* Output last pixel if necessary */
-+ "2: tst %0, #1\n"
-+ " strne %4, [%1], #4\n"
-+ : "=r" (dummy1), "=r" (dummy2)
-+ : "0" (width), "1" (bits), "r" (xor)
-+ : "cc", "memory"
-+ );
-+
-+ bits += stride;
++ dst = dstLine;
++ dstLine += dstStride;
++ src = srcLine;
++ srcLine += srcStride;
++ w = width;
++
++//#define inner_branch
++ asm volatile (
++ "cmp %[w], #0\n\t"
++ "beq 2f\n\t"
++ "1:\n\t"
++ /* load dest */
++ "ldr r5, [%[src]], #4\n\t"
++#ifdef inner_branch
++ /* We can avoid doing the multiplication in two cases: 0x0 or 0xff.
++ * The 0x0 case also allows us to avoid doing an unecessary data
++ * write which is more valuable so we only check for that */
++ "cmp r5, #0x1000000\n\t"
++ "blt 3f\n\t"
++
++ /* = 255 - alpha */
++ "mvn r8, r5\n\t"
++ "mov r8, r8, lsr #24\n\t"
++
++ "ldr r4, [%[dest]] \n\t"
++
++#else
++ "ldr r4, [%[dest]] \n\t"
++
++ /* = 255 - alpha */
++ "mvn r8, r5\n\t"
++ "mov r8, r8, lsr #24\n\t"
++#endif
++ "and r6, %[component_mask], r4\n\t"
++ "and r7, %[component_mask], r4, lsr #8\n\t"
++
++ /* multiply by 257 and divide by 65536 */
++ "mla r6, r6, r8, %[component_half]\n\t"
++ "mla r7, r7, r8, %[component_half]\n\t"
++
++ "and r8, %[component_mask], r6, lsr #8\n\t"
++ "and r9, %[component_mask], r7, lsr #8\n\t"
++
++ "add r6, r6, r8\n\t"
++ "add r7, r7, r9\n\t"
++
++ "and r6, %[component_mask], r6, lsr #8\n\t"
++ "and r7, %[component_mask], r7, lsr #8\n\t"
++
++ /* recombine */
++ "orr r6, r6, r7, lsl #8\n\t"
++
++ "uqadd8 r5, r6, r5\n\t"
++
++#ifdef inner_branch
++ "3:\n\t"
++
++#endif
++ "str r5, [%[dest]], #4\n\t"
++ /* increment counter and jmp to top */
++ "subs %[w], %[w], #1\n\t"
++ "bne 1b\n\t"
++ "2:\n\t"
++ : [w] "+r" (w), [dest] "+r" (dst), [src] "+r" (src)
++ : [component_half] "r" (component_half), [component_mask] "r" (component_mask)
++ : "r4", "r5", "r6", "r7", "r8", "r9", "cc", "memory"
++ );
+ }
+}
+
-+pixman_bool_t
-+pixman_fill (uint32_t *bits,
-+ int stride,
-+ int bpp,
-+ int x,
-+ int y,
-+ int width,
-+ int height,
-+ uint32_t xor)
++void
++fbCompositeSrc_8888x8x8888arm (pixman_op_t op,
++ pixman_image_t * pSrc,
++ pixman_image_t * pMask,
++ pixman_image_t * pDst,
++ int16_t xSrc,
++ int16_t ySrc,
++ int16_t xMask,
++ int16_t yMask,
++ int16_t xDst,
++ int16_t yDst,
++ uint16_t width,
++ uint16_t height)
+{
-+ switch (bpp)
++ uint32_t *dstLine, *dst;
++ uint32_t *srcLine, *src;
++ uint32_t mask;
++ int dstStride, srcStride;
++ uint16_t w;
++ uint32_t component_mask = 0xff00ff;
++ uint32_t component_half = 0x800080;
++
++ fbComposeGetStart (pDst, xDst, yDst, uint32_t, dstStride, dstLine, 1);
++ fbComposeGetStart (pSrc, xSrc, ySrc, uint32_t, srcStride, srcLine, 1);
++
++ fbComposeGetSolid (pMask, mask, pDst->bits.format);
++ mask = (mask) >> 24;
++
++ while (height--)
+ {
-+ case 8:
-+ pixman_fill8 (bits, stride, x, y, width, height, xor);
-+ break;
-+
-+ case 16:
-+ pixman_fill16 (bits, stride, x, y, width, height, xor);
-+ break;
-+
-+ case 32:
-+ pixman_fill32 (bits, stride, x, y, width, height, xor);
-+ break;
-+
-+ default:
-+ return FALSE;
-+ break;
++ dst = dstLine;
++ dstLine += dstStride;
++ src = srcLine;
++ srcLine += srcStride;
++ w = width;
++
++//#define inner_branch
++ asm volatile (
++ "cmp %[w], #0\n\t"
++ "beq 2f\n\t"
++ "1:\n\t"
++ /* load dest */
++ "ldr r5, [%[src]], #4\n\t"
++#ifdef inner_branch
++ /* We can avoid doing the multiplication in two cases: 0x0 or 0xff.
++ * The 0x0 case also allows us to avoid doing an unecessary data
++ * write which is more valuable so we only check for that */
++ "cmp r5, #0x1000000\n\t"
++ "blt 3f\n\t"
++
++#endif
++ "ldr r4, [%[dest]] \n\t"
++
++ "and r6, %[component_mask], r5\n\t"
++ "and r7, %[component_mask], r5, lsr #8\n\t"
++
++ /* multiply by alpha (r8) then by 257 and divide by 65536 */
++ "mla r6, r6, %[mask_alpha], %[component_half]\n\t"
++ "mla r7, r7, %[mask_alpha], %[component_half]\n\t"
++
++ "and r8, %[component_mask], r6, lsr #8\n\t"
++ "and r9, %[component_mask], r7, lsr #8\n\t"
++
++ "add r6, r6, r8\n\t"
++ "add r7, r7, r9\n\t"
++
++ "and r6, %[component_mask], r6, lsr #8\n\t"
++ "and r7, %[component_mask], r7, lsr #8\n\t"
++
++ /* recombine */
++ "orr r5, r6, r7, lsl #8\n\t"
++
++ "and r6, %[component_mask], r4\n\t"
++ "and r7, %[component_mask], r4, lsr #8\n\t"
++
++ "mvn r8, r5\n\t"
++ "mov r8, r8, lsr #24\n\t"
++
++ /* multiply by alpha (r8) then by 257 and divide by 65536 */
++ "mla r6, r6, r8, %[component_half]\n\t"
++ "mla r7, r7, r8, %[component_half]\n\t"
++
++ "and r8, %[component_mask], r6, lsr #8\n\t"
++ "and r9, %[component_mask], r7, lsr #8\n\t"
++
++ "add r6, r6, r8\n\t"
++ "add r7, r7, r9\n\t"
++
++ "and r6, %[component_mask], r6, lsr #8\n\t"
++ "and r7, %[component_mask], r7, lsr #8\n\t"
++
++ /* recombine */
++ "orr r6, r6, r7, lsl #8\n\t"
++
++ "uqadd8 r5, r6, r5\n\t"
++
++#ifdef inner_branch
++ "3:\n\t"
++
++#endif
++ "str r5, [%[dest]], #4\n\t"
++ /* increment counter and jmp to top */
++ "subs %[w], %[w], #1\n\t"
++ "bne 1b\n\t"
++ "2:\n\t"
++ : [w] "+r" (w), [dest] "+r" (dst), [src] "+r" (src)
++ : [component_half] "r" (component_half), [component_mask] "r" (component_mask), [mask_alpha] "r" (mask)
++ : "r4", "r5", "r6", "r7", "r8", "r9", "cc", "memory"
++ );
+ }
-+
-+ return TRUE;
+}
-diff --git a/pixman/pixman-arch.h b/pixman/pixman-arch.h
++
++
+diff --git a/pixman/pixman-arm.h b/pixman/pixman-arm.h
new file mode 100644
-index 0000000..1eee9d3
+index 0000000..06a3121
--- /dev/null
-+++ b/pixman/pixman-arch.h
-@@ -0,0 +1,7 @@
-+#ifdef USE_ARCH_OPTS
++++ b/pixman/pixman-arm.h
+@@ -0,0 +1,80 @@
++/*
++ * Copyright © 2008 Mozilla Corporation
++ *
++ * Permission to use, copy, modify, distribute, and sell this software and its
++ * documentation for any purpose is hereby granted without fee, provided that
++ * the above copyright notice appear in all copies and that both that
++ * copyright notice and this permission notice appear in supporting
++ * documentation, and that the name of Mozilla Corporation not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission. Mozilla Corporation makes no
++ * representations about the suitability of this software for any purpose. It
++ * is provided "as is" without express or implied warranty.
++ *
++ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
++ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
++ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
++ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
++ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
++ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
++ * SOFTWARE.
++ *
++ * Author: Jeff Muizelaar (jeff@infidigm.net)
++ *
++ */
+
-+#ifdef __arm__
-+#define USE_ARCH_FILL
-+#endif
++#include "pixman-private.h"
++
++#ifdef USE_ARM
++
++static inline pixman_bool_t pixman_have_arm(void) { return TRUE; }
+
++#else
++#define pixman_have_arm() FALSE
+#endif
---- /tmp/pixman-utils.c 2008-08-14 12:38:44.000000000 +0200
-+++ pixman-0.11.8/pixman/pixman-utils.c 2008-08-14 12:40:03.503198000 +0200
-@@ -28,6 +28,7 @@
- #include <stdlib.h>
-
- #include "pixman-private.h"
-+#include "pixman-arch.h"
++
++#ifdef USE_ARM
++
++void
++fbCompositeSrcAdd_8000x8000arm (pixman_op_t op,
++ pixman_image_t * pSrc,
++ pixman_image_t * pMask,
++ pixman_image_t * pDst,
++ int16_t xSrc,
++ int16_t ySrc,
++ int16_t xMask,
++ int16_t yMask,
++ int16_t xDst,
++ int16_t yDst,
++ uint16_t width,
++ uint16_t height);
++void
++fbCompositeSrc_8888x8888arm (pixman_op_t op,
++ pixman_image_t * pSrc,
++ pixman_image_t * pMask,
++ pixman_image_t * pDst,
++ int16_t xSrc,
++ int16_t ySrc,
++ int16_t xMask,
++ int16_t yMask,
++ int16_t xDst,
++ int16_t yDst,
++ uint16_t width,
++ uint16_t height);
++
++void
++fbCompositeSrc_8888x8x8888arm (pixman_op_t op,
++ pixman_image_t * pSrc,
++ pixman_image_t * pMask,
++ pixman_image_t * pDst,
++ int16_t xSrc,
++ int16_t ySrc,
++ int16_t xMask,
++ int16_t yMask,
++ int16_t xDst,
++ int16_t yDst,
++ uint16_t width,
++ uint16_t height);
++
++#endif /* USE_ARM */
+diff --git a/pixman/pixman-pict.c b/pixman/pixman-pict.c
+index b918219..05abc82 100644
+--- a/pixman/pixman-pict.c
++++ b/pixman/pixman-pict.c
+@@ -34,6 +34,7 @@
#include "pixman-mmx.h"
+ #include "pixman-vmx.h"
+ #include "pixman-sse.h"
++#include "pixman-arm.h"
+ #include "pixman-combine32.h"
- PIXMAN_EXPORT pixman_bool_t
-@@ -84,6 +85,7 @@
- return FALSE;
- }
+ #ifdef __GNUC__
+@@ -1479,6 +1480,18 @@ static const FastPathInfo vmx_fast_paths[] =
+ };
+ #endif
-+#ifndef USE_ARCH_FILL
- static void
- pixman_fill8 (uint32_t *bits,
- int stride,
-@@ -197,7 +199,7 @@
++#ifdef USE_ARM
++static const FastPathInfo arm_fast_paths[] =
++{
++ { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_null, PIXMAN_a8r8g8b8, fbCompositeSrc_8888x8888arm, 0 },
++ { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_a8, PIXMAN_a8r8g8b8, fbCompositeSrc_8888x8x8888arm, NEED_SOLID_MASK },
++ { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_a8, PIXMAN_x8r8g8b8, fbCompositeSrc_8888x8x8888arm, NEED_SOLID_MASK },
++
++ { PIXMAN_OP_ADD, PIXMAN_a8, PIXMAN_null, PIXMAN_a8, fbCompositeSrcAdd_8000x8000arm, 0 },
++
++ { PIXMAN_OP_NONE },
++};
++#endif
- return TRUE;
- }
--
+ static const FastPathInfo c_fast_paths[] =
+ {
+@@ -1829,6 +1842,12 @@ pixman_image_composite (pixman_op_t op,
+ if (!info && pixman_have_vmx())
+ info = get_fast_path (vmx_fast_paths, op, pSrc, pMask, pDst, pixbuf);
+ #endif
++#ifdef USE_ARM
++
++ if (!info && pixman_have_arm())
++ info = get_fast_path (arm_fast_paths, op, pSrc, pMask, pDst, pixbuf);
+#endif
++
+ if (!info)
+ info = get_fast_path (c_fast_paths, op, pSrc, pMask, pDst, pixbuf);
- /*
- * Compute the smallest value no less than y which is on a