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