d57557c0 |
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} |