xref: /aosp_15_r20/external/libdav1d/src/arm/64/cdef16.S (revision c09093415860a1c2373dacd84c4fde00c507cdfd)
1*c0909341SAndroid Build Coastguard Worker/*
2*c0909341SAndroid Build Coastguard Worker * Copyright © 2018, VideoLAN and dav1d authors
3*c0909341SAndroid Build Coastguard Worker * Copyright © 2020, Martin Storsjo
4*c0909341SAndroid Build Coastguard Worker * All rights reserved.
5*c0909341SAndroid Build Coastguard Worker *
6*c0909341SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
7*c0909341SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met:
8*c0909341SAndroid Build Coastguard Worker *
9*c0909341SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright notice, this
10*c0909341SAndroid Build Coastguard Worker *    list of conditions and the following disclaimer.
11*c0909341SAndroid Build Coastguard Worker *
12*c0909341SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright notice,
13*c0909341SAndroid Build Coastguard Worker *    this list of conditions and the following disclaimer in the documentation
14*c0909341SAndroid Build Coastguard Worker *    and/or other materials provided with the distribution.
15*c0909341SAndroid Build Coastguard Worker *
16*c0909341SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17*c0909341SAndroid Build Coastguard Worker * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18*c0909341SAndroid Build Coastguard Worker * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19*c0909341SAndroid Build Coastguard Worker * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
20*c0909341SAndroid Build Coastguard Worker * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21*c0909341SAndroid Build Coastguard Worker * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22*c0909341SAndroid Build Coastguard Worker * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23*c0909341SAndroid Build Coastguard Worker * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24*c0909341SAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25*c0909341SAndroid Build Coastguard Worker * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*c0909341SAndroid Build Coastguard Worker */
27*c0909341SAndroid Build Coastguard Worker
28*c0909341SAndroid Build Coastguard Worker#include "src/arm/asm.S"
29*c0909341SAndroid Build Coastguard Worker#include "util.S"
30*c0909341SAndroid Build Coastguard Worker#include "cdef_tmpl.S"
31*c0909341SAndroid Build Coastguard Worker
32*c0909341SAndroid Build Coastguard Worker.macro pad_top_bot_16 s1, s2, w, stride, reg, ret
33*c0909341SAndroid Build Coastguard Worker        tst             w7,  #1 // CDEF_HAVE_LEFT
34*c0909341SAndroid Build Coastguard Worker        b.eq            2f
35*c0909341SAndroid Build Coastguard Worker        // CDEF_HAVE_LEFT
36*c0909341SAndroid Build Coastguard Worker        sub             \s1,  \s1,  #4
37*c0909341SAndroid Build Coastguard Worker        sub             \s2,  \s2,  #4
38*c0909341SAndroid Build Coastguard Worker        tst             w7,  #2 // CDEF_HAVE_RIGHT
39*c0909341SAndroid Build Coastguard Worker        b.eq            1f
40*c0909341SAndroid Build Coastguard Worker        // CDEF_HAVE_LEFT+CDEF_HAVE_RIGHT
41*c0909341SAndroid Build Coastguard Worker        ldr             \reg\()0, [\s1]
42*c0909341SAndroid Build Coastguard Worker        ldr             d1,       [\s1, #2*\w]
43*c0909341SAndroid Build Coastguard Worker        ldr             \reg\()2, [\s2]
44*c0909341SAndroid Build Coastguard Worker        ldr             d3,       [\s2, #2*\w]
45*c0909341SAndroid Build Coastguard Worker        str             \reg\()0, [x0]
46*c0909341SAndroid Build Coastguard Worker        str             d1,       [x0, #2*\w]
47*c0909341SAndroid Build Coastguard Worker        add             x0,  x0,  #2*\stride
48*c0909341SAndroid Build Coastguard Worker        str             \reg\()2, [x0]
49*c0909341SAndroid Build Coastguard Worker        str             d3,       [x0, #2*\w]
50*c0909341SAndroid Build Coastguard Worker.if \ret
51*c0909341SAndroid Build Coastguard Worker        ret
52*c0909341SAndroid Build Coastguard Worker.else
53*c0909341SAndroid Build Coastguard Worker        add             x0,  x0,  #2*\stride
54*c0909341SAndroid Build Coastguard Worker        b               3f
55*c0909341SAndroid Build Coastguard Worker.endif
56*c0909341SAndroid Build Coastguard Worker
57*c0909341SAndroid Build Coastguard Worker1:
58*c0909341SAndroid Build Coastguard Worker        // CDEF_HAVE_LEFT+!CDEF_HAVE_RIGHT
59*c0909341SAndroid Build Coastguard Worker        ldr             \reg\()0, [\s1]
60*c0909341SAndroid Build Coastguard Worker        ldr             s1,       [\s1, #2*\w]
61*c0909341SAndroid Build Coastguard Worker        ldr             \reg\()2, [\s2]
62*c0909341SAndroid Build Coastguard Worker        ldr             s3,       [\s2, #2*\w]
63*c0909341SAndroid Build Coastguard Worker        str             \reg\()0, [x0]
64*c0909341SAndroid Build Coastguard Worker        str             s1,       [x0, #2*\w]
65*c0909341SAndroid Build Coastguard Worker        str             s31,      [x0, #2*\w+4]
66*c0909341SAndroid Build Coastguard Worker        add             x0,  x0,  #2*\stride
67*c0909341SAndroid Build Coastguard Worker        str             \reg\()2, [x0]
68*c0909341SAndroid Build Coastguard Worker        str             s3,       [x0, #2*\w]
69*c0909341SAndroid Build Coastguard Worker        str             s31,      [x0, #2*\w+4]
70*c0909341SAndroid Build Coastguard Worker.if \ret
71*c0909341SAndroid Build Coastguard Worker        ret
72*c0909341SAndroid Build Coastguard Worker.else
73*c0909341SAndroid Build Coastguard Worker        add             x0,  x0,  #2*\stride
74*c0909341SAndroid Build Coastguard Worker        b               3f
75*c0909341SAndroid Build Coastguard Worker.endif
76*c0909341SAndroid Build Coastguard Worker
77*c0909341SAndroid Build Coastguard Worker2:
78*c0909341SAndroid Build Coastguard Worker        // !CDEF_HAVE_LEFT
79*c0909341SAndroid Build Coastguard Worker        tst             w7,  #2 // CDEF_HAVE_RIGHT
80*c0909341SAndroid Build Coastguard Worker        b.eq            1f
81*c0909341SAndroid Build Coastguard Worker        // !CDEF_HAVE_LEFT+CDEF_HAVE_RIGHT
82*c0909341SAndroid Build Coastguard Worker        ldr             \reg\()0, [\s1]
83*c0909341SAndroid Build Coastguard Worker        ldr             s1,       [\s1, #2*\w]
84*c0909341SAndroid Build Coastguard Worker        ldr             \reg\()2, [\s2]
85*c0909341SAndroid Build Coastguard Worker        ldr             s3,       [\s2, #2*\w]
86*c0909341SAndroid Build Coastguard Worker        str             s31, [x0]
87*c0909341SAndroid Build Coastguard Worker        stur            \reg\()0, [x0, #4]
88*c0909341SAndroid Build Coastguard Worker        str             s1,       [x0, #4+2*\w]
89*c0909341SAndroid Build Coastguard Worker        add             x0,  x0,  #2*\stride
90*c0909341SAndroid Build Coastguard Worker        str             s31, [x0]
91*c0909341SAndroid Build Coastguard Worker        stur            \reg\()2, [x0, #4]
92*c0909341SAndroid Build Coastguard Worker        str             s3,       [x0, #4+2*\w]
93*c0909341SAndroid Build Coastguard Worker.if \ret
94*c0909341SAndroid Build Coastguard Worker        ret
95*c0909341SAndroid Build Coastguard Worker.else
96*c0909341SAndroid Build Coastguard Worker        add             x0,  x0,  #2*\stride
97*c0909341SAndroid Build Coastguard Worker        b               3f
98*c0909341SAndroid Build Coastguard Worker.endif
99*c0909341SAndroid Build Coastguard Worker
100*c0909341SAndroid Build Coastguard Worker1:
101*c0909341SAndroid Build Coastguard Worker        // !CDEF_HAVE_LEFT+!CDEF_HAVE_RIGHT
102*c0909341SAndroid Build Coastguard Worker        ldr             \reg\()0, [\s1]
103*c0909341SAndroid Build Coastguard Worker        ldr             \reg\()1, [\s2]
104*c0909341SAndroid Build Coastguard Worker        str             s31,      [x0]
105*c0909341SAndroid Build Coastguard Worker        stur            \reg\()0, [x0, #4]
106*c0909341SAndroid Build Coastguard Worker        str             s31,      [x0, #4+2*\w]
107*c0909341SAndroid Build Coastguard Worker        add             x0,  x0,  #2*\stride
108*c0909341SAndroid Build Coastguard Worker        str             s31,      [x0]
109*c0909341SAndroid Build Coastguard Worker        stur            \reg\()1, [x0, #4]
110*c0909341SAndroid Build Coastguard Worker        str             s31,      [x0, #4+2*\w]
111*c0909341SAndroid Build Coastguard Worker.if \ret
112*c0909341SAndroid Build Coastguard Worker        ret
113*c0909341SAndroid Build Coastguard Worker.else
114*c0909341SAndroid Build Coastguard Worker        add             x0,  x0,  #2*\stride
115*c0909341SAndroid Build Coastguard Worker.endif
116*c0909341SAndroid Build Coastguard Worker3:
117*c0909341SAndroid Build Coastguard Worker.endm
118*c0909341SAndroid Build Coastguard Worker
119*c0909341SAndroid Build Coastguard Worker.macro load_n_incr_16 dst, src, incr, w
120*c0909341SAndroid Build Coastguard Worker.if \w == 4
121*c0909341SAndroid Build Coastguard Worker        ld1             {\dst\().4h}, [\src], \incr
122*c0909341SAndroid Build Coastguard Worker.else
123*c0909341SAndroid Build Coastguard Worker        ld1             {\dst\().8h}, [\src], \incr
124*c0909341SAndroid Build Coastguard Worker.endif
125*c0909341SAndroid Build Coastguard Worker.endm
126*c0909341SAndroid Build Coastguard Worker
127*c0909341SAndroid Build Coastguard Worker// void dav1d_cdef_paddingX_16bpc_neon(uint16_t *tmp, const pixel *src,
128*c0909341SAndroid Build Coastguard Worker//                                     ptrdiff_t src_stride, const pixel (*left)[2],
129*c0909341SAndroid Build Coastguard Worker//                                     const pixel *const top,
130*c0909341SAndroid Build Coastguard Worker//                                     const pixel *const bottom, int h,
131*c0909341SAndroid Build Coastguard Worker//                                     enum CdefEdgeFlags edges);
132*c0909341SAndroid Build Coastguard Worker
133*c0909341SAndroid Build Coastguard Worker.macro padding_func_16 w, stride, reg
134*c0909341SAndroid Build Coastguard Workerfunction cdef_padding\w\()_16bpc_neon, export=1
135*c0909341SAndroid Build Coastguard Worker        movi            v30.8h,  #0x80, lsl #8
136*c0909341SAndroid Build Coastguard Worker        mov             v31.16b, v30.16b
137*c0909341SAndroid Build Coastguard Worker        sub             x0,  x0,  #2*(2*\stride+2)
138*c0909341SAndroid Build Coastguard Worker        tst             w7,  #4 // CDEF_HAVE_TOP
139*c0909341SAndroid Build Coastguard Worker        b.ne            1f
140*c0909341SAndroid Build Coastguard Worker        // !CDEF_HAVE_TOP
141*c0909341SAndroid Build Coastguard Worker        st1             {v30.8h, v31.8h}, [x0], #32
142*c0909341SAndroid Build Coastguard Worker.if \w == 8
143*c0909341SAndroid Build Coastguard Worker        st1             {v30.8h, v31.8h}, [x0], #32
144*c0909341SAndroid Build Coastguard Worker.endif
145*c0909341SAndroid Build Coastguard Worker        b               3f
146*c0909341SAndroid Build Coastguard Worker1:
147*c0909341SAndroid Build Coastguard Worker        // CDEF_HAVE_TOP
148*c0909341SAndroid Build Coastguard Worker        add             x9,  x4,  x2
149*c0909341SAndroid Build Coastguard Worker        pad_top_bot_16  x4,  x9, \w, \stride, \reg, 0
150*c0909341SAndroid Build Coastguard Worker
151*c0909341SAndroid Build Coastguard Worker        // Middle section
152*c0909341SAndroid Build Coastguard Worker3:
153*c0909341SAndroid Build Coastguard Worker        tst             w7,  #1 // CDEF_HAVE_LEFT
154*c0909341SAndroid Build Coastguard Worker        b.eq            2f
155*c0909341SAndroid Build Coastguard Worker        // CDEF_HAVE_LEFT
156*c0909341SAndroid Build Coastguard Worker        tst             w7,  #2 // CDEF_HAVE_RIGHT
157*c0909341SAndroid Build Coastguard Worker        b.eq            1f
158*c0909341SAndroid Build Coastguard Worker        // CDEF_HAVE_LEFT+CDEF_HAVE_RIGHT
159*c0909341SAndroid Build Coastguard Worker0:
160*c0909341SAndroid Build Coastguard Worker        ld1             {v0.s}[0], [x3], #4
161*c0909341SAndroid Build Coastguard Worker        ldr             s2,       [x1, #2*\w]
162*c0909341SAndroid Build Coastguard Worker        load_n_incr_16  v1,  x1,  x2,  \w
163*c0909341SAndroid Build Coastguard Worker        subs            w6,  w6,  #1
164*c0909341SAndroid Build Coastguard Worker        str             s0,       [x0]
165*c0909341SAndroid Build Coastguard Worker        stur            \reg\()1, [x0, #4]
166*c0909341SAndroid Build Coastguard Worker        str             s2,       [x0, #4+2*\w]
167*c0909341SAndroid Build Coastguard Worker        add             x0,  x0,  #2*\stride
168*c0909341SAndroid Build Coastguard Worker        b.gt            0b
169*c0909341SAndroid Build Coastguard Worker        b               3f
170*c0909341SAndroid Build Coastguard Worker1:
171*c0909341SAndroid Build Coastguard Worker        // CDEF_HAVE_LEFT+!CDEF_HAVE_RIGHT
172*c0909341SAndroid Build Coastguard Worker        ld1             {v0.s}[0], [x3], #4
173*c0909341SAndroid Build Coastguard Worker        load_n_incr_16  v1,  x1,  x2,  \w
174*c0909341SAndroid Build Coastguard Worker        subs            w6,  w6,  #1
175*c0909341SAndroid Build Coastguard Worker        str             s0,       [x0]
176*c0909341SAndroid Build Coastguard Worker        stur            \reg\()1, [x0, #4]
177*c0909341SAndroid Build Coastguard Worker        str             s31,      [x0, #4+2*\w]
178*c0909341SAndroid Build Coastguard Worker        add             x0,  x0,  #2*\stride
179*c0909341SAndroid Build Coastguard Worker        b.gt            1b
180*c0909341SAndroid Build Coastguard Worker        b               3f
181*c0909341SAndroid Build Coastguard Worker2:
182*c0909341SAndroid Build Coastguard Worker        tst             w7,  #2 // CDEF_HAVE_RIGHT
183*c0909341SAndroid Build Coastguard Worker        b.eq            1f
184*c0909341SAndroid Build Coastguard Worker        // !CDEF_HAVE_LEFT+CDEF_HAVE_RIGHT
185*c0909341SAndroid Build Coastguard Worker0:
186*c0909341SAndroid Build Coastguard Worker        ldr             s1,       [x1, #2*\w]
187*c0909341SAndroid Build Coastguard Worker        load_n_incr_16  v0,  x1,  x2,  \w
188*c0909341SAndroid Build Coastguard Worker        subs            w6,  w6,  #1
189*c0909341SAndroid Build Coastguard Worker        str             s31,      [x0]
190*c0909341SAndroid Build Coastguard Worker        stur            \reg\()0, [x0, #4]
191*c0909341SAndroid Build Coastguard Worker        str             s1,       [x0, #4+2*\w]
192*c0909341SAndroid Build Coastguard Worker        add             x0,  x0,  #2*\stride
193*c0909341SAndroid Build Coastguard Worker        b.gt            0b
194*c0909341SAndroid Build Coastguard Worker        b               3f
195*c0909341SAndroid Build Coastguard Worker1:
196*c0909341SAndroid Build Coastguard Worker        // !CDEF_HAVE_LEFT+!CDEF_HAVE_RIGHT
197*c0909341SAndroid Build Coastguard Worker        load_n_incr_16  v0,  x1,  x2,  \w
198*c0909341SAndroid Build Coastguard Worker        subs            w6,  w6,  #1
199*c0909341SAndroid Build Coastguard Worker        str             s31,      [x0]
200*c0909341SAndroid Build Coastguard Worker        stur            \reg\()0, [x0, #4]
201*c0909341SAndroid Build Coastguard Worker        str             s31,      [x0, #4+2*\w]
202*c0909341SAndroid Build Coastguard Worker        add             x0,  x0,  #2*\stride
203*c0909341SAndroid Build Coastguard Worker        b.gt            1b
204*c0909341SAndroid Build Coastguard Worker
205*c0909341SAndroid Build Coastguard Worker3:
206*c0909341SAndroid Build Coastguard Worker        tst             w7,  #8 // CDEF_HAVE_BOTTOM
207*c0909341SAndroid Build Coastguard Worker        b.ne            1f
208*c0909341SAndroid Build Coastguard Worker        // !CDEF_HAVE_BOTTOM
209*c0909341SAndroid Build Coastguard Worker        st1             {v30.8h, v31.8h}, [x0], #32
210*c0909341SAndroid Build Coastguard Worker.if \w == 8
211*c0909341SAndroid Build Coastguard Worker        st1             {v30.8h, v31.8h}, [x0], #32
212*c0909341SAndroid Build Coastguard Worker.endif
213*c0909341SAndroid Build Coastguard Worker        ret
214*c0909341SAndroid Build Coastguard Worker1:
215*c0909341SAndroid Build Coastguard Worker        // CDEF_HAVE_BOTTOM
216*c0909341SAndroid Build Coastguard Worker        add             x9,  x5,  x2
217*c0909341SAndroid Build Coastguard Worker        pad_top_bot_16  x5,  x9, \w, \stride, \reg, 1
218*c0909341SAndroid Build Coastguard Workerendfunc
219*c0909341SAndroid Build Coastguard Worker.endm
220*c0909341SAndroid Build Coastguard Worker
221*c0909341SAndroid Build Coastguard Workerpadding_func_16 8, 16, q
222*c0909341SAndroid Build Coastguard Workerpadding_func_16 4, 8,  d
223*c0909341SAndroid Build Coastguard Worker
224*c0909341SAndroid Build Coastguard Workertables
225*c0909341SAndroid Build Coastguard Worker
226*c0909341SAndroid Build Coastguard Workerfilter 8, 16
227*c0909341SAndroid Build Coastguard Workerfilter 4, 16
228*c0909341SAndroid Build Coastguard Worker
229*c0909341SAndroid Build Coastguard Workerfind_dir 16
230