2 * (C) GraÅžvydas "notaz" Ignotas, 2013
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.
8 #include "arm_features.h"
15 .macro bgr555_to_rgb565_one rn
17 and r12, lr, \rn, lsr #5
18 and \rn, lr, \rn, lsr #10
23 .macro bgr555_to_rgb565_one_i rn1 rn2
24 and r12, lr, \rn1, lsr #5
25 and \rn1,lr, \rn1, lsr #10
31 .macro pld_ reg offs=#0
37 FUNCTION(bgr555_to_rgb565): @ void *dst, const void *src, int bytes
44 @ src can be unaligned, but that's very rare, so just force it.
45 @ The manual says unaligned ldm should fault, and it does on
46 @ cortex-a78's 32bit mode, but curiously on cortex-a8 it just
47 @ works and loads the data correctly.
56 bgr555_to_rgb565_one_i r3 r4
57 bgr555_to_rgb565_one_i r4 r5
58 bgr555_to_rgb565_one_i r5 r6
59 bgr555_to_rgb565_one_i r6 r7
60 bgr555_to_rgb565_one_i r7 r8
61 bgr555_to_rgb565_one_i r8 r9
62 bgr555_to_rgb565_one_i r9 r10
63 bgr555_to_rgb565_one_i r10 r10
74 bgr555_to_rgb565_one r3
81 #ifdef HAVE_ARMV6 /* v6-only due to potential misaligned reads */
83 # r1b0g0r0 g2r2b1g1 b3g3r3b2
84 FUNCTION(bgr888_to_rgb565):
88 mov r10, #0x001f @ b mask
89 mov r12, #0x07e0 @ g mask
90 mov lr, #0xf800 @ r mask
93 ldr r3, [r1], #4 @ may be unaligned
97 and r6, r10,r3, lsr #16+3 @ b0
98 and r7, r12,r3, lsr #5 @ g0
99 and r8, lr, r3, lsl #8 @ r0
100 and r9, lr, r3, lsr #16 @ r1
102 orr r6, r6, r8 @ r0g0b0
104 and r7, r12,r4, lsl #3 @ g1
105 and r8, r10,r4, lsr #11 @ b1
107 orr r9, r9, r8 @ r1g1b1
108 and r7, lr, r4, lsr #8 @ r2
109 and r8, r12,r4, lsr #21 @ g2
110 pkhbt r9, r6, r9, lsl #16
113 and r6, r10,r5, lsr #3 @ b2
115 orr r6, r6, r7 @ r2g2b2
117 and r8, r12,r5, lsr #13 @ g3
118 orr r7, r7, r5, lsr #27 @ r3b3
119 orr r7, r7, r8 @ r3g3b3
120 pkhbt r7, r6, r7, lsl #16
127 #endif /* HAVE_ARMV6 */