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