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