frontend: scanline efect and memcard saving
[pcsx_rearmed.git] / frontend / cspace_neon.S
... / ...
CommitLineData
1/*
2 * (C) GraÅžvydas "notaz" Ignotas, 2010
3 *
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.
8 * See the COPYING file in the top-level directory.
9 */
10
11#include "arm_features.h"
12
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
19.text
20.align 2
21
22FUNCTION(bgr555_to_rgb565): @ dst, src, bytes
23 pld [r1]
24 mov r3, #0x07c0
25 vdup.16 q15, r3
26 subs r2, r2, #64
27 blt btr16_end64
280:
29 pld [r1, #64*2]
30 vldmia r1!, {q0-q3}
31 vshl.u16 q8, q0, #11
32 vshl.u16 q9, q1, #11
33 vshl.u16 q10, q2, #11
34 vshl.u16 q11, q3, #11
35 vsri.u16 q8, q0, #10
36 vsri.u16 q9, q1, #10
37 vsri.u16 q10, q2, #10
38 vsri.u16 q11, q3, #10
39 vshl.u16 q0, q0, #1
40 vshl.u16 q1, q1, #1
41 vshl.u16 q2, q2, #1
42 vshl.u16 q3, q3, #1
43 vbit q8, q0, q15
44 vbit q9, q1, q15
45 vbit q10, q2, q15
46 vbit q11, q3, q15
47 vstmia r0!, {q8-q11}
48 subs r2, r2, #64
49 bge 0b
50
51btr16_end64:
52 adds r2, r2, #64
53 bxeq lr
54 subs r2, r2, #16
55 blt btr16_end16
56
57 @ handle the remainder (reasonably rare)
580:
59 vld1.16 {q0}, [r1]!
60 vshl.u16 q1, q0, #11
61 vshl.u16 q2, q0, #1
62 vsri.u16 q1, q0, #10
63 vbit q1, q2, q15
64 subs r2, r2, #16
65 vst1.16 {q1}, [r0]!
66 bge 0b
67
68btr16_end16:
69 adds r2, r2, #16
70 bxeq lr
71 subs r2, r2, #8
72 bxlt lr
73
74 @ very rare
75 vld1.16 {d0}, [r1]!
76 vshl.u16 d1, d0, #11
77 vshl.u16 d2, d0, #1
78 vsri.u16 d1, d0, #10
79 vbit d1, d2, d30
80 vst1.16 {d1}, [r0]!
81 bx lr
82
83
84@ note: may overflow source
85FUNCTION(bgr555_to_rgb565_b): @ dst, src, bytes, int brightness2k // 0-0x0800
86 pld [r1]
87 vdup.16 q15, r3
88 vpush {q4-q7}
89 mov r3, #0x1f
90 vdup.16 q14, r3
910:
92 pld [r1, #64*2]
93 vldmia r1!, {q0-q3}
94 vand.u16 q8, q0, q14
95 vand.u16 q9, q1, q14
96 vand.u16 q10, q2, q14
97 vand.u16 q11, q3, q14
98 vmul.u16 q4, q8, q15
99 vmul.u16 q5, q9, q15
100 vmul.u16 q6, q10, q15
101 vmul.u16 q7, q11, q15
102
103 vshr.u16 q8, q0, #5
104 vshr.u16 q9, q1, #5
105 vshr.u16 q10, q2, #5
106 vshr.u16 q11, q3, #5
107 vand.u16 q8, q14
108 vand.u16 q9, q14
109 vand.u16 q10, q14
110 vand.u16 q11, q14
111 vmul.u16 q8, q15
112 vmul.u16 q9, q15
113 vmul.u16 q10, q15
114 vmul.u16 q11, q15
115 vsri.u16 q4, q8, #5
116 vsri.u16 q5, q9, #5
117 vsri.u16 q6, q10, #5
118 vsri.u16 q7, q11, #5
119
120 vshr.u16 q8, q0, #10
121 vshr.u16 q9, q1, #10
122 vshr.u16 q10, q2, #10
123 vshr.u16 q11, q3, #10
124 vand.u16 q8, q14
125 vand.u16 q9, q14
126 vand.u16 q10, q14
127 vand.u16 q11, q14
128 vmul.u16 q8, q15
129 vmul.u16 q9, q15
130 vmul.u16 q10, q15
131 vmul.u16 q11, q15
132 vsri.u16 q4, q8, #11
133 vsri.u16 q5, q9, #11
134 vsri.u16 q6, q10, #11
135 vsri.u16 q7, q11, #11
136
137 subs r2, r2, #64
138 ble 1f
139 vstmia r0!, {q4-q7}
140 b 0b
141
1421:
143 blt 0f
144 vstmia r0!, {q4-q7}
145 b btr16b_end
1460:
147 subs r2, r2, #8
148 blt btr16b_end
149 vst1.16 {q4}, [r0]!
150 subs r2, r2, #8
151 blt btr16b_end
152 vst1.16 {q5}, [r0]!
153 subs r2, r2, #8
154 blt btr16b_end
155 vst1.16 {q6}, [r0]!
156 subs r2, r2, #8
157 blt btr16b_end
158 vst1.16 {q7}, [r0]!
159
160btr16b_end:
161 vpop {q4-q7}
162 bx lr
163
164
165FUNCTION(bgr888_to_rgb888): @ dst, src, bytes
166 pld [r1]
167 @ r2 /= 48
168 mov r2, r2, lsr #4
169 movw r3, #0x5556
170 movt r3, #0x5555
171 umull r12,r2, r3, r2
1720:
173 pld [r1, #48*3]
174 vld3.8 {d0-d2}, [r1, :64]!
175 vld3.8 {d3-d5}, [r1, :64]!
176 vswp d0, d2
177 vswp d3, d5
178 vst3.8 {d0-d2}, [r0, :64]!
179 vst3.8 {d3-d5}, [r0, :64]!
180 subs r2, r2, #1
181 bne 0b
182
183 bx lr
184
185
186FUNCTION(bgr888_to_rgb565): @ dst, src, bytes
187 pld [r1]
188 @ r2 /= 48
189 mov r2, r2, lsr #4
190 movw r3, #0x5556
191 movt r3, #0x5555
192 umull r12,r2, r3, r2
193
194 mov r3, #0x07e0
195 vdup.16 q15, r3
1960:
197 pld [r1, #48*3]
198 vld3.8 {d1-d3}, [r1, :64]!
199 vld3.8 {d5-d7}, [r1, :64]!
200
201 vshll.u8 q8, d2, #3 @ g
202 vshll.u8 q9, d6, #3
203 vshr.u8 d0, d3, #3 @ b
204 vshr.u8 d4, d7, #3
205 vzip.8 d0, d1 @ rb
206 vzip.8 d4, d5
207 vbit q0, q8, q15
208 vbit q2, q9, q15
209
210 vstmia r0!, {d0,d1}
211 vstmia r0!, {d4,d5}
212 subs r2, r2, #1
213 bne 0b
214
215 bx lr
216
217
218FUNCTION(rgb888_to_rgb565): @ dst, src, bytes
219 pld [r1]
220 @ r2 /= 48
221 mov r2, r2, lsr #4
222 movw r3, #0x5556
223 movt r3, #0x5555
224 umull r12,r2, r3, r2
225
226 mov r3, #0x07e0
227 vdup.16 q15, r3
2280:
229 pld [r1, #48*3]
230 vld3.8 {d1-d3}, [r1, :64]!
231 vld3.8 {d5-d7}, [r1, :64]!
232
233 vshll.u8 q8, d2, #3 @ g
234 vshll.u8 q9, d6, #3
235 vshr.u8 d2, d1, #3 @ b
236 vshr.u8 d6, d5, #3
237 vzip.8 d2, d3 @ rb
238 vzip.8 d6, d7
239 vbit q1, q8, q15
240 vbit q3, q9, q15
241
242 vstmia r0!, {d2,d3}
243 vstmia r0!, {d6,d7}
244 subs r2, r2, #1
245 bne 0b
246
247 bx lr
248
249
250@ vim:filetype=armasm