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