]> git.sesse.net Git - x264/blob - common/arm/deblock-a.S
d7818282eb496c81b2d9c1ba784526ce8e71f845
[x264] / common / arm / deblock-a.S
1 /*****************************************************************************
2  * deblock.S: arm deblocking
3  *****************************************************************************
4  * Copyright (C) 2009-2016 x264 project
5  *
6  * Authors: Mans Rullgard <mans@mansr.com>
7  *          Martin Storsjo <martin@martin.st>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
22  *
23  * This program is also available under a commercial proprietary license.
24  * For more information, contact us at licensing@x264.com.
25  *****************************************************************************/
26
27 #include "asm.S"
28
29 .macro h264_loop_filter_start
30     ldr             ip,  [sp]
31     ldr             ip,  [ip]
32     vdup.32         d24, ip
33     and             ip,  ip,  ip, lsl #16
34     ands            ip,  ip,  ip, lsl #8
35     bxlt            lr
36 .endm
37
38 .macro align_push_regs
39     and             ip,  sp,  #15
40     add             ip,  ip,  #32
41     sub             sp,  sp,  ip
42     vst1.64         {d12-d15}, [sp,:128]
43     sub             sp,  sp,  #32
44     vst1.64         {d8-d11},  [sp,:128]
45 .endm
46
47 .macro align_pop_regs
48     vld1.64         {d8-d11},  [sp,:128]!
49     vld1.64         {d12-d15}, [sp,:128], ip
50 .endm
51
52 .macro h264_loop_filter_luma
53     vdup.8          q11, r2         @ alpha
54     vmovl.u8        q12, d24
55     vabd.u8         q6,  q8,  q0    @ abs(p0 - q0)
56     vmovl.u16       q12, d24
57     vabd.u8         q14, q9,  q8    @ abs(p1 - p0)
58     vsli.16         q12, q12, #8
59     vabd.u8         q15, q1,  q0    @ abs(q1 - q0)
60     vsli.32         q12, q12, #16
61     vclt.u8         q6,  q6,  q11   @ < alpha
62     vdup.8          q11, r3         @ beta
63     vclt.s8         q7,  q12, #0
64     vclt.u8         q14, q14, q11   @ < beta
65     vclt.u8         q15, q15, q11   @ < beta
66     vbic            q6,  q6,  q7
67     vabd.u8         q4,  q10, q8    @ abs(p2 - p0)
68     vand            q6,  q6,  q14
69     vabd.u8         q5,  q2,  q0    @ abs(q2 - q0)
70     vclt.u8         q4,  q4,  q11   @ < beta
71     vand            q6,  q6,  q15
72     vclt.u8         q5,  q5,  q11   @ < beta
73     vand            q4,  q4,  q6
74     vand            q5,  q5,  q6
75     vand            q12, q12, q6
76     vrhadd.u8       q14, q8,  q0
77     vsub.i8         q6,  q12, q4
78     vqadd.u8        q7,  q9,  q12
79     vhadd.u8        q10, q10, q14
80     vsub.i8         q6,  q6,  q5
81     vhadd.u8        q14, q2,  q14
82     vmin.u8         q7,  q7,  q10
83     vqsub.u8        q11, q9,  q12
84     vqadd.u8        q2,  q1,  q12
85     vmax.u8         q7,  q7,  q11
86     vqsub.u8        q11, q1,  q12
87     vmin.u8         q14, q2,  q14
88     vmovl.u8        q2,  d0
89     vmax.u8         q14, q14, q11
90     vmovl.u8        q10, d1
91     vsubw.u8        q2,  q2,  d16
92     vsubw.u8        q10, q10, d17
93     vshl.i16        q2,  q2,  #2
94     vshl.i16        q10, q10, #2
95     vaddw.u8        q2,  q2,  d18
96     vaddw.u8        q10, q10, d19
97     vsubw.u8        q2,  q2,  d2
98     vsubw.u8        q10, q10, d3
99     vrshrn.i16      d4,  q2,  #3
100     vrshrn.i16      d5,  q10, #3
101     vbsl            q4,  q7,  q9
102     vbsl            q5,  q14, q1
103     vneg.s8         q7,  q6
104     vmovl.u8        q14, d16
105     vmin.s8         q2,  q2,  q6
106     vmovl.u8        q6,  d17
107     vmax.s8         q2,  q2,  q7
108     vmovl.u8        q11, d0
109     vmovl.u8        q12, d1
110     vaddw.s8        q14, q14, d4
111     vaddw.s8        q6,  q6,  d5
112     vsubw.s8        q11, q11, d4
113     vsubw.s8        q12, q12, d5
114     vqmovun.s16     d16, q14
115     vqmovun.s16     d17, q6
116     vqmovun.s16     d0,  q11
117     vqmovun.s16     d1,  q12
118 .endm
119
120 function x264_deblock_v_luma_neon
121     h264_loop_filter_start
122
123     vld1.64         {d0, d1},  [r0,:128], r1
124     vld1.64         {d2, d3},  [r0,:128], r1
125     vld1.64         {d4, d5},  [r0,:128], r1
126     sub             r0,  r0,  r1, lsl #2
127     sub             r0,  r0,  r1, lsl #1
128     vld1.64         {d20,d21}, [r0,:128], r1
129     vld1.64         {d18,d19}, [r0,:128], r1
130     vld1.64         {d16,d17}, [r0,:128], r1
131
132     align_push_regs
133
134     h264_loop_filter_luma
135
136     sub             r0,  r0,  r1, lsl #1
137     vst1.64         {d8, d9},  [r0,:128], r1
138     vst1.64         {d16,d17}, [r0,:128], r1
139     vst1.64         {d0, d1},  [r0,:128], r1
140     vst1.64         {d10,d11}, [r0,:128]
141
142     align_pop_regs
143     bx              lr
144 endfunc
145
146 function x264_deblock_h_luma_neon
147     h264_loop_filter_start
148
149     sub             r0,  r0,  #4
150     vld1.64         {d6},  [r0], r1
151     vld1.64         {d20}, [r0], r1
152     vld1.64         {d18}, [r0], r1
153     vld1.64         {d16}, [r0], r1
154     vld1.64         {d0},  [r0], r1
155     vld1.64         {d2},  [r0], r1
156     vld1.64         {d4},  [r0], r1
157     vld1.64         {d26}, [r0], r1
158     vld1.64         {d7},  [r0], r1
159     vld1.64         {d21}, [r0], r1
160     vld1.64         {d19}, [r0], r1
161     vld1.64         {d17}, [r0], r1
162     vld1.64         {d1},  [r0], r1
163     vld1.64         {d3},  [r0], r1
164     vld1.64         {d5},  [r0], r1
165     vld1.64         {d27}, [r0], r1
166
167     TRANSPOSE8x8    q3, q10, q9, q8, q0, q1, q2, q13
168
169     align_push_regs
170
171     h264_loop_filter_luma
172
173     TRANSPOSE4x4    q4, q8, q0, q5
174
175     sub             r0,  r0,  r1, lsl #4
176     add             r0,  r0,  #2
177     vst1.32         {d8[0]},  [r0], r1
178     vst1.32         {d16[0]}, [r0], r1
179     vst1.32         {d0[0]},  [r0], r1
180     vst1.32         {d10[0]}, [r0], r1
181     vst1.32         {d8[1]},  [r0], r1
182     vst1.32         {d16[1]}, [r0], r1
183     vst1.32         {d0[1]},  [r0], r1
184     vst1.32         {d10[1]}, [r0], r1
185     vst1.32         {d9[0]},  [r0], r1
186     vst1.32         {d17[0]}, [r0], r1
187     vst1.32         {d1[0]},  [r0], r1
188     vst1.32         {d11[0]}, [r0], r1
189     vst1.32         {d9[1]},  [r0], r1
190     vst1.32         {d17[1]}, [r0], r1
191     vst1.32         {d1[1]},  [r0], r1
192     vst1.32         {d11[1]}, [r0], r1
193
194     align_pop_regs
195     bx              lr
196 endfunc
197
198 .macro h264_loop_filter_luma_intra
199     vdup.8          q14, r2         @ alpha
200     vabd.u8         q4,  q8,  q0    @ abs(p0 - q0)
201     vabd.u8         q5,  q9,  q8    @ abs(p1 - p0)
202     vabd.u8         q6,  q1,  q0    @ abs(q1 - q0)
203     vdup.8          q15, r3         @ beta
204     vmov.u8         q13, #2
205     vclt.u8         q7,  q4,  q14   @ < alpha
206     vshr.u8         q14, q14, #2    @ alpha >> 2
207     vclt.u8         q5,  q5,  q15   @ < beta
208     vadd.u8         q14, q14, q13   @ (alpha >> 2) + 2
209     vand            q7,  q7,  q5
210     vclt.u8         q6,  q6,  q15   @ < beta
211     vclt.u8         q13, q4,  q14   @ < (alpha >> 2) + 2 if_2
212     vand            q12, q7,  q6    @ if_1
213     vshrn.u16       d28, q12,  #4
214     vcmp.f64        d28, #0
215     vmrs            APSR_nzcv, FPSCR
216     beq             9f
217
218     sub             sp,  sp,  #32
219     vst1.8         {q12-q13}, [sp,:128]
220
221     vshll.u8        q4,  d18, #1    @ 2*p1
222     vshll.u8        q5,  d19, #1
223     vaddw.u8        q4,  q4,  d16   @ 2*p1 + p0
224     vaddw.u8        q5,  q5,  d17
225     vaddw.u8        q4,  q4,  d2    @ 2*p1 + p0 + q1
226     vaddw.u8        q5,  q5,  d3
227     vrshrn.u16      d24, q4,  #2
228     vrshrn.u16      d25, q5,  #2
229
230     vaddl.u8        q6,  d20, d16   @ p2 + p0
231     vaddl.u8        q7,  d21, d17
232     vaddw.u8        q6,  q6,  d0    @ p2 + p0 + q0
233     vaddw.u8        q7,  q7,  d1
234     vadd.u16        q4,  q4,  q6    @ p2 + 2*p1 + 2*p0 + q0 + q1
235     vadd.u16        q5,  q5,  q7
236     vaddw.u8        q4,  q4,  d0    @ p2 + 2*p1 + 2*p0 + 2*q0 + q1
237     vaddw.u8        q5,  q5,  d1
238     vrshrn.u16      d26, q4,  #3    @ p0'_2
239     vrshrn.u16      d27, q5,  #3
240     vaddw.u8        q6,  q6,  d18   @ p2 + p1 + p0 + q0
241     vaddw.u8        q7,  q7,  d19
242     vrshrn.u16      d28, q6,  #2    @ p1'_2
243     vrshrn.u16      d29, q7,  #2
244     vaddl.u8        q4,  d22, d20   @ p3 + p2
245     vaddl.u8        q5,  d23, d21
246     vshl.u16        q4,  q4,  #1    @ 2*p3 + 2*p2
247     vshl.u16        q5,  q5,  #1
248     vadd.u16        q4,  q4,  q6    @ 2*p3 + 3*p2 + p1 + p0 + q0
249     vadd.u16        q5,  q5,  q7
250     vrshrn.u16      d30, q4,  #3    @ p2'_2
251     vrshrn.u16      d31, q5,  #3
252
253     vdup.8          q4,  r3         @ beta
254     vabd.u8         q5,  q10, q8    @ abs(p2 - p0)
255     vld1.8         {q6-q7}, [sp,:128]   @ if_1, if_2
256     vclt.u8         q5,  q5,  q4    @ < beta if_3
257
258     vand            q7,  q7,  q5    @ if_2 && if_3
259     vmvn            q4,  q7
260     vand            q7,  q7,  q6    @ if_1 && if_2 && if_3
261     vand            q6,  q4,  q6    @ if_1 && !(if_2 && if_3)
262
263     @ copy p0 to q15 so it can be clobbered
264     vbit            q10, q15, q7
265     vmov            q15, q8
266     vbit            q8,  q12, q6
267
268     @ wait for q9 to clobber
269     vshll.u8        q4,  d2,  #1    @ 2*q1
270     vshll.u8        q5,  d3,  #1
271
272     vbit            q8,  q12, q6
273
274     vaddw.u8        q4,  q4,  d0    @ 2*q1 + q0
275     vaddw.u8        q5,  q5,  d1
276
277     vbit            q8,  q13, q7
278
279     vaddw.u8        q4,  q4,  d18   @ 2*q1 + q0 + p1
280     vaddw.u8        q5,  q5,  d19
281
282     vbit            q9,  q14, q7
283
284     vrshrn.u16      d24, q4,  #2
285     vrshrn.u16      d25, q5,  #2
286
287     vaddl.u8        q6,  d4,  d0    @ q2 + q0
288     vaddl.u8        q7,  d5,  d1
289     vaddw.u8        q6,  q6,  d30   @ q2 + q0 + p0
290     vaddw.u8        q7,  q7,  d31
291     vadd.u16        q4,  q4,  q6    @ q2 + 2*q1 + 2*q0 + p0 + p1
292     vadd.u16        q5,  q5,  q7
293     vaddw.u8        q4,  q4,  d30   @ q2 + 2*q1 + 2*q0 + 2*p0 + p1
294     vaddw.u8        q5,  q5,  d31
295     vrshrn.u16      d26, q4,  #3    @ q0'_2
296     vrshrn.u16      d27, q5,  #3
297     vaddw.u8        q6,  q6,  d2    @ q2 + q1 + q0 + p0
298     vaddw.u8        q7,  q7,  d3
299     vrshrn.u16      d28, q6,  #2    @ q1'_2
300     vrshrn.u16      d29, q7,  #2
301     vaddl.u8        q4,  d6,  d4    @ q3 + q2
302     vaddl.u8        q5,  d7,  d5
303     vshl.u16        q4,  q4,  #1    @ 2*q3 + 2*q2
304     vshl.u16        q5,  q5,  #1
305     vadd.u16        q4,  q4,  q6    @ 2*q3 + 3*q2 + q1 + q0 + p0
306     vadd.u16        q5,  q5,  q7
307     vrshrn.u16      d30, q4,  #3    @ q2'_2
308     vrshrn.u16      d31, q5,  #3
309
310     vdup.8          q4,  r3         @ beta
311     vabd.u8         q5,  q2,  q0    @ abs(q2 - q0)
312     vld1.8         {q6-q7}, [sp,:128]!   @ if_1, if_2
313     vclt.u8         q5,  q5,  q4    @ < beta if_4
314
315     vand            q7,  q7,  q5    @ if_2 && if_4
316     vmvn            q4,  q7
317     vand            q7,  q6,  q7    @ if_1 && if_2 && if_4
318     vand            q6,  q6,  q4    @ if_1 && !(if_2 && if_4)
319
320     vbit            q0,  q12, q6
321     vbit            q1,  q14, q7
322     vbit            q0,  q13, q7
323     vbit            q2,  q15, q7
324
325 .endm
326
327 function x264_deblock_v_luma_intra_neon
328     vld1.64         {d0, d1},  [r0,:128], r1
329     vld1.64         {d2, d3},  [r0,:128], r1
330     vld1.64         {d4, d5},  [r0,:128], r1
331     vld1.64         {d6, d7},  [r0,:128], r1
332     sub             r0,  r0,  r1, lsl #3
333     vld1.64         {d22,d23}, [r0,:128], r1
334     vld1.64         {d20,d21}, [r0,:128], r1
335     vld1.64         {d18,d19}, [r0,:128], r1
336     vld1.64         {d16,d17}, [r0,:128]
337
338     align_push_regs
339
340     h264_loop_filter_luma_intra
341
342     sub             r0,  r0,  r1, lsl #1
343     vst1.64         {d20,d21}, [r0,:128], r1
344     vst1.64         {d18,d19}, [r0,:128], r1
345     vst1.64         {d16,d17}, [r0,:128], r1
346     vst1.64         {d0, d1},  [r0,:128], r1
347     vst1.64         {d2, d3},  [r0,:128], r1
348     vst1.64         {d4, d5},  [r0,:128]
349 9:
350     align_pop_regs
351     bx              lr
352 endfunc
353
354 function x264_deblock_h_luma_intra_neon
355     sub             r0,  r0,  #4
356     vld1.64         {d22}, [r0], r1
357     vld1.64         {d20}, [r0], r1
358     vld1.64         {d18}, [r0], r1
359     vld1.64         {d16}, [r0], r1
360     vld1.64         {d0},  [r0], r1
361     vld1.64         {d2},  [r0], r1
362     vld1.64         {d4},  [r0], r1
363     vld1.64         {d6},  [r0], r1
364     vld1.64         {d23}, [r0], r1
365     vld1.64         {d21}, [r0], r1
366     vld1.64         {d19}, [r0], r1
367     vld1.64         {d17}, [r0], r1
368     vld1.64         {d1},  [r0], r1
369     vld1.64         {d3},  [r0], r1
370     vld1.64         {d5},  [r0], r1
371     vld1.64         {d7},  [r0], r1
372
373     TRANSPOSE8x8    q11, q10, q9, q8, q0, q1, q2, q3
374
375     align_push_regs
376
377     h264_loop_filter_luma_intra
378
379     TRANSPOSE8x8    q11, q10, q9, q8, q0, q1, q2, q3
380
381     sub             r0,  r0,  r1, lsl #4
382     vst1.64         {d22}, [r0], r1
383     vst1.64         {d20}, [r0], r1
384     vst1.64         {d18}, [r0], r1
385     vst1.64         {d16}, [r0], r1
386     vst1.64         {d0},  [r0], r1
387     vst1.64         {d2},  [r0], r1
388     vst1.64         {d4},  [r0], r1
389     vst1.64         {d6},  [r0], r1
390     vst1.64         {d23}, [r0], r1
391     vst1.64         {d21}, [r0], r1
392     vst1.64         {d19}, [r0], r1
393     vst1.64         {d17}, [r0], r1
394     vst1.64         {d1},  [r0], r1
395     vst1.64         {d3},  [r0], r1
396     vst1.64         {d5},  [r0], r1
397     vst1.64         {d7},  [r0], r1
398 9:
399     align_pop_regs
400     bx              lr
401 endfunc
402
403 .macro h264_loop_filter_chroma
404     vdup.8          q11, r2         // alpha
405     vmovl.u8        q12, d24
406     vabd.u8         q13, q8,  q0    // abs(p0 - q0)
407     vabd.u8         q14, q9,  q8    // abs(p1 - p0)
408     vsubl.u8        q2,  d0,  d16
409     vsubl.u8        q3,  d1,  d17
410     vsli.16         q12, q12, #8
411     vshl.i16        q2,  q2,  #2
412     vshl.i16        q3,  q3,  #2
413     vabd.u8         q15, q1,  q0    // abs(q1 - q0)
414     vmovl.u8        q12, d24
415     vaddw.u8        q2,  q2,  d18
416     vaddw.u8        q3,  q3,  d19
417     vclt.u8         q13, q13, q11   // < alpha
418     vsubw.u8        q2,  q2,  d2
419     vsubw.u8        q3,  q3,  d3
420     vsli.16         q12, q12, #8
421     vdup.8          q11, r3         // beta
422     vclt.s8         q10, q12, #0
423     vrshrn.i16      d4,  q2,  #3
424     vrshrn.i16      d5,  q3,  #3
425     vclt.u8         q14, q14, q11   // < beta
426     vbic            q13, q13, q10
427     vclt.u8         q15, q15, q11   // < beta
428     vand            q13, q13, q14
429     vneg.s8         q10, q12
430     vand            q13, q13, q15
431     vmin.s8         q2,  q2,  q12
432     vmovl.u8        q14, d16
433     vand            q2,  q2,  q13
434     vmovl.u8        q15, d17
435     vmax.s8         q2,  q2,  q10
436     vmovl.u8        q11, d0
437     vmovl.u8        q12, d1
438     vaddw.s8        q14, q14, d4
439     vaddw.s8        q15, q15, d5
440     vsubw.s8        q11, q11, d4
441     vsubw.s8        q12, q12, d5
442     vqmovun.s16     d16, q14
443     vqmovun.s16     d17, q15
444     vqmovun.s16     d0,  q11
445     vqmovun.s16     d1,  q12
446 .endm
447
448 function x264_deblock_v_chroma_neon
449     h264_loop_filter_start
450
451     sub             r0,  r0,  r1, lsl #1
452     vld1.8          {d18,d19}, [r0,:128], r1
453     vld1.8          {d16,d17}, [r0,:128], r1
454     vld1.8          {d0, d1},  [r0,:128], r1
455     vld1.8          {d2, d3},  [r0,:128]
456
457     h264_loop_filter_chroma
458
459     sub             r0,  r0,  r1, lsl #1
460     vst1.8          {d16,d17}, [r0,:128], r1
461     vst1.8          {d0, d1},  [r0,:128], r1
462
463     bx              lr
464 endfunc
465
466 function x264_deblock_h_chroma_neon
467     h264_loop_filter_start
468
469     sub             r0,  r0,  #4
470 deblock_h_chroma:
471     vld1.8          {d18}, [r0], r1
472     vld1.8          {d16}, [r0], r1
473     vld1.8          {d0},  [r0], r1
474     vld1.8          {d2},  [r0], r1
475     vld1.8          {d19}, [r0], r1
476     vld1.8          {d17}, [r0], r1
477     vld1.8          {d1},  [r0], r1
478     vld1.8          {d3},  [r0], r1
479
480     TRANSPOSE4x4_16 q9, q8, q0, q1
481
482     h264_loop_filter_chroma
483
484     vtrn.16         q8,  q0
485
486     sub             r0,  r0,  r1, lsl #3
487     add             r0,  r0,  #2
488     vst1.32         {d16[0]}, [r0], r1
489     vst1.32         {d0[0]},  [r0], r1
490     vst1.32         {d16[1]}, [r0], r1
491     vst1.32         {d0[1]},  [r0], r1
492     vst1.32         {d17[0]}, [r0], r1
493     vst1.32         {d1[0]},  [r0], r1
494     vst1.32         {d17[1]}, [r0], r1
495     vst1.32         {d1[1]},  [r0], r1
496
497     bx              lr
498 endfunc
499
500 function x264_deblock_h_chroma_422_neon
501     h264_loop_filter_start
502     push            {lr}
503     sub             r0,  r0,  #4
504     add             r1,  r1,  r1
505     bl              deblock_h_chroma
506     ldr             ip,  [sp, #4]
507     ldr             ip,  [ip]
508     vdup.32         d24, ip
509     sub             r0,  r0,  r1, lsl #3
510     add             r0,  r0,  r1, lsr #1
511     sub             r0,  r0,  #2
512     pop             {lr}
513     b               deblock_h_chroma
514 endfunc
515
516 .macro h264_loop_filter_chroma8
517     vdup.8          d22, r2         @ alpha
518     vmovl.u8        q12, d24
519     vabd.u8         d26, d16, d0    @ abs(p0 - q0)
520     vabd.u8         d28, d18, d16   @ abs(p1 - p0)
521     vsubl.u8        q2,  d0,  d16
522     vsli.16         d24, d24, #8
523     vshl.i16        q2,  q2,  #2
524     vabd.u8         d30, d2,  d0    @ abs(q1 - q0)
525     vaddw.u8        q2,  q2,  d18
526     vclt.u8         d26, d26, d22   @ < alpha
527     vsubw.u8        q2,  q2,  d2
528     vdup.8          d22, r3         @ beta
529     vclt.s8         d20, d24, #0
530     vrshrn.i16      d4,  q2,  #3
531     vclt.u8         d28, d28, d22   @ < beta
532     vbic            d26, d26, d20
533     vclt.u8         d30, d30, d22   @ < beta
534     vand            d26, d26, d28
535     vneg.s8         d20, d24
536     vand            d26, d26, d30
537     vmin.s8         d4,  d4,  d24
538     vmovl.u8        q14, d16
539     vand            d4,  d4,  d26
540     vmax.s8         d4,  d4,  d20
541     vmovl.u8        q11, d0
542     vaddw.s8        q14, q14, d4
543     vsubw.s8        q11, q11, d4
544     vqmovun.s16     d16, q14
545     vqmovun.s16     d0,  q11
546 .endm
547
548 function x264_deblock_h_chroma_mbaff_neon
549     h264_loop_filter_start
550
551     sub             r0,  r0,  #4
552     vld1.8          {d18}, [r0], r1
553     vld1.8          {d16}, [r0], r1
554     vld1.8          {d0},  [r0], r1
555     vld1.8          {d2},  [r0], r1
556
557     TRANSPOSE4x4_16 d18, d16, d0, d2
558
559     h264_loop_filter_chroma8
560
561     vtrn.16         d16, d0
562
563     sub             r0,  r0,  r1, lsl #2
564     add             r0,  r0,  #2
565     vst1.32         {d16[0]}, [r0], r1
566     vst1.32         {d0[0]},  [r0], r1
567     vst1.32         {d16[1]}, [r0], r1
568     vst1.32         {d0[1]},  [r0]
569
570     bx              lr
571 endfunc
572
573 .macro h264_loop_filter_chroma_intra, width=16
574     vdup.8          q11, r2         @ alpha
575     vabd.u8         q13, q8,  q0    @ abs(p0 - q0)
576     vabd.u8         q14, q9,  q8    @ abs(p1 - p0)
577     vabd.u8         q15, q1,  q0    @ abs(q1 - q0)
578     vclt.u8         q13, q13, q11   @ < alpha
579     vdup.8          q11, r3         @ beta
580     vclt.u8         q14, q14, q11   @ < beta
581     vclt.u8         q15, q15, q11   @ < beta
582     vand            q13, q13, q14
583     vand            q13, q13, q15
584
585     vshll.u8        q14, d18, #1
586     vshll.u8        q2,  d2,  #1
587 .ifc \width, 16
588     vshll.u8        q15, d19, #1
589     vshll.u8        q3,  d3,  #1
590     vaddl.u8        q12, d17, d3
591     vaddl.u8        q10, d1,  d19
592 .endif
593     vaddl.u8        q11, d16, d2
594     vaddl.u8        q1,  d18, d0    @ or vaddw q2, to not clobber q1
595     vadd.u16        q14, q14, q11
596     vadd.u16        q2,  q2,  q1
597 .ifc \width, 16
598     vadd.u16        q15, q15, q12
599     vadd.u16        q3,  q3,  q10
600 .endif
601     vqrshrn.u16     d28, q14, #2
602     vqrshrn.u16     d4,  q2, #2
603 .ifc \width, 16
604     vqrshrn.u16     d29, q15, #2
605     vqrshrn.u16     d5,  q3, #2
606 .endif
607     vbit            q8,  q14, q13
608     vbit            q0,  q2,  q13
609 .endm
610
611 function x264_deblock_v_chroma_intra_neon
612     sub             r0,  r0,  r1, lsl #1
613     vld2.8          {d18,d19}, [r0,:128], r1
614     vld2.8          {d16,d17}, [r0,:128], r1
615     vld2.8          {d0, d1},  [r0,:128], r1
616     vld2.8          {d2, d3},  [r0,:128]
617
618     h264_loop_filter_chroma_intra
619
620     sub             r0,  r0,  r1, lsl #1
621     vst2.8          {d16,d17}, [r0,:128], r1
622     vst2.8          {d0, d1},  [r0,:128], r1
623
624     bx              lr
625 endfunc
626
627 function x264_deblock_h_chroma_intra_neon
628     sub             r0,  r0,  #4
629     vld1.8          {d18}, [r0], r1
630     vld1.8          {d16}, [r0], r1
631     vld1.8          {d0},  [r0], r1
632     vld1.8          {d2},  [r0], r1
633     vld1.8          {d19}, [r0], r1
634     vld1.8          {d17}, [r0], r1
635     vld1.8          {d1},  [r0], r1
636     vld1.8          {d3},  [r0], r1
637
638     TRANSPOSE4x4_16 q9, q8, q0, q1
639
640     h264_loop_filter_chroma_intra
641
642     vtrn.16         q8,  q0
643
644     sub             r0,  r0,  r1, lsl #3
645     add             r0,  r0,  #2
646     vst1.32         {d16[0]}, [r0], r1
647     vst1.32         {d0[0]},  [r0], r1
648     vst1.32         {d16[1]}, [r0], r1
649     vst1.32         {d0[1]},  [r0], r1
650     vst1.32         {d17[0]}, [r0], r1
651     vst1.32         {d1[0]},  [r0], r1
652     vst1.32         {d17[1]}, [r0], r1
653     vst1.32         {d1[1]},  [r0], r1
654
655     bx              lr
656 endfunc
657
658 function x264_deblock_h_chroma_422_intra_neon
659     push            {lr}
660     bl              X(x264_deblock_h_chroma_intra_neon)
661     add             r0, r0,  #2
662     pop             {lr}
663     b               X(x264_deblock_h_chroma_intra_neon)
664 endfunc
665
666 function x264_deblock_h_chroma_intra_mbaff_neon
667     sub             r0,  r0,  #4
668     vld1.8          {d18}, [r0], r1
669     vld1.8          {d16}, [r0], r1
670     vld1.8          {d0},  [r0], r1
671     vld1.8          {d2},  [r0], r1
672
673     TRANSPOSE4x4_16 d18, d16, d0, d2
674
675     h264_loop_filter_chroma_intra width=8
676
677     vtrn.16         d16, d0
678
679     sub             r0,  r0,  r1, lsl #2
680     add             r0,  r0,  #2
681     vst1.32         {d16[0]}, [r0], r1
682     vst1.32         {d0[0]},  [r0], r1
683     vst1.32         {d16[1]}, [r0], r1
684     vst1.32         {d0[1]},  [r0]
685
686     bx              lr
687 endfunc
688
689 function x264_deblock_strength_neon
690     ldr             ip,  [sp]
691     vmov.i8         q8,  #0
692     lsl             ip,  ip,  #8
693     add             r3,  r3,  #32
694     sub             ip,  ip,  #(1<<8)-3
695     vmov.i8         q9,  #0
696     vdup.16         q10, ip
697     ldr             ip,  [sp, #4]
698
699 lists:
700     @ load bytes ref
701     vld1.8          {d31}, [r1]!
702     add             r2,  r2,  #16
703     vld1.8          {q1},  [r1]!
704     vmov.i8         q0,  #0
705     vld1.8          {q2},  [r1]!
706     vext.8          q3,  q0,  q1,  #15
707     vext.8          q0,  q0,  q2,  #15
708     vuzp.32         q1,  q2
709     vuzp.32         q3,  q0
710     vext.8          q1,  q15, q2,  #12
711
712     veor            q0,  q0,  q2
713     veor            q1,  q1,  q2
714     vorr            q8,  q8,  q0
715     vorr            q9,  q9,  q1
716
717     vld1.16         {q11}, [r2,:128]!   @ mv + 0x10
718     vld1.16         {q3},  [r2,:128]!   @ mv + 0x20
719     vld1.16         {q12}, [r2,:128]!   @ mv + 0x30
720     vld1.16         {q2},  [r2,:128]!   @ mv + 0x40
721     vld1.16         {q13}, [r2,:128]!   @ mv + 0x50
722     vext.8          q3,  q3,  q12, #12
723     vext.8          q2,  q2,  q13, #12
724     vabd.s16        q0,  q12, q3
725     vld1.16         {q3},  [r2,:128]!   @ mv + 0x60
726     vabd.s16        q1,  q13, q2
727     vld1.16         {q14}, [r2,:128]!   @ mv + 0x70
728     vqmovn.u16      d0,  q0
729     vld1.16         {q2},  [r2,:128]!   @ mv + 0x80
730     vld1.16         {q15}, [r2,:128]!   @ mv + 0x90
731     vqmovn.u16      d1,  q1
732     vext.8          q3,  q3,  q14, #12
733     vext.8          q2,  q2,  q15, #12
734     vabd.s16        q3,  q14, q3
735     vabd.s16        q2,  q15, q2
736     vqmovn.u16      d2,  q3
737     vqmovn.u16      d3,  q2
738
739     vqsub.u8        q0,  q0,  q10
740     vqsub.u8        q1,  q1,  q10
741     vqmovn.u16      d0,  q0
742     vqmovn.u16      d1,  q1
743
744     vabd.s16        q1,  q12, q13
745     vorr            q8,  q8,  q0
746
747     vabd.s16        q0,  q11, q12
748     vabd.s16        q2,  q13, q14
749     vabd.s16        q3,  q14, q15
750     vqmovn.u16      d0,  q0
751     vqmovn.u16      d1,  q1
752     vqmovn.u16      d2,  q2
753     vqmovn.u16      d3,  q3
754
755     vqsub.u8        q0,  q0,  q10
756     vqsub.u8        q1,  q1,  q10
757     vqmovn.u16      d0,  q0
758     vqmovn.u16      d1,  q1
759     subs            ip,  ip,  #1
760     vorr            q9,  q9,  q0
761     beq             lists
762
763     mov             ip,  #-32
764     @ load bytes nnz
765     vld1.8          {d31}, [r0]!
766     vld1.8          {q1},  [r0]!
767     vmov.i8         q0,  #0
768     vld1.8          {q2},  [r0]
769     vext.8          q3,  q0,  q1,  #15
770     vext.8          q0,  q0,  q2,  #15
771     vuzp.32         q1,  q2
772     vuzp.32         q3,  q0
773     vext.8          q1,  q15, q2,  #12
774
775     vorr            q0,  q0,  q2
776     vorr            q1,  q1,  q2
777     vmov.u8         q10, #1
778     vmin.u8         q0,  q0,  q10
779     vmin.u8         q1,  q1,  q10
780     vmin.u8         q8,  q8,  q10       @ mv ? 1 : 0
781     vmin.u8         q9,  q9,  q10
782     vadd.u8         q0,  q0,  q0        @ nnz ? 2 : 0
783     vadd.u8         q1,  q1,  q1
784     vmax.u8         q8,  q8,  q0
785     vmax.u8         q9,  q9,  q1
786     vzip.16         d16, d17
787     vst1.8          {q9}, [r3,:128], ip @ bs[1]
788     vtrn.8          d16, d17
789     vtrn.32         d16, d17
790
791     vst1.8          {q8}, [r3,:128]     @ bs[0]
792     bx              lr
793 endfunc