arm: Implement a NEON version of 422 h264_h_loop_filter_chroma
[libav.git] / libavcodec / arm / h264dsp_neon.S
CommitLineData
1cce897a
MR
1/*
2 * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
3 *
2912e87a 4 * This file is part of Libav.
1cce897a 5 *
2912e87a 6 * Libav is free software; you can redistribute it and/or
1cce897a
MR
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 *
2912e87a 11 * Libav is distributed in the hope that it will be useful,
1cce897a
MR
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
2912e87a 17 * License along with Libav; if not, write to the Free Software
1cce897a
MR
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
94d2b0d2 21#include "libavutil/arm/asm.S"
a760f530 22#include "neon.S"
5813e05d 23
ad74a0f8
MR
24 /* H.264 loop filter */
25
59807fee
MR
26.macro h264_loop_filter_start
27 ldr r12, [sp]
ad74a0f8 28 tst r2, r2
59807fee 29 ldr r12, [r12]
8986fddc 30 it ne
ad74a0f8 31 tstne r3, r3
59807fee
MR
32 vmov.32 d24[0], r12
33 and r12, r12, r12, lsl #16
8986fddc 34 it eq
ad74a0f8 35 bxeq lr
59807fee 36 ands r12, r12, r12, lsl #8
8986fddc 37 it lt
ad74a0f8 38 bxlt lr
59807fee 39.endm
ad74a0f8 40
59807fee 41.macro h264_loop_filter_luma
ad74a0f8
MR
42 vdup.8 q11, r2 @ alpha
43 vmovl.u8 q12, d24
44 vabd.u8 q6, q8, q0 @ abs(p0 - q0)
45 vmovl.u16 q12, d24
46 vabd.u8 q14, q9, q8 @ abs(p1 - p0)
47 vsli.16 q12, q12, #8
48 vabd.u8 q15, q1, q0 @ abs(q1 - q0)
49 vsli.32 q12, q12, #16
50 vclt.u8 q6, q6, q11 @ < alpha
51 vdup.8 q11, r3 @ beta
52 vclt.s8 q7, q12, #0
53 vclt.u8 q14, q14, q11 @ < beta
54 vclt.u8 q15, q15, q11 @ < beta
55 vbic q6, q6, q7
56 vabd.u8 q4, q10, q8 @ abs(p2 - p0)
57 vand q6, q6, q14
58 vabd.u8 q5, q2, q0 @ abs(q2 - q0)
59 vclt.u8 q4, q4, q11 @ < beta
60 vand q6, q6, q15
61 vclt.u8 q5, q5, q11 @ < beta
62 vand q4, q4, q6
63 vand q5, q5, q6
64 vand q12, q12, q6
65 vrhadd.u8 q14, q8, q0
66 vsub.i8 q6, q12, q4
67 vqadd.u8 q7, q9, q12
68 vhadd.u8 q10, q10, q14
69 vsub.i8 q6, q6, q5
70 vhadd.u8 q14, q2, q14
71 vmin.u8 q7, q7, q10
72 vqsub.u8 q11, q9, q12
73 vqadd.u8 q2, q1, q12
74 vmax.u8 q7, q7, q11
75 vqsub.u8 q11, q1, q12
76 vmin.u8 q14, q2, q14
77 vmovl.u8 q2, d0
78 vmax.u8 q14, q14, q11
79 vmovl.u8 q10, d1
80 vsubw.u8 q2, q2, d16
81 vsubw.u8 q10, q10, d17
82 vshl.i16 q2, q2, #2
83 vshl.i16 q10, q10, #2
84 vaddw.u8 q2, q2, d18
85 vaddw.u8 q10, q10, d19
86 vsubw.u8 q2, q2, d2
87 vsubw.u8 q10, q10, d3
88 vrshrn.i16 d4, q2, #3
89 vrshrn.i16 d5, q10, #3
90 vbsl q4, q7, q9
91 vbsl q5, q14, q1
92 vneg.s8 q7, q6
93 vmovl.u8 q14, d16
94 vmin.s8 q2, q2, q6
95 vmovl.u8 q6, d17
96 vmax.s8 q2, q2, q7
97 vmovl.u8 q11, d0
98 vmovl.u8 q12, d1
99 vaddw.s8 q14, q14, d4
100 vaddw.s8 q6, q6, d5
101 vsubw.s8 q11, q11, d4
102 vsubw.s8 q12, q12, d5
103 vqmovun.s16 d16, q14
104 vqmovun.s16 d17, q6
105 vqmovun.s16 d0, q11
106 vqmovun.s16 d1, q12
59807fee 107.endm
ad74a0f8
MR
108
109function ff_h264_v_loop_filter_luma_neon, export=1
110 h264_loop_filter_start
111
59807fee
MR
112 vld1.8 {d0, d1}, [r0,:128], r1
113 vld1.8 {d2, d3}, [r0,:128], r1
114 vld1.8 {d4, d5}, [r0,:128], r1
ad74a0f8
MR
115 sub r0, r0, r1, lsl #2
116 sub r0, r0, r1, lsl #1
59807fee
MR
117 vld1.8 {d20,d21}, [r0,:128], r1
118 vld1.8 {d18,d19}, [r0,:128], r1
119 vld1.8 {d16,d17}, [r0,:128], r1
ad74a0f8 120
8986fddc 121 vpush {d8-d15}
ad74a0f8
MR
122
123 h264_loop_filter_luma
124
125 sub r0, r0, r1, lsl #1
59807fee
MR
126 vst1.8 {d8, d9}, [r0,:128], r1
127 vst1.8 {d16,d17}, [r0,:128], r1
128 vst1.8 {d0, d1}, [r0,:128], r1
129 vst1.8 {d10,d11}, [r0,:128]
ad74a0f8 130
8986fddc 131 vpop {d8-d15}
ad74a0f8 132 bx lr
a7e7d40c 133endfunc
ad74a0f8
MR
134
135function ff_h264_h_loop_filter_luma_neon, export=1
136 h264_loop_filter_start
137
138 sub r0, r0, #4
59807fee
MR
139 vld1.8 {d6}, [r0], r1
140 vld1.8 {d20}, [r0], r1
141 vld1.8 {d18}, [r0], r1
142 vld1.8 {d16}, [r0], r1
143 vld1.8 {d0}, [r0], r1
144 vld1.8 {d2}, [r0], r1
145 vld1.8 {d4}, [r0], r1
146 vld1.8 {d26}, [r0], r1
147 vld1.8 {d7}, [r0], r1
148 vld1.8 {d21}, [r0], r1
149 vld1.8 {d19}, [r0], r1
150 vld1.8 {d17}, [r0], r1
151 vld1.8 {d1}, [r0], r1
152 vld1.8 {d3}, [r0], r1
153 vld1.8 {d5}, [r0], r1
154 vld1.8 {d27}, [r0], r1
ad74a0f8 155
5813e05d 156 transpose_8x8 q3, q10, q9, q8, q0, q1, q2, q13
ad74a0f8 157
8986fddc 158 vpush {d8-d15}
ad74a0f8
MR
159
160 h264_loop_filter_luma
161
2da4e5e3 162 transpose_4x4 q4, q8, q0, q5
ad74a0f8
MR
163
164 sub r0, r0, r1, lsl #4
2da4e5e3
MR
165 add r0, r0, #2
166 vst1.32 {d8[0]}, [r0], r1
167 vst1.32 {d16[0]}, [r0], r1
168 vst1.32 {d0[0]}, [r0], r1
169 vst1.32 {d10[0]}, [r0], r1
170 vst1.32 {d8[1]}, [r0], r1
171 vst1.32 {d16[1]}, [r0], r1
172 vst1.32 {d0[1]}, [r0], r1
173 vst1.32 {d10[1]}, [r0], r1
174 vst1.32 {d9[0]}, [r0], r1
175 vst1.32 {d17[0]}, [r0], r1
176 vst1.32 {d1[0]}, [r0], r1
177 vst1.32 {d11[0]}, [r0], r1
178 vst1.32 {d9[1]}, [r0], r1
179 vst1.32 {d17[1]}, [r0], r1
180 vst1.32 {d1[1]}, [r0], r1
181 vst1.32 {d11[1]}, [r0], r1
ad74a0f8 182
8986fddc 183 vpop {d8-d15}
ad74a0f8 184 bx lr
a7e7d40c 185endfunc
ad74a0f8 186
59807fee 187.macro h264_loop_filter_chroma
ad74a0f8
MR
188 vdup.8 d22, r2 @ alpha
189 vmovl.u8 q12, d24
190 vabd.u8 d26, d16, d0 @ abs(p0 - q0)
191 vmovl.u8 q2, d0
192 vabd.u8 d28, d18, d16 @ abs(p1 - p0)
193 vsubw.u8 q2, q2, d16
194 vsli.16 d24, d24, #8
195 vshl.i16 q2, q2, #2
196 vabd.u8 d30, d2, d0 @ abs(q1 - q0)
197 vaddw.u8 q2, q2, d18
198 vclt.u8 d26, d26, d22 @ < alpha
199 vsubw.u8 q2, q2, d2
200 vdup.8 d22, r3 @ beta
ad74a0f8
MR
201 vrshrn.i16 d4, q2, #3
202 vclt.u8 d28, d28, d22 @ < beta
ad74a0f8 203 vclt.u8 d30, d30, d22 @ < beta
ad74a0f8 204 vmin.s8 d4, d4, d24
75148437
MR
205 vneg.s8 d25, d24
206 vand d26, d26, d28
ad74a0f8 207 vmax.s8 d4, d4, d25
75148437 208 vand d26, d26, d30
ad74a0f8 209 vmovl.u8 q11, d0
75148437
MR
210 vand d4, d4, d26
211 vmovl.u8 q14, d16
ad74a0f8
MR
212 vaddw.s8 q14, q14, d4
213 vsubw.s8 q11, q11, d4
214 vqmovun.s16 d16, q14
215 vqmovun.s16 d0, q11
59807fee 216.endm
ad74a0f8
MR
217
218function ff_h264_v_loop_filter_chroma_neon, export=1
219 h264_loop_filter_start
220
221 sub r0, r0, r1, lsl #1
59807fee
MR
222 vld1.8 {d18}, [r0,:64], r1
223 vld1.8 {d16}, [r0,:64], r1
224 vld1.8 {d0}, [r0,:64], r1
225 vld1.8 {d2}, [r0,:64]
ad74a0f8
MR
226
227 h264_loop_filter_chroma
228
229 sub r0, r0, r1, lsl #1
59807fee
MR
230 vst1.8 {d16}, [r0,:64], r1
231 vst1.8 {d0}, [r0,:64], r1
ad74a0f8
MR
232
233 bx lr
a7e7d40c 234endfunc
ad74a0f8
MR
235
236function ff_h264_h_loop_filter_chroma_neon, export=1
237 h264_loop_filter_start
238
239 sub r0, r0, #2
0676de93 240h_loop_filter_chroma420:
ad74a0f8
MR
241 vld1.32 {d18[0]}, [r0], r1
242 vld1.32 {d16[0]}, [r0], r1
243 vld1.32 {d0[0]}, [r0], r1
244 vld1.32 {d2[0]}, [r0], r1
245 vld1.32 {d18[1]}, [r0], r1
246 vld1.32 {d16[1]}, [r0], r1
247 vld1.32 {d0[1]}, [r0], r1
248 vld1.32 {d2[1]}, [r0], r1
249
250 vtrn.16 d18, d0
251 vtrn.16 d16, d2
252 vtrn.8 d18, d16
253 vtrn.8 d0, d2
254
255 h264_loop_filter_chroma
256
257 vtrn.16 d18, d0
258 vtrn.16 d16, d2
259 vtrn.8 d18, d16
260 vtrn.8 d0, d2
261
262 sub r0, r0, r1, lsl #3
263 vst1.32 {d18[0]}, [r0], r1
264 vst1.32 {d16[0]}, [r0], r1
265 vst1.32 {d0[0]}, [r0], r1
266 vst1.32 {d2[0]}, [r0], r1
267 vst1.32 {d18[1]}, [r0], r1
268 vst1.32 {d16[1]}, [r0], r1
269 vst1.32 {d0[1]}, [r0], r1
270 vst1.32 {d2[1]}, [r0], r1
271
272 bx lr
a7e7d40c 273endfunc
5813e05d 274
0676de93
MS
275function ff_h264_h_loop_filter_chroma422_neon, export=1
276 h264_loop_filter_start
277 push {r4, lr}
278 add r4, r0, r1
279 add r1, r1, r1
280 sub r0, r0, #2
281
282 bl h_loop_filter_chroma420
283
284 ldr r12, [sp, #8]
285 ldr r12, [r12]
286 vmov.32 d24[0], r12
287 sub r0, r4, #2
288
289 bl h_loop_filter_chroma420
290 pop {r4, pc}
291endfunc
292
5a29589b
MR
293@ Biweighted prediction
294
59807fee 295.macro biweight_16 macs, macd
5a29589b
MR
296 vdup.8 d0, r4
297 vdup.8 d1, r5
298 vmov q2, q8
299 vmov q3, q8
c2d33742 3001: subs r3, r3, #2
5a29589b
MR
301 vld1.8 {d20-d21},[r0,:128], r2
302 \macd q2, d0, d20
303 pld [r0]
304 \macd q3, d0, d21
305 vld1.8 {d22-d23},[r1,:128], r2
306 \macs q2, d1, d22
307 pld [r1]
308 \macs q3, d1, d23
309 vmov q12, q8
310 vld1.8 {d28-d29},[r0,:128], r2
311 vmov q13, q8
312 \macd q12, d0, d28
313 pld [r0]
314 \macd q13, d0, d29
315 vld1.8 {d30-d31},[r1,:128], r2
316 \macs q12, d1, d30
317 pld [r1]
318 \macs q13, d1, d31
319 vshl.s16 q2, q2, q9
320 vshl.s16 q3, q3, q9
321 vqmovun.s16 d4, q2
322 vqmovun.s16 d5, q3
323 vshl.s16 q12, q12, q9
324 vshl.s16 q13, q13, q9
325 vqmovun.s16 d24, q12
326 vqmovun.s16 d25, q13
327 vmov q3, q8
328 vst1.8 {d4- d5}, [r6,:128], r2
329 vmov q2, q8
330 vst1.8 {d24-d25},[r6,:128], r2
331 bne 1b
332 pop {r4-r6, pc}
59807fee 333.endm
5a29589b 334
59807fee 335.macro biweight_8 macs, macd
5a29589b
MR
336 vdup.8 d0, r4
337 vdup.8 d1, r5
338 vmov q1, q8
339 vmov q10, q8
c2d33742 3401: subs r3, r3, #2
5a29589b
MR
341 vld1.8 {d4},[r0,:64], r2
342 \macd q1, d0, d4
343 pld [r0]
344 vld1.8 {d5},[r1,:64], r2
345 \macs q1, d1, d5
346 pld [r1]
347 vld1.8 {d6},[r0,:64], r2
348 \macd q10, d0, d6
349 pld [r0]
350 vld1.8 {d7},[r1,:64], r2
351 \macs q10, d1, d7
352 pld [r1]
353 vshl.s16 q1, q1, q9
354 vqmovun.s16 d2, q1
355 vshl.s16 q10, q10, q9
356 vqmovun.s16 d4, q10
357 vmov q10, q8
358 vst1.8 {d2},[r6,:64], r2
359 vmov q1, q8
360 vst1.8 {d4},[r6,:64], r2
361 bne 1b
362 pop {r4-r6, pc}
59807fee 363.endm
5a29589b 364
59807fee 365.macro biweight_4 macs, macd
5a29589b
MR
366 vdup.8 d0, r4
367 vdup.8 d1, r5
368 vmov q1, q8
369 vmov q10, q8
c2d33742 3701: subs r3, r3, #4
5a29589b
MR
371 vld1.32 {d4[0]},[r0,:32], r2
372 vld1.32 {d4[1]},[r0,:32], r2
373 \macd q1, d0, d4
374 pld [r0]
375 vld1.32 {d5[0]},[r1,:32], r2
376 vld1.32 {d5[1]},[r1,:32], r2
377 \macs q1, d1, d5
378 pld [r1]
379 blt 2f
380 vld1.32 {d6[0]},[r0,:32], r2
381 vld1.32 {d6[1]},[r0,:32], r2
382 \macd q10, d0, d6
383 pld [r0]
384 vld1.32 {d7[0]},[r1,:32], r2
385 vld1.32 {d7[1]},[r1,:32], r2
386 \macs q10, d1, d7
387 pld [r1]
388 vshl.s16 q1, q1, q9
389 vqmovun.s16 d2, q1
390 vshl.s16 q10, q10, q9
391 vqmovun.s16 d4, q10
392 vmov q10, q8
393 vst1.32 {d2[0]},[r6,:32], r2
394 vst1.32 {d2[1]},[r6,:32], r2
395 vmov q1, q8
396 vst1.32 {d4[0]},[r6,:32], r2
397 vst1.32 {d4[1]},[r6,:32], r2
398 bne 1b
399 pop {r4-r6, pc}
4002: vshl.s16 q1, q1, q9
401 vqmovun.s16 d2, q1
402 vst1.32 {d2[0]},[r6,:32], r2
403 vst1.32 {d2[1]},[r6,:32], r2
404 pop {r4-r6, pc}
59807fee 405.endm
5a29589b 406
59807fee 407.macro biweight_func w
c2d33742 408function ff_biweight_h264_pixels_\w\()_neon, export=1
5a29589b 409 push {r4-r6, lr}
c2d33742
RB
410 ldr r12, [sp, #16]
411 add r4, sp, #20
5a29589b
MR
412 ldm r4, {r4-r6}
413 lsr lr, r4, #31
414 add r6, r6, #1
415 eors lr, lr, r5, lsr #30
416 orr r6, r6, #1
c2d33742
RB
417 vdup.16 q9, r12
418 lsl r6, r6, r12
5a29589b
MR
419 vmvn q9, q9
420 vdup.16 q8, r6
421 mov r6, r0
422 beq 10f
423 subs lr, lr, #1
424 beq 20f
425 subs lr, lr, #1
426 beq 30f
427 b 40f
42810: biweight_\w vmlal.u8, vmlal.u8
42920: rsb r4, r4, #0
430 biweight_\w vmlal.u8, vmlsl.u8
43130: rsb r4, r4, #0
432 rsb r5, r5, #0
433 biweight_\w vmlsl.u8, vmlsl.u8
43440: rsb r5, r5, #0
435 biweight_\w vmlsl.u8, vmlal.u8
a7e7d40c 436endfunc
59807fee 437.endm
5a29589b 438
5a29589b 439 biweight_func 16
5a29589b 440 biweight_func 8
5a29589b 441 biweight_func 4
bd53b426
MR
442
443@ Weighted prediction
444
59807fee 445.macro weight_16 add
c2d33742
RB
446 vdup.8 d0, r12
4471: subs r2, r2, #2
bd53b426 448 vld1.8 {d20-d21},[r0,:128], r1
fe7f149e 449 vmull.u8 q2, d0, d20
bd53b426 450 pld [r0]
fe7f149e 451 vmull.u8 q3, d0, d21
bd53b426 452 vld1.8 {d28-d29},[r0,:128], r1
fe7f149e 453 vmull.u8 q12, d0, d28
bd53b426 454 pld [r0]
fe7f149e
MR
455 vmull.u8 q13, d0, d29
456 \add q2, q8, q2
457 vrshl.s16 q2, q2, q9
458 \add q3, q8, q3
459 vrshl.s16 q3, q3, q9
bd53b426
MR
460 vqmovun.s16 d4, q2
461 vqmovun.s16 d5, q3
fe7f149e
MR
462 \add q12, q8, q12
463 vrshl.s16 q12, q12, q9
464 \add q13, q8, q13
465 vrshl.s16 q13, q13, q9
bd53b426
MR
466 vqmovun.s16 d24, q12
467 vqmovun.s16 d25, q13
bd53b426 468 vst1.8 {d4- d5}, [r4,:128], r1
bd53b426
MR
469 vst1.8 {d24-d25},[r4,:128], r1
470 bne 1b
471 pop {r4, pc}
59807fee 472.endm
bd53b426 473
59807fee 474.macro weight_8 add
c2d33742
RB
475 vdup.8 d0, r12
4761: subs r2, r2, #2
bd53b426 477 vld1.8 {d4},[r0,:64], r1
fe7f149e 478 vmull.u8 q1, d0, d4
bd53b426
MR
479 pld [r0]
480 vld1.8 {d6},[r0,:64], r1
fe7f149e
MR
481 vmull.u8 q10, d0, d6
482 \add q1, q8, q1
bd53b426 483 pld [r0]
fe7f149e 484 vrshl.s16 q1, q1, q9
bd53b426 485 vqmovun.s16 d2, q1
fe7f149e
MR
486 \add q10, q8, q10
487 vrshl.s16 q10, q10, q9
bd53b426 488 vqmovun.s16 d4, q10
bd53b426 489 vst1.8 {d2},[r4,:64], r1
bd53b426
MR
490 vst1.8 {d4},[r4,:64], r1
491 bne 1b
492 pop {r4, pc}
59807fee 493.endm
bd53b426 494
59807fee 495.macro weight_4 add
c2d33742 496 vdup.8 d0, r12
bd53b426
MR
497 vmov q1, q8
498 vmov q10, q8
c2d33742 4991: subs r2, r2, #4
bd53b426
MR
500 vld1.32 {d4[0]},[r0,:32], r1
501 vld1.32 {d4[1]},[r0,:32], r1
fe7f149e 502 vmull.u8 q1, d0, d4
bd53b426
MR
503 pld [r0]
504 blt 2f
505 vld1.32 {d6[0]},[r0,:32], r1
506 vld1.32 {d6[1]},[r0,:32], r1
fe7f149e 507 vmull.u8 q10, d0, d6
bd53b426 508 pld [r0]
fe7f149e
MR
509 \add q1, q8, q1
510 vrshl.s16 q1, q1, q9
bd53b426 511 vqmovun.s16 d2, q1
fe7f149e
MR
512 \add q10, q8, q10
513 vrshl.s16 q10, q10, q9
bd53b426
MR
514 vqmovun.s16 d4, q10
515 vmov q10, q8
516 vst1.32 {d2[0]},[r4,:32], r1
517 vst1.32 {d2[1]},[r4,:32], r1
518 vmov q1, q8
519 vst1.32 {d4[0]},[r4,:32], r1
520 vst1.32 {d4[1]},[r4,:32], r1
521 bne 1b
522 pop {r4, pc}
fe7f149e
MR
5232: \add q1, q8, q1
524 vrshl.s16 q1, q1, q9
bd53b426
MR
525 vqmovun.s16 d2, q1
526 vst1.32 {d2[0]},[r4,:32], r1
527 vst1.32 {d2[1]},[r4,:32], r1
528 pop {r4, pc}
59807fee 529.endm
bd53b426 530
59807fee 531.macro weight_func w
c2d33742 532function ff_weight_h264_pixels_\w\()_neon, export=1
bd53b426 533 push {r4, lr}
c2d33742
RB
534 ldr r12, [sp, #8]
535 ldr r4, [sp, #12]
536 cmp r3, #1
537 lsl r4, r4, r3
bd53b426
MR
538 vdup.16 q8, r4
539 mov r4, r0
fe7f149e 540 ble 20f
c2d33742 541 rsb lr, r3, #1
fe7f149e 542 vdup.16 q9, lr
c2d33742 543 cmp r12, #0
fe7f149e
MR
544 blt 10f
545 weight_\w vhadd.s16
c2d33742 54610: rsb r12, r12, #0
fe7f149e 547 weight_\w vhsub.s16
c2d33742 54820: rsb lr, r3, #0
fe7f149e 549 vdup.16 q9, lr
c2d33742 550 cmp r12, #0
bd53b426 551 blt 10f
fe7f149e 552 weight_\w vadd.s16
c2d33742 55310: rsb r12, r12, #0
fe7f149e 554 weight_\w vsub.s16
a7e7d40c 555endfunc
59807fee 556.endm
bd53b426 557
bd53b426 558 weight_func 16
bd53b426 559 weight_func 8
bd53b426 560 weight_func 4