arm: hevcdsp: Avoid using macro expansion counters
[ffmpeg.git] / libavcodec / arm / hevcdsp_deblock_neon.S
1 /*
2  * Copyright (c) 2014 Seppo Tomperi <seppo.tomperi@vtt.fi>
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20
21
22 #include "libavutil/arm/asm.S"
23 #include "neon.S"
24
25 .macro hevc_loop_filter_chroma_start
26         ldr      r12, [r2]
27         ldr      r3, [r2, #4]
28         add      r2, r3, r12
29         cmp      r2, #0
30         it       eq
31         bxeq     lr
32 .endm
33
34 .macro hevc_loop_filter_chroma_body
35         vsubl.u8  q3, d4, d2
36         vsubl.u8  q11, d18, d19
37         vshl.i16  q3, #2
38         vadd.i16  q11, q3
39         vdup.16   d0, r12
40         vdup.16   d1, r3
41         vrshr.s16 q11, q11, #3
42         vneg.s16  q12, q0
43         vmovl.u8  q2, d4
44         vmin.s16  q11, q11, q0
45         vmax.s16  q11, q11, q12
46         vaddw.u8  q1, q11, d2
47         vsub.i16  q2, q11
48         vqmovun.s16 d2, q1
49         vqmovun.s16 d4, q2
50 .endm
51
52 .macro hevc_loop_filter_luma_start
53         ldr     r12, [r3]
54         ldr      r3, [r3, #4]
55         lsl      r3, #16
56         orr      r3, r12
57         cmp      r3, #0
58         it       eq
59         bxeq     lr
60         lsr      r3, #16
61 .endm
62
63 .macro hevc_loop_filter_luma_body
64         vmovl.u8  q8, d16
65         vmovl.u8  q9, d18
66         vmovl.u8  q10, d20
67         vmovl.u8  q11, d22
68         vmovl.u8  q12, d24
69         vmovl.u8  q13, d26
70         vmovl.u8  q14, d28
71         vmovl.u8  q15, d30
72
73         vadd.i16   q7, q9, q11
74         vadd.i16   q6, q14, q12
75         vsub.i16   q7, q10
76         vsub.i16   q6, q13
77         vabd.s16   q7, q7, q10
78         vabd.s16   q6, q6, q13
79
80
81         vdup.16    q0, r2
82         vmov       q4, q7
83         vmov       q5, q6
84         vdup.16    d4, r12
85         vtrn.16    q7, q4
86         vtrn.16    q6, q5
87
88         vshl.u64   q7, #32
89         vshr.u64   q4, #32
90         vshl.u64   q6, #32
91         vshr.u64   q5, #32
92         vshr.u64   q7, #32
93         vshr.u64   q6, #32
94         vshl.u64   q5, #32
95         vshl.u64   q4, #32
96         vorr       q6, q5
97         vorr       q7, q4
98         vdup.16    d5, r3
99         vadd.i16   q5, q7, q6
100
101         vmov       q4, q5
102         vmov       q3, q5
103         vtrn.32    q3, q4
104
105         vadd.i16   q4, q3
106
107         vshl.s16   q5, q5, #1
108         vcgt.s16   q3, q0, q4
109
110         vmovn.i16  d6, q3
111         vshr.s16   q1, q0, #2
112         vmovn.i16  d6, q3
113         vcgt.s16   q5, q1, q5
114         vmov       r7, s12
115         cmp        r7, #0
116         beq        bypasswrite
117
118         vpadd.i32  d0, d14, d12
119         vpadd.i32  d1, d15, d13
120         vmov       q4, q2
121         vshl.s16   q2, #2
122         vshr.s16   q1, q1, #1
123         vrhadd.s16 q2, q4
124
125         vabd.s16   q7, q8, q11
126         vaba.s16   q7, q15, q12
127
128         vmovn.i32  d0, q0
129         vmov       r5, r6, s0, s1
130         vcgt.s16   q6, q1, q7
131         vand       q5, q5, q6
132         vabd.s16   q7, q11, q12
133         vcgt.s16   q6, q2, q7
134         vand       q5, q5, q6
135
136         vmov       q2, q5
137         vtrn.s16   q5, q2
138         vshr.u64   q2, #32
139         vshl.u64   q5, #32
140         vshl.u64   q2, #32
141         vshr.u64   q5, #32
142         vorr       q5, q2
143
144         vmov       q2, q5
145         vshl.i16   q7, q4, #1
146         vtrn.32    q2, q5
147         vand       q5, q2
148         vneg.s16   q6, q7
149         vmovn.i16  d4, q5
150         vmovn.i16  d4, q2
151         vmov       r8, s8
152
153         and        r9, r8, r7
154         cmp        r9, #0
155         beq        1f
156
157         vadd.i16  q2, q11, q12
158         vadd.i16  q4, q9, q8
159         vadd.i16  q1, q2, q10
160         vdup.16   d10, r9
161         vadd.i16  q0, q1, q9
162         vshl.i16  q4, #1
163         lsr        r9, #16
164         vadd.i16  q1, q0
165         vrshr.s16 q3, q0, #2
166         vadd.i16  q1, q13
167         vadd.i16  q4, q0
168         vsub.i16  q3, q10
169         vrshr.s16 q1, #3
170         vrshr.s16 q4, #3
171         vmax.s16  q3, q6
172         vsub.i16  q1, q11
173         vsub.i16  q4, q9
174         vmin.s16  q3, q7
175         vmax.s16  q4, q6
176         vmax.s16  q1, q6
177         vadd.i16  q3, q10
178         vmin.s16  q4, q7
179         vmin.s16  q1, q7
180         vdup.16   d11, r9
181         vadd.i16  q4, q9
182         vadd.i16  q1, q11
183         vbit      q9, q4, q5
184         vadd.i16  q4, q2, q13
185         vbit      q11, q1, q5
186         vadd.i16  q0, q4, q14
187         vadd.i16  q2, q15, q14
188         vadd.i16  q4, q0
189
190         vshl.i16  q2, #1
191         vadd.i16  q4, q10
192         vbit      q10, q3, q5
193         vrshr.s16 q4, #3
194         vadd.i16  q2, q0
195         vrshr.s16 q3, q0, #2
196         vsub.i16  q4, q12
197         vrshr.s16 q2, #3
198         vsub.i16  q3, q13
199         vmax.s16  q4, q6
200         vsub.i16  q2, q14
201         vmax.s16  q3, q6
202         vmin.s16  q4, q7
203         vmax.s16  q2, q6
204         vmin.s16  q3, q7
205         vadd.i16  q4, q12
206         vmin.s16  q2, q7
207         vadd.i16  q3, q13
208         vbit      q12, q4, q5
209         vadd.i16  q2, q14
210         vbit      q13, q3, q5
211         vbit      q14, q2, q5
212
213 1:
214         mvn       r8, r8
215         and       r9, r8, r7
216         cmp       r9, #0
217         beq       2f
218
219         vdup.16    q4, r2
220
221         vdup.16   d10, r9
222         lsr       r9, #16
223         vmov       q1, q4
224         vdup.16   d11, r9
225         vshr.s16   q1, #1
226         vsub.i16  q2, q12, q11
227         vadd.i16   q4, q1
228         vshl.s16  q0, q2, #3
229         vshr.s16   q4, #3
230         vadd.i16  q2, q0
231         vsub.i16  q0, q13, q10
232         vsub.i16  q2, q0
233         vshl.i16  q0, q0, #1
234         vsub.i16  q2, q0
235         vshl.s16  q1, q7, 2
236         vrshr.s16 q2, q2, #4
237         vadd.i16  q1, q7
238         vabs.s16  q3, q2
239         vshr.s16  q6, q6, #1
240         vcgt.s16  q1, q1, q3
241         vand      q5, q1
242         vshr.s16  q7, q7, #1
243         vmax.s16  q2, q2, q6
244         vmin.s16  q2, q2, q7
245
246         vshr.s16  q7, q7, #1
247         vrhadd.s16 q3, q9, q11
248         vneg.s16  q6, q7
249         vsub.s16  q3, q10
250         vdup.16   d2, r5
251         vhadd.s16 q3, q2
252         vdup.16   d3, r6
253         vmax.s16  q3, q3, q6
254         vcgt.s16  q1, q4, q1
255         vmin.s16  q3, q3, q7
256         vand      q1, q5
257         vadd.i16  q3, q10
258         lsr       r5, #16
259         lsr       r6, #16
260         vbit      q10, q3, q1
261
262         vrhadd.s16 q3, q14, q12
263         vdup.16   d2, r5
264         vsub.s16  q3, q13
265         vdup.16   d3, r6
266         vhsub.s16 q3, q2
267         vcgt.s16  q1, q4, q1
268         vmax.s16  q3, q3, q6
269         vand      q1, q5
270         vmin.s16  q3, q3, q7
271         vadd.i16  q3, q13
272         vbit      q13, q3, q1
273         vadd.i16  q0, q11, q2
274         vsub.i16  q4, q12, q2
275         vbit      q11, q0, q5
276         vbit      q12, q4, q5
277
278 2:
279         vqmovun.s16 d16, q8
280         vqmovun.s16 d18, q9
281         vqmovun.s16 d20, q10
282         vqmovun.s16 d22, q11
283         vqmovun.s16 d24, q12
284         vqmovun.s16 d26, q13
285         vqmovun.s16 d28, q14
286         vqmovun.s16 d30, q15
287 .endm
288
289 function ff_hevc_v_loop_filter_luma_neon, export=1
290         hevc_loop_filter_luma_start
291         push     {r5-r11}
292         vpush    {d8-d15}
293         sub      r0, #4
294         vld1.8   {d16}, [r0], r1
295         vld1.8   {d18}, [r0], r1
296         vld1.8   {d20}, [r0], r1
297         vld1.8   {d22}, [r0], r1
298         vld1.8   {d24}, [r0], r1
299         vld1.8   {d26}, [r0], r1
300         vld1.8   {d28}, [r0], r1
301         vld1.8   {d30}, [r0], r1
302         sub      r0, r0, r1, lsl #3
303         transpose_8x8 d16, d18, d20, d22, d24, d26, d28, d30
304         hevc_loop_filter_luma_body
305         transpose_8x8 d16, d18, d20, d22, d24, d26, d28, d30
306         vst1.8   {d16}, [r0], r1
307         vst1.8   {d18}, [r0], r1
308         vst1.8   {d20}, [r0], r1
309         vst1.8   {d22}, [r0], r1
310         vst1.8   {d24}, [r0], r1
311         vst1.8   {d26}, [r0], r1
312         vst1.8   {d28}, [r0], r1
313         vst1.8   {d30}, [r0]
314         vpop     {d8-d15}
315         pop      {r5-r11}
316         bx lr
317 endfunc
318
319 function ff_hevc_h_loop_filter_luma_neon, export=1
320         hevc_loop_filter_luma_start
321         push     {r5-r11}
322         vpush    {d8-d15}
323         sub      r0, r0, r1, lsl #2
324         vld1.8  {d16}, [r0], r1
325         vld1.8  {d18}, [r0], r1
326         vld1.8  {d20}, [r0], r1
327         vld1.8  {d22}, [r0], r1
328         vld1.8  {d24}, [r0], r1
329         vld1.8  {d26}, [r0], r1
330         vld1.8  {d28}, [r0], r1
331         vld1.8  {d30}, [r0], r1
332         sub        r0, r0, r1, lsl #3
333         add        r0, r1
334         hevc_loop_filter_luma_body
335         vst1.8   {d18}, [r0], r1
336         vst1.8   {d20}, [r0], r1
337         vst1.8   {d22}, [r0], r1
338         vst1.8   {d24}, [r0], r1
339         vst1.8   {d26}, [r0], r1
340         vst1.8   {d28}, [r0]
341 bypasswrite:
342         vpop     {d8-d15}
343         pop      {r5-r11}
344         bx lr
345 endfunc
346
347 function ff_hevc_v_loop_filter_chroma_neon, export=1
348         hevc_loop_filter_chroma_start
349         sub      r0, #4
350         vld1.8   {d16}, [r0], r1
351         vld1.8   {d17}, [r0], r1
352         vld1.8   {d18}, [r0], r1
353         vld1.8   {d2},  [r0], r1
354         vld1.8   {d4},  [r0], r1
355         vld1.8   {d19}, [r0], r1
356         vld1.8   {d20}, [r0], r1
357         vld1.8   {d21}, [r0], r1
358         sub      r0, r0, r1, lsl #3
359         transpose_8x8 d16, d17, d18, d2, d4, d19, d20, d21
360         hevc_loop_filter_chroma_body
361         transpose_8x8 d16, d17, d18, d2, d4, d19, d20, d21
362         vst1.8   {d16}, [r0], r1
363         vst1.8   {d17}, [r0], r1
364         vst1.8   {d18}, [r0], r1
365         vst1.8   {d2},  [r0], r1
366         vst1.8   {d4},  [r0], r1
367         vst1.8   {d19}, [r0], r1
368         vst1.8   {d20}, [r0], r1
369         vst1.8   {d21}, [r0]
370         bx       lr
371 endfunc
372
373 function ff_hevc_h_loop_filter_chroma_neon, export=1
374         hevc_loop_filter_chroma_start
375         sub      r0, r0, r1, lsl #1
376         vld1.8   {d18}, [r0], r1
377         vld1.8   {d2}, [r0], r1
378         vld1.8   {d4}, [r0], r1
379         vld1.8   {d19}, [r0]
380         sub      r0, r0, r1, lsl #1
381         hevc_loop_filter_chroma_body
382         vst1.8   {d2}, [r0], r1
383         vst1.8   {d4}, [r0]
384         bx       lr
385 endfunc