cdrom: change pause timing again
[pcsx_rearmed.git] / frontend / cspace_neon.S
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
22 FUNCTION(bgr555_to_rgb565): @ dst, src, bytes
23     pld         [r1]
24     mov         r3, #0x07c0
25     vdup.16     q15, r3
26     tst         r0, #8
27     beq         0f
28     @ align the dst
29     vld1.16     {d0}, [r1]!
30     sub         r2, r2, #8
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]!
36 0:
37     subs        r2, r2, #64
38     blt         btr16_end64
39 0:
40     pld         [r1, #64*2]
41     @ Pulls 15-bit BGR color values (which are actually 16 bits) into q0-q3.
42     @ example:  q0 = 0111 1110 0101 0011
43     vld1.16     {d0-d3}, [r1]!
44     vld1.16     {d4-d7}, [r1]!
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
48     vshl.u16    q0,  q0, #1
49     vshl.u16    q1,  q1, #1
50     vshl.u16    q2,  q2, #1
51     vshl.u16    q3,  q3, #1
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
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}
72     subs        r2, r2, #64
73     bge         0b
74
75 btr16_end64:
76     adds        r2, r2, #64
77     bxeq        lr
78     subs        r2, r2, #16
79     blt         btr16_end16
80
81     @ handle the remainder (reasonably rare)
82 0:
83     vld1.16     {q0}, [r1]!
84     vshl.u16    q0, q0, #1
85     vshl.u16    q1, q0, #10
86     vsri.u16    q1, q0, #11
87     vbit        q1, q0, q15
88     subs        r2, r2, #16
89     vst1.16     {q1}, [r0]!
90     bge         0b
91
92 btr16_end16:
93     adds        r2, r2, #16
94     bxeq        lr
95     subs        r2, r2, #8
96     bxlt        lr
97
98     @ very rare
99     vld1.16     {d0}, [r1]!
100     vshl.u16    d0, d0, #1
101     vshl.u16    d1, d0, #10
102     vsri.u16    d1, d0, #11
103     vbit        d1, d0, d30
104     vst1.16     {d1}, [r0]!
105     bx          lr
106
107
108 @ note: may overflow source
109 FUNCTION(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
115 0:
116     pld         [r1, #64*2]
117     vld1.16     {d0-d3}, [r1]!
118     vld1.16     {d4-d7}, [r1]!
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
167 1:
168     blt         0f
169     vstmia      r0!, {q4-q7}
170     b           btr16b_end
171 0:
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
185 btr16b_end:
186     vpop        {q4-q7}
187     bx          lr
188
189
190 FUNCTION(bgr888_to_rgb888): @ dst, src, bytes
191     pld         [r1]
192     @ r2 /= 48
193     mov         r2, r2, lsr #4
194     movw        r3, #0x5556
195     movt        r3, #0x5555
196     umull       r12,r2, r3, r2
197 0:
198     pld         [r1, #48*3]
199     vld3.8      {d0-d2}, [r1]!
200     vld3.8      {d3-d5}, [r1]!
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
211 FUNCTION(bgr888_to_rgb565): @ dst, src, bytes
212     pld         [r1]
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
221 0:
222     pld         [r1, #48*3]
223     vld3.8      {d1-d3}, [r1]!
224     vld3.8      {d5-d7}, [r1]!
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
243 FUNCTION(rgb888_to_rgb565): @ dst, src, bytes
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
253 0:
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
275 @ vim:filetype=armasm:expandtab