cdrom: change pause timing again
[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]!
dcb2e057 30 sub r2, r2, #8
d639fa7f 31 vshl.u16 d0, d0, #1
32 vshl.u16 d1, d0, #10
33 vsri.u16 d1, d0, #11
34 vbit d1, d0, d30
35 vst1.16 {d1}, [r0]!
360:
69f0df9c 37 subs r2, r2, #64
38 blt btr16_end64
a327967e 390:
30f6e5ed 40 pld [r1, #64*2]
92db7708 41 @ Pulls 15-bit BGR color values (which are actually 16 bits) into q0-q3.
42 @ example: q0 = 0111 1110 0101 0011
f189413e 43 vld1.16 {d0-d3}, [r1]!
44 vld1.16 {d4-d7}, [r1]!
92db7708 45 @ Shift BGR color 1 bit to the left, discarding MSB and preparing for vbit.
46 @ MSB is used for transparency (not needed here, and can mess with green).
47 @ example: q0 = 1111 1100 1010 0110
288e55cb 48 vshl.u16 q0, q0, #1
49 vshl.u16 q1, q1, #1
50 vshl.u16 q2, q2, #1
51 vshl.u16 q3, q3, #1
92db7708 52 @ Places red value in left most bits, clears bits to the right.
53 @ example: q8 = 1001 1000 0000 0000
54 vshl.u16 q8, q0, #10
55 vshl.u16 q9, q1, #10
56 vshl.u16 q10, q2, #10
57 vshl.u16 q11, q3, #10
58 @ Places blue value in right most bits, leaving bits to the left unchanged.
59 @ example: q8 = 1001 1000 0001 1111
60 vsri.u16 q8, q0, #11
61 vsri.u16 q9, q1, #11
62 vsri.u16 q10, q2, #11
63 vsri.u16 q11, q3, #11
64 @ Sets green value from shifted BGR color by apply a mask.
65 @ example: q15 = 0000 0111 1100 0000
66 @ q8 = 1001 1100 1001 1111
288e55cb 67 vbit q8, q0, q15
68 vbit q9, q1, q15
69 vbit q10, q2, q15
70 vbit q11, q3, q15
71 vstmia r0!, {q8-q11}
d352cde2 72 subs r2, r2, #64
73 bge 0b
74
69f0df9c 75btr16_end64:
d352cde2 76 adds r2, r2, #64
77 bxeq lr
69f0df9c 78 subs r2, r2, #16
79 blt btr16_end16
d352cde2 80
69f0df9c 81 @ handle the remainder (reasonably rare)
d352cde2 820:
69f0df9c 83 vld1.16 {q0}, [r1]!
92db7708 84 vshl.u16 q0, q0, #1
85 vshl.u16 q1, q0, #10
86 vsri.u16 q1, q0, #11
87 vbit q1, q0, q15
d352cde2 88 subs r2, r2, #16
69f0df9c 89 vst1.16 {q1}, [r0]!
90 bge 0b
91
92btr16_end16:
93 adds r2, r2, #16
94 bxeq lr
95 subs r2, r2, #8
96 bxlt lr
a327967e 97
69f0df9c 98 @ very rare
35d3fd2e 99 vld1.16 {d0}, [r1]!
92db7708 100 vshl.u16 d0, d0, #1
101 vshl.u16 d1, d0, #10
102 vsri.u16 d1, d0, #11
103 vbit d1, d0, d30
35d3fd2e 104 vst1.16 {d1}, [r0]!
105 bx lr
106
107
108@ note: may overflow source
109FUNCTION(bgr555_to_rgb565_b): @ dst, src, bytes, int brightness2k // 0-0x0800
110 pld [r1]
111 vdup.16 q15, r3
112 vpush {q4-q7}
113 mov r3, #0x1f
114 vdup.16 q14, r3
1150:
116 pld [r1, #64*2]
f189413e 117 vld1.16 {d0-d3}, [r1]!
118 vld1.16 {d4-d7}, [r1]!
35d3fd2e 119 vand.u16 q8, q0, q14
120 vand.u16 q9, q1, q14
121 vand.u16 q10, q2, q14
122 vand.u16 q11, q3, q14
123 vmul.u16 q4, q8, q15
124 vmul.u16 q5, q9, q15
125 vmul.u16 q6, q10, q15
126 vmul.u16 q7, q11, q15
127
128 vshr.u16 q8, q0, #5
129 vshr.u16 q9, q1, #5
130 vshr.u16 q10, q2, #5
131 vshr.u16 q11, q3, #5
132 vand.u16 q8, q14
133 vand.u16 q9, q14
134 vand.u16 q10, q14
135 vand.u16 q11, q14
136 vmul.u16 q8, q15
137 vmul.u16 q9, q15
138 vmul.u16 q10, q15
139 vmul.u16 q11, q15
140 vsri.u16 q4, q8, #5
141 vsri.u16 q5, q9, #5
142 vsri.u16 q6, q10, #5
143 vsri.u16 q7, q11, #5
144
145 vshr.u16 q8, q0, #10
146 vshr.u16 q9, q1, #10
147 vshr.u16 q10, q2, #10
148 vshr.u16 q11, q3, #10
149 vand.u16 q8, q14
150 vand.u16 q9, q14
151 vand.u16 q10, q14
152 vand.u16 q11, q14
153 vmul.u16 q8, q15
154 vmul.u16 q9, q15
155 vmul.u16 q10, q15
156 vmul.u16 q11, q15
157 vsri.u16 q4, q8, #11
158 vsri.u16 q5, q9, #11
159 vsri.u16 q6, q10, #11
160 vsri.u16 q7, q11, #11
161
162 subs r2, r2, #64
163 ble 1f
164 vstmia r0!, {q4-q7}
165 b 0b
166
1671:
168 blt 0f
169 vstmia r0!, {q4-q7}
170 b btr16b_end
1710:
172 subs r2, r2, #8
173 blt btr16b_end
174 vst1.16 {q4}, [r0]!
175 subs r2, r2, #8
176 blt btr16b_end
177 vst1.16 {q5}, [r0]!
178 subs r2, r2, #8
179 blt btr16b_end
180 vst1.16 {q6}, [r0]!
181 subs r2, r2, #8
182 blt btr16b_end
183 vst1.16 {q7}, [r0]!
184
185btr16b_end:
186 vpop {q4-q7}
a327967e 187 bx lr
188
1972732a 189
288e55cb 190FUNCTION(bgr888_to_rgb888): @ dst, src, bytes
30f6e5ed 191 pld [r1]
1972732a 192 @ r2 /= 48
193 mov r2, r2, lsr #4
194 movw r3, #0x5556
195 movt r3, #0x5555
196 umull r12,r2, r3, r2
1970:
30f6e5ed 198 pld [r1, #48*3]
2391c1b4 199 vld3.8 {d0-d2}, [r1]!
200 vld3.8 {d3-d5}, [r1]!
1972732a 201 vswp d0, d2
202 vswp d3, d5
203 vst3.8 {d0-d2}, [r0, :64]!
204 vst3.8 {d3-d5}, [r0, :64]!
205 subs r2, r2, #1
206 bne 0b
207
208 bx lr
209
210
288e55cb 211FUNCTION(bgr888_to_rgb565): @ dst, src, bytes
30f6e5ed 212 pld [r1]
f3a63e25 213 @ r2 /= 48
214 mov r2, r2, lsr #4
215 movw r3, #0x5556
216 movt r3, #0x5555
217 umull r12,r2, r3, r2
218
219 mov r3, #0x07e0
220 vdup.16 q15, r3
2210:
30f6e5ed 222 pld [r1, #48*3]
2391c1b4 223 vld3.8 {d1-d3}, [r1]!
224 vld3.8 {d5-d7}, [r1]!
f3a63e25 225
226 vshll.u8 q8, d2, #3 @ g
227 vshll.u8 q9, d6, #3
228 vshr.u8 d0, d3, #3 @ b
229 vshr.u8 d4, d7, #3
230 vzip.8 d0, d1 @ rb
231 vzip.8 d4, d5
232 vbit q0, q8, q15
233 vbit q2, q9, q15
234
235 vstmia r0!, {d0,d1}
236 vstmia r0!, {d4,d5}
237 subs r2, r2, #1
238 bne 0b
239
240 bx lr
241
242
288e55cb 243FUNCTION(rgb888_to_rgb565): @ dst, src, bytes
00a5d459 244 pld [r1]
245 @ r2 /= 48
246 mov r2, r2, lsr #4
247 movw r3, #0x5556
248 movt r3, #0x5555
249 umull r12,r2, r3, r2
250
251 mov r3, #0x07e0
252 vdup.16 q15, r3
2530:
254 pld [r1, #48*3]
255 vld3.8 {d1-d3}, [r1, :64]!
256 vld3.8 {d5-d7}, [r1, :64]!
257
258 vshll.u8 q8, d2, #3 @ g
259 vshll.u8 q9, d6, #3
260 vshr.u8 d2, d1, #3 @ b
261 vshr.u8 d6, d5, #3
262 vzip.8 d2, d3 @ rb
263 vzip.8 d6, d7
264 vbit q1, q8, q15
265 vbit q3, q9, q15
266
267 vstmia r0!, {d2,d3}
268 vstmia r0!, {d6,d7}
269 subs r2, r2, #1
270 bne 0b
271
272 bx lr
273
274
f189413e 275@ vim:filetype=armasm:expandtab