~ubuntu-branches/ubuntu/wily/libde265/wily

« back to all changes in this revision

Viewing changes to libde265/arm/hevcdsp_qpel_neon.S

  • Committer: Package Import Robot
  • Author(s): Joachim Bauch
  • Date: 2015-07-16 11:07:46 UTC
  • mfrom: (2.1.2 sid)
  • Revision ID: package-import@ubuntu.com-20150716110746-76vsv24j3yux7tnu
Tags: 1.0.2-1
* Imported Upstream version 1.0.2
* Added new files to copyright information.
* Only export decoder API and update symbols for new version.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (c) 2014 - 2015 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
 * This is commit 63ca0fe8288dbd300c9bb814cb671e5d889f691c from
 
23
 * https://github.com/FFmpeg/FFmpeg/blob/master/libavcodec/arm/hevcdsp_qpel_neon.S
 
24
 */
 
25
 
 
26
#include "asm.S"
 
27
#include "neon.S"
 
28
 
 
29
#define MAX_PB_SIZE #64
 
30
 
 
31
.macro regshuffle_d8
 
32
    vmov d16, d17
 
33
    vmov d17, d18
 
34
    vmov d18, d19
 
35
    vmov d19, d20
 
36
    vmov d20, d21
 
37
    vmov d21, d22
 
38
    vmov d22, d23
 
39
.endm
 
40
 
 
41
.macro regshuffle_q8
 
42
    vmov q0, q1
 
43
    vmov q1, q2
 
44
    vmov q2, q3
 
45
    vmov q3, q4
 
46
    vmov q4, q5
 
47
    vmov q5, q6
 
48
    vmov q6, q7
 
49
.endm
 
50
 
 
51
.macro vextin8
 
52
        pld       [r2]
 
53
        vld1.8    {q11}, [r2], r3
 
54
        vext.8    d16, d22, d23, #1
 
55
        vext.8    d17, d22, d23, #2
 
56
        vext.8    d18, d22, d23, #3
 
57
        vext.8    d19, d22, d23, #4
 
58
        vext.8    d20, d22, d23, #5
 
59
        vext.8    d21, d22, d23, #6
 
60
        vext.8    d22, d22, d23, #7
 
61
.endm
 
62
 
 
63
.macro loadin8
 
64
        pld       [r2]
 
65
        vld1.8    {d16}, [r2], r3
 
66
        pld       [r2]
 
67
        vld1.8    {d17}, [r2], r3
 
68
        pld       [r2]
 
69
        vld1.8    {d18}, [r2], r3
 
70
        pld       [r2]
 
71
        vld1.8    {d19}, [r2], r3
 
72
        pld       [r2]
 
73
        vld1.8    {d20}, [r2], r3
 
74
        pld       [r2]
 
75
        vld1.8    {d21}, [r2], r3
 
76
        pld       [r2]
 
77
        vld1.8    {d22}, [r2], r3
 
78
        pld       [r2]
 
79
        vld1.8    {d23}, [r2], r3
 
80
.endm
 
81
 
 
82
.macro qpel_filter_1_32b
 
83
        vmov.i16   d16, #58
 
84
        vmov.i16   d17, #10
 
85
        vmull.s16   q9, d6, d16   // 58 * d0
 
86
        vmull.s16  q10, d7, d16   // 58 * d1
 
87
        vmov.i16   d16, #17
 
88
        vmull.s16  q11, d4, d17   // 10 * c0
 
89
        vmull.s16  q12, d5, d17   // 10 * c1
 
90
        vmov.i16   d17, #5
 
91
        vmull.s16  q13, d8, d16   // 17 * e0
 
92
        vmull.s16  q14, d9, d16   // 17 * e1
 
93
        vmull.s16  q15, d10, d17  //  5 * f0
 
94
        vmull.s16   q8, d11, d17  //  5 * f1
 
95
        vsub.s32    q9, q11       // 58 * d0 - 10 * c0
 
96
        vsub.s32   q10, q12       // 58 * d1 - 10 * c1
 
97
        vshll.s16  q11, d2, #2    // 4 * b0
 
98
        vshll.s16  q12, d3, #2    // 4 * b1
 
99
        vadd.s32    q9, q13       // 58 * d0 - 10 * c0 + 17 * e0
 
100
        vadd.s32   q10, q14       // 58 * d1 - 10 * c1 + 17 * e1
 
101
        vsubl.s16  q13, d12, d0   // g0 - a0
 
102
        vsubl.s16  q14, d13, d1   // g1 - a1
 
103
        vadd.s32    q9, q11       // 58 * d0 - 10 * c0 + 17 * e0 + 4 * b0
 
104
        vadd.s32   q10, q12       // 58 * d1 - 10 * c1 + 17 * e1 + 4 * b1
 
105
        vsub.s32   q13, q15       // g0 - a0 - 5 * f0
 
106
        vsub.s32   q14, q8        // g1 - a1 - 5 * f1
 
107
        vadd.s32    q9, q13       // 58 * d0 - 10 * c0 + 17 * e0 + 4 * b0 + g0 - a0 - 5 * f0
 
108
        vadd.s32   q10, q14       // 58 * d1 - 10 * c1 + 17 * e1 + 4 * b1 + g1 - a1 - 5 * f1
 
109
        vqshrn.s32  d16, q9, #6
 
110
        vqshrn.s32  d17, q10, #6
 
111
.endm
 
112
 
 
113
// input  q0 - q7
 
114
// output q8
 
115
.macro qpel_filter_2_32b
 
116
        vmov.i32   q8, #11
 
117
        vaddl.s16   q9, d6, d8   // d0 + e0
 
118
        vaddl.s16  q10, d7, d9   // d1 + e1
 
119
        vaddl.s16  q11, d4, d10  // c0 + f0
 
120
        vaddl.s16  q12, d5, d11  // c1 + f1
 
121
        vmul.s32   q11, q8       // 11 * (c0 + f0)
 
122
        vmul.s32   q12, q8       // 11 * (c1 + f1)
 
123
        vmov.i32   q8, #40
 
124
        vaddl.s16  q15, d2, d12  // b0 + g0
 
125
        vmul.s32    q9, q8       // 40 * (d0 + e0)
 
126
        vmul.s32   q10, q8       // 40 * (d1 + e1)
 
127
        vaddl.s16   q8, d3, d13  // b1 + g1
 
128
        vaddl.s16  q13, d0, d14  // a0 + h0
 
129
        vaddl.s16  q14, d1, d15  // a1 + h1
 
130
        vshl.s32   q15, #2       // 4*(b0+g0)
 
131
        vshl.s32    q8, #2       // 4*(b1+g1)
 
132
        vadd.s32   q11, q13      // 11 * (c0 + f0) + a0 + h0
 
133
        vadd.s32   q12, q14      // 11 * (c1 + f1) + a1 + h1
 
134
        vadd.s32   q9, q15       // 40 * (d0 + e0) + 4*(b0+g0)
 
135
        vadd.s32   q10, q8       // 40 * (d1 + e1) + 4*(b1+g1)
 
136
        vsub.s32   q9, q11       // 40 * (d0 + e0) + 4*(b0+g0) - (11 * (c0 + f0) + a0 + h0)
 
137
        vsub.s32   q10, q12      // 40 * (d1 + e1) + 4*(b1+g1) - (11 * (c1 + f1) + a1 + h1)
 
138
        vqshrn.s32  d16, q9, #6
 
139
        vqshrn.s32  d17, q10, #6
 
140
.endm
 
141
 
 
142
.macro qpel_filter_3_32b
 
143
        vmov.i16   d16, #58
 
144
        vmov.i16   d17, #10
 
145
        vmull.s16   q9, d8, d16   // 58 * d0
 
146
        vmull.s16  q10, d9, d16   // 58 * d1
 
147
        vmov.i16   d16, #17
 
148
        vmull.s16  q11, d10, d17  // 10 * c0
 
149
        vmull.s16  q12, d11, d17  // 10 * c1
 
150
        vmov.i16   d17, #5
 
151
        vmull.s16  q13, d6, d16   // 17 * e0
 
152
        vmull.s16  q14, d7, d16   // 17 * e1
 
153
        vmull.s16  q15, d4, d17   //  5 * f0
 
154
        vmull.s16   q8, d5, d17   //  5 * f1
 
155
        vsub.s32    q9, q11       // 58 * d0 - 10 * c0
 
156
        vsub.s32   q10, q12       // 58 * d1 - 10 * c1
 
157
        vshll.s16  q11, d12, #2   // 4 * b0
 
158
        vshll.s16  q12, d13, #2   // 4 * b1
 
159
        vadd.s32    q9, q13       // 58 * d0 - 10 * c0 + 17 * e0
 
160
        vadd.s32   q10, q14       // 58 * d1 - 10 * c1 + 17 * e1
 
161
        vsubl.s16  q13, d2, d14   // g0 - a0
 
162
        vsubl.s16  q14, d3, d15   // g1 - a1
 
163
        vadd.s32    q9, q11       // 58 * d0 - 10 * c0 + 17 * e0 + 4 * b0
 
164
        vadd.s32   q10, q12       // 58 * d1 - 10 * c1 + 17 * e1 + 4 * b1
 
165
        vsub.s32   q13, q15       // g0 - a0 - 5 * f0
 
166
        vsub.s32   q14, q8        // g1 - a1 - 5 * f1
 
167
        vadd.s32    q9, q13       // 58 * d0 - 10 * c0 + 17 * e0 + 4 * b0 + g0 - a0 - 5 * f0
 
168
        vadd.s32   q10, q14       // 58 * d1 - 10 * c1 + 17 * e1 + 4 * b1 + g1 - a1 - 5 * f1
 
169
        vqshrn.s32  d16, q9, #6
 
170
        vqshrn.s32  d17, q10, #6
 
171
.endm
 
172
 
 
173
.macro qpel_filter_1 out=q7
 
174
        vmov.u8    d24, #58
 
175
        vmov.u8    d25, #10
 
176
        vshll.u8   q13, d20, #4   // 16*e
 
177
        vshll.u8   q14, d21, #2   // 4*f
 
178
        vmull.u8  \out, d19, d24  // 58*d
 
179
        vaddw.u8   q13, q13, d20  // 17*e
 
180
        vmull.u8   q15, d18, d25  // 10*c
 
181
        vaddw.u8   q14, q14, d21  // 5*f
 
182
        vsubl.u8   q12, d22, d16  // g - a
 
183
        vadd.u16  \out, q13       // 58d + 17e
 
184
        vshll.u8   q13, d17, #2   // 4*b
 
185
        vadd.u16   q15, q14       // 10*c + 5*f
 
186
        vadd.s16   q13, q12       // - a + 4*b + g
 
187
        vsub.s16  \out, q15       // -10*c + 58*d + 17*e -5*f
 
188
        vadd.s16  \out, q13       // -a + 4*b -10*c + 58*d + 17*e -5*f
 
189
.endm
 
190
 
 
191
.macro qpel_filter_2 out=q7
 
192
        vmov.i16   q12, #10
 
193
        vmov.i16   q14, #11
 
194
        vaddl.u8   q13, d19, d20   // d + e
 
195
        vaddl.u8   q15, d18, d21   // c + f
 
196
        vmul.u16   q13, q12        // 10 * (d+e)
 
197
        vmul.u16   q15, q14        // 11 * ( c + f)
 
198
        vaddl.u8  \out, d17, d22   // b + g
 
199
        vaddl.u8   q12, d16, d23   // a + h
 
200
        vadd.u16  \out, q13        // b + 10 * (d + e) + g
 
201
        vadd.s16   q12, q15
 
202
        vshl.u16  \out, #2         // 4 * (b + 10 * (d + e) + g)
 
203
        vsub.s16  \out, q12
 
204
.endm
 
205
 
 
206
.macro qpel_filter_3 out=q7
 
207
        vmov.u8    d24, #58
 
208
        vmov.u8    d25, #10
 
209
        vshll.u8   q13, d19, #4     // 16*e
 
210
        vshll.u8   q14, d18, #2     // 4*f
 
211
        vmull.u8  \out, d20, d24    // 58*d
 
212
        vaddw.u8   q13, q13, d19    // 17*e
 
213
        vmull.u8   q15, d21, d25    // 10*c
 
214
        vaddw.u8   q14, q14, d18    // 5*f
 
215
        vsubl.u8   q12, d17, d23    // g - a
 
216
        vadd.u16  \out, q13         // 58d + 17e
 
217
        vshll.u8   q13, d22, #2     // 4*b
 
218
        vadd.u16   q15, q14         // 10*c + 5*f
 
219
        vadd.s16   q13, q12         // - a + 4*b + g
 
220
        vsub.s16  \out, q15         // -10*c + 58*d + 17*e -5*f
 
221
        vadd.s16  \out, q13         // -a + 4*b -10*c + 58*d + 17*e -5*f
 
222
.endm
 
223
 
 
224
.macro  hevc_put_qpel_vX_neon_8 filter
 
225
        push   {r4, r5, r6, r7}
 
226
        ldr    r4, [sp, #16] // height
 
227
        ldr    r5, [sp, #20] // width
 
228
        vpush {d8-d15}
 
229
        sub       r2, r2, r3, lsl #1
 
230
        sub       r2, r3
 
231
        mov       r12, r4
 
232
        mov       r6, r0
 
233
        mov       r7, r2
 
234
        lsl       r1, #1
 
235
0:      loadin8
 
236
        cmp       r5, #4
 
237
        beq       4f
 
238
8:      subs r4, #1
 
239
        \filter
 
240
        vst1.16    {q7}, [r0], r1
 
241
        regshuffle_d8
 
242
        vld1.8    {d23}, [r2], r3
 
243
        bne 8b
 
244
        subs  r5, #8
 
245
        beq       99f
 
246
        mov r4, r12
 
247
        add r6, #16
 
248
        mov r0, r6
 
249
        add r7, #8
 
250
        mov r2, r7
 
251
        b     0b
 
252
4:      subs r4, #1
 
253
        \filter
 
254
        vst1.16    d14, [r0], r1
 
255
        regshuffle_d8
 
256
        vld1.32    {d23[0]}, [r2], r3
 
257
        bne 4b
 
258
99:     vpop {d8-d15}
 
259
        pop {r4, r5, r6, r7}
 
260
        bx lr
 
261
.endm
 
262
 
 
263
.macro  hevc_put_qpel_uw_vX_neon_8 filter
 
264
        push   {r4-r10}
 
265
        ldr    r5, [sp, #28] // width
 
266
        ldr    r4, [sp, #32] // height
 
267
        ldr    r8, [sp, #36] // src2
 
268
        ldr    r9, [sp, #40] // src2stride
 
269
        vpush {d8-d15}
 
270
        sub       r2, r2, r3, lsl #1
 
271
        sub       r2, r3
 
272
        mov       r12, r4
 
273
        mov       r6, r0
 
274
        mov       r7, r2
 
275
        cmp       r8, #0
 
276
        bne       .Lbi\@
 
277
0:      loadin8
 
278
        cmp       r5, #4
 
279
        beq       4f
 
280
8:      subs r4, #1
 
281
        \filter
 
282
        vqrshrun.s16   d0, q7, #6
 
283
        vst1.8    d0, [r0], r1
 
284
        regshuffle_d8
 
285
        vld1.8    {d23}, [r2], r3
 
286
        bne 8b
 
287
        subs  r5, #8
 
288
        beq       99f
 
289
        mov r4, r12
 
290
        add r6, #8
 
291
        mov r0, r6
 
292
        add r7, #8
 
293
        mov r2, r7
 
294
        b     0b
 
295
4:      subs r4, #1
 
296
        \filter
 
297
        vqrshrun.s16   d0, q7, #6
 
298
        vst1.32    d0[0], [r0], r1
 
299
        regshuffle_d8
 
300
        vld1.32    {d23[0]}, [r2], r3
 
301
        bne 4b
 
302
        b   99f
 
303
.Lbi\@: lsl       r9, #1
 
304
        mov       r10, r8
 
305
0:      loadin8
 
306
        cmp       r5, #4
 
307
        beq       4f
 
308
8:      subs r4, #1
 
309
        \filter
 
310
        vld1.16        {q0}, [r8], r9
 
311
        vqadd.s16      q0, q7
 
312
        vqrshrun.s16   d0, q0, #7
 
313
        vst1.8         d0, [r0], r1
 
314
        regshuffle_d8
 
315
        vld1.8    {d23}, [r2], r3
 
316
        bne 8b
 
317
        subs  r5, #8
 
318
        beq       99f
 
319
        mov r4, r12
 
320
        add r6, #8
 
321
        mov r0, r6
 
322
        add r10, #16
 
323
        mov r8, r10
 
324
        add r7, #8
 
325
        mov r2, r7
 
326
        b     0b
 
327
4:      subs r4, #1
 
328
        \filter
 
329
        vld1.16      d0, [r8], r9
 
330
        vqadd.s16    d0, d14
 
331
        vqrshrun.s16 d0, q0, #7
 
332
        vst1.32      d0[0], [r0], r1
 
333
        regshuffle_d8
 
334
        vld1.32    {d23[0]}, [r2], r3
 
335
        bne 4b
 
336
99:     vpop {d8-d15}
 
337
        pop {r4-r10}
 
338
        bx lr
 
339
.endm
 
340
 
 
341
function ff_hevc_put_qpel_v1_neon_8, export=1
 
342
        hevc_put_qpel_vX_neon_8 qpel_filter_1
 
343
endfunc
 
344
 
 
345
function ff_hevc_put_qpel_v2_neon_8, export=1
 
346
        hevc_put_qpel_vX_neon_8 qpel_filter_2
 
347
endfunc
 
348
 
 
349
function ff_hevc_put_qpel_v3_neon_8, export=1
 
350
        hevc_put_qpel_vX_neon_8 qpel_filter_3
 
351
endfunc
 
352
 
 
353
 
 
354
function ff_hevc_put_qpel_uw_v1_neon_8, export=1
 
355
        hevc_put_qpel_uw_vX_neon_8 qpel_filter_1
 
356
endfunc
 
357
 
 
358
function ff_hevc_put_qpel_uw_v2_neon_8, export=1
 
359
        hevc_put_qpel_uw_vX_neon_8 qpel_filter_2
 
360
endfunc
 
361
 
 
362
function ff_hevc_put_qpel_uw_v3_neon_8, export=1
 
363
        hevc_put_qpel_uw_vX_neon_8 qpel_filter_3
 
364
endfunc
 
365
 
 
366
.macro hevc_put_qpel_hX_neon_8 filter
 
367
        push     {r4, r5, r6, r7}
 
368
        ldr    r4, [sp, #16] // height
 
369
        ldr    r5, [sp, #20] // width
 
370
 
 
371
        vpush    {d8-d15}
 
372
        sub       r2, #4
 
373
        lsl       r1, #1
 
374
        mov      r12, r4
 
375
        mov       r6, r0
 
376
        mov       r7, r2
 
377
        cmp       r5, #4
 
378
        beq       4f
 
379
8:      subs      r4, #1
 
380
        vextin8
 
381
        \filter
 
382
        vst1.16   {q7}, [r0], r1
 
383
        bne       8b
 
384
        subs      r5, #8
 
385
        beq      99f
 
386
        mov       r4, r12
 
387
        add       r6, #16
 
388
        mov       r0, r6
 
389
        add       r7, #8
 
390
        mov       r2, r7
 
391
        cmp       r5, #4
 
392
        bne       8b
 
393
4:      subs      r4, #1
 
394
        vextin8
 
395
        \filter
 
396
        vst1.16  d14, [r0], r1
 
397
        bne       4b
 
398
99:     vpop     {d8-d15}
 
399
        pop      {r4, r5, r6, r7}
 
400
        bx lr
 
401
.endm
 
402
 
 
403
.macro hevc_put_qpel_uw_hX_neon_8 filter
 
404
        push     {r4-r10}
 
405
        ldr       r5, [sp, #28] // width
 
406
        ldr       r4, [sp, #32] // height
 
407
        ldr       r8, [sp, #36] // src2
 
408
        ldr       r9, [sp, #40] // src2stride
 
409
        vpush    {d8-d15}
 
410
        sub       r2, #4
 
411
        mov      r12, r4
 
412
        mov       r6, r0
 
413
        mov       r7, r2
 
414
        cmp       r8, #0
 
415
        bne       .Lbi\@
 
416
        cmp       r5, #4
 
417
        beq       4f
 
418
8:      subs      r4, #1
 
419
        vextin8
 
420
        \filter
 
421
        vqrshrun.s16   d0, q7, #6
 
422
        vst1.8    d0, [r0], r1
 
423
        bne       8b
 
424
        subs      r5, #8
 
425
        beq      99f
 
426
        mov       r4, r12
 
427
        add       r6, #8
 
428
        mov       r0, r6
 
429
        add       r7, #8
 
430
        mov       r2, r7
 
431
        cmp       r5, #4
 
432
        bne       8b
 
433
4:      subs      r4, #1
 
434
        vextin8
 
435
        \filter
 
436
        vqrshrun.s16   d0, q7, #6
 
437
        vst1.32  d0[0], [r0], r1
 
438
        bne       4b
 
439
        b         99f
 
440
.Lbi\@:
 
441
        lsl       r9, #1
 
442
        cmp       r5, #4
 
443
        beq       4f
 
444
        mov       r10, r8
 
445
8:      subs      r4, #1
 
446
        vextin8
 
447
        \filter
 
448
        vld1.16        {q0}, [r8], r9
 
449
        vqadd.s16      q0, q7
 
450
        vqrshrun.s16   d0, q0, #7
 
451
        vst1.8         d0, [r0], r1
 
452
        bne       8b
 
453
        subs      r5, #8
 
454
        beq      99f
 
455
        mov       r4, r12
 
456
        add       r6, #8
 
457
        add       r10, #16
 
458
        mov       r8, r10
 
459
        mov       r0, r6
 
460
        add       r7, #8
 
461
        mov       r2, r7
 
462
        cmp       r5, #4
 
463
        bne       8b
 
464
4:      subs      r4, #1
 
465
        vextin8
 
466
        \filter
 
467
        vld1.16      d0, [r8], r9
 
468
        vqadd.s16    d0, d14
 
469
        vqrshrun.s16 d0, q0, #7
 
470
        vst1.32      d0[0], [r0], r1
 
471
        bne       4b
 
472
99:     vpop     {d8-d15}
 
473
        pop      {r4-r10}
 
474
        bx lr
 
475
.endm
 
476
 
 
477
function ff_hevc_put_qpel_h1_neon_8, export=1
 
478
        hevc_put_qpel_hX_neon_8 qpel_filter_1
 
479
endfunc
 
480
 
 
481
function ff_hevc_put_qpel_h2_neon_8, export=1
 
482
        hevc_put_qpel_hX_neon_8 qpel_filter_2
 
483
endfunc
 
484
 
 
485
function ff_hevc_put_qpel_h3_neon_8, export=1
 
486
        hevc_put_qpel_hX_neon_8 qpel_filter_3
 
487
endfunc
 
488
 
 
489
 
 
490
function ff_hevc_put_qpel_uw_h1_neon_8, export=1
 
491
        hevc_put_qpel_uw_hX_neon_8 qpel_filter_1
 
492
endfunc
 
493
 
 
494
function ff_hevc_put_qpel_uw_h2_neon_8, export=1
 
495
        hevc_put_qpel_uw_hX_neon_8 qpel_filter_2
 
496
endfunc
 
497
 
 
498
function ff_hevc_put_qpel_uw_h3_neon_8, export=1
 
499
        hevc_put_qpel_uw_hX_neon_8 qpel_filter_3
 
500
endfunc
 
501
 
 
502
.macro hevc_put_qpel_hXvY_neon_8 filterh filterv
 
503
        push   {r4, r5, r6, r7}
 
504
        ldr    r4, [sp, #16] // height
 
505
        ldr    r5, [sp, #20] // width
 
506
 
 
507
        vpush {d8-d15}
 
508
        sub       r2, #4
 
509
        sub       r2, r2, r3, lsl #1
 
510
        sub       r2, r3  // extra_before 3
 
511
        lsl       r1, #1
 
512
        mov       r12, r4
 
513
        mov       r6, r0
 
514
        mov       r7, r2
 
515
0:      vextin8
 
516
        \filterh q0
 
517
        vextin8
 
518
        \filterh q1
 
519
        vextin8
 
520
        \filterh q2
 
521
        vextin8
 
522
        \filterh q3
 
523
        vextin8
 
524
        \filterh q4
 
525
        vextin8
 
526
        \filterh q5
 
527
        vextin8
 
528
        \filterh q6
 
529
        vextin8
 
530
        \filterh q7
 
531
        cmp r5, #4
 
532
        beq 4f
 
533
8:      subs  r4, #1
 
534
        \filterv
 
535
        vst1.16    {q8}, [r0], r1
 
536
        regshuffle_q8
 
537
        vextin8
 
538
        \filterh q7
 
539
        bne 8b
 
540
        subs  r5, #8
 
541
        beq 99f
 
542
        mov r4, r12
 
543
        add r6, #16
 
544
        mov r0, r6
 
545
        add r7, #8
 
546
        mov r2, r7
 
547
        b 0b
 
548
4:      subs  r4, #1
 
549
        \filterv
 
550
        vst1.16    d16, [r0], r1
 
551
        regshuffle_q8
 
552
        vextin8
 
553
        \filterh q7
 
554
        bne 4b
 
555
99:     vpop {d8-d15}
 
556
        pop {r4, r5, r6, r7}
 
557
        bx lr
 
558
.endm
 
559
 
 
560
.macro hevc_put_qpel_uw_hXvY_neon_8 filterh filterv
 
561
        push     {r4-r10}
 
562
        ldr       r5, [sp, #28] // width
 
563
        ldr       r4, [sp, #32] // height
 
564
        ldr       r8, [sp, #36] // src2
 
565
        ldr       r9, [sp, #40] // src2stride
 
566
        vpush {d8-d15}
 
567
        sub       r2, #4
 
568
        sub       r2, r2, r3, lsl #1
 
569
        sub       r2, r3  // extra_before 3
 
570
        mov       r12, r4
 
571
        mov       r6, r0
 
572
        mov       r7, r2
 
573
        cmp       r8, #0
 
574
        bne       .Lbi\@
 
575
0:      vextin8
 
576
        \filterh q0
 
577
        vextin8
 
578
        \filterh q1
 
579
        vextin8
 
580
        \filterh q2
 
581
        vextin8
 
582
        \filterh q3
 
583
        vextin8
 
584
        \filterh q4
 
585
        vextin8
 
586
        \filterh q5
 
587
        vextin8
 
588
        \filterh q6
 
589
        vextin8
 
590
        \filterh q7
 
591
        cmp r5, #4
 
592
        beq 4f
 
593
8:      subs  r4, #1
 
594
        \filterv
 
595
        vqrshrun.s16   d0, q8, #6
 
596
        vst1.8    d0, [r0], r1
 
597
        regshuffle_q8
 
598
        vextin8
 
599
        \filterh q7
 
600
        bne 8b
 
601
        subs  r5, #8
 
602
        beq 99f
 
603
        mov r4, r12
 
604
        add r6, #8
 
605
        mov r0, r6
 
606
        add r7, #8
 
607
        mov r2, r7
 
608
        b 0b
 
609
4:      subs  r4, #1
 
610
        \filterv
 
611
        vqrshrun.s16   d0, q8, #6
 
612
        vst1.32        d0[0], [r0], r1
 
613
        regshuffle_q8
 
614
        vextin8
 
615
        \filterh q7
 
616
        bne 4b
 
617
        b   99f
 
618
.Lbi\@: lsl      r9, #1
 
619
        mov      r10, r8
 
620
0:      vextin8
 
621
        \filterh q0
 
622
        vextin8
 
623
        \filterh q1
 
624
        vextin8
 
625
        \filterh q2
 
626
        vextin8
 
627
        \filterh q3
 
628
        vextin8
 
629
        \filterh q4
 
630
        vextin8
 
631
        \filterh q5
 
632
        vextin8
 
633
        \filterh q6
 
634
        vextin8
 
635
        \filterh q7
 
636
        cmp r5, #4
 
637
        beq 4f
 
638
8:      subs  r4, #1
 
639
        \filterv
 
640
        vld1.16        {q0}, [r8], r9
 
641
        vqadd.s16      q0, q8
 
642
        vqrshrun.s16   d0, q0, #7
 
643
        vst1.8         d0, [r0], r1
 
644
        regshuffle_q8
 
645
        vextin8
 
646
        \filterh q7
 
647
        bne 8b
 
648
        subs  r5, #8
 
649
        beq 99f
 
650
        mov r4, r12
 
651
        add r6, #8
 
652
        mov r0, r6
 
653
        add r10, #16
 
654
        mov r8, r10
 
655
        add r7, #8
 
656
        mov r2, r7
 
657
        b 0b
 
658
4:      subs  r4, #1
 
659
        \filterv
 
660
        vld1.16      d0, [r8], r9
 
661
        vqadd.s16    d0, d16
 
662
        vqrshrun.s16 d0, q0, #7
 
663
        vst1.32      d0[0], [r0], r1
 
664
        regshuffle_q8
 
665
        vextin8
 
666
        \filterh q7
 
667
        bne 4b
 
668
99:     vpop {d8-d15}
 
669
        pop {r4-r10}
 
670
        bx lr
 
671
.endm
 
672
 
 
673
 
 
674
function ff_hevc_put_qpel_h1v1_neon_8, export=1
 
675
        hevc_put_qpel_hXvY_neon_8 qpel_filter_1 qpel_filter_1_32b
 
676
endfunc
 
677
 
 
678
function ff_hevc_put_qpel_h2v1_neon_8, export=1
 
679
        hevc_put_qpel_hXvY_neon_8 qpel_filter_2 qpel_filter_1_32b
 
680
endfunc
 
681
 
 
682
function ff_hevc_put_qpel_h3v1_neon_8, export=1
 
683
        hevc_put_qpel_hXvY_neon_8 qpel_filter_3 qpel_filter_1_32b
 
684
endfunc
 
685
 
 
686
function ff_hevc_put_qpel_h1v2_neon_8, export=1
 
687
        hevc_put_qpel_hXvY_neon_8 qpel_filter_1 qpel_filter_2_32b
 
688
endfunc
 
689
 
 
690
function ff_hevc_put_qpel_h2v2_neon_8, export=1
 
691
        hevc_put_qpel_hXvY_neon_8 qpel_filter_2 qpel_filter_2_32b
 
692
endfunc
 
693
 
 
694
function ff_hevc_put_qpel_h3v2_neon_8, export=1
 
695
        hevc_put_qpel_hXvY_neon_8 qpel_filter_3 qpel_filter_2_32b
 
696
endfunc
 
697
 
 
698
function ff_hevc_put_qpel_h1v3_neon_8, export=1
 
699
        hevc_put_qpel_hXvY_neon_8 qpel_filter_1 qpel_filter_3_32b
 
700
endfunc
 
701
 
 
702
function ff_hevc_put_qpel_h2v3_neon_8, export=1
 
703
        hevc_put_qpel_hXvY_neon_8 qpel_filter_2 qpel_filter_3_32b
 
704
endfunc
 
705
 
 
706
function ff_hevc_put_qpel_h3v3_neon_8, export=1
 
707
        hevc_put_qpel_hXvY_neon_8 qpel_filter_3 qpel_filter_3_32b
 
708
endfunc
 
709
 
 
710
 
 
711
function ff_hevc_put_qpel_uw_h1v1_neon_8, export=1
 
712
        hevc_put_qpel_uw_hXvY_neon_8 qpel_filter_1 qpel_filter_1_32b
 
713
endfunc
 
714
 
 
715
function ff_hevc_put_qpel_uw_h2v1_neon_8, export=1
 
716
        hevc_put_qpel_uw_hXvY_neon_8 qpel_filter_2 qpel_filter_1_32b
 
717
endfunc
 
718
 
 
719
function ff_hevc_put_qpel_uw_h3v1_neon_8, export=1
 
720
        hevc_put_qpel_uw_hXvY_neon_8 qpel_filter_3 qpel_filter_1_32b
 
721
endfunc
 
722
 
 
723
function ff_hevc_put_qpel_uw_h1v2_neon_8, export=1
 
724
        hevc_put_qpel_uw_hXvY_neon_8 qpel_filter_1 qpel_filter_2_32b
 
725
endfunc
 
726
 
 
727
function ff_hevc_put_qpel_uw_h2v2_neon_8, export=1
 
728
        hevc_put_qpel_uw_hXvY_neon_8 qpel_filter_2 qpel_filter_2_32b
 
729
endfunc
 
730
 
 
731
function ff_hevc_put_qpel_uw_h3v2_neon_8, export=1
 
732
        hevc_put_qpel_uw_hXvY_neon_8 qpel_filter_3 qpel_filter_2_32b
 
733
endfunc
 
734
 
 
735
function ff_hevc_put_qpel_uw_h1v3_neon_8, export=1
 
736
        hevc_put_qpel_uw_hXvY_neon_8 qpel_filter_1 qpel_filter_3_32b
 
737
endfunc
 
738
 
 
739
function ff_hevc_put_qpel_uw_h2v3_neon_8, export=1
 
740
        hevc_put_qpel_uw_hXvY_neon_8 qpel_filter_2 qpel_filter_3_32b
 
741
endfunc
 
742
 
 
743
function ff_hevc_put_qpel_uw_h3v3_neon_8, export=1
 
744
        hevc_put_qpel_uw_hXvY_neon_8 qpel_filter_3 qpel_filter_3_32b
 
745
endfunc
 
746
 
 
747
.macro init_put_pixels
 
748
        pld    [r1]
 
749
        pld    [r1, r2]
 
750
        mov    r12, MAX_PB_SIZE
 
751
        lsl    r12, #1
 
752
.endm
 
753
 
 
754
function ff_hevc_put_pixels_w2_neon_8, export=1
 
755
        init_put_pixels
 
756
        vmov.u8      d5, #255
 
757
        vshr.u64     d5, #32
 
758
0:      subs r3, #1
 
759
        vld1.32     {d0[0]}, [r1], r2
 
760
        pld [r1]
 
761
        vld1.32     d6, [r0]
 
762
        vshll.u8    q0, d0, #6
 
763
        vbit        d6, d0, d5
 
764
        vst1.32     d6, [r0], r12
 
765
        bne 0b
 
766
        bx lr
 
767
endfunc
 
768
 
 
769
function ff_hevc_put_pixels_w4_neon_8, export=1
 
770
        init_put_pixels
 
771
0:      subs r3, #2
 
772
        vld1.32   {d0[0]}, [r1], r2
 
773
        vld1.32   {d0[1]}, [r1], r2
 
774
        pld       [r1]
 
775
        pld       [r1, r2]
 
776
        vshll.u8   q0, d0, #6
 
777
        vst1.64   {d0}, [r0], r12
 
778
        vst1.64   {d1}, [r0], r12
 
779
        bne 0b
 
780
        bx lr
 
781
endfunc
 
782
 
 
783
function ff_hevc_put_pixels_w6_neon_8, export=1
 
784
        init_put_pixels
 
785
        vmov.u8      q10, #255
 
786
        vshr.u64     d21, #32
 
787
0:      subs r3, #1
 
788
        vld1.16     {d0}, [r1], r2
 
789
        pld [r1]
 
790
        vshll.u8    q0, d0, #6
 
791
        vld1.8      {q12}, [r0]
 
792
        vbit        q12, q0, q10
 
793
        vst1.8      {q12}, [r0], r12
 
794
        bne 0b
 
795
        bx lr
 
796
endfunc
 
797
 
 
798
function ff_hevc_put_pixels_w8_neon_8, export=1
 
799
        init_put_pixels
 
800
0:      subs r3, #2
 
801
        vld1.8   {d0}, [r1], r2
 
802
        vld1.8   {d2}, [r1], r2
 
803
        pld        [r1]
 
804
        pld        [r1, r2]
 
805
        vshll.u8   q0, d0, #6
 
806
        vshll.u8   q1, d2, #6
 
807
        vst1.16   {q0}, [r0], r12
 
808
        vst1.16   {q1}, [r0], r12
 
809
        bne 0b
 
810
        bx lr
 
811
endfunc
 
812
 
 
813
function ff_hevc_put_pixels_w12_neon_8, export=1
 
814
        init_put_pixels
 
815
0:      subs r3, #2
 
816
        vld1.64    {d0}, [r1]
 
817
        add       r1, #8
 
818
        vld1.32   {d1[0]}, [r1], r2
 
819
        sub       r1, #8
 
820
        vld1.64    {d2}, [r1]
 
821
        add       r1, #8
 
822
        vld1.32   {d1[1]}, [r1], r2
 
823
        sub       r1, #8
 
824
        pld       [r1]
 
825
        pld       [r1, r2]
 
826
        vshll.u8  q8, d0, #6
 
827
        vshll.u8  q9, d1, #6
 
828
        vshll.u8  q10, d2, #6
 
829
        vmov      d22, d19
 
830
        vst1.64   {d16, d17, d18}, [r0], r12
 
831
        vst1.64   {d20, d21, d22}, [r0], r12
 
832
        bne 0b
 
833
        bx lr
 
834
endfunc
 
835
 
 
836
function ff_hevc_put_pixels_w16_neon_8, export=1
 
837
        init_put_pixels
 
838
0:      subs r3, #2
 
839
        vld1.8   {q0}, [r1], r2
 
840
        vld1.8   {q1}, [r1], r2
 
841
        pld       [r1]
 
842
        pld       [r1, r2]
 
843
        vshll.u8  q8, d0, #6
 
844
        vshll.u8  q9, d1, #6
 
845
        vshll.u8  q10, d2, #6
 
846
        vshll.u8  q11, d3, #6
 
847
        vst1.8    {q8, q9}, [r0], r12
 
848
        vst1.8    {q10, q11}, [r0], r12
 
849
        bne 0b
 
850
        bx lr
 
851
endfunc
 
852
 
 
853
function ff_hevc_put_pixels_w24_neon_8, export=1
 
854
        init_put_pixels
 
855
0:      subs r3, #1
 
856
        vld1.8   {d0, d1, d2}, [r1], r2
 
857
        pld       [r1]
 
858
        vshll.u8  q10, d0, #6
 
859
        vshll.u8  q11, d1, #6
 
860
        vshll.u8  q12, d2, #6
 
861
        vstm     r0, {q10, q11, q12}
 
862
        add      r0, r12
 
863
        bne 0b
 
864
        bx lr
 
865
endfunc
 
866
 
 
867
function ff_hevc_put_pixels_w32_neon_8, export=1
 
868
        init_put_pixels
 
869
0:      subs r3, #1
 
870
        vld1.8 {q0, q1}, [r1], r2
 
871
        pld       [r1]
 
872
        vshll.u8  q8, d0, #6
 
873
        vshll.u8  q9, d1, #6
 
874
        vshll.u8  q10, d2, #6
 
875
        vshll.u8  q11, d3, #6
 
876
        vstm    r0, {q8, q9, q10, q11}
 
877
        add     r0, r12
 
878
        bne 0b
 
879
        bx lr
 
880
endfunc
 
881
 
 
882
function ff_hevc_put_pixels_w48_neon_8, export=1
 
883
        init_put_pixels
 
884
0:      subs r3, #1
 
885
        vld1.8    {q0, q1}, [r1]
 
886
        add r1, #32
 
887
        vld1.8    {q2}, [r1], r2
 
888
        sub r1, #32
 
889
        pld       [r1]
 
890
        vshll.u8  q8, d0, #6
 
891
        vshll.u8  q9, d1, #6
 
892
        vshll.u8  q10, d2, #6
 
893
        vshll.u8  q11, d3, #6
 
894
        vshll.u8  q12, d4, #6
 
895
        vshll.u8  q13, d5, #6
 
896
        vstm r0, {q8, q9, q10, q11, q12, q13}
 
897
        add  r0, r12
 
898
        bne 0b
 
899
        bx lr
 
900
endfunc
 
901
 
 
902
function ff_hevc_put_pixels_w64_neon_8, export=1
 
903
        init_put_pixels
 
904
0:      subs r3, #1
 
905
        vld1.8    {q0, q1}, [r1]
 
906
        add      r1, #32
 
907
        vld1.8    {q2, q3}, [r1], r2
 
908
        sub      r1, #32
 
909
        pld       [r1]
 
910
        vshll.u8  q8, d0, #6
 
911
        vshll.u8  q9, d1, #6
 
912
        vshll.u8  q10, d2, #6
 
913
        vshll.u8  q11, d3, #6
 
914
        vshll.u8  q12, d4, #6
 
915
        vshll.u8  q13, d5, #6
 
916
        vshll.u8  q14, d6, #6
 
917
        vshll.u8  q15, d7, #6
 
918
        vstm    r0, {q8, q9, q10, q11, q12, q13, q14, q15}
 
919
        add r0, r12
 
920
        bne 0b
 
921
        bx lr
 
922
endfunc
 
923
 
 
924
function ff_hevc_put_qpel_uw_pixels_neon_8, export=1
 
925
        push   {r4-r9}
 
926
        ldr    r5, [sp, #24] // width
 
927
        ldr    r4, [sp, #28] // height
 
928
        ldr    r8, [sp, #32] // src2
 
929
        ldr    r9, [sp, #36] // src2stride
 
930
        vpush {d8-d15}
 
931
        cmp    r8, #0
 
932
        bne    2f
 
933
1:      subs r4, #1
 
934
        vld1.8     {d0}, [r2], r3
 
935
        vst1.8      d0, [r0], r1
 
936
        bne 1b
 
937
        vpop {d8-d15}
 
938
        pop   {r4-r9}
 
939
        bx lr
 
940
2:      subs  r4, #1
 
941
        vld1.8         {d0}, [r2], r3
 
942
        vld1.16        {q1}, [r8], r9
 
943
        vshll.u8       q0, d0, #6
 
944
        vqadd.s16      q0, q1
 
945
        vqrshrun.s16   d0, q0, #7
 
946
        vst1.8      d0, [r0], r1
 
947
        bne 2b
 
948
        vpop {d8-d15}
 
949
        pop   {r4-r9}
 
950
        bx lr
 
951
endfunc
 
952
 
 
953
.macro put_qpel_uw_pixels width, regs, regs2, regs3, regs4
 
954
function ff_hevc_put_qpel_uw_pixels_w\width\()_neon_8, export=1
 
955
        ldr    r12, [sp] // height
 
956
1:      subs   r12, #4
 
957
        vld1.32     {\regs}  , [r2], r3
 
958
        vld1.32     {\regs2} , [r2], r3
 
959
        vld1.32     {\regs3} , [r2], r3
 
960
        vld1.32     {\regs4} , [r2], r3
 
961
        vst1.32     {\regs}  , [r0], r1
 
962
        vst1.32     {\regs2} , [r0], r1
 
963
        vst1.32     {\regs3} , [r0], r1
 
964
        vst1.32     {\regs4} , [r0], r1
 
965
        bne 1b
 
966
        bx lr
 
967
endfunc
 
968
.endm
 
969
 
 
970
.macro put_qpel_uw_pixels_m width, regs, regs2, regs3, regs4
 
971
function ff_hevc_put_qpel_uw_pixels_w\width\()_neon_8, export=1
 
972
        push   {r4-r5}
 
973
        ldr    r12, [sp, #8] // height
 
974
1:      subs r12, #2
 
975
        mov      r4, r2
 
976
        vld1.32   {\regs} , [r2]!
 
977
        vld1.32   {\regs2} , [r2]
 
978
        add      r2, r4, r3
 
979
        mov      r4, r2
 
980
        vld1.32   {\regs3} , [r2]!
 
981
        vld1.32   {\regs4} , [r2]
 
982
        add      r2, r4, r3
 
983
        mov      r5, r0
 
984
        vst1.32   {\regs} , [r0]!
 
985
        vst1.32   {\regs2} , [r0]
 
986
        add      r0, r5, r1
 
987
        mov      r5, r0
 
988
        vst1.32   {\regs3} , [r0]!
 
989
        vst1.32   {\regs4} , [r0]
 
990
        add      r0, r5, r1
 
991
        bne 1b
 
992
        pop   {r4-r5}
 
993
        bx lr
 
994
endfunc
 
995
.endm
 
996
 
 
997
put_qpel_uw_pixels    4, d0[0], d0[1], d1[0], d1[1]
 
998
put_qpel_uw_pixels    8, d0,    d1,    d2,    d3
 
999
put_qpel_uw_pixels_m 12, d0,    d1[0], d2,    d3[0]
 
1000
put_qpel_uw_pixels   16, q0,    q1,    q2,    q3
 
1001
put_qpel_uw_pixels   24, d0-d2, d3-d5, d16-d18, d19-d21
 
1002
put_qpel_uw_pixels   32, q0-q1, q2-q3, q8-q9, q10-q11
 
1003
put_qpel_uw_pixels_m 48, q0-q1, q2,    q8-q9, q10
 
1004
put_qpel_uw_pixels_m 64, q0-q1, q2-q3, q8-q9, q10-q11