frontend: add armv6 color space converter
authornotaz <notasas@gmail.com>
Fri, 8 Feb 2013 00:13:03 +0000 (02:13 +0200)
committernotaz <notasas@gmail.com>
Fri, 8 Feb 2013 00:13:03 +0000 (02:13 +0200)
Makefile
frontend/cspace.c
frontend/cspace_arm.S [new file with mode: 0644]
jni/Android.mk

index b6f381c..9f8b777 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -129,6 +129,10 @@ OBJS += plugins/dfinput/main.o plugins/dfinput/pad.o plugins/dfinput/guncon.o
 OBJS += frontend/cspace.o
 ifeq "$(HAVE_NEON)" "1"
 OBJS += frontend/cspace_neon.o
+else
+ifeq "$(ARCH)" "arm"
+OBJS += frontend/cspace_arm.o
+endif
 endif
 
 ifeq "$(PLATFORM)" "generic"
index f0c4912..33a981d 100644 (file)
@@ -15,7 +15,7 @@
  * in favor of NEON version or platform-specific conversion
  */
 
-#ifndef __ARM_NEON__
+#ifndef __arm__
 
 void bgr555_to_rgb565(void *dst_, const void *src_, int bytes)
 {
@@ -32,6 +32,10 @@ void bgr555_to_rgb565(void *dst_, const void *src_, int bytes)
        }
 }
 
+#endif
+
+#ifndef __ARM_NEON__
+
 void bgr888_to_rgb565(void *dst_, const void *src_, int bytes)
 {
        const unsigned char *src = src_;
diff --git a/frontend/cspace_arm.S b/frontend/cspace_arm.S
new file mode 100644 (file)
index 0000000..e9d15a5
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * (C) GraÅžvydas "notaz" Ignotas, 2013
+ *
+ * This work is licensed under the terms of GNU GPL version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#include "arm_features.h"
+
+.text
+.align 2
+
+@ lr=0x001f001f
+@ trashes r11, r12
+.macro bgr555_to_rgb565_one rn
+    and      r11, lr, \rn
+    and      r12, lr, \rn, lsr #5
+    and      \rn, lr, \rn, lsr #10
+    orr      r12, r11, lsl #5
+    orr      \rn, r12, lsl #6
+.endm
+
+.macro pld_ reg offs=#0
+#ifdef HAVE_ARMV6
+    pld      [\reg, \offs]
+#endif
+.endm
+
+.global bgr555_to_rgb565 @ void *dst, const void *src, int bytes
+bgr555_to_rgb565:
+    pld_     r1
+    push     {r4-r11,lr}
+    mov      lr, #0x001f
+    subs     r2, #4*8
+    orr      lr, lr, lsl #16
+    blt      1f
+
+0:
+    ldmia    r1!, {r3-r10}
+    subs     r2, #4*8
+    bgr555_to_rgb565_one r3
+
+    pld_     r1, #32*2
+    bgr555_to_rgb565_one r4
+    bgr555_to_rgb565_one r5
+    bgr555_to_rgb565_one r6
+    bgr555_to_rgb565_one r7
+    bgr555_to_rgb565_one r8
+    bgr555_to_rgb565_one r9
+    bgr555_to_rgb565_one r10
+    stmia    r0!, {r3-r10}
+    bge      0b
+
+1:
+    adds     r2, #4*8
+    popeq    {r4-r11,pc}
+
+2:
+    ldr      r3, [r1], #4
+    subs     r2, #4
+    bgr555_to_rgb565_one r3
+    str      r3, [r0], #4
+    bgt      2b
+
+    pop      {r4-r11,pc}
index 05a92d4..81962e0 100644 (file)
@@ -35,6 +35,7 @@ ifeq ($(TARGET_ARCH),arm)
       # gpu
       LOCAL_CFLAGS += -DREARMED
       LOCAL_SRC_FILES += ../plugins/gpu_unai/gpulib_if.cpp ../plugins/gpu_unai/gpu_arm.s
+      LOCAL_SRC_FILES += ../frontend/cspace_arm.S
    else
       LOCAL_ARM_NEON := true
       LOCAL_CFLAGS += -DNEON_BUILD -DTEXTURE_CACHE_4BPP -DTEXTURE_CACHE_8BPP