aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile4
-rw-r--r--frontend/cspace.c6
-rw-r--r--frontend/cspace_arm.S65
-rw-r--r--jni/Android.mk1
4 files changed, 75 insertions, 1 deletions
diff --git a/Makefile b/Makefile
index b6f381c..9f8b777 100644
--- 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"
diff --git a/frontend/cspace.c b/frontend/cspace.c
index f0c4912..33a981d 100644
--- a/frontend/cspace.c
+++ b/frontend/cspace.c
@@ -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
index 0000000..e9d15a5
--- /dev/null
+++ b/frontend/cspace_arm.S
@@ -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}
diff --git a/jni/Android.mk b/jni/Android.mk
index 05a92d4..81962e0 100644
--- a/jni/Android.mk
+++ b/jni/Android.mk
@@ -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