1/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <machine/cpu-features.h>
18
19#define SNIP_START(x) \
20    .globl x; x:
21
22#define SNIP_END(x) \
23    .globl x##_end; x##_end: \
24    .globl x##_len; x##_len: \
25    .word x##_end-x
26
27SNIP_START(_N_ColorMatrix_prefix_i)
28    stmfd           sp!, {r4, lr}
29    vpush           {q4-q7}
30    vld1.16 {q2}, [r2]!
31    vld1.16 {q3}, [r2]!
32    vld1.32 {d8[],d9[]}, [r2]!
33    vld1.32 {d10[],d11[]}, [r2]!
34    vld1.32 {d12[],d13[]}, [r2]!
35    vld1.32 {d14[],d15[]}, [r2]!
36    veor q0, q0
37    veor q1, q1
38    veor q9, q9
39    veor q10, q10
40    veor q11, q11
41SNIP_END(_N_ColorMatrix_prefix_i)
42
43SNIP_START(_N_ColorMatrix_prefix_f)
44    stmfd           sp!, {r4, lr}
45    vpush           {q4-q7}
46    add r2, #48
47    vld1.32 {q4}, [r2]!
48    vld1.32 {q5}, [r2]!
49    vld1.32 {q6}, [r2]!
50    vld1.32 {q7}, [r2]!
51    vld1.32 {d16[],d17[]}, [r2]!
52    vld1.32 {d18[],d19[]}, [r2]!
53    vld1.32 {d20[],d21[]}, [r2]!
54    vld1.32 {d22[],d23[]}, [r2]!
55    veor q1, q1
56    veor q2, q2
57    veor q3, q3
58SNIP_END(_N_ColorMatrix_prefix_f)
59
60SNIP_START(_N_ColorMatrix_postfix1)
61    subs r3, r3, #1
62    #bne 1b
63SNIP_END(_N_ColorMatrix_postfix1)
64
65SNIP_START(_N_ColorMatrix_postfix2)
66
67    #mov r0, #0
68    #ldr r0, [r0]
69
70    #vqadd.s32 q0,q0,q0
71    #vadd.f32 q0,q0,q0
72    #vmul.f32 q0,q0,d0[0]
73    #vmla.f32 q0,q0,d0[0]
74    #vmov q0, q0
75
76
77    vpop            {q4-q7}
78    ldmfd           sp!, {r4, lr}
79    bx              lr
80SNIP_END(_N_ColorMatrix_postfix2)
81
82SNIP_START(_N_ColorMatrix_load_u8_4)
83    vld4.8 {d0[0],d1[0],d2[0],d3[0]}, [r1]!
84    vld4.8 {d0[1],d1[1],d2[1],d3[1]}, [r1]!
85    vld4.8 {d0[2],d1[2],d2[2],d3[2]}, [r1]!
86    vld4.8 {d0[3],d1[3],d2[3],d3[3]}, [r1]!
87SNIP_END(_N_ColorMatrix_load_u8_4)
88
89SNIP_START(_N_ColorMatrix_load_u8_3)
90    vld4.8 {d0[0],d1[0],d2[0],d3[0]}, [r1]!
91    vld4.8 {d0[1],d1[1],d2[1],d3[1]}, [r1]!
92    vld4.8 {d0[2],d1[2],d2[2],d3[2]}, [r1]!
93    vld4.8 {d0[3],d1[3],d2[3],d3[3]}, [r1]!
94    veor d3, d3
95SNIP_END(_N_ColorMatrix_load_u8_3)
96
97SNIP_START(_N_ColorMatrix_load_u8_2)
98    vld2.8 {d0[0],d1[0]}, [r1]!
99    vld2.8 {d0[1],d1[1]}, [r1]!
100    vld2.8 {d0[2],d1[2]}, [r1]!
101    vld2.8 {d0[3],d1[3]}, [r1]!
102    veor d2, d2
103    veor d3, d3
104SNIP_END(_N_ColorMatrix_load_u8_2)
105
106SNIP_START(_N_ColorMatrix_load_u8_1)
107    vld1.32 {d0[0]}, [r1]!
108    veor d1, d1
109    veor d2, d2
110    veor d3, d3
111SNIP_END(_N_ColorMatrix_load_u8_1)
112
113SNIP_START(_N_ColorMatrix_load_u8f_4)
114    vld4.8 {d0[0],d1[0],d2[0],d3[0]}, [r1]!
115    vld4.8 {d0[1],d1[1],d2[1],d3[1]}, [r1]!
116    vld4.8 {d0[2],d1[2],d2[2],d3[2]}, [r1]!
117    vld4.8 {d0[3],d1[3],d2[3],d3[3]}, [r1]!
118    vmovl.u8 q3, d3
119    vmovl.u8 q2, d2
120    vmovl.u8 q1, d1
121    vmovl.u8 q0, d0
122    vmovl.u16 q3, d6
123    vmovl.u16 q2, d4
124    vmovl.u16 q1, d2
125    vmovl.u16 q0, d0
126    vcvt.f32.s32 q3, q3
127    vcvt.f32.s32 q2, q2
128    vcvt.f32.s32 q1, q1
129    vcvt.f32.s32 q0, q0
130SNIP_END(_N_ColorMatrix_load_u8f_4)
131
132SNIP_START(_N_ColorMatrix_load_u8f_3)
133    vld4.8 {d0[0],d1[0],d2[0],d3[0]}, [r1]!
134    vld4.8 {d0[1],d1[1],d2[1],d3[1]}, [r1]!
135    vld4.8 {d0[2],d1[2],d2[2],d3[2]}, [r1]!
136    vld4.8 {d0[3],d1[3],d2[3],d3[3]}, [r1]!
137    vmovl.u8 q2, d2
138    vmovl.u8 q1, d1
139    vmovl.u8 q0, d0
140    vmovl.u16 q2, d4
141    vmovl.u16 q1, d2
142    vmovl.u16 q0, d0
143    vcvt.f32.s32 q2, q2
144    vcvt.f32.s32 q1, q1
145    vcvt.f32.s32 q0, q0
146    veor q3, q3
147SNIP_END(_N_ColorMatrix_load_u8f_3)
148
149SNIP_START(_N_ColorMatrix_load_u8f_2)
150    vld2.8 {d0[0],d1[0]}, [r1]!
151    vld2.8 {d0[1],d1[1]}, [r1]!
152    vld2.8 {d0[2],d1[2]}, [r1]!
153    vld2.8 {d0[3],d1[3]}, [r1]!
154    vmovl.u8 q1, d1
155    vmovl.u8 q0, d0
156    vmovl.u16 q1, d2
157    vmovl.u16 q0, d0
158    vcvt.f32.s32 q1, q1
159    vcvt.f32.s32 q0, q0
160    veor q2, q2
161    veor q3, q3
162SNIP_END(_N_ColorMatrix_load_u8f_2)
163
164SNIP_START(_N_ColorMatrix_load_u8f_1)
165    vld1.32 {d0[0]}, [r1]!
166    vmovl.u8 q0, d0
167    vmovl.u16 q0, d0
168    vcvt.f32.s32 q0, q0
169    veor q1, q1
170    veor q2, q2
171    veor q3, q3
172SNIP_END(_N_ColorMatrix_load_u8f_1)
173
174SNIP_START(_N_ColorMatrix_load_f32_4)
175    vld4.32 {d0[0],d2[0],d4[0],d6[0]}, [r1]!
176    vld4.32 {d0[1],d2[1],d4[1],d6[1]}, [r1]!
177    vld4.32 {d1[0],d3[0],d5[0],d7[0]}, [r1]!
178    vld4.32 {d1[1],d3[1],d5[1],d7[1]}, [r1]!
179SNIP_END(_N_ColorMatrix_load_f32_4)
180
181SNIP_START(_N_ColorMatrix_load_f32_3)
182    vld3.32 {d0[0],d2[0],d4[0]}, [r1]!
183    add r1, r1, #4
184    vld3.32 {d0[1],d2[1],d4[1]}, [r1]!
185    add r1, r1, #4
186    vld3.32 {d1[0],d3[0],d5[0]}, [r1]!
187    add r1, r1, #4
188    vld3.32 {d1[1],d3[1],d5[1]}, [r1]!
189    add r1, r1, #4
190    veor q3, q3
191SNIP_END(_N_ColorMatrix_load_f32_3)
192
193SNIP_START(_N_ColorMatrix_load_f32_2)
194    vld2.32 {d0[0],d2[0]}, [r1]!
195    vld2.32 {d0[1],d2[1]}, [r1]!
196    vld2.32 {d1[0],d3[0]}, [r1]!
197    vld2.32 {d1[1],d3[1]}, [r1]!
198    veor q2, q2
199    veor q3, q3
200SNIP_END(_N_ColorMatrix_load_f32_2)
201
202SNIP_START(_N_ColorMatrix_load_f32_1)
203    vld1.32 {q0}, [r1]!
204    veor q1, q1
205    veor q2, q2
206    veor q3, q3
207SNIP_END(_N_ColorMatrix_load_f32_1)
208
209
210SNIP_START(_N_ColorMatrix_store_u8_4)
211#mov r0, #0
212    vst4.8 {d0[0],d1[0],d2[0],d3[0]}, [r0]!
213    vst4.8 {d0[1],d1[1],d2[1],d3[1]}, [r0]!
214    vst4.8 {d0[2],d1[2],d2[2],d3[2]}, [r0]!
215    vst4.8 {d0[3],d1[3],d2[3],d3[3]}, [r0]!
216SNIP_END(_N_ColorMatrix_store_u8_4)
217
218SNIP_START(_N_ColorMatrix_store_u8_2)
219    vst2.8 {d0[0],d1[0]}, [r0]!
220    vst2.8 {d0[1],d1[1]}, [r0]!
221    vst2.8 {d0[2],d1[2]}, [r0]!
222    vst2.8 {d0[3],d1[3]}, [r0]!
223SNIP_END(_N_ColorMatrix_store_u8_2)
224
225SNIP_START(_N_ColorMatrix_store_u8_1)
226    vst1.32 {d0[0]}, [r0]!
227SNIP_END(_N_ColorMatrix_store_u8_1)
228
229
230SNIP_START(_N_ColorMatrix_store_f32u_4)
231    vcvt.s32.f32 q0, q0
232    vcvt.s32.f32 q1, q1
233    vcvt.s32.f32 q2, q2
234    vcvt.s32.f32 q3, q3
235    vqmovn.s32 d0, q0
236    vqmovn.s32 d2, q1
237    vqmovn.s32 d4, q2
238    vqmovn.s32 d6, q3
239    vqmovun.s16 d0, q0
240    vqmovun.s16 d1, q1
241    vqmovun.s16 d2, q2
242    vqmovun.s16 d3, q3
243    vst4.8 {d0[0],d1[0],d2[0],d3[0]}, [r0]!
244    vst4.8 {d0[1],d1[1],d2[1],d3[1]}, [r0]!
245    vst4.8 {d0[2],d1[2],d2[2],d3[2]}, [r0]!
246    vst4.8 {d0[3],d1[3],d2[3],d3[3]}, [r0]!
247
248    #mov r0, #0
249    #ldr r0, [r0]
250
251SNIP_END(_N_ColorMatrix_store_f32u_4)
252
253SNIP_START(_N_ColorMatrix_store_f32u_2)
254    vcvt.s32.f32 q0, q0
255    vcvt.s32.f32 q1, q1
256    vqmovn.s32 d0, q0
257    vqmovn.s32 d2, q1
258    vqmovun.s16 d0, q0
259    vqmovun.s16 d1, q1
260    vst2.8 {d0[0],d1[0]}, [r0]!
261    vst2.8 {d0[1],d1[1]}, [r0]!
262    vst2.8 {d0[2],d1[2]}, [r0]!
263    vst2.8 {d0[3],d1[3]}, [r0]!
264SNIP_END(_N_ColorMatrix_store_f32u_2)
265
266SNIP_START(_N_ColorMatrix_store_f32u_1)
267    vcvt.s32.f32 q0, q0
268    vqmovn.s32 d0, q0
269    vqmovun.s16 d0, q0
270    vst1.32 {d0[0]}, [r0]!
271SNIP_END(_N_ColorMatrix_store_f32u_1)
272
273SNIP_START(_N_ColorMatrix_store_f32_4)
274    vst4.32 {d0[0],d2[0],d4[0],d6[0]}, [r0]!
275    vst4.32 {d0[1],d2[1],d4[1],d6[1]}, [r0]!
276    vst4.32 {d1[0],d3[0],d5[0],d7[0]}, [r0]!
277    vst4.32 {d1[1],d3[1],d5[1],d7[1]}, [r0]!
278SNIP_END(_N_ColorMatrix_store_f32_4)
279
280SNIP_START(_N_ColorMatrix_store_f32_3)
281    vst4.32 {d0[0],d2[0],d4[0],d6[0]}, [r0]!
282    vst4.32 {d0[1],d2[1],d4[1],d6[1]}, [r0]!
283    vst4.32 {d1[0],d3[0],d5[0],d7[0]}, [r0]!
284    vst4.32 {d1[1],d3[1],d5[1],d7[1]}, [r0]!
285SNIP_END(_N_ColorMatrix_store_f32_3)
286
287SNIP_START(_N_ColorMatrix_store_f32_2)
288    vst2.32 {d0[0],d2[0]}, [r0]!
289    vst2.32 {d0[1],d2[1]}, [r0]!
290    vst2.32 {d1[0],d3[0]}, [r0]!
291    vst2.32 {d1[1],d3[1]}, [r0]!
292SNIP_END(_N_ColorMatrix_store_f32_2)
293
294SNIP_START(_N_ColorMatrix_store_f32_1)
295    vst1.32 {q0}, [r0]!
296SNIP_END(_N_ColorMatrix_store_f32_1)
297
298
299SNIP_START(_N_ColorMatrix_unpack_u8_4)
300    vmovl.u8 q12, d0  /* R */
301    vmovl.u8 q13, d1  /* G */
302    vmovl.u8 q14, d2  /* B */
303    vmovl.u8 q15, d3  /* A */
304SNIP_END(_N_ColorMatrix_unpack_u8_4)
305
306SNIP_START(_N_ColorMatrix_unpack_u8_3)
307    vmovl.u8 q12, d0  /* R */
308    vmovl.u8 q13, d1  /* G */
309    vmovl.u8 q14, d2  /* B */
310    veor q15, q15
311SNIP_END(_N_ColorMatrix_unpack_u8_3)
312
313SNIP_START(_N_ColorMatrix_unpack_u8_2)
314    vmovl.u8 q12, d0  /* R */
315    vmovl.u8 q13, d1  /* G */
316    veor q14, q14
317    veor q15, q15
318SNIP_END(_N_ColorMatrix_unpack_u8_2)
319
320SNIP_START(_N_ColorMatrix_unpack_u8_1)
321    vmovl.u8 q12, d0  /* R */
322    veor q13, q13
323    veor q14, q14
324    veor q15, q15
325SNIP_END(_N_ColorMatrix_unpack_u8_1)
326
327SNIP_START(_N_ColorMatrix_pack_u8_4)
328    vqrshrn.s32 d24, q8, #8
329    vqrshrn.s32 d26, q9, #8
330    vqrshrn.s32 d28, q10, #8
331    vqrshrn.s32 d30, q11, #8
332    vqmovun.s16 d0, q12
333    vqmovun.s16 d1, q13
334    vqmovun.s16 d2, q14
335    vqmovun.s16 d3, q15
336SNIP_END(_N_ColorMatrix_pack_u8_4)
337
338SNIP_START(_N_ColorMatrix_pack_u8_3)
339    vqrshrn.s32 d24, q8, #8
340    vqrshrn.s32 d26, q9, #8
341    vqrshrn.s32 d28, q10, #8
342    vqmovun.s16 d0, q12
343    vqmovun.s16 d1, q13
344    vqmovun.s16 d2, q14
345SNIP_END(_N_ColorMatrix_pack_u8_3)
346
347SNIP_START(_N_ColorMatrix_pack_u8_2)
348    vqrshrn.s32 d24, q8, #8
349    vqrshrn.s32 d26, q9, #8
350    vqmovun.s16 d0, q12
351    vqmovun.s16 d1, q13
352SNIP_END(_N_ColorMatrix_pack_u8_2)
353
354SNIP_START(_N_ColorMatrix_pack_u8_1)
355    vqrshrn.s32 d24, q8, #8
356    vqmovun.s16 d0, q12
357SNIP_END(_N_ColorMatrix_pack_u8_1)
358
359SNIP_START(_N_ColorMatrix_dot)
360    vmov.u8 d1, d0
361    vmov.u8 d2, d0
362SNIP_END(_N_ColorMatrix_dot)
363
364