1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Copyright (c) 2017 Google Inc.
3cabdff1aSopenharmony_ci *
4cabdff1aSopenharmony_ci * This file is part of FFmpeg.
5cabdff1aSopenharmony_ci *
6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
7cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
8cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
9cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
10cabdff1aSopenharmony_ci *
11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14cabdff1aSopenharmony_ci * Lesser General Public License for more details.
15cabdff1aSopenharmony_ci *
16cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
17cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
18cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19cabdff1aSopenharmony_ci */
20cabdff1aSopenharmony_ci
21cabdff1aSopenharmony_ci#include "libavutil/aarch64/asm.S"
22cabdff1aSopenharmony_ci
23cabdff1aSopenharmony_ci// All public functions in this file have the following signature:
24cabdff1aSopenharmony_ci// typedef void (*vp9_mc_func)(uint8_t *dst, ptrdiff_t dst_stride,
25cabdff1aSopenharmony_ci//                            const uint8_t *ref, ptrdiff_t ref_stride,
26cabdff1aSopenharmony_ci//                            int h, int mx, int my);
27cabdff1aSopenharmony_ci
28cabdff1aSopenharmony_cifunction ff_vp9_avg64_16_neon, export=1
29cabdff1aSopenharmony_ci        mov             x5,  x0
30cabdff1aSopenharmony_ci        sub             x1,  x1,  #64
31cabdff1aSopenharmony_ci        sub             x3,  x3,  #64
32cabdff1aSopenharmony_ci1:
33cabdff1aSopenharmony_ci        ld1             {v4.8h,  v5.8h,  v6.8h,  v7.8h},  [x2], #64
34cabdff1aSopenharmony_ci        ld1             {v0.8h,  v1.8h,  v2.8h,  v3.8h},  [x0], #64
35cabdff1aSopenharmony_ci        ld1             {v20.8h, v21.8h, v22.8h, v23.8h}, [x2], x3
36cabdff1aSopenharmony_ci        urhadd          v0.8h,  v0.8h,  v4.8h
37cabdff1aSopenharmony_ci        urhadd          v1.8h,  v1.8h,  v5.8h
38cabdff1aSopenharmony_ci        ld1             {v16.8h, v17.8h, v18.8h, v19.8h}, [x0], x1
39cabdff1aSopenharmony_ci        urhadd          v2.8h,  v2.8h,  v6.8h
40cabdff1aSopenharmony_ci        urhadd          v3.8h,  v3.8h,  v7.8h
41cabdff1aSopenharmony_ci        subs            w4,  w4,  #1
42cabdff1aSopenharmony_ci        urhadd          v16.8h, v16.8h, v20.8h
43cabdff1aSopenharmony_ci        urhadd          v17.8h, v17.8h, v21.8h
44cabdff1aSopenharmony_ci        st1             {v0.8h,  v1.8h,  v2.8h,  v3.8h},  [x5], #64
45cabdff1aSopenharmony_ci        urhadd          v18.8h, v18.8h, v22.8h
46cabdff1aSopenharmony_ci        urhadd          v19.8h, v19.8h, v23.8h
47cabdff1aSopenharmony_ci        st1             {v16.8h, v17.8h, v18.8h, v19.8h}, [x5], x1
48cabdff1aSopenharmony_ci        b.ne            1b
49cabdff1aSopenharmony_ci        ret
50cabdff1aSopenharmony_ciendfunc
51cabdff1aSopenharmony_ci
52cabdff1aSopenharmony_cifunction ff_vp9_avg32_16_neon, export=1
53cabdff1aSopenharmony_ci        mov             x5,  x0
54cabdff1aSopenharmony_ci1:
55cabdff1aSopenharmony_ci        ld1             {v4.8h,  v5.8h,  v6.8h,  v7.8h},  [x2], x3
56cabdff1aSopenharmony_ci        ld1             {v0.8h,  v1.8h,  v2.8h,  v3.8h},  [x0], x1
57cabdff1aSopenharmony_ci        ld1             {v20.8h, v21.8h, v22.8h, v23.8h}, [x2], x3
58cabdff1aSopenharmony_ci        urhadd          v0.8h,  v0.8h,  v4.8h
59cabdff1aSopenharmony_ci        urhadd          v1.8h,  v1.8h,  v5.8h
60cabdff1aSopenharmony_ci        ld1             {v16.8h, v17.8h, v18.8h, v19.8h}, [x0], x1
61cabdff1aSopenharmony_ci        urhadd          v2.8h,  v2.8h,  v6.8h
62cabdff1aSopenharmony_ci        urhadd          v3.8h,  v3.8h,  v7.8h
63cabdff1aSopenharmony_ci        subs            w4,  w4,  #2
64cabdff1aSopenharmony_ci        urhadd          v16.8h, v16.8h, v20.8h
65cabdff1aSopenharmony_ci        urhadd          v17.8h, v17.8h, v21.8h
66cabdff1aSopenharmony_ci        st1             {v0.8h,  v1.8h,  v2.8h,  v3.8h},  [x5], x1
67cabdff1aSopenharmony_ci        urhadd          v18.8h, v18.8h, v22.8h
68cabdff1aSopenharmony_ci        urhadd          v19.8h, v19.8h, v23.8h
69cabdff1aSopenharmony_ci        st1             {v16.8h, v17.8h, v18.8h, v19.8h}, [x5], x1
70cabdff1aSopenharmony_ci        b.ne            1b
71cabdff1aSopenharmony_ci        ret
72cabdff1aSopenharmony_ciendfunc
73cabdff1aSopenharmony_ci
74cabdff1aSopenharmony_cifunction ff_vp9_avg16_16_neon, export=1
75cabdff1aSopenharmony_ci1:
76cabdff1aSopenharmony_ci        ld1             {v2.8h, v3.8h},  [x2], x3
77cabdff1aSopenharmony_ci        ld1             {v0.8h, v1.8h},  [x0]
78cabdff1aSopenharmony_ci        urhadd          v0.8h,  v0.8h,  v2.8h
79cabdff1aSopenharmony_ci        urhadd          v1.8h,  v1.8h,  v3.8h
80cabdff1aSopenharmony_ci        subs            w4,  w4,  #1
81cabdff1aSopenharmony_ci        st1             {v0.8h, v1.8h},  [x0], x1
82cabdff1aSopenharmony_ci        b.ne            1b
83cabdff1aSopenharmony_ci        ret
84cabdff1aSopenharmony_ciendfunc
85cabdff1aSopenharmony_ci
86cabdff1aSopenharmony_cifunction ff_vp9_avg8_16_neon, export=1
87cabdff1aSopenharmony_ci        mov             x5,  x0
88cabdff1aSopenharmony_ci1:
89cabdff1aSopenharmony_ci        ld1             {v2.8h},  [x2], x3
90cabdff1aSopenharmony_ci        ld1             {v0.8h},  [x0], x1
91cabdff1aSopenharmony_ci        ld1             {v3.8h},  [x2], x3
92cabdff1aSopenharmony_ci        urhadd          v0.8h,  v0.8h,  v2.8h
93cabdff1aSopenharmony_ci        ld1             {v1.8h},  [x0], x1
94cabdff1aSopenharmony_ci        urhadd          v1.8h,  v1.8h,  v3.8h
95cabdff1aSopenharmony_ci        subs            w4,  w4,  #2
96cabdff1aSopenharmony_ci        st1             {v0.8h},  [x5], x1
97cabdff1aSopenharmony_ci        st1             {v1.8h},  [x5], x1
98cabdff1aSopenharmony_ci        b.ne            1b
99cabdff1aSopenharmony_ci        ret
100cabdff1aSopenharmony_ciendfunc
101cabdff1aSopenharmony_ci
102cabdff1aSopenharmony_cifunction ff_vp9_avg4_16_neon, export=1
103cabdff1aSopenharmony_ci        mov             x5,  x0
104cabdff1aSopenharmony_ci1:
105cabdff1aSopenharmony_ci        ld1             {v2.4h},  [x2], x3
106cabdff1aSopenharmony_ci        ld1             {v0.4h},  [x0], x1
107cabdff1aSopenharmony_ci        ld1             {v3.4h},  [x2], x3
108cabdff1aSopenharmony_ci        urhadd          v0.4h,  v0.4h,  v2.4h
109cabdff1aSopenharmony_ci        ld1             {v1.4h},  [x0], x1
110cabdff1aSopenharmony_ci        urhadd          v1.4h,  v1.4h,  v3.4h
111cabdff1aSopenharmony_ci        subs            w4,  w4,  #2
112cabdff1aSopenharmony_ci        st1             {v0.4h},  [x5], x1
113cabdff1aSopenharmony_ci        st1             {v1.8b},  [x5], x1
114cabdff1aSopenharmony_ci        b.ne            1b
115cabdff1aSopenharmony_ci        ret
116cabdff1aSopenharmony_ciendfunc
117cabdff1aSopenharmony_ci
118cabdff1aSopenharmony_ci
119cabdff1aSopenharmony_ci// Extract a vector from src1-src2 and src4-src5 (src1-src3 and src4-src6
120cabdff1aSopenharmony_ci// for size >= 16), and multiply-accumulate into dst1 and dst5 (or
121cabdff1aSopenharmony_ci// dst1-dst2 and dst5-dst6 for size >= 8 and dst1-dst4 and dst5-dst8
122cabdff1aSopenharmony_ci// for size >= 16)
123cabdff1aSopenharmony_ci.macro extmlal dst1, dst2, dst3, dst4, dst5, dst6, dst7, dst8, src1, src2, src3, src4, src5, src6, offset, size
124cabdff1aSopenharmony_ci        ext             v20.16b, \src1\().16b, \src2\().16b, #(2*\offset)
125cabdff1aSopenharmony_ci        ext             v22.16b, \src4\().16b, \src5\().16b, #(2*\offset)
126cabdff1aSopenharmony_ci        smlal           \dst1\().4s, v20.4h, v0.h[\offset]
127cabdff1aSopenharmony_ci        smlal           \dst5\().4s, v22.4h, v0.h[\offset]
128cabdff1aSopenharmony_ci.if \size >= 16
129cabdff1aSopenharmony_ci        ext             v21.16b, \src2\().16b, \src3\().16b, #(2*\offset)
130cabdff1aSopenharmony_ci        ext             v23.16b, \src5\().16b, \src6\().16b, #(2*\offset)
131cabdff1aSopenharmony_ci.endif
132cabdff1aSopenharmony_ci.if \size >= 8
133cabdff1aSopenharmony_ci        smlal2          \dst2\().4s, v20.8h, v0.h[\offset]
134cabdff1aSopenharmony_ci        smlal2          \dst6\().4s, v22.8h, v0.h[\offset]
135cabdff1aSopenharmony_ci.endif
136cabdff1aSopenharmony_ci.if \size >= 16
137cabdff1aSopenharmony_ci        smlal           \dst3\().4s, v21.4h, v0.h[\offset]
138cabdff1aSopenharmony_ci        smlal           \dst7\().4s, v23.4h, v0.h[\offset]
139cabdff1aSopenharmony_ci        smlal2          \dst4\().4s, v21.8h, v0.h[\offset]
140cabdff1aSopenharmony_ci        smlal2          \dst8\().4s, v23.8h, v0.h[\offset]
141cabdff1aSopenharmony_ci.endif
142cabdff1aSopenharmony_ci.endm
143cabdff1aSopenharmony_ci
144cabdff1aSopenharmony_ci
145cabdff1aSopenharmony_ci// Instantiate a horizontal filter function for the given size.
146cabdff1aSopenharmony_ci// This can work on 4, 8 or 16 pixels in parallel; for larger
147cabdff1aSopenharmony_ci// widths it will do 16 pixels at a time and loop horizontally.
148cabdff1aSopenharmony_ci// The actual width (in bytes) is passed in x5, the height in w4 and
149cabdff1aSopenharmony_ci// the filter coefficients in x9.
150cabdff1aSopenharmony_ci.macro do_8tap_h type, size
151cabdff1aSopenharmony_cifunction \type\()_8tap_\size\()h
152cabdff1aSopenharmony_ci        sub             x2,  x2,  #6
153cabdff1aSopenharmony_ci        add             x6,  x0,  x1
154cabdff1aSopenharmony_ci        add             x7,  x2,  x3
155cabdff1aSopenharmony_ci        add             x1,  x1,  x1
156cabdff1aSopenharmony_ci        add             x3,  x3,  x3
157cabdff1aSopenharmony_ci        // Only size >= 16 loops horizontally and needs
158cabdff1aSopenharmony_ci        // reduced dst stride
159cabdff1aSopenharmony_ci.if \size >= 16
160cabdff1aSopenharmony_ci        sub             x1,  x1,  x5
161cabdff1aSopenharmony_ci.endif
162cabdff1aSopenharmony_ci        // size >= 16 loads two qwords and increments r2,
163cabdff1aSopenharmony_ci        // for size 4/8 it's enough with one qword and no
164cabdff1aSopenharmony_ci        // postincrement
165cabdff1aSopenharmony_ci.if \size >= 16
166cabdff1aSopenharmony_ci        sub             x3,  x3,  x5
167cabdff1aSopenharmony_ci        sub             x3,  x3,  #16
168cabdff1aSopenharmony_ci.endif
169cabdff1aSopenharmony_ci        // Load the filter vector
170cabdff1aSopenharmony_ci        ld1             {v0.8h},  [x9]
171cabdff1aSopenharmony_ci1:
172cabdff1aSopenharmony_ci.if \size >= 16
173cabdff1aSopenharmony_ci        mov             x9,  x5
174cabdff1aSopenharmony_ci.endif
175cabdff1aSopenharmony_ci        // Load src
176cabdff1aSopenharmony_ci.if \size >= 16
177cabdff1aSopenharmony_ci        ld1             {v5.8h,  v6.8h,  v7.8h},  [x2], #48
178cabdff1aSopenharmony_ci        ld1             {v16.8h, v17.8h, v18.8h}, [x7], #48
179cabdff1aSopenharmony_ci.else
180cabdff1aSopenharmony_ci        ld1             {v5.8h,  v6.8h},  [x2]
181cabdff1aSopenharmony_ci        ld1             {v16.8h, v17.8h}, [x7]
182cabdff1aSopenharmony_ci.endif
183cabdff1aSopenharmony_ci2:
184cabdff1aSopenharmony_ci
185cabdff1aSopenharmony_ci        smull           v1.4s,  v5.4h,  v0.h[0]
186cabdff1aSopenharmony_ci        smull           v24.4s, v16.4h, v0.h[0]
187cabdff1aSopenharmony_ci.if \size >= 8
188cabdff1aSopenharmony_ci        smull2          v2.4s,  v5.8h,  v0.h[0]
189cabdff1aSopenharmony_ci        smull2          v25.4s, v16.8h, v0.h[0]
190cabdff1aSopenharmony_ci.endif
191cabdff1aSopenharmony_ci.if \size >= 16
192cabdff1aSopenharmony_ci        smull           v3.4s,  v6.4h,  v0.h[0]
193cabdff1aSopenharmony_ci        smull           v26.4s, v17.4h, v0.h[0]
194cabdff1aSopenharmony_ci        smull2          v4.4s,  v6.8h,  v0.h[0]
195cabdff1aSopenharmony_ci        smull2          v27.4s, v17.8h, v0.h[0]
196cabdff1aSopenharmony_ci.endif
197cabdff1aSopenharmony_ci        extmlal         v1,  v2,  v3,  v4,  v24, v25, v26, v27, v5,  v6,  v7,  v16, v17, v18, 1, \size
198cabdff1aSopenharmony_ci        extmlal         v1,  v2,  v3,  v4,  v24, v25, v26, v27, v5,  v6,  v7,  v16, v17, v18, 2, \size
199cabdff1aSopenharmony_ci        extmlal         v1,  v2,  v3,  v4,  v24, v25, v26, v27, v5,  v6,  v7,  v16, v17, v18, 3, \size
200cabdff1aSopenharmony_ci        extmlal         v1,  v2,  v3,  v4,  v24, v25, v26, v27, v5,  v6,  v7,  v16, v17, v18, 4, \size
201cabdff1aSopenharmony_ci        extmlal         v1,  v2,  v3,  v4,  v24, v25, v26, v27, v5,  v6,  v7,  v16, v17, v18, 5, \size
202cabdff1aSopenharmony_ci        extmlal         v1,  v2,  v3,  v4,  v24, v25, v26, v27, v5,  v6,  v7,  v16, v17, v18, 6, \size
203cabdff1aSopenharmony_ci        extmlal         v1,  v2,  v3,  v4,  v24, v25, v26, v27, v5,  v6,  v7,  v16, v17, v18, 7, \size
204cabdff1aSopenharmony_ci
205cabdff1aSopenharmony_ci        // Round, shift and saturate
206cabdff1aSopenharmony_ci        // The sqrshrun takes care of clamping negative values to zero, but
207cabdff1aSopenharmony_ci        // we manually need to do umin with the max pixel value.
208cabdff1aSopenharmony_ci        sqrshrun        v1.4h,  v1.4s,  #7
209cabdff1aSopenharmony_ci        sqrshrun        v24.4h, v24.4s, #7
210cabdff1aSopenharmony_ci.if \size >= 8
211cabdff1aSopenharmony_ci        sqrshrun2       v1.8h,  v2.4s,  #7
212cabdff1aSopenharmony_ci        sqrshrun2       v24.8h, v25.4s, #7
213cabdff1aSopenharmony_ci        umin            v1.8h,  v1.8h,  v31.8h
214cabdff1aSopenharmony_ci        umin            v24.8h, v24.8h, v31.8h
215cabdff1aSopenharmony_ci.if \size >= 16
216cabdff1aSopenharmony_ci        sqrshrun        v2.4h,  v3.4s,  #7
217cabdff1aSopenharmony_ci        sqrshrun        v25.4h, v26.4s, #7
218cabdff1aSopenharmony_ci        sqrshrun2       v2.8h,  v4.4s,  #7
219cabdff1aSopenharmony_ci        sqrshrun2       v25.8h, v27.4s, #7
220cabdff1aSopenharmony_ci        umin            v2.8h,  v2.8h,  v31.8h
221cabdff1aSopenharmony_ci        umin            v25.8h, v25.8h, v31.8h
222cabdff1aSopenharmony_ci.endif
223cabdff1aSopenharmony_ci.else
224cabdff1aSopenharmony_ci        umin            v1.4h,  v1.4h,  v31.4h
225cabdff1aSopenharmony_ci        umin            v24.4h, v24.4h, v31.4h
226cabdff1aSopenharmony_ci.endif
227cabdff1aSopenharmony_ci        // Average
228cabdff1aSopenharmony_ci.ifc \type,avg
229cabdff1aSopenharmony_ci.if \size >= 16
230cabdff1aSopenharmony_ci        ld1             {v3.8h,  v4.8h},  [x0]
231cabdff1aSopenharmony_ci        ld1             {v29.8h, v30.8h}, [x6]
232cabdff1aSopenharmony_ci        urhadd          v1.8h,  v1.8h,  v3.8h
233cabdff1aSopenharmony_ci        urhadd          v2.8h,  v2.8h,  v4.8h
234cabdff1aSopenharmony_ci        urhadd          v24.8h, v24.8h, v29.8h
235cabdff1aSopenharmony_ci        urhadd          v25.8h, v25.8h, v30.8h
236cabdff1aSopenharmony_ci.elseif \size >= 8
237cabdff1aSopenharmony_ci        ld1             {v3.8h},  [x0]
238cabdff1aSopenharmony_ci        ld1             {v4.8h},  [x6]
239cabdff1aSopenharmony_ci        urhadd          v1.8h,  v1.8h,  v3.8h
240cabdff1aSopenharmony_ci        urhadd          v24.8h, v24.8h, v4.8h
241cabdff1aSopenharmony_ci.else
242cabdff1aSopenharmony_ci        ld1             {v3.4h},  [x0]
243cabdff1aSopenharmony_ci        ld1             {v4.4h},  [x6]
244cabdff1aSopenharmony_ci        urhadd          v1.4h,  v1.4h,  v3.4h
245cabdff1aSopenharmony_ci        urhadd          v24.4h, v24.4h, v4.4h
246cabdff1aSopenharmony_ci.endif
247cabdff1aSopenharmony_ci.endif
248cabdff1aSopenharmony_ci        // Store and loop horizontally (for size >= 16)
249cabdff1aSopenharmony_ci.if \size >= 16
250cabdff1aSopenharmony_ci        subs            x9,  x9,  #32
251cabdff1aSopenharmony_ci        st1             {v1.8h,  v2.8h},  [x0], #32
252cabdff1aSopenharmony_ci        st1             {v24.8h, v25.8h}, [x6], #32
253cabdff1aSopenharmony_ci        b.eq            3f
254cabdff1aSopenharmony_ci        mov             v5.16b,  v7.16b
255cabdff1aSopenharmony_ci        mov             v16.16b, v18.16b
256cabdff1aSopenharmony_ci        ld1             {v6.8h,  v7.8h},  [x2], #32
257cabdff1aSopenharmony_ci        ld1             {v17.8h, v18.8h}, [x7], #32
258cabdff1aSopenharmony_ci        b               2b
259cabdff1aSopenharmony_ci.elseif \size == 8
260cabdff1aSopenharmony_ci        st1             {v1.8h},  [x0]
261cabdff1aSopenharmony_ci        st1             {v24.8h}, [x6]
262cabdff1aSopenharmony_ci.else // \size == 4
263cabdff1aSopenharmony_ci        st1             {v1.4h},  [x0]
264cabdff1aSopenharmony_ci        st1             {v24.4h}, [x6]
265cabdff1aSopenharmony_ci.endif
266cabdff1aSopenharmony_ci3:
267cabdff1aSopenharmony_ci        // Loop vertically
268cabdff1aSopenharmony_ci        add             x0,  x0,  x1
269cabdff1aSopenharmony_ci        add             x6,  x6,  x1
270cabdff1aSopenharmony_ci        add             x2,  x2,  x3
271cabdff1aSopenharmony_ci        add             x7,  x7,  x3
272cabdff1aSopenharmony_ci        subs            w4,  w4,  #2
273cabdff1aSopenharmony_ci        b.ne            1b
274cabdff1aSopenharmony_ci        ret
275cabdff1aSopenharmony_ciendfunc
276cabdff1aSopenharmony_ci.endm
277cabdff1aSopenharmony_ci
278cabdff1aSopenharmony_ci.macro do_8tap_h_size size
279cabdff1aSopenharmony_cido_8tap_h put, \size
280cabdff1aSopenharmony_cido_8tap_h avg, \size
281cabdff1aSopenharmony_ci.endm
282cabdff1aSopenharmony_ci
283cabdff1aSopenharmony_cido_8tap_h_size 4
284cabdff1aSopenharmony_cido_8tap_h_size 8
285cabdff1aSopenharmony_cido_8tap_h_size 16
286cabdff1aSopenharmony_ci
287cabdff1aSopenharmony_ci.macro do_8tap_h_func type, filter, offset, size, bpp
288cabdff1aSopenharmony_cifunction ff_vp9_\type\()_\filter\()\size\()_h_\bpp\()_neon, export=1
289cabdff1aSopenharmony_ci        mvni            v31.8h, #((0xff << (\bpp - 8)) & 0xff), lsl #8
290cabdff1aSopenharmony_ci        movrel          x6,  X(ff_vp9_subpel_filters), 256*\offset
291cabdff1aSopenharmony_ci        cmp             w5,  #8
292cabdff1aSopenharmony_ci        add             x9,  x6,  w5, uxtw #4
293cabdff1aSopenharmony_ci        mov             x5,  #2*\size
294cabdff1aSopenharmony_ci.if \size >= 16
295cabdff1aSopenharmony_ci        b               \type\()_8tap_16h
296cabdff1aSopenharmony_ci.else
297cabdff1aSopenharmony_ci        b               \type\()_8tap_\size\()h
298cabdff1aSopenharmony_ci.endif
299cabdff1aSopenharmony_ciendfunc
300cabdff1aSopenharmony_ci.endm
301cabdff1aSopenharmony_ci
302cabdff1aSopenharmony_ci.macro do_8tap_h_filters size, bpp
303cabdff1aSopenharmony_cido_8tap_h_func put, regular, 1, \size, \bpp
304cabdff1aSopenharmony_cido_8tap_h_func avg, regular, 1, \size, \bpp
305cabdff1aSopenharmony_cido_8tap_h_func put, sharp,   2, \size, \bpp
306cabdff1aSopenharmony_cido_8tap_h_func avg, sharp,   2, \size, \bpp
307cabdff1aSopenharmony_cido_8tap_h_func put, smooth,  0, \size, \bpp
308cabdff1aSopenharmony_cido_8tap_h_func avg, smooth,  0, \size, \bpp
309cabdff1aSopenharmony_ci.endm
310cabdff1aSopenharmony_ci
311cabdff1aSopenharmony_ci.macro do_8tap_h_filters_bpp bpp
312cabdff1aSopenharmony_cido_8tap_h_filters 64, \bpp
313cabdff1aSopenharmony_cido_8tap_h_filters 32, \bpp
314cabdff1aSopenharmony_cido_8tap_h_filters 16, \bpp
315cabdff1aSopenharmony_cido_8tap_h_filters 8,  \bpp
316cabdff1aSopenharmony_cido_8tap_h_filters 4,  \bpp
317cabdff1aSopenharmony_ci.endm
318cabdff1aSopenharmony_ci
319cabdff1aSopenharmony_cido_8tap_h_filters_bpp 10
320cabdff1aSopenharmony_cido_8tap_h_filters_bpp 12
321cabdff1aSopenharmony_ci
322cabdff1aSopenharmony_ci
323cabdff1aSopenharmony_ci// Vertical filters
324cabdff1aSopenharmony_ci
325cabdff1aSopenharmony_ci// Round, shift and saturate and store reg1-reg4
326cabdff1aSopenharmony_ci.macro do_store4 reg1, reg2, reg3, reg4, tmp1, tmp2, tmp3, tmp4, minreg, type
327cabdff1aSopenharmony_ci        sqrshrun        \reg1\().4h,  \reg1\().4s, #7
328cabdff1aSopenharmony_ci        sqrshrun        \reg2\().4h,  \reg2\().4s, #7
329cabdff1aSopenharmony_ci        sqrshrun        \reg3\().4h,  \reg3\().4s, #7
330cabdff1aSopenharmony_ci        sqrshrun        \reg4\().4h,  \reg4\().4s, #7
331cabdff1aSopenharmony_ci.ifc \type,avg
332cabdff1aSopenharmony_ci        ld1             {\tmp1\().4h},  [x7], x1
333cabdff1aSopenharmony_ci        ld1             {\tmp2\().4h},  [x7], x1
334cabdff1aSopenharmony_ci        ld1             {\tmp3\().4h},  [x7], x1
335cabdff1aSopenharmony_ci        ld1             {\tmp4\().4h},  [x7], x1
336cabdff1aSopenharmony_ci.endif
337cabdff1aSopenharmony_ci        umin            \reg1\().4h,  \reg1\().4h,  \minreg\().4h
338cabdff1aSopenharmony_ci        umin            \reg2\().4h,  \reg2\().4h,  \minreg\().4h
339cabdff1aSopenharmony_ci        umin            \reg3\().4h,  \reg3\().4h,  \minreg\().4h
340cabdff1aSopenharmony_ci        umin            \reg4\().4h,  \reg4\().4h,  \minreg\().4h
341cabdff1aSopenharmony_ci.ifc \type,avg
342cabdff1aSopenharmony_ci        urhadd          \reg1\().4h,  \reg1\().4h,  \tmp1\().4h
343cabdff1aSopenharmony_ci        urhadd          \reg2\().4h,  \reg2\().4h,  \tmp2\().4h
344cabdff1aSopenharmony_ci        urhadd          \reg3\().4h,  \reg3\().4h,  \tmp3\().4h
345cabdff1aSopenharmony_ci        urhadd          \reg4\().4h,  \reg4\().4h,  \tmp4\().4h
346cabdff1aSopenharmony_ci.endif
347cabdff1aSopenharmony_ci        st1             {\reg1\().4h},  [x0], x1
348cabdff1aSopenharmony_ci        st1             {\reg2\().4h},  [x0], x1
349cabdff1aSopenharmony_ci        st1             {\reg3\().4h},  [x0], x1
350cabdff1aSopenharmony_ci        st1             {\reg4\().4h},  [x0], x1
351cabdff1aSopenharmony_ci.endm
352cabdff1aSopenharmony_ci
353cabdff1aSopenharmony_ci// Round, shift and saturate and store reg1-8, where
354cabdff1aSopenharmony_ci// reg1-2, reg3-4 etc pairwise correspond to 4 rows.
355cabdff1aSopenharmony_ci.macro do_store8 reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8, minreg, type
356cabdff1aSopenharmony_ci        sqrshrun        \reg1\().4h,  \reg1\().4s, #7
357cabdff1aSopenharmony_ci        sqrshrun2       \reg1\().8h,  \reg2\().4s, #7
358cabdff1aSopenharmony_ci        sqrshrun        \reg2\().4h,  \reg3\().4s, #7
359cabdff1aSopenharmony_ci        sqrshrun2       \reg2\().8h,  \reg4\().4s, #7
360cabdff1aSopenharmony_ci        sqrshrun        \reg3\().4h,  \reg5\().4s, #7
361cabdff1aSopenharmony_ci        sqrshrun2       \reg3\().8h,  \reg6\().4s, #7
362cabdff1aSopenharmony_ci        sqrshrun        \reg4\().4h,  \reg7\().4s, #7
363cabdff1aSopenharmony_ci        sqrshrun2       \reg4\().8h,  \reg8\().4s, #7
364cabdff1aSopenharmony_ci.ifc \type,avg
365cabdff1aSopenharmony_ci        ld1             {\reg5\().8h},  [x7], x1
366cabdff1aSopenharmony_ci        ld1             {\reg6\().8h},  [x7], x1
367cabdff1aSopenharmony_ci        ld1             {\reg7\().8h},  [x7], x1
368cabdff1aSopenharmony_ci        ld1             {\reg8\().8h},  [x7], x1
369cabdff1aSopenharmony_ci.endif
370cabdff1aSopenharmony_ci        umin            \reg1\().8h,  \reg1\().8h,  \minreg\().8h
371cabdff1aSopenharmony_ci        umin            \reg2\().8h,  \reg2\().8h,  \minreg\().8h
372cabdff1aSopenharmony_ci        umin            \reg3\().8h,  \reg3\().8h,  \minreg\().8h
373cabdff1aSopenharmony_ci        umin            \reg4\().8h,  \reg4\().8h,  \minreg\().8h
374cabdff1aSopenharmony_ci.ifc \type,avg
375cabdff1aSopenharmony_ci        urhadd          \reg1\().8h,  \reg1\().8h,  \reg5\().8h
376cabdff1aSopenharmony_ci        urhadd          \reg2\().8h,  \reg2\().8h,  \reg6\().8h
377cabdff1aSopenharmony_ci        urhadd          \reg3\().8h,  \reg3\().8h,  \reg7\().8h
378cabdff1aSopenharmony_ci        urhadd          \reg4\().8h,  \reg4\().8h,  \reg8\().8h
379cabdff1aSopenharmony_ci.endif
380cabdff1aSopenharmony_ci        st1             {\reg1\().8h},  [x0], x1
381cabdff1aSopenharmony_ci        st1             {\reg2\().8h},  [x0], x1
382cabdff1aSopenharmony_ci        st1             {\reg3\().8h},  [x0], x1
383cabdff1aSopenharmony_ci        st1             {\reg4\().8h},  [x0], x1
384cabdff1aSopenharmony_ci.endm
385cabdff1aSopenharmony_ci
386cabdff1aSopenharmony_ci// Evaluate the filter twice in parallel, from the inputs src1-src9 into dst1-dst2
387cabdff1aSopenharmony_ci// (src1-src8 into dst1, src2-src9 into dst2).
388cabdff1aSopenharmony_ci.macro convolve4 dst1, dst2, src1, src2, src3, src4, src5, src6, src7, src8, src9, tmp1, tmp2
389cabdff1aSopenharmony_ci        smull           \dst1\().4s, \src1\().4h, v0.h[0]
390cabdff1aSopenharmony_ci        smull           \dst2\().4s, \src2\().4h, v0.h[0]
391cabdff1aSopenharmony_ci        smull           \tmp1\().4s, \src2\().4h, v0.h[1]
392cabdff1aSopenharmony_ci        smull           \tmp2\().4s, \src3\().4h, v0.h[1]
393cabdff1aSopenharmony_ci        smlal           \dst1\().4s, \src3\().4h, v0.h[2]
394cabdff1aSopenharmony_ci        smlal           \dst2\().4s, \src4\().4h, v0.h[2]
395cabdff1aSopenharmony_ci        smlal           \tmp1\().4s, \src4\().4h, v0.h[3]
396cabdff1aSopenharmony_ci        smlal           \tmp2\().4s, \src5\().4h, v0.h[3]
397cabdff1aSopenharmony_ci        smlal           \dst1\().4s, \src5\().4h, v0.h[4]
398cabdff1aSopenharmony_ci        smlal           \dst2\().4s, \src6\().4h, v0.h[4]
399cabdff1aSopenharmony_ci        smlal           \tmp1\().4s, \src6\().4h, v0.h[5]
400cabdff1aSopenharmony_ci        smlal           \tmp2\().4s, \src7\().4h, v0.h[5]
401cabdff1aSopenharmony_ci        smlal           \dst1\().4s, \src7\().4h, v0.h[6]
402cabdff1aSopenharmony_ci        smlal           \dst2\().4s, \src8\().4h, v0.h[6]
403cabdff1aSopenharmony_ci        smlal           \tmp1\().4s, \src8\().4h, v0.h[7]
404cabdff1aSopenharmony_ci        smlal           \tmp2\().4s, \src9\().4h, v0.h[7]
405cabdff1aSopenharmony_ci        add             \dst1\().4s, \dst1\().4s, \tmp1\().4s
406cabdff1aSopenharmony_ci        add             \dst2\().4s, \dst2\().4s, \tmp2\().4s
407cabdff1aSopenharmony_ci.endm
408cabdff1aSopenharmony_ci
409cabdff1aSopenharmony_ci// Evaluate the filter twice in parallel, from the inputs src1-src9 into dst1-dst4
410cabdff1aSopenharmony_ci// (src1-src8 into dst1-dst2, src2-src9 into dst3-dst4).
411cabdff1aSopenharmony_ci.macro convolve8 dst1, dst2, dst3, dst4, src1, src2, src3, src4, src5, src6, src7, src8, src9
412cabdff1aSopenharmony_ci        smull           \dst1\().4s, \src1\().4h, v0.h[0]
413cabdff1aSopenharmony_ci        smull2          \dst2\().4s, \src1\().8h, v0.h[0]
414cabdff1aSopenharmony_ci        smull           \dst3\().4s, \src2\().4h, v0.h[0]
415cabdff1aSopenharmony_ci        smull2          \dst4\().4s, \src2\().8h, v0.h[0]
416cabdff1aSopenharmony_ci        smlal           \dst1\().4s, \src2\().4h, v0.h[1]
417cabdff1aSopenharmony_ci        smlal2          \dst2\().4s, \src2\().8h, v0.h[1]
418cabdff1aSopenharmony_ci        smlal           \dst3\().4s, \src3\().4h, v0.h[1]
419cabdff1aSopenharmony_ci        smlal2          \dst4\().4s, \src3\().8h, v0.h[1]
420cabdff1aSopenharmony_ci        smlal           \dst1\().4s, \src3\().4h, v0.h[2]
421cabdff1aSopenharmony_ci        smlal2          \dst2\().4s, \src3\().8h, v0.h[2]
422cabdff1aSopenharmony_ci        smlal           \dst3\().4s, \src4\().4h, v0.h[2]
423cabdff1aSopenharmony_ci        smlal2          \dst4\().4s, \src4\().8h, v0.h[2]
424cabdff1aSopenharmony_ci        smlal           \dst1\().4s, \src4\().4h, v0.h[3]
425cabdff1aSopenharmony_ci        smlal2          \dst2\().4s, \src4\().8h, v0.h[3]
426cabdff1aSopenharmony_ci        smlal           \dst3\().4s, \src5\().4h, v0.h[3]
427cabdff1aSopenharmony_ci        smlal2          \dst4\().4s, \src5\().8h, v0.h[3]
428cabdff1aSopenharmony_ci        smlal           \dst1\().4s, \src5\().4h, v0.h[4]
429cabdff1aSopenharmony_ci        smlal2          \dst2\().4s, \src5\().8h, v0.h[4]
430cabdff1aSopenharmony_ci        smlal           \dst3\().4s, \src6\().4h, v0.h[4]
431cabdff1aSopenharmony_ci        smlal2          \dst4\().4s, \src6\().8h, v0.h[4]
432cabdff1aSopenharmony_ci        smlal           \dst1\().4s, \src6\().4h, v0.h[5]
433cabdff1aSopenharmony_ci        smlal2          \dst2\().4s, \src6\().8h, v0.h[5]
434cabdff1aSopenharmony_ci        smlal           \dst3\().4s, \src7\().4h, v0.h[5]
435cabdff1aSopenharmony_ci        smlal2          \dst4\().4s, \src7\().8h, v0.h[5]
436cabdff1aSopenharmony_ci        smlal           \dst1\().4s, \src7\().4h, v0.h[6]
437cabdff1aSopenharmony_ci        smlal2          \dst2\().4s, \src7\().8h, v0.h[6]
438cabdff1aSopenharmony_ci        smlal           \dst3\().4s, \src8\().4h, v0.h[6]
439cabdff1aSopenharmony_ci        smlal2          \dst4\().4s, \src8\().8h, v0.h[6]
440cabdff1aSopenharmony_ci        smlal           \dst1\().4s, \src8\().4h, v0.h[7]
441cabdff1aSopenharmony_ci        smlal2          \dst2\().4s, \src8\().8h, v0.h[7]
442cabdff1aSopenharmony_ci        smlal           \dst3\().4s, \src9\().4h, v0.h[7]
443cabdff1aSopenharmony_ci        smlal2          \dst4\().4s, \src9\().8h, v0.h[7]
444cabdff1aSopenharmony_ci.endm
445cabdff1aSopenharmony_ci
446cabdff1aSopenharmony_ci// Instantiate a vertical filter function for filtering 8 pixels at a time.
447cabdff1aSopenharmony_ci// The height is passed in x4, the width in x5 and the filter coefficients
448cabdff1aSopenharmony_ci// in x6.
449cabdff1aSopenharmony_ci.macro do_8tap_8v type
450cabdff1aSopenharmony_cifunction \type\()_8tap_8v
451cabdff1aSopenharmony_ci        sub             x2,  x2,  x3, lsl #1
452cabdff1aSopenharmony_ci        sub             x2,  x2,  x3
453cabdff1aSopenharmony_ci        ld1             {v0.8h},  [x6]
454cabdff1aSopenharmony_ci1:
455cabdff1aSopenharmony_ci.ifc \type,avg
456cabdff1aSopenharmony_ci        mov             x7,  x0
457cabdff1aSopenharmony_ci.endif
458cabdff1aSopenharmony_ci        mov             x6,  x4
459cabdff1aSopenharmony_ci
460cabdff1aSopenharmony_ci        ld1             {v17.8h}, [x2], x3
461cabdff1aSopenharmony_ci        ld1             {v18.8h}, [x2], x3
462cabdff1aSopenharmony_ci        ld1             {v19.8h}, [x2], x3
463cabdff1aSopenharmony_ci        ld1             {v20.8h}, [x2], x3
464cabdff1aSopenharmony_ci        ld1             {v21.8h}, [x2], x3
465cabdff1aSopenharmony_ci        ld1             {v22.8h}, [x2], x3
466cabdff1aSopenharmony_ci        ld1             {v23.8h}, [x2], x3
467cabdff1aSopenharmony_ci2:
468cabdff1aSopenharmony_ci        ld1             {v24.8h}, [x2], x3
469cabdff1aSopenharmony_ci        ld1             {v25.8h}, [x2], x3
470cabdff1aSopenharmony_ci        ld1             {v26.8h}, [x2], x3
471cabdff1aSopenharmony_ci        ld1             {v27.8h}, [x2], x3
472cabdff1aSopenharmony_ci
473cabdff1aSopenharmony_ci        convolve8       v2,  v3,  v4,  v5,  v17, v18, v19, v20, v21, v22, v23, v24, v25
474cabdff1aSopenharmony_ci        convolve8       v6,  v7,  v30, v31, v19, v20, v21, v22, v23, v24, v25, v26, v27
475cabdff1aSopenharmony_ci        do_store8       v2,  v3,  v4,  v5,  v6,  v7,  v30, v31, v1,  \type
476cabdff1aSopenharmony_ci
477cabdff1aSopenharmony_ci        subs            x6,  x6,  #4
478cabdff1aSopenharmony_ci        b.eq            8f
479cabdff1aSopenharmony_ci
480cabdff1aSopenharmony_ci        ld1             {v16.8h}, [x2], x3
481cabdff1aSopenharmony_ci        ld1             {v17.8h}, [x2], x3
482cabdff1aSopenharmony_ci        ld1             {v18.8h}, [x2], x3
483cabdff1aSopenharmony_ci        ld1             {v19.8h}, [x2], x3
484cabdff1aSopenharmony_ci        convolve8       v2,  v3,  v4,  v5,  v21, v22, v23, v24, v25, v26, v27, v16, v17
485cabdff1aSopenharmony_ci        convolve8       v6,  v7,  v20, v21, v23, v24, v25, v26, v27, v16, v17, v18, v19
486cabdff1aSopenharmony_ci        do_store8       v2,  v3,  v4,  v5,  v6,  v7,  v20, v21, v1,  \type
487cabdff1aSopenharmony_ci
488cabdff1aSopenharmony_ci        subs            x6,  x6,  #4
489cabdff1aSopenharmony_ci        b.eq            8f
490cabdff1aSopenharmony_ci
491cabdff1aSopenharmony_ci        ld1             {v20.8h}, [x2], x3
492cabdff1aSopenharmony_ci        ld1             {v21.8h}, [x2], x3
493cabdff1aSopenharmony_ci        ld1             {v22.8h}, [x2], x3
494cabdff1aSopenharmony_ci        ld1             {v23.8h}, [x2], x3
495cabdff1aSopenharmony_ci        convolve8       v2,  v3,  v4,  v5,  v25, v26, v27, v16, v17, v18, v19, v20, v21
496cabdff1aSopenharmony_ci        convolve8       v6,  v7,  v24, v25, v27, v16, v17, v18, v19, v20, v21, v22, v23
497cabdff1aSopenharmony_ci        do_store8       v2,  v3,  v4,  v5,  v6,  v7,  v24, v25, v1,  \type
498cabdff1aSopenharmony_ci
499cabdff1aSopenharmony_ci        subs            x6,  x6,  #4
500cabdff1aSopenharmony_ci        b.ne            2b
501cabdff1aSopenharmony_ci
502cabdff1aSopenharmony_ci8:
503cabdff1aSopenharmony_ci        subs            x5,  x5,  #8
504cabdff1aSopenharmony_ci        b.eq            9f
505cabdff1aSopenharmony_ci        // x0 -= h * dst_stride
506cabdff1aSopenharmony_ci        msub            x0,  x1,  x4, x0
507cabdff1aSopenharmony_ci        // x2 -= h * src_stride
508cabdff1aSopenharmony_ci        msub            x2,  x3,  x4, x2
509cabdff1aSopenharmony_ci        // x2 -= 8 * src_stride
510cabdff1aSopenharmony_ci        sub             x2,  x2,  x3, lsl #3
511cabdff1aSopenharmony_ci        // x2 += 1 * src_stride
512cabdff1aSopenharmony_ci        add             x2,  x2,  x3
513cabdff1aSopenharmony_ci        add             x2,  x2,  #16
514cabdff1aSopenharmony_ci        add             x0,  x0,  #16
515cabdff1aSopenharmony_ci        b               1b
516cabdff1aSopenharmony_ci9:
517cabdff1aSopenharmony_ci        ret
518cabdff1aSopenharmony_ciendfunc
519cabdff1aSopenharmony_ci.endm
520cabdff1aSopenharmony_ci
521cabdff1aSopenharmony_cido_8tap_8v put
522cabdff1aSopenharmony_cido_8tap_8v avg
523cabdff1aSopenharmony_ci
524cabdff1aSopenharmony_ci
525cabdff1aSopenharmony_ci// Instantiate a vertical filter function for filtering a 4 pixels wide
526cabdff1aSopenharmony_ci// slice. This only is designed to work for 4 or 8 output lines.
527cabdff1aSopenharmony_ci.macro do_8tap_4v type
528cabdff1aSopenharmony_cifunction \type\()_8tap_4v
529cabdff1aSopenharmony_ci        sub             x2,  x2,  x3, lsl #1
530cabdff1aSopenharmony_ci        sub             x2,  x2,  x3
531cabdff1aSopenharmony_ci        ld1             {v0.8h},  [x6]
532cabdff1aSopenharmony_ci.ifc \type,avg
533cabdff1aSopenharmony_ci        mov             x7,  x0
534cabdff1aSopenharmony_ci.endif
535cabdff1aSopenharmony_ci
536cabdff1aSopenharmony_ci        ld1             {v16.4h}, [x2], x3
537cabdff1aSopenharmony_ci        ld1             {v17.4h}, [x2], x3
538cabdff1aSopenharmony_ci        ld1             {v18.4h}, [x2], x3
539cabdff1aSopenharmony_ci        ld1             {v19.4h}, [x2], x3
540cabdff1aSopenharmony_ci        ld1             {v20.4h}, [x2], x3
541cabdff1aSopenharmony_ci        ld1             {v21.4h}, [x2], x3
542cabdff1aSopenharmony_ci        ld1             {v22.4h}, [x2], x3
543cabdff1aSopenharmony_ci        ld1             {v23.4h}, [x2], x3
544cabdff1aSopenharmony_ci        ld1             {v24.4h}, [x2], x3
545cabdff1aSopenharmony_ci        ld1             {v25.4h}, [x2], x3
546cabdff1aSopenharmony_ci        ld1             {v26.4h}, [x2], x3
547cabdff1aSopenharmony_ci
548cabdff1aSopenharmony_ci        convolve4       v2,  v3,  v16, v17, v18, v19, v20, v21, v22, v23, v24, v30, v31
549cabdff1aSopenharmony_ci        convolve4       v4,  v5,  v18, v19, v20, v21, v22, v23, v24, v25, v26, v30, v31
550cabdff1aSopenharmony_ci        do_store4       v2,  v3,  v4,  v5,  v28, v29, v30, v31, v1,  \type
551cabdff1aSopenharmony_ci
552cabdff1aSopenharmony_ci        subs            x4,  x4,  #4
553cabdff1aSopenharmony_ci        b.eq            9f
554cabdff1aSopenharmony_ci
555cabdff1aSopenharmony_ci        ld1             {v27.4h}, [x2], x3
556cabdff1aSopenharmony_ci        ld1             {v28.4h}, [x2], x3
557cabdff1aSopenharmony_ci        ld1             {v29.4h}, [x2], x3
558cabdff1aSopenharmony_ci        ld1             {v30.4h}, [x2], x3
559cabdff1aSopenharmony_ci
560cabdff1aSopenharmony_ci        convolve4       v2,  v3,  v20, v21, v22, v23, v24, v25, v26, v27, v28, v16, v17
561cabdff1aSopenharmony_ci        convolve4       v4,  v5,  v22, v23, v24, v25, v26, v27, v28, v29, v30, v16, v17
562cabdff1aSopenharmony_ci        do_store4       v2,  v3,  v4,  v5,  v16, v17, v18, v19, v1,  \type
563cabdff1aSopenharmony_ci
564cabdff1aSopenharmony_ci9:
565cabdff1aSopenharmony_ci        ret
566cabdff1aSopenharmony_ciendfunc
567cabdff1aSopenharmony_ci.endm
568cabdff1aSopenharmony_ci
569cabdff1aSopenharmony_cido_8tap_4v put
570cabdff1aSopenharmony_cido_8tap_4v avg
571cabdff1aSopenharmony_ci
572cabdff1aSopenharmony_ci
573cabdff1aSopenharmony_ci.macro do_8tap_v_func type, filter, offset, size, bpp
574cabdff1aSopenharmony_cifunction ff_vp9_\type\()_\filter\()\size\()_v_\bpp\()_neon, export=1
575cabdff1aSopenharmony_ci        uxtw            x4,  w4
576cabdff1aSopenharmony_ci        mvni            v1.8h, #((0xff << (\bpp - 8)) & 0xff), lsl #8
577cabdff1aSopenharmony_ci        movrel          x5,  X(ff_vp9_subpel_filters), 256*\offset
578cabdff1aSopenharmony_ci        add             x6,  x5,  w6, uxtw #4
579cabdff1aSopenharmony_ci        mov             x5,  #\size
580cabdff1aSopenharmony_ci.if \size >= 8
581cabdff1aSopenharmony_ci        b               \type\()_8tap_8v
582cabdff1aSopenharmony_ci.else
583cabdff1aSopenharmony_ci        b               \type\()_8tap_4v
584cabdff1aSopenharmony_ci.endif
585cabdff1aSopenharmony_ciendfunc
586cabdff1aSopenharmony_ci.endm
587cabdff1aSopenharmony_ci
588cabdff1aSopenharmony_ci.macro do_8tap_v_filters size, bpp
589cabdff1aSopenharmony_cido_8tap_v_func put, regular, 1, \size, \bpp
590cabdff1aSopenharmony_cido_8tap_v_func avg, regular, 1, \size, \bpp
591cabdff1aSopenharmony_cido_8tap_v_func put, sharp,   2, \size, \bpp
592cabdff1aSopenharmony_cido_8tap_v_func avg, sharp,   2, \size, \bpp
593cabdff1aSopenharmony_cido_8tap_v_func put, smooth,  0, \size, \bpp
594cabdff1aSopenharmony_cido_8tap_v_func avg, smooth,  0, \size, \bpp
595cabdff1aSopenharmony_ci.endm
596cabdff1aSopenharmony_ci
597cabdff1aSopenharmony_ci.macro do_8tap_v_filters_bpp bpp
598cabdff1aSopenharmony_cido_8tap_v_filters 64, \bpp
599cabdff1aSopenharmony_cido_8tap_v_filters 32, \bpp
600cabdff1aSopenharmony_cido_8tap_v_filters 16, \bpp
601cabdff1aSopenharmony_cido_8tap_v_filters 8,  \bpp
602cabdff1aSopenharmony_cido_8tap_v_filters 4,  \bpp
603cabdff1aSopenharmony_ci.endm
604cabdff1aSopenharmony_ci
605cabdff1aSopenharmony_cido_8tap_v_filters_bpp 10
606cabdff1aSopenharmony_cido_8tap_v_filters_bpp 12
607