Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
52867 views
1
/*****************************************************************************
2
* deblock.S: arm deblocking
3
*****************************************************************************
4
* Copyright (C) 2009-2016 x264 project
5
*
6
* Authors: Mans Rullgard <[email protected]>
7
* Martin Storsjo <[email protected]>
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 [email protected].
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
794
795