aboutsummaryrefslogtreecommitdiff
path: root/frontend/cspace_arm.S
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/cspace_arm.S')
-rw-r--r--frontend/cspace_arm.S65
1 files changed, 65 insertions, 0 deletions
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}