cspace: generic implementation with vector extensions
[pcsx_rearmed.git] / frontend / cspace_neon.S
CommitLineData
a327967e 1/*
2 * (C) GraÅžvydas "notaz" Ignotas, 2010
3 *
69af03a2 4 * This work is licensed under the terms of any of these licenses
5 * (at your option):
6 * - GNU GPL, version 2 or later.
7 * - GNU LGPL, version 2.1 or later.
a327967e 8 * See the COPYING file in the top-level directory.
9 */
10
e5ed711c 11#include "arm_features.h"
12
b09a1d34 13/* sanity check */
14#ifndef __ARM_NEON__
15#error Compiling NEON code, but appropriate preprocessor flag is missing
16#error This usually means -mfpu=neon or -mfloat-abi= is not correctly specified
17#endif
18
a327967e 19.text
20.align 2
21
288e55cb 22FUNCTION(bgr555_to_rgb565): @ dst, src, bytes
30f6e5ed 23 pld [r1]
d352cde2 24 mov r3, #0x07c0
a327967e 25 vdup.16 q15, r3
d639fa7f 26 tst r0, #8
27 beq 0f
28 @ align the dst
29 vld1.16 {d0}, [r1]!
30 vshl.u16 d0, d0, #1
31 vshl.u16 d1, d0, #10
32 vsri.u16 d1, d0, #11
33 vbit d1, d0, d30
34 vst1.16 {d1}, [r0]!
350:
69f0df9c 36 subs r2, r2, #64
37 blt btr16_end64
a327967e 380:
30f6e5ed 39 pld [r1, #64*2]
92db7708 40 @ Pulls 15-bit BGR color values (which are actually 16 bits) into q0-q3.
41 @ example: q0 = 0111 1110 0101 0011
a327967e 42 vldmia r1!, {q0-q3}
92db7708 43 @ Shift BGR color 1 bit to the left, discarding MSB and preparing for vbit.
44 @ MSB is used for transparency (not needed here, and can mess with green).
45 @ example: q0 = 1111 1100 1010 0110
288e55cb 46 vshl.u16 q0, q0, #1
47 vshl.u16 q1, q1, #1
48 vshl.u16 q2, q2, #1
49 vshl.u16 q3, q3, #1
92db7708 50 @ Places red value in left most bits, clears bits to the right.
51 @ example: q8 = 1001 1000 0000 0000
52 vshl.u16 q8, q0, #10
53 vshl.u16 q9, q1, #10
54 vshl.u16 q10, q2, #10
55 vshl.u16 q11, q3, #10
56 @ Places blue value in right most bits, leaving bits to the left unchanged.
57 @ example: q8 = 1001 1000 0001 1111
58 vsri.u16 q8, q0, #11
59 vsri.u16 q9, q1, #11
60 vsri.u16 q10, q2, #11
61 vsri.u16 q11, q3, #11
62 @ Sets green value from shifted BGR color by apply a mask.
63 @ example: q15 = 0000 0111 1100 0000
64 @ q8 = 1001 1100 1001 1111
288e55cb 65 vbit q8, q0, q15
66 vbit q9, q1, q15
67 vbit q10, q2, q15
68 vbit q11, q3, q15
69 vstmia r0!, {q8-q11}
d352cde2 70 subs r2, r2, #64
71 bge 0b
72
69f0df9c 73btr16_end64:
d352cde2 74 adds r2, r2, #64
75 bxeq lr
69f0df9c 76 subs r2, r2, #16
77 blt btr16_end16
d352cde2 78
69f0df9c 79 @ handle the remainder (reasonably rare)
d352cde2 800:
69f0df9c 81 vld1.16 {q0}, [r1]!
92db7708 82 vshl.u16 q0, q0, #1
83 vshl.u16 q1, q0, #10
84 vsri.u16 q1, q0, #11
85 vbit q1, q0, q15
d352cde2 86 subs r2, r2, #16
69f0df9c 87 vst1.16 {q1}, [r0]!
88 bge 0b
89
90btr16_end16:
91 adds r2, r2, #16
92 bxeq lr
93 subs r2, r2, #8
94 bxlt lr
a327967e 95
69f0df9c 96 @ very rare
35d3fd2e 97 vld1.16 {d0}, [r1]!
92db7708 98 vshl.u16 d0, d0, #1
99 vshl.u16 d1, d0, #10
100 vsri.u16 d1, d0, #11
101 vbit d1, d0, d30
35d3fd2e 102 vst1.16 {d1}, [r0]!
103 bx lr
104
105
106@ note: may overflow source
107FUNCTION(bgr555_to_rgb565_b): @ dst, src, bytes, int brightness2k // 0-0x0800
108 pld [r1]
109 vdup.16 q15, r3
110 vpush {q4-q7}
111 mov r3, #0x1f
112 vdup.16 q14, r3
1130:
114 pld [r1, #64*2]
115 vldmia r1!, {q0-q3}
116 vand.u16 q8, q0, q14
117 vand.u16 q9, q1, q14
118 vand.u16 q10, q2, q14
119 vand.u16 q11, q3, q14
120 vmul.u16 q4, q8, q15
121 vmul.u16 q5, q9, q15
122 vmul.u16 q6, q10, q15
123 vmul.u16 q7, q11, q15
124
125 vshr.u16 q8, q0, #5
126 vshr.u16 q9, q1, #5
127 vshr.u16 q10, q2, #5
128 vshr.u16 q11, q3, #5
129 vand.u16 q8, q14
130 vand.u16 q9, q14
131 vand.u16 q10, q14
132 vand.u16 q11, q14
133 vmul.u16 q8, q15
134 vmul.u16 q9, q15
135 vmul.u16 q10, q15
136 vmul.u16 q11, q15
137 vsri.u16 q4, q8, #5
138 vsri.u16 q5, q9, #5
139 vsri.u16 q6, q10, #5
140 vsri.u16 q7, q11, #5
141
142 vshr.u16 q8, q0, #10
143 vshr.u16 q9, q1, #10
144 vshr.u16 q10, q2, #10
145 vshr.u16 q11, q3, #10
146 vand.u16 q8, q14
147 vand.u16 q9, q14
148 vand.u16 q10, q14
149 vand.u16 q11, q14
150 vmul.u16 q8, q15
151 vmul.u16 q9, q15
152 vmul.u16 q10, q15
153 vmul.u16 q11, q15
154 vsri.u16 q4, q8, #11
155 vsri.u16 q5, q9, #11
156 vsri.u16 q6, q10, #11
157 vsri.u16 q7, q11, #11
158
159 subs r2, r2, #64
160 ble 1f
161 vstmia r0!, {q4-q7}
162 b 0b
163
1641:
165 blt 0f
166 vstmia r0!, {q4-q7}
167 b btr16b_end
1680:
169 subs r2, r2, #8
170 blt btr16b_end
171 vst1.16 {q4}, [r0]!
172 subs r2, r2, #8
173 blt btr16b_end
174 vst1.16 {q5}, [r0]!
175 subs r2, r2, #8
176 blt btr16b_end
177 vst1.16 {q6}, [r0]!
178 subs r2, r2, #8
179 blt btr16b_end
180 vst1.16 {q7}, [r0]!
181
182btr16b_end:
183 vpop {q4-q7}
a327967e 184 bx lr
185
1972732a 186
288e55cb 187FUNCTION(bgr888_to_rgb888): @ dst, src, bytes
30f6e5ed 188 pld [r1]
1972732a 189 @ r2 /= 48
190 mov r2, r2, lsr #4
191 movw r3, #0x5556
192 movt r3, #0x5555
193 umull r12,r2, r3, r2
1940:
30f6e5ed 195 pld [r1, #48*3]
2391c1b4 196 vld3.8 {d0-d2}, [r1]!
197 vld3.8 {d3-d5}, [r1]!
1972732a 198 vswp d0, d2
199 vswp d3, d5
200 vst3.8 {d0-d2}, [r0, :64]!
201 vst3.8 {d3-d5}, [r0, :64]!
202 subs r2, r2, #1
203 bne 0b
204
205 bx lr
206
207
288e55cb 208FUNCTION(bgr888_to_rgb565): @ dst, src, bytes
30f6e5ed 209 pld [r1]
f3a63e25 210 @ r2 /= 48
211 mov r2, r2, lsr #4
212 movw r3, #0x5556
213 movt r3, #0x5555
214 umull r12,r2, r3, r2
215
216 mov r3, #0x07e0
217 vdup.16 q15, r3
2180:
30f6e5ed 219 pld [r1, #48*3]
2391c1b4 220 vld3.8 {d1-d3}, [r1]!
221 vld3.8 {d5-d7}, [r1]!
f3a63e25 222
223 vshll.u8 q8, d2, #3 @ g
224 vshll.u8 q9, d6, #3
225 vshr.u8 d0, d3, #3 @ b
226 vshr.u8 d4, d7, #3
227 vzip.8 d0, d1 @ rb
228 vzip.8 d4, d5
229 vbit q0, q8, q15
230 vbit q2, q9, q15
231
232 vstmia r0!, {d0,d1}
233 vstmia r0!, {d4,d5}
234 subs r2, r2, #1
235 bne 0b
236
237 bx lr
238
239
288e55cb 240FUNCTION(rgb888_to_rgb565): @ dst, src, bytes
00a5d459 241 pld [r1]
242 @ r2 /= 48
243 mov r2, r2, lsr #4
244 movw r3, #0x5556
245 movt r3, #0x5555
246 umull r12,r2, r3, r2
247
248 mov r3, #0x07e0
249 vdup.16 q15, r3
2500:
251 pld [r1, #48*3]
252 vld3.8 {d1-d3}, [r1, :64]!
253 vld3.8 {d5-d7}, [r1, :64]!
254
255 vshll.u8 q8, d2, #3 @ g
256 vshll.u8 q9, d6, #3
257 vshr.u8 d2, d1, #3 @ b
258 vshr.u8 d6, d5, #3
259 vzip.8 d2, d3 @ rb
260 vzip.8 d6, d7
261 vbit q1, q8, q15
262 vbit q3, q9, q15
263
264 vstmia r0!, {d2,d3}
265 vstmia r0!, {d6,d7}
266 subs r2, r2, #1
267 bne 0b
268
269 bx lr
270
271
a327967e 272@ vim:filetype=armasm