xref: /aosp_15_r20/external/libdav1d/src/arm/32/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// r1 = d0/q0
33*c0909341SAndroid Build Coastguard Worker// r2 = d2/q1
34*c0909341SAndroid Build Coastguard Worker.macro pad_top_bot_16 s1, s2, w, stride, r1, r2, align, ret
35*c0909341SAndroid Build Coastguard Worker        tst             r7,  #1 // CDEF_HAVE_LEFT
36*c0909341SAndroid Build Coastguard Worker        beq             2f
37*c0909341SAndroid Build Coastguard Worker        // CDEF_HAVE_LEFT
38*c0909341SAndroid Build Coastguard Worker        tst             r7,  #2 // CDEF_HAVE_RIGHT
39*c0909341SAndroid Build Coastguard Worker        beq             1f
40*c0909341SAndroid Build Coastguard Worker        // CDEF_HAVE_LEFT+CDEF_HAVE_RIGHT
41*c0909341SAndroid Build Coastguard Worker        vldr            s8,  [\s1, #-4]
42*c0909341SAndroid Build Coastguard Worker        vld1.16         {\r1}, [\s1, :\align]
43*c0909341SAndroid Build Coastguard Worker        vldr            s9,  [\s1, #2*\w]
44*c0909341SAndroid Build Coastguard Worker        vldr            s10, [\s2, #-4]
45*c0909341SAndroid Build Coastguard Worker        vld1.16         {\r2}, [\s2, :\align]
46*c0909341SAndroid Build Coastguard Worker        vldr            s11, [\s2, #2*\w]
47*c0909341SAndroid Build Coastguard Worker        vstr            s8,  [r0, #-4]
48*c0909341SAndroid Build Coastguard Worker        vst1.16         {\r1}, [r0, :\align]
49*c0909341SAndroid Build Coastguard Worker        vstr            s9,  [r0, #2*\w]
50*c0909341SAndroid Build Coastguard Worker        add             r0,  r0,  #2*\stride
51*c0909341SAndroid Build Coastguard Worker        vstr            s10, [r0, #-4]
52*c0909341SAndroid Build Coastguard Worker        vst1.16         {\r2}, [r0, :\align]
53*c0909341SAndroid Build Coastguard Worker        vstr            s11, [r0, #2*\w]
54*c0909341SAndroid Build Coastguard Worker.if \ret
55*c0909341SAndroid Build Coastguard Worker        pop             {r4-r8,pc}
56*c0909341SAndroid Build Coastguard Worker.else
57*c0909341SAndroid Build Coastguard Worker        add             r0,  r0,  #2*\stride
58*c0909341SAndroid Build Coastguard Worker        b               3f
59*c0909341SAndroid Build Coastguard Worker.endif
60*c0909341SAndroid Build Coastguard Worker
61*c0909341SAndroid Build Coastguard Worker1:
62*c0909341SAndroid Build Coastguard Worker        // CDEF_HAVE_LEFT+!CDEF_HAVE_RIGHT
63*c0909341SAndroid Build Coastguard Worker        vldr            s8,  [\s1, #-4]
64*c0909341SAndroid Build Coastguard Worker        vld1.16         {\r1}, [\s1, :\align]
65*c0909341SAndroid Build Coastguard Worker        vldr            s9,  [\s2, #-4]
66*c0909341SAndroid Build Coastguard Worker        vld1.16         {\r2}, [\s2, :\align]
67*c0909341SAndroid Build Coastguard Worker        vstr            s8,  [r0, #-4]
68*c0909341SAndroid Build Coastguard Worker        vst1.16         {\r1}, [r0, :\align]
69*c0909341SAndroid Build Coastguard Worker        vstr            s12, [r0, #2*\w]
70*c0909341SAndroid Build Coastguard Worker        add             r0,  r0,  #2*\stride
71*c0909341SAndroid Build Coastguard Worker        vstr            s9,  [r0, #-4]
72*c0909341SAndroid Build Coastguard Worker        vst1.16         {\r2}, [r0, :\align]
73*c0909341SAndroid Build Coastguard Worker        vstr            s12, [r0, #2*\w]
74*c0909341SAndroid Build Coastguard Worker.if \ret
75*c0909341SAndroid Build Coastguard Worker        pop             {r4-r8,pc}
76*c0909341SAndroid Build Coastguard Worker.else
77*c0909341SAndroid Build Coastguard Worker        add             r0,  r0,  #2*\stride
78*c0909341SAndroid Build Coastguard Worker        b               3f
79*c0909341SAndroid Build Coastguard Worker.endif
80*c0909341SAndroid Build Coastguard Worker
81*c0909341SAndroid Build Coastguard Worker2:
82*c0909341SAndroid Build Coastguard Worker        // !CDEF_HAVE_LEFT
83*c0909341SAndroid Build Coastguard Worker        tst             r7,  #2 // CDEF_HAVE_RIGHT
84*c0909341SAndroid Build Coastguard Worker        beq             1f
85*c0909341SAndroid Build Coastguard Worker        // !CDEF_HAVE_LEFT+CDEF_HAVE_RIGHT
86*c0909341SAndroid Build Coastguard Worker        vld1.16         {\r1}, [\s1, :\align]
87*c0909341SAndroid Build Coastguard Worker        vldr            s8,  [\s1, #2*\w]
88*c0909341SAndroid Build Coastguard Worker        vld1.16         {\r2}, [\s2, :\align]
89*c0909341SAndroid Build Coastguard Worker        vldr            s9,  [\s2, #2*\w]
90*c0909341SAndroid Build Coastguard Worker        vstr            s12, [r0, #-4]
91*c0909341SAndroid Build Coastguard Worker        vst1.16         {\r1}, [r0, :\align]
92*c0909341SAndroid Build Coastguard Worker        vstr            s8,  [r0, #2*\w]
93*c0909341SAndroid Build Coastguard Worker        add             r0,  r0,  #2*\stride
94*c0909341SAndroid Build Coastguard Worker        vstr            s12, [r0, #-4]
95*c0909341SAndroid Build Coastguard Worker        vst1.16         {\r2}, [r0, :\align]
96*c0909341SAndroid Build Coastguard Worker        vstr            s9,  [r0, #2*\w]
97*c0909341SAndroid Build Coastguard Worker.if \ret
98*c0909341SAndroid Build Coastguard Worker        pop             {r4-r8,pc}
99*c0909341SAndroid Build Coastguard Worker.else
100*c0909341SAndroid Build Coastguard Worker        add             r0,  r0,  #2*\stride
101*c0909341SAndroid Build Coastguard Worker        b               3f
102*c0909341SAndroid Build Coastguard Worker.endif
103*c0909341SAndroid Build Coastguard Worker
104*c0909341SAndroid Build Coastguard Worker1:
105*c0909341SAndroid Build Coastguard Worker        // !CDEF_HAVE_LEFT+!CDEF_HAVE_RIGHT
106*c0909341SAndroid Build Coastguard Worker        vld1.16         {\r1}, [\s1, :\align]
107*c0909341SAndroid Build Coastguard Worker        vld1.16         {\r2}, [\s2, :\align]
108*c0909341SAndroid Build Coastguard Worker        vstr            s12, [r0, #-4]
109*c0909341SAndroid Build Coastguard Worker        vst1.16         {\r1}, [r0, :\align]
110*c0909341SAndroid Build Coastguard Worker        vstr            s12, [r0, #2*\w]
111*c0909341SAndroid Build Coastguard Worker        add             r0,  r0,  #2*\stride
112*c0909341SAndroid Build Coastguard Worker        vstr            s12, [r0, #-4]
113*c0909341SAndroid Build Coastguard Worker        vst1.16         {\r2}, [r0, :\align]
114*c0909341SAndroid Build Coastguard Worker        vstr            s12, [r0, #2*\w]
115*c0909341SAndroid Build Coastguard Worker.if \ret
116*c0909341SAndroid Build Coastguard Worker        pop             {r4-r8,pc}
117*c0909341SAndroid Build Coastguard Worker.else
118*c0909341SAndroid Build Coastguard Worker        add             r0,  r0,  #2*\stride
119*c0909341SAndroid Build Coastguard Worker.endif
120*c0909341SAndroid Build Coastguard Worker3:
121*c0909341SAndroid Build Coastguard Worker.endm
122*c0909341SAndroid Build Coastguard Worker
123*c0909341SAndroid Build Coastguard Worker// void dav1d_cdef_paddingX_16bpc_neon(uint16_t *tmp, const pixel *src,
124*c0909341SAndroid Build Coastguard Worker//                                     ptrdiff_t src_stride, const pixel (*left)[2],
125*c0909341SAndroid Build Coastguard Worker//                                     const pixel *const top,
126*c0909341SAndroid Build Coastguard Worker//                                     const pixel *const bottom, int h,
127*c0909341SAndroid Build Coastguard Worker//                                     enum CdefEdgeFlags edges);
128*c0909341SAndroid Build Coastguard Worker
129*c0909341SAndroid Build Coastguard Worker// r1 = d0/q0
130*c0909341SAndroid Build Coastguard Worker// r2 = d2/q1
131*c0909341SAndroid Build Coastguard Worker.macro padding_func_16 w, stride, r1, r2, align
132*c0909341SAndroid Build Coastguard Workerfunction cdef_padding\w\()_16bpc_neon, export=1
133*c0909341SAndroid Build Coastguard Worker        push            {r4-r8,lr}
134*c0909341SAndroid Build Coastguard Worker        ldrd            r4,  r5,  [sp, #24]
135*c0909341SAndroid Build Coastguard Worker        ldrd            r6,  r7,  [sp, #32]
136*c0909341SAndroid Build Coastguard Worker        vmov.i16        q3,  #0x8000
137*c0909341SAndroid Build Coastguard Worker        tst             r7,  #4 // CDEF_HAVE_TOP
138*c0909341SAndroid Build Coastguard Worker        bne             1f
139*c0909341SAndroid Build Coastguard Worker        // !CDEF_HAVE_TOP
140*c0909341SAndroid Build Coastguard Worker        sub             r12, r0,  #2*(2*\stride+2)
141*c0909341SAndroid Build Coastguard Worker        vmov.i16        q2,  #0x8000
142*c0909341SAndroid Build Coastguard Worker        vst1.16         {q2,q3}, [r12]!
143*c0909341SAndroid Build Coastguard Worker.if \w == 8
144*c0909341SAndroid Build Coastguard Worker        vst1.16         {q2,q3}, [r12]!
145*c0909341SAndroid Build Coastguard Worker.endif
146*c0909341SAndroid Build Coastguard Worker        b               3f
147*c0909341SAndroid Build Coastguard Worker1:
148*c0909341SAndroid Build Coastguard Worker        // CDEF_HAVE_TOP
149*c0909341SAndroid Build Coastguard Worker        add             r8,  r4,  r2
150*c0909341SAndroid Build Coastguard Worker        sub             r0,  r0,  #2*(2*\stride)
151*c0909341SAndroid Build Coastguard Worker        pad_top_bot_16  r4,  r8,  \w, \stride, \r1, \r2, \align, 0
152*c0909341SAndroid Build Coastguard Worker
153*c0909341SAndroid Build Coastguard Worker        // Middle section
154*c0909341SAndroid Build Coastguard Worker3:
155*c0909341SAndroid Build Coastguard Worker        tst             r7,  #1 // CDEF_HAVE_LEFT
156*c0909341SAndroid Build Coastguard Worker        beq             2f
157*c0909341SAndroid Build Coastguard Worker        // CDEF_HAVE_LEFT
158*c0909341SAndroid Build Coastguard Worker        tst             r7,  #2 // CDEF_HAVE_RIGHT
159*c0909341SAndroid Build Coastguard Worker        beq             1f
160*c0909341SAndroid Build Coastguard Worker        // CDEF_HAVE_LEFT+CDEF_HAVE_RIGHT
161*c0909341SAndroid Build Coastguard Worker0:
162*c0909341SAndroid Build Coastguard Worker        vld1.32         {d2[]}, [r3, :32]!
163*c0909341SAndroid Build Coastguard Worker        vldr            s5,  [r1, #2*\w]
164*c0909341SAndroid Build Coastguard Worker        vld1.16         {\r1}, [r1, :\align], r2
165*c0909341SAndroid Build Coastguard Worker        subs            r6,  r6,  #1
166*c0909341SAndroid Build Coastguard Worker        vstr            s4,  [r0, #-4]
167*c0909341SAndroid Build Coastguard Worker        vst1.16         {\r1}, [r0, :\align]
168*c0909341SAndroid Build Coastguard Worker        vstr            s5,  [r0, #2*\w]
169*c0909341SAndroid Build Coastguard Worker        add             r0,  r0,  #2*\stride
170*c0909341SAndroid Build Coastguard Worker        bgt             0b
171*c0909341SAndroid Build Coastguard Worker        b               3f
172*c0909341SAndroid Build Coastguard Worker1:
173*c0909341SAndroid Build Coastguard Worker        // CDEF_HAVE_LEFT+!CDEF_HAVE_RIGHT
174*c0909341SAndroid Build Coastguard Worker        vld1.32         {d2[]}, [r3, :32]!
175*c0909341SAndroid Build Coastguard Worker        vld1.16         {\r1}, [r1, :\align], r2
176*c0909341SAndroid Build Coastguard Worker        subs            r6,  r6,  #1
177*c0909341SAndroid Build Coastguard Worker        vstr            s4,  [r0, #-4]
178*c0909341SAndroid Build Coastguard Worker        vst1.16         {\r1}, [r0, :\align]
179*c0909341SAndroid Build Coastguard Worker        vstr            s12, [r0, #2*\w]
180*c0909341SAndroid Build Coastguard Worker        add             r0,  r0,  #2*\stride
181*c0909341SAndroid Build Coastguard Worker        bgt             1b
182*c0909341SAndroid Build Coastguard Worker        b               3f
183*c0909341SAndroid Build Coastguard Worker2:
184*c0909341SAndroid Build Coastguard Worker        tst             r7,  #2 // CDEF_HAVE_RIGHT
185*c0909341SAndroid Build Coastguard Worker        beq             1f
186*c0909341SAndroid Build Coastguard Worker        // !CDEF_HAVE_LEFT+CDEF_HAVE_RIGHT
187*c0909341SAndroid Build Coastguard Worker0:
188*c0909341SAndroid Build Coastguard Worker        vldr            s4,  [r1, #2*\w]
189*c0909341SAndroid Build Coastguard Worker        vld1.16         {\r1}, [r1, :\align], r2
190*c0909341SAndroid Build Coastguard Worker        subs            r6,  r6,  #1
191*c0909341SAndroid Build Coastguard Worker        vstr            s12, [r0, #-4]
192*c0909341SAndroid Build Coastguard Worker        vst1.16         {\r1}, [r0, :\align]
193*c0909341SAndroid Build Coastguard Worker        vstr            s4,  [r0, #2*\w]
194*c0909341SAndroid Build Coastguard Worker        add             r0,  r0,  #2*\stride
195*c0909341SAndroid Build Coastguard Worker        bgt             0b
196*c0909341SAndroid Build Coastguard Worker        b               3f
197*c0909341SAndroid Build Coastguard Worker1:
198*c0909341SAndroid Build Coastguard Worker        // !CDEF_HAVE_LEFT+!CDEF_HAVE_RIGHT
199*c0909341SAndroid Build Coastguard Worker        vld1.16         {\r1}, [r1, :\align], r2
200*c0909341SAndroid Build Coastguard Worker        subs            r6,  r6,  #1
201*c0909341SAndroid Build Coastguard Worker        vstr            s12, [r0, #-4]
202*c0909341SAndroid Build Coastguard Worker        vst1.16         {\r1}, [r0, :\align]
203*c0909341SAndroid Build Coastguard Worker        vstr            s12, [r0, #2*\w]
204*c0909341SAndroid Build Coastguard Worker        add             r0,  r0,  #2*\stride
205*c0909341SAndroid Build Coastguard Worker        bgt             1b
206*c0909341SAndroid Build Coastguard Worker
207*c0909341SAndroid Build Coastguard Worker3:
208*c0909341SAndroid Build Coastguard Worker        tst             r7,  #8 // CDEF_HAVE_BOTTOM
209*c0909341SAndroid Build Coastguard Worker        bne             1f
210*c0909341SAndroid Build Coastguard Worker        // !CDEF_HAVE_BOTTOM
211*c0909341SAndroid Build Coastguard Worker        sub             r12, r0,  #4
212*c0909341SAndroid Build Coastguard Worker        vmov.i16        q2,  #0x8000
213*c0909341SAndroid Build Coastguard Worker        vst1.16         {q2,q3}, [r12]!
214*c0909341SAndroid Build Coastguard Worker.if \w == 8
215*c0909341SAndroid Build Coastguard Worker        vst1.16         {q2,q3}, [r12]!
216*c0909341SAndroid Build Coastguard Worker.endif
217*c0909341SAndroid Build Coastguard Worker        pop             {r4-r8,pc}
218*c0909341SAndroid Build Coastguard Worker1:
219*c0909341SAndroid Build Coastguard Worker        // CDEF_HAVE_BOTTOM
220*c0909341SAndroid Build Coastguard Worker        add             r8,  r5,  r2
221*c0909341SAndroid Build Coastguard Worker        pad_top_bot_16  r5,  r8,  \w, \stride, \r1, \r2, \align, 1
222*c0909341SAndroid Build Coastguard Workerendfunc
223*c0909341SAndroid Build Coastguard Worker.endm
224*c0909341SAndroid Build Coastguard Worker
225*c0909341SAndroid Build Coastguard Workerpadding_func_16 8, 16, q0, q1, 128
226*c0909341SAndroid Build Coastguard Workerpadding_func_16 4, 8,  d0, d2, 64
227*c0909341SAndroid Build Coastguard Worker
228*c0909341SAndroid Build Coastguard Workertables
229*c0909341SAndroid Build Coastguard Worker
230*c0909341SAndroid Build Coastguard Workerfilter 8, 16
231*c0909341SAndroid Build Coastguard Workerfilter 4, 16
232*c0909341SAndroid Build Coastguard Worker
233*c0909341SAndroid Build Coastguard Workerfind_dir 16
234