mingw build fixes
[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     subs        r2, r2, #64
27     blt         btr16_end64
28 0:
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
51 btr16_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)
58 0:
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
68 btr16_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
85 FUNCTION(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
91 0:
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
142 1:
143     blt         0f
144     vstmia      r0!, {q4-q7}
145     b           btr16b_end
146 0:
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
160 btr16b_end:
161     vpop        {q4-q7}
162     bx          lr
163
164
165 FUNCTION(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
172 0:
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
186 FUNCTION(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
196 0:
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
218 FUNCTION(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
228 0:
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