Fix polygon issues
[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
69f0df9c 26 subs r2, r2, #64
27 blt btr16_end64
a327967e 280:
30f6e5ed 29 pld [r1, #64*2]
a327967e 30 vldmia r1!, {q0-q3}
288e55cb 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}
d352cde2 48 subs r2, r2, #64
49 bge 0b
50
69f0df9c 51btr16_end64:
d352cde2 52 adds r2, r2, #64
53 bxeq lr
69f0df9c 54 subs r2, r2, #16
55 blt btr16_end16
d352cde2 56
69f0df9c 57 @ handle the remainder (reasonably rare)
d352cde2 580:
69f0df9c 59 vld1.16 {q0}, [r1]!
d352cde2 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
69f0df9c 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
a327967e 73
69f0df9c 74 @ very rare
35d3fd2e 75 vld1.16 {d0}, [r1]!
69f0df9c 76 vshl.u16 d1, d0, #11
77 vshl.u16 d2, d0, #1
78 vsri.u16 d1, d0, #10
79 vbit d1, d2, d30
35d3fd2e 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}
a327967e 162 bx lr
163
1972732a 164
288e55cb 165FUNCTION(bgr888_to_rgb888): @ dst, src, bytes
30f6e5ed 166 pld [r1]
1972732a 167 @ r2 /= 48
168 mov r2, r2, lsr #4
169 movw r3, #0x5556
170 movt r3, #0x5555
171 umull r12,r2, r3, r2
1720:
30f6e5ed 173 pld [r1, #48*3]
1972732a 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
288e55cb 186FUNCTION(bgr888_to_rgb565): @ dst, src, bytes
30f6e5ed 187 pld [r1]
f3a63e25 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:
30f6e5ed 197 pld [r1, #48*3]
f3a63e25 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
288e55cb 218FUNCTION(rgb888_to_rgb565): @ dst, src, bytes
00a5d459 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
a327967e 250@ vim:filetype=armasm