diff options
author | notaz | 2013-02-08 02:13:03 +0200 |
---|---|---|
committer | notaz | 2013-02-08 02:13:03 +0200 |
commit | d57557c0644f9294e30657f0c7cf673cf2914695 (patch) | |
tree | f8623af5beeb8939631acceb2acb505c9497f71c /frontend/cspace_arm.S | |
parent | c82f907a99f7d0d3071471489d247f4b4394a8b7 (diff) | |
download | pcsx_rearmed-d57557c0644f9294e30657f0c7cf673cf2914695.tar.gz pcsx_rearmed-d57557c0644f9294e30657f0c7cf673cf2914695.tar.bz2 pcsx_rearmed-d57557c0644f9294e30657f0c7cf673cf2914695.zip |
frontend: add armv6 color space converter
Diffstat (limited to 'frontend/cspace_arm.S')
-rw-r--r-- | frontend/cspace_arm.S | 65 |
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} |