frontend: add armv6 color space converter
[pcsx_rearmed.git] / frontend / cspace_arm.S
1 /*
2  * (C) GraÅžvydas "notaz" Ignotas, 2013
3  *
4  * This work is licensed under the terms of GNU GPL version 2 or later.
5  * See the COPYING file in the top-level directory.
6  */
7
8 #include "arm_features.h"
9
10 .text
11 .align 2
12
13 @ lr=0x001f001f
14 @ trashes r11, r12
15 .macro bgr555_to_rgb565_one rn
16     and      r11, lr, \rn
17     and      r12, lr, \rn, lsr #5
18     and      \rn, lr, \rn, lsr #10
19     orr      r12, r11, lsl #5
20     orr      \rn, r12, lsl #6
21 .endm
22
23 .macro pld_ reg offs=#0
24 #ifdef HAVE_ARMV6
25     pld      [\reg, \offs]
26 #endif
27 .endm
28
29 .global bgr555_to_rgb565 @ void *dst, const void *src, int bytes
30 bgr555_to_rgb565:
31     pld_     r1
32     push     {r4-r11,lr}
33     mov      lr, #0x001f
34     subs     r2, #4*8
35     orr      lr, lr, lsl #16
36     blt      1f
37
38 0:
39     ldmia    r1!, {r3-r10}
40     subs     r2, #4*8
41     bgr555_to_rgb565_one r3
42
43     pld_     r1, #32*2
44     bgr555_to_rgb565_one r4
45     bgr555_to_rgb565_one r5
46     bgr555_to_rgb565_one r6
47     bgr555_to_rgb565_one r7
48     bgr555_to_rgb565_one r8
49     bgr555_to_rgb565_one r9
50     bgr555_to_rgb565_one r10
51     stmia    r0!, {r3-r10}
52     bge      0b
53
54 1:
55     adds     r2, #4*8
56     popeq    {r4-r11,pc}
57
58 2:
59     ldr      r3, [r1], #4
60     subs     r2, #4
61     bgr555_to_rgb565_one r3
62     str      r3, [r0], #4
63     bgt      2b
64
65     pop      {r4-r11,pc}