Home | History | Annotate | Download | only in arm
      1 @/******************************************************************************
      2 @ *
      3 @ * Copyright (C) 2015 The Android Open Source Project
      4 @ *
      5 @ * Licensed under the Apache License, Version 2.0 (the "License");
      6 @ * you may not use this file except in compliance with the License.
      7 @ * You may obtain a copy of the License at:
      8 @ *
      9 @ * http://www.apache.org/licenses/LICENSE-2.0
     10 @ *
     11 @ * Unless required by applicable law or agreed to in writing, software
     12 @ * distributed under the License is distributed on an "AS IS" BASIS,
     13 @ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 @ * See the License for the specific language governing permissions and
     15 @ * limitations under the License.
     16 @ *
     17 @ *****************************************************************************
     18 @ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
     19 @*/
     20 @/*****************************************************************************/
     21 @/*                                                                           */
     22 @/*  File Name         : ih264_deblk_luma_a9.s                                */
     23 @/*                                                                           */
     24 @/*  Description       : Contains function definitions for deblocking luma    */
     25 @/*                      edge. Functions are coded in NEON assembly and can   */
     26 @/*                      be compiled using ARM RVDS.                          */
     27 @/*                                                                           */
     28 @/*  List of Functions : ih264_deblk_luma_vert_bs4_a9()                       */
     29 @/*                      ih264_deblk_luma_vert_bslt4_a9()                     */
     30 @/*                      ih264_deblk_luma_horz_bs4_a9()                       */
     31 @/*                      ih264_deblk_luma_horz_bslt4_a9()                     */
     32 @/*                      ih264_deblk_luma_vert_bs4_mbaff_a9()                 */
     33 @/*                      ih264_deblk_luma_vert_bslt4_mbaff_a9()               */
     34 @/*                                                                           */
     35 @/*  Issues / Problems : None                                                 */
     36 @/*                                                                           */
     37 @/*  Revision History  :                                                      */
     38 @/*                                                                           */
     39 @/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
     40 @/*         28 11 2013   Ittiam          Draft                                */
     41 @/*         05 01 2015   Kaushik         Added double-call functions for      */
     42 @/*                      Senthoor        vertical deblocking.                 */
     43 @/*                                                                           */
     44 @/*****************************************************************************/
     45 
     46 
     47 .text
     48 .p2align 2
     49 
     50 @**
     51 @*******************************************************************************
     52 @*
     53 @* @brief
     54 @*     Performs filtering of a luma block horizontal edge for cases where the
     55 @*     boundary strength is less than 4
     56 @*
     57 @* @par Description:
     58 @*    This operation is described in  Sec. 8.7.2.4 under the title
     59 @*    "Filtering process for edges for bS equal to 4" in ITU T Rec H.264.
     60 @*
     61 @* @param[in] r0 - pu1_src
     62 @*  Pointer to the src sample q0
     63 @*
     64 @* @param[in] r1 - src_strd
     65 @*  Source stride
     66 @*
     67 @* @param[in] r2 - alpha
     68 @*  Alpha Value for the boundary
     69 @*
     70 @* @param[in] r3 - beta
     71 @*  Beta Value for the boundary
     72 @*
     73 @* @param[in] sp(0) - u4_bs
     74 @*  Packed Boundary strength array
     75 @*
     76 @* @param[in] sp(4) - pu1_cliptab
     77 @*  tc0_table
     78 @*
     79 @* @returns
     80 @*  None
     81 @*
     82 @* @remarks
     83 @*  None
     84 @*
     85 @*******************************************************************************
     86 @*
     87 
     88     .global ih264_deblk_luma_horz_bslt4_a9
     89 
     90 ih264_deblk_luma_horz_bslt4_a9:
     91 
     92     stmfd         sp!, {r4-r7, lr}
     93 
     94     ldrd          r4, r5, [sp, #0x14]   @r4 = ui_Bs , r5 = *puc_ClpTab
     95     vpush         {d8 - d15}
     96     sub           r0, r0, r1, lsl #1    @R1 = uc_Horizonpad
     97     sub           r0, r0, r1            @r0 pointer to p2
     98     rev           r4, r4                @
     99     vld1.8        {q5}, [r0], r1        @p2 values are loaded into q5
    100     vmov.32       d12[0], r4            @d12[0] = ui_Bs
    101     mov           r6, r0                @keeping backup of pointer to p1
    102     vld1.8        {q4}, [r0], r1        @p1 values are loaded into q4
    103     mov           r7, r0                @keeping backup of pointer to p0
    104     vld1.8        {q3}, [r0], r1        @p0 values are loaded into q3
    105     vmovl.u8      q6, d12               @q6 = uc_Bs in each 16 bt scalar
    106     vld1.8        {q0}, [r0], r1        @q0 values are loaded into q0
    107     vabd.u8       q13, q4, q3           @Q13 = ABS(p1 - p0)
    108     vld1.8        {q1}, [r0], r1        @q1 values are loaded into q1
    109     vabd.u8       q11, q3, q0           @Q11 = ABS(p0 - q0)
    110     vld1.32       d16[0], [r5]          @D16[0] contains cliptab
    111     vabd.u8       q12, q1, q0           @Q12 = ABS(q1 - q0)
    112     vld1.8        {q2}, [r0], r1        @q2 values are loaded into q2
    113     vtbl.8        d14, {d16}, d12       @
    114     vdup.8        q10, r2               @Q10 contains alpha
    115     vdup.8        q8, r3                @Q8 contains beta
    116     vmovl.u16     q6, d12               @
    117     vmovl.u16     q7, d14               @
    118     vabd.u8       q14, q5, q3           @Q14 = Ap = ABS(p2 - p0)
    119     vabd.u8       q15, q2, q0           @Q15 = Aq = ABS(q2 - q0)
    120     vcgt.s32      q6, q6, #0            @Q6 = (us_Bs > 0)
    121     vsli.32       q7, q7, #8            @
    122     vcge.u8       q9, q11, q10          @Q9 = ( ABS(p0 - q0) >= Alpha )
    123     vcge.u8       q12, q12, q8          @Q12=( ABS(q1 - q0) >= Beta )
    124     vcge.u8       q13, q13, q8          @Q13=( ABS(p1 - p0) >= Beta )
    125     vcgt.u8       q10, q8, q14          @Q10=(Ap<Beta)
    126     vcgt.u8       q11, q8, q15          @Q11=(Aq<Beta)
    127     vsli.32       q7, q7, #16           @Q7  = C0
    128     vorr          q9, q9, q12           @Q9 = ( ABS(p0 - q0) >= Alpha ) | ( ABS(q1 - q0) >= Beta )
    129     vsubl.u8      q15, d1, d7           @
    130     vsubl.u8      q12, d0, d6           @Q15,Q12 = (q0 - p0)
    131     vorr          q9, q9, q13           @Q9 = ( ABS(p0 - q0) >= Alpha ) | ( ABS(q1 - q0) >= Beta ) | ( ABS(p1 - p0) >= Beta )
    132     vsubl.u8      q14, d8, d2           @Q14 = (p1 - q1)L
    133     vshl.i16      q13, q15, #2          @Q13 = (q0 - p0)<<2
    134     vshl.i16      q12, q12, #2          @Q12 = (q0 - p0)<<2
    135     vsubl.u8      q15, d9, d3           @Q15 = (p1 - q1)H
    136     vbic          q6, q6, q9            @final condition
    137     vadd.i16      q12, q12, q14         @
    138     vadd.i16      q13, q13, q15         @Q13,Q12 = [ (q0 - p0)<<2 ] + (p1 - q1)
    139     vsub.i8       q9, q7, q10           @Q9 = C0 + (Ap < Beta)
    140     vrhadd.u8     q8, q3, q0            @Q8 = ((p0+q0+1) >> 1)
    141     vqrshrn.s16   d24, q12, #3          @
    142     vqrshrn.s16   d25, q13, #3          @Q12 = i_macro = (((q0 - p0)<<2) + (p1 - q1) + 4)>>3
    143     vsub.i8       q9, q9, q11           @Q9 = C0 + (Ap < Beta) + (Aq < Beta)
    144     vand.i8       q10, q10, q6          @
    145     vand.i8       q11, q11, q6          @
    146     vabs.s8       q13, q12              @Q13 = ABS (i_macro)
    147     vaddl.u8      q14, d17, d11         @
    148     vaddl.u8      q5, d16, d10          @Q14,Q5 = p2 + (p0+q0+1)>>1
    149     vaddl.u8      q15, d17, d5          @
    150     vmin.u8       q9, q13, q9           @Q9 = delta = (ABS(i_macro) > C) ? C : ABS(i_macro)
    151     vshll.u8      q13, d9, #1           @
    152     vaddl.u8      q2, d16, d4           @Q15,Q2 = q2 + (p0+q0+1)>>1
    153     vshll.u8      q8, d8, #1            @Q13,Q8 = (p1<<1)
    154     vand          q9, q9, q6            @Making delta zero in places where values shouldn be filterd
    155     vsub.i16      q14, q14, q13         @Q14,Q5 = [p2 + (p0+q0+1)>>1] - (p1<<1)
    156     vsub.i16      q5, q5, q8            @
    157     vshll.u8      q8, d2, #1            @
    158     vshll.u8      q13, d3, #1           @Q13,Q8 = (q1<<1)
    159     vqshrn.s16    d29, q14, #1          @
    160     vqshrn.s16    d28, q5, #1           @Q14 = i_macro_p1
    161     vsub.i16      q2, q2, q8            @
    162     vsub.i16      q15, q15, q13         @Q15,Q2  = [q2 + (p0+q0+1)>>1] - (q1<<1)
    163     vneg.s8       q13, q7               @Q13 = -C0
    164     vmin.s8       q14, q14, q7          @Q14 = min(C0,i_macro_p1)
    165     vcge.s8       q12, q12, #0          @Q12 = (i_macro >= 0)
    166     vqshrn.s16    d31, q15, #1          @
    167     vqshrn.s16    d30, q2, #1           @Q15 = i_macro_q1
    168     vmax.s8       q14, q14, q13         @Q14 = max( - C0 , min(C0, i_macro_p1) )
    169     vqadd.u8      q8, q3, q9            @Q8  = p0 + delta
    170     vqsub.u8      q3, q3, q9            @Q3 = p0 - delta
    171     vmin.s8       q15, q15, q7          @Q15 = min(C0,i_macro_q1)
    172     vand.i8       q14, q10, q14         @condition check Ap<beta
    173     vqadd.u8      q7, q0, q9            @Q7 = q0 + delta
    174     vqsub.u8      q0, q0, q9            @Q0   = q0 - delta
    175     vmax.s8       q15, q15, q13         @Q15 = max( - C0 , min(C0, i_macro_q1) )
    176     vbif          q8, q3, q12           @Q8  = (i_macro >= 0 ) ? (p0+delta) : (p0-delta)
    177     vbif          q0, q7, q12           @Q0  = (i_macro >= 0 ) ? (q0-delta) : (q0+delta)
    178     vadd.i8       q14, q14, q4          @
    179     vand.i8       q15, q11, q15         @condition check Aq<beta
    180     vst1.8        {q8}, [r7], r1        @writting back filtered value of p0
    181     vadd.i8       q15, q15, q1          @
    182     vst1.8        {q0}, [r7], r1        @writting back filtered value of q0
    183     vst1.8        {q14}, [r6]           @writting back filtered value of p1
    184     vst1.8        {q15}, [r7], r1       @writting back filtered value of q1
    185     vpop          {d8 - d15}
    186     ldmfd         sp!, {r4-r7, pc}
    187 
    188 
    189 
    190 @**
    191 @*******************************************************************************
    192 @*
    193 @* @brief
    194 @*     Performs filtering of a luma block horizontal edge when the
    195 @*     boundary strength is set to 4
    196 @*
    197 @* @par Description:
    198 @*    This operation is described in  Sec. 8.7.2.4 under the title
    199 @*    "Filtering process for edges for bS equal to 4" in ITU T Rec H.264.
    200 @*
    201 @* @param[in] r0 - pu1_src
    202 @*  Pointer to the src sample q0
    203 @*
    204 @* @param[in] r1 - src_strd
    205 @*  Source stride
    206 @*
    207 @* @param[in] r2 - alpha
    208 @*  Alpha Value for the boundary
    209 @*
    210 @* @param[in] r3 - beta
    211 @*  Beta Value for the boundary
    212 @*
    213 @* @returns
    214 @*  None
    215 @*
    216 @* @remarks
    217 @*  None
    218 @*
    219 @*******************************************************************************
    220 @*
    221 
    222     .global ih264_deblk_luma_horz_bs4_a9
    223 
    224 ih264_deblk_luma_horz_bs4_a9:
    225 
    226     @ Back up necessary registers on stack
    227     stmfd         sp!, {r12, r14}
    228     vpush         {d8 - d15}
    229     @ Init
    230     vdup.8        q0, r2                @duplicate alpha
    231     sub           r12, r0, r1           @pointer to p0 = q0 - src_strd
    232     vdup.8        q1, r3                @duplicate beta
    233     sub           r14, r0, r1, lsl#1    @pointer to p1 = q0 - src_strd*2
    234     sub           r2, r0, r1, lsl#2     @pointer to p3 = q0 - src_strd*4
    235     sub           r3, r14, r1           @pointer to p2 = p1 - src_strd
    236 
    237     @ Load Data
    238     vld1.8        {d4, d5}, [r0], r1    @load q0 to Q2, q0 = q0 + src_strd
    239     vld1.8        {d6, d7}, [r12]       @load p0 to Q3
    240     vld1.8        {d8, d9}, [r0], r1    @load q1 to Q4, q0 = q0 + src_strd
    241     vld1.8        {d10, d11}, [r14]     @load p1 to Q5
    242 
    243     @ Filter Decision
    244     vabd.u8       q6, q2, q3            @ABS(p0 - q0)
    245     vabd.u8       q7, q4, q2            @ABS(q1 - q0)
    246     vabd.u8       q8, q5, q3            @ABS(p1 - p0)
    247     vcge.u8       q9, q6, q0            @ABS(p0 - q0) >= Alpha
    248     vcge.u8       q7, q7, q1            @ABS(q1 - q0) >= Beta
    249     vcge.u8       q8, q8, q1            @ABS(p1 - p0) >= Beta
    250     vmov.i8       q10, #2
    251     vorr          q9, q9, q7            @ABS(p0 - q0) >= Alpha || ABS(q1 - q0) >= Beta
    252     vld1.8        {d14, d15}, [r0], r1  @load q2 to Q7, q0 = q0 + src_strd
    253     vorr          q9, q9, q8            @ABS(p0 - q0) >= Alpha || ABS(q1 - q0) >= Beta || ABS(p1 - p0) >= Beta
    254     vsra.u8       q10, q0, #2           @((Alpha >> 2) + 2)
    255     vabd.u8       q11, q7, q2           @Aq  = ABS(q2 - q0)
    256     vaddl.u8      q12, d4, d6           @p0+q0 L
    257     vaddl.u8      q13, d5, d7           @p0+q0 H
    258     vclt.u8       q11, q11, q1          @Aq < Beta
    259     vclt.u8       q10, q6, q10          @(ABS(p0 - q0) <((Alpha >>2) + 2))
    260 
    261     @ Deblock Filtering q0', q1', q2'
    262     vaddw.u8      q14, q12, d8          @p0+q0+q1 L
    263     vaddw.u8      q15, q13, d9          @p0+q0+q1 H
    264     vand          q11, q11, q10         @(Aq < Beta && ABS(p0 - q0) <((Alpha >>2) + 2))
    265     @ q0' if (Aq < Beta && ABS(p0 - q0) <((Alpha >>2) + 2)) TRUE
    266     vadd.i16      q8, q14, q14          @2*(p0+q0+q1)L
    267     vadd.i16      q0, q15, q15          @2*(p0+q0+q1)H
    268     vaddw.u8      q8, q8, d14           @2*(p0+q0+q1)+q2 L
    269     vaddw.u8      q0, q0, d15           @2*(p0+q0+q1)+q2 H
    270     vaddw.u8      q8, q8, d10           @2*(p0+q0+q1)+q2 +p1 L
    271     vaddw.u8      q0, q0, d11           @2*(p0+q0+q1)+q2 +p1 H
    272     vrshrn.u16    d12, q8, #3           @(2*(p0+q0+q1)+q2 +p1 +4)>> 3 L [q0']
    273     vrshrn.u16    d13, q0, #3           @(2*(p0+q0+q1)+q2 +p1 +4)>> 3 H [q0']
    274     @ q0" if (Aq < Beta && ABS(p0 - q0) <((Alpha >>2) + 2)) FALSE
    275     vaddl.u8      q8, d8, d8            @2*q1 L
    276     vaddl.u8      q0, d9, d9            @2*q1 H
    277     vaddw.u8      q8, q8, d4            @2*q1+q0 L
    278     vaddw.u8      q0, q0, d5            @2*q1+q0 H
    279     vaddw.u8      q8, q8, d10           @2*q1+q0+p1  L
    280     vaddw.u8      q0, q0, d11           @2*q1+q0+p1 H
    281     vrshrn.u16    d16, q8, #2           @(2*q1+q0+p1+2)>>2 L [q0"]
    282     vrshrn.u16    d17, q0, #2           @(2*q1+q0+p1+2)>>2 H [q0"]
    283     @ q1'
    284     vaddw.u8      q14, q14, d14         @p0+q0+q1+q2 L
    285     vaddw.u8      q15, q15, d15         @p0+q0+q1+q2 H
    286     vld1.8        {q0}, [r0], r1        @load q3 to Q0, q0 = q0 + src_strd
    287     vbit          q8, q6, q11           @choosing between q0' and q0" depending on condn
    288     sub           r0, r0, r1, lsl #2    @pointer to q0
    289     vbic          q11, q11, q9          @((ABS(p0 - q0) >= Alpha  || ABS(q1 - q0) >= Beta || ABS(p1 - p0) >= Beta))
    290                                         @ && (Aq < Beta && ABS(p0 - q0) <((Alpha >>2) + 2))
    291     vrshrn.u16    d12, q14, #2          @(p0+q0+q1+q2+2)>>2 L [q1']
    292     vrshrn.u16    d13, q15, #2          @(p0+q0+q1+q2+2)>>2 H [q1']
    293     vbif          q2, q8, q9            @choose q0 or filtered q0
    294     @ q2'
    295     vaddl.u8      q8, d14, d0           @q2+q3,L
    296     vaddl.u8      q0, d15, d1           @q2+q3,H
    297     vadd.i16      q14, q14, q8          @p0+q0+q1+2*q2+q3 L
    298     vst1.8        {d4, d5}, [r0], r1    @store q0
    299     vadd.i16      q15, q15, q0          @p0+q0+q1+2*q2+q3 H
    300     vadd.i16      q14, q14, q8          @p0+q0+q1+3*q2+2*q3 L
    301     vadd.i16      q15, q15, q0          @p0+q0+q1+3*q2+2*q3 H
    302     vrshrn.u16    d0, q14, #3           @(p0+q0+q1+3*q2+2*q3+4)>>3 L [q2']
    303     vrshrn.u16    d1, q15, #3           @(p0+q0+q1+3*q2+2*q3+4)>>3 H [q2']
    304     vld1.8        {d30, d31}, [r3]      @load p2 to Q15
    305     vbif          q6, q4, q11           @choose q1 or filtered value of q1
    306 
    307     vabd.u8       q8, q15, q3           @Ap,ABS(p2 - p0)
    308     vaddw.u8      q12, q12, d10         @p0+q0+p1 L
    309     vbif          q0, q7, q11           @choose q2 or filtered q2
    310     vaddw.u8      q13, q13, d11         @p0+q0+p1 H
    311     vst1.8        {d12, d13}, [r0], r1  @store q1
    312     vclt.u8       q8, q8, q1            @Ap < Beta
    313     vadd.i16      q14, q12, q12         @2*(p0+q0+p1) L
    314     vadd.i16      q2, q13, q13          @2*(p0+q0+p1) H
    315     vst1.8        {d0, d1}, [r0], r1    @store q2
    316     vand          q10, q10, q8          @((Ap < Beta) && (ABS(p0 - q0) <((Alpha >>2) + 2)))
    317     vaddw.u8      q14, q14, d30         @2*(p0+q0+p1)+p2 l
    318     vaddw.u8      q2, q2, d31           @2*(p0+q0+p1)+p2 H
    319     vaddw.u8      q14, q14, d8          @2*(p0+q0+p1)+p2+q1 L
    320     vaddw.u8      q2, q2, d9            @2*(p0+q0+p1)+p2+q1 H
    321     vrshrn.u16    d28, q14, #3          @(2*(p0+q0+p1)+p2+q1+4)>>3  L,p0'
    322     vrshrn.u16    d29, q2, #3           @(2*(p0+q0+p1)+p2+q1+4)>>3  H,p0'
    323     vmov.i8       d0, #2
    324     vmov.i16      d1, #2
    325     vaddl.u8      q1, d6, d8            @p0+q1      L
    326     vmlal.u8      q1, d10, d0           @2*p1+p0+q1 L
    327     vaddl.u8      q8, d7, d9            @p0+q1  H
    328     vmlal.u8      q8, d11, d0           @2*p1+p0+q1 H
    329     vaddw.u8      q6, q12, d30          @(p0+q0+p1) +p2 L
    330     vld1.8        {d24, d25}, [r2]      @load p3,Q12
    331     vaddw.u8      q2, q13, d31          @(p0+q0+p1) +p2 H
    332     vaddl.u8      q4, d30, d24          @p2+p3 L
    333     vrshrn.u16    d26, q6, #2           @((p0+q0+p1)+p2 +2)>>2,p1' L
    334     vrshrn.u16    d2, q1, #2            @(2*p1+p0+q1+2)>>2,p0"L
    335     vrshrn.u16    d27, q2, #2           @((p0+q0+p1)+p2 +2)>>2,p1' H
    336     vrshrn.u16    d3, q8, #2            @(2*p1+p0+q1+2)>>2,p0" H
    337     vaddl.u8      q8, d31, d25          @p2+p3 H
    338     vmla.u16      q6, q4, d1[0]         @(p0+q0+p1)+3*p2+2*p3 L
    339     vmla.u16      q2, q8, d1[0]         @(p0+q0+p1)+3*p2+2*p3 H
    340     vbic          q8, q10, q9           @((ABS(p0 - q0) >= Alpha  || ABS(q1 - q0) >= Beta || ABS(p1 - p0) >= Beta))
    341                                         @&& (Ap < Beta && ABS(p0 - q0) <((Alpha >>2) + 2))
    342     vbit          q1, q14, q10          @choosing between po' and p0"
    343     vrshrn.u16    d12, q6, #3           @((p0+q0+p1)+3*p2+2*p3+4)>>3 L p2'
    344     vrshrn.u16    d13, q2, #3           @((p0+q0+p1)+3*p2+2*p3+4)>>3 H p2'
    345     vbif          q3, q1, q9            @choosing between p0 and filtered value of p0
    346     vbit          q5, q13, q8           @choosing between p1 and p1'
    347     vbit          q15, q6, q8           @choosing between p2 and p2'
    348     vst1.8        {d6, d7}, [r12]       @store p0
    349     vst1.8        {d10, d11}, [r14]     @store p1
    350     vst1.8        {d30, d31}, [r3]      @store p2
    351     vpop          {d8 - d15}
    352     ldmfd         sp!, {r12, pc}
    353 
    354 
    355 
    356 @**
    357 @*******************************************************************************
    358 @*
    359 @* @brief
    360 @*     Performs filtering of a luma block vertical edge for cases where the
    361 @*     boundary strength is less than 4
    362 @*
    363 @* @par Description:
    364 @*    This operation is described in  Sec. 8.7.2.4 under the title
    365 @*    "Filtering process for edges for bS equal to 4" in ITU T Rec H.264.
    366 @*
    367 @* @param[in] r0 - pu1_src
    368 @*  Pointer to the src sample q0
    369 @*
    370 @* @param[in] r1 - src_strd
    371 @*  Source stride
    372 @*
    373 @* @param[in] r2 - alpha
    374 @*  Alpha Value for the boundary
    375 @*
    376 @* @param[in] r3 - beta
    377 @*  Beta Value for the boundary
    378 @*
    379 @* @param[in] sp(0) - u4_bs
    380 @*  Packed Boundary strength array
    381 @*
    382 @* @param[in] sp(4) - pu1_cliptab
    383 @*  tc0_table
    384 @*
    385 @* @returns
    386 @*  None
    387 @*
    388 @* @remarks
    389 @*  None
    390 @*
    391 @*******************************************************************************
    392 @*
    393 
    394     .global ih264_deblk_luma_vert_bslt4_a9
    395 
    396 ih264_deblk_luma_vert_bslt4_a9:
    397 
    398     stmfd         sp!, {r12, lr}
    399 
    400     sub           r0, r0, #4            @pointer uc_edgePixel-4
    401     ldr           r12, [sp, #8]         @r12 = ui_Bs
    402     ldr           r14, [sp, #12]        @r14 = *puc_ClpTab
    403     vpush         {d8 - d15}
    404     @loading p3:p2:p1:p0:q0:q1:q2:q3 for every row
    405     vld1.8        {d0}, [r0], r1        @row1
    406     vld1.8        d2, [r0], r1          @row2
    407     vld1.8        d4, [r0], r1          @row3
    408     rev           r12, r12              @reversing ui_bs
    409     vld1.8        d6, [r0], r1          @row4
    410     vmov.32       d18[0], r12           @d12[0] = ui_Bs
    411     vld1.32       d16[0], [r14]         @D16[0] contains cliptab
    412     vld1.8        d8, [r0], r1          @row5
    413     vmovl.u8      q9, d18               @q6 = uc_Bs in each 16 bt scalar
    414     vld1.8        d10, [r0], r1         @row6
    415     vld1.8        d12, [r0], r1         @row7
    416     vtbl.8        d16, {d16}, d18       @puc_ClipTab[uc_Bs]
    417     vld1.8        d14, [r0], r1         @row8
    418     vld1.8        d1, [r0], r1          @row9
    419     vmovl.u16     q8, d16               @
    420     vld1.8        d3, [r0], r1          @row10
    421     vld1.8        d5, [r0], r1          @row11
    422     vld1.8        d7, [r0], r1          @row12
    423     vsli.32       q8, q8, #8            @
    424     vld1.8        d9, [r0], r1          @row13
    425     vld1.8        d11, [r0], r1         @row14
    426     vld1.8        d13, [r0], r1         @row15
    427     vsli.32       q8, q8, #16           @Q8  = C0
    428     vld1.8        d15, [r0], r1         @row16
    429 
    430     @taking two 8x8 transposes
    431     @2X2 transposes
    432     vtrn.8        d0, d2                @row1 &2
    433     vtrn.8        d4, d6                @row3&row4
    434     vtrn.8        d8, d10               @row5&6
    435     vtrn.8        d12, d14              @row7 & 8
    436     vtrn.8        d1, d3                @row9 &10
    437     vtrn.8        d5, d7                @row11 & 12
    438     vtrn.8        d9, d11               @row13 &14
    439     vtrn.8        d13, d15              @row15 & 16
    440     @4x4 transposes
    441     vtrn.16       d2, d6                @row2 & row4
    442     vtrn.16       d10, d14              @row6 & row8
    443     vtrn.16       d3, d7                @row10 & 12
    444     vtrn.16       d11, d15              @row14 & row16
    445     vtrn.32       d6, d14               @row4 & 8
    446     vtrn.32       d7, d15               @row 12 & 16
    447 
    448     @now Q3 ->p0 and Q7->q3
    449     vtrn.16       d0, d4                @row1 & 3
    450     vtrn.16       d8, d12               @row 5 & 7
    451     vtrn.16       d1, d5                @row9 & row11
    452     vtrn.16       d9, d13               @row13 & row15
    453     vtrn.32       d0, d8                @row1 & row5
    454     vtrn.32       d1, d9                @row9 & 13
    455 
    456     @now Q0->p3 & Q4->q0
    457     @starting processing as p0 and q0 are now ready
    458     vtrn.32       d2, d10               @row2 &6
    459     vrhadd.u8     q10, q3, q4           @((p0 + q0 + 1) >> 1)
    460     vtrn.32       d3, d11               @row10&row14
    461     vmov.i8       d19, #2
    462     @now Q1->p2     & Q5->q1
    463     vtrn.32       d4, d12               @row3 & 7
    464     vabd.u8       q11, q3, q4           @ABS(p0 - q0)
    465     vtrn.32       d5, d13               @row11 & row15
    466     vaddl.u8      q12, d20, d2          @(p2 + ((p0 + q0 + 1) >> 1) L
    467     @now            Q2->p1,Q6->q2
    468     vaddl.u8      q13, d21, d3          @(p2 + ((p0 + q0 + 1) >> 1) H
    469     vmlsl.u8      q12, d4, d19          @(p2 + ((p0 + q0 + 1) >> 1) - (p1 << 1)) L
    470     vmlsl.u8      q13, d5, d19          @(p2 + ((p0 + q0 + 1) >> 1) - (p1 << 1)) H
    471     vdup.8        q14, r2               @alpha
    472     vcle.u8       q11, q14, q11         @ABS(p0 - q0) >= Alpha(Alpha <=ABS(p0 - q0))
    473     vdup.i8       q14, r3               @beta
    474     vabd.u8       q15, q5, q4           @ABS(q1 - q0)
    475     vqshrn.s16    d24, q12, #1          @((p2 + ((p0 + q0 + 1) >> 1) - (p1 << 1)) >> 1) L
    476     vqshrn.s16    d25 , q13, #1         @((p2 + ((p0 + q0 + 1) >> 1) - (p1 << 1)) >> 1) H
    477     vcge.u8       q15, q15, q14         @ABS(q1 - q0) >= Beta
    478     vabd.u8       q13, q2, q3           @ABS(p1 - p0)
    479     vmin.s8       q12, q12, q8          @min(deltap1 ,C0)
    480     vorr          q11, q11, q15         @ABS(q1 - q0) >= Beta ||ABS(p0 - q0) >= Alpha
    481     vneg.s8       q15, q8               @-C0
    482     vcge.u8       q13, q13, q14         @ABS(p1 - p0) >= Beta
    483     vmax.s8       q12, q12, q15         @max(deltap1,-C0)
    484     vorr          q11, q11, q13         @ABS(p0 - q0) >= Alpha  || ABS(q1 - q0) >= Beta ||  ABS(p1 - p0) >= Beta)
    485     vmovl.u16     q13, d18              @ui_bs
    486     vaddl.u8      q9, d20, d12          @q2 + ((p0 + q0 + 1) >> 1) L
    487     vceq.u32      q13, q13, #0          @ui_bs == 0
    488     vsubw.u8      q9, q9, d10           @(q2 + ((p0 + q0 + 1) >> 1) - q1) L
    489     vaddl.u8      q10, d21, d13         @q2 + ((p0 + q0 + 1) >> 1) H
    490     vsubw.u8      q9, q9, d10           @(q2 + ((p0 + q0 + 1) >> 1) - 2*q1)L
    491     vsubw.u8      q10, q10, d11         @(q2 + ((p0 + q0 + 1) >> 1) - q1) H
    492     vorr          q13, q13, q11         @(ABS(p0 - q0) >= Alpha  || ABS(q1 - q0) >= Beta || ABS(p1 - p0) >= Beta)) &&(ui_bs)
    493     vsubw.u8      q10, q10, d11         @(q2 + ((p0 + q0 + 1) >> 1) - 2*q1) H
    494     vqshrn.s16    d18, q9, #1           @((q2 + ((p0 + q0 + 1) >> 1) - (q1 << 1)) >> 1) L
    495     vabd.u8       q11, q1, q3           @Ap = ABS(p2 - p0)
    496     vqshrn.s16    d19, q10, #1          @((q2 + ((p0 + q0 + 1) >> 1) - (q1 << 1)) >> 1) H
    497     vabd.u8       q10, q6, q4           @Aq= ABS(q2 - q0)
    498     vclt.u8       q11, q11, q14         @Ap < Beta
    499     vmin.s8       q9, q9, q8            @min(delatq1,C0)
    500     vclt.u8       q10, q10, q14         @Aq <Beta
    501     vsubl.u8      q14, d8, d6           @(q0 - p0) L
    502     vmax.s8       q9, q9, q15           @max(deltaq1,-C0)
    503     vsubl.u8      q15, d9, d7           @(q0 - p0) H
    504     vshl.s16      q14, q14, #2          @(q0 - p0)<<2 L
    505     vsub.u8       q8, q8, q11           @C0 + (Ap < Beta)
    506     vshl.s16      q15, q15, #2          @(q0 - p0) << 2) H
    507     vaddw.u8      q14, q14, d4          @((q0 - p0) << 2) + (p1  L
    508     vaddw.u8      q15, q15, d5          @((q0 - p0) << 2) + (p1 H
    509     vsubw.u8      q14, q14, d10         @((q0 - p0) << 2) + (p1 - q1) L
    510     vsubw.u8      q15, q15, d11         @((q0 - p0) << 2) + (p1 - q1) H
    511     vbic          q11, q11, q13         @final condition for p1
    512     vrshrn.s16    d28, q14, #3          @delta = ((((q0 - p0) << 2) + (p1 - q1) + 4) >> 3); L
    513     vrshrn.s16    d29, q15, #3          @delta = ((((q0 - p0) << 2) + (p1 - q1) + 4) >> 3) H
    514     vsub.u8       q8, q8, q10           @C0 + (Ap < Beta) + (Aq < Beta)
    515     vbic          q10, q10, q13         @final condition for q1
    516     vabs.s8       q15, q14              @abs(delta)
    517     vand          q12, q12, q11         @delatp1
    518     vand          q9, q9, q10           @delta q1
    519     vmin.u8       q15, q15, q8          @min((abs(delta),C)
    520     vadd.i8       q2, q2, q12           @p1+deltap1
    521     vadd.i8       q5, q5, q9            @q1+deltaq1
    522     vbic          q15, q15, q13         @abs(delta) of pixels to be changed only
    523     vcge.s8       q14, q14, #0          @sign(delta)
    524     vqsub.u8      q11, q3, q15          @clip(p0-delta)
    525     vtrn.8        d0, d2                @row1 &2
    526     vqadd.u8      q3, q3, q15           @clip(p0+delta)
    527     vtrn.8        d1, d3                @row9 &10
    528     vqadd.u8      q12, q4, q15          @clip(q0+delta)
    529     vtrn.8        d12, d14              @row7 & 8
    530     vqsub.u8      q4, q4, q15           @clip(q0-delta)
    531     vtrn.8        d13, d15              @row15 & 16
    532     vbif          q3, q11, q14          @p0
    533     vbif          q4, q12, q14          @q0
    534     vtrn.8        d4, d6                @row3&row4
    535     vtrn.8        d8, d10               @row5&6
    536     vtrn.8        d5, d7                @row11 & 12
    537     vtrn.8        d9, d11               @row13 &14
    538     vtrn.16       d2, d6                @row2 & row4
    539     vtrn.16       d10, d14              @row6 & row8
    540     vtrn.16       d3, d7                @row10 & 12
    541     vtrn.16       d11, d15              @row14 & row16
    542     vtrn.32       d6, d14               @row4 & 8
    543     vtrn.32       d7, d15               @row 12 & 16
    544     @now Q3 ->p0 and Q7->q3
    545     vtrn.16       d0, d4                @row1 & 3
    546     vtrn.16       d8, d12               @row 5 & 7
    547     vtrn.16       d1, d5                @row9 & row11
    548     vtrn.16       d9, d13               @row13 & row15
    549     sub           r0, r0, r1, lsl#4     @restore pointer
    550     vtrn.32       d0, d8                @row1 & row5
    551     vtrn.32       d1, d9                @row9 & 13
    552     vtrn.32       d2, d10               @row2 &6
    553     vtrn.32       d3, d11               @row10&row14
    554     vtrn.32       d4, d12               @row3 & 7
    555     vtrn.32       d5, d13               @row11 & row15
    556     vst1.8        {d0}, [r0], r1        @row1
    557     vst1.8        d2, [r0], r1          @row2
    558     vst1.8        d4, [r0], r1          @row3
    559     vst1.8        d6, [r0], r1          @row4
    560     vst1.8        d8, [r0], r1          @row5
    561     vst1.8        d10, [r0], r1         @row6
    562     vst1.8        d12, [r0], r1         @row7
    563     vst1.8        d14, [r0], r1         @row8
    564     vst1.8        d1, [r0], r1          @row9
    565     vst1.8        d3, [r0], r1          @row10
    566     vst1.8        d5, [r0], r1          @row11
    567     vst1.8        d7, [r0], r1          @row12
    568     vst1.8        d9, [r0], r1          @row13
    569     vst1.8        d11, [r0], r1         @row14
    570     vst1.8        d13, [r0], r1         @row15
    571     vst1.8        d15, [r0], r1         @row16
    572     vpop          {d8 - d15}
    573     ldmfd         sp!, {r12, pc}
    574 
    575 
    576 
    577 @**
    578 @*******************************************************************************
    579 @*
    580 @* @brief
    581 @*     Performs filtering of a luma block vertical edge when the
    582 @*     boundary strength is set to 4
    583 @*
    584 @* @par Description:
    585 @*    This operation is described in  Sec. 8.7.2.4 under the title
    586 @*    "Filtering process for edges for bS equal to 4" in ITU T Rec H.264.
    587 @*
    588 @* @param[in] r0 - pu1_src
    589 @*  Pointer to the src sample q0
    590 @*
    591 @* @param[in] r1 - src_strd
    592 @*  Source stride
    593 @*
    594 @* @param[in] r2 - alpha
    595 @*  Alpha Value for the boundary
    596 @*
    597 @* @param[in] r3 - beta
    598 @*  Beta Value for the boundary
    599 @*
    600 @* @returns
    601 @*  None
    602 @*
    603 @* @remarks
    604 @*  None
    605 @*
    606 @*******************************************************************************
    607 @*
    608 
    609     .global ih264_deblk_luma_vert_bs4_a9
    610 
    611 ih264_deblk_luma_vert_bs4_a9:
    612 
    613     stmfd         sp!, {r12, lr}
    614     vpush         {d8 - d15}
    615     sub           r0, r0, #4            @pointer uc_edgePixel-4
    616     @loading p3:p2:p1:p0:q0:q1:q2:q3 for every row
    617     vld1.8        d0, [r0], r1          @row1
    618     vld1.8        d2, [r0], r1          @row2
    619     vld1.8        d4, [r0], r1          @row3
    620     vld1.8        d6, [r0], r1          @row4
    621     vld1.8        d8, [r0], r1          @row5
    622     vld1.8        d10, [r0], r1         @row6
    623     vld1.8        d12, [r0], r1         @row7
    624     vld1.8        d14, [r0], r1         @row8
    625     vld1.8        d1, [r0], r1          @row9
    626     vld1.8        d3, [r0], r1          @row10
    627     vld1.8        d5, [r0], r1          @row11
    628     vld1.8        d7, [r0], r1          @row12
    629     vld1.8        d9, [r0], r1          @row13
    630     vld1.8        d11, [r0], r1         @row14
    631     vld1.8        d13, [r0], r1         @row15
    632     vld1.8        d15, [r0], r1         @row16
    633     @taking two 8x8 transposes
    634     @2X2 transposes
    635     vtrn.8        d0, d2                @row1 &2
    636     vtrn.8        d4, d6                @row3&row4
    637     vtrn.8        d8, d10               @row5&6
    638     vtrn.8        d12, d14              @row7 & 8
    639     vtrn.8        d1, d3                @row9 &10
    640     vtrn.8        d5, d7                @row11 & 12
    641     vtrn.8        d9, d11               @row13 &14
    642     vtrn.8        d13, d15              @row15 & 16
    643     @4x4 transposes
    644     vtrn.16       d2, d6                @row2 & row4
    645     vtrn.16       d10, d14              @row6 & row8
    646     vtrn.16       d3, d7                @row10 & 12
    647     vtrn.16       d11, d15              @row14 & row16
    648     vtrn.32       d6, d14               @row4 & 8
    649     vtrn.32       d7, d15               @row 12 & 16
    650     @now Q3 ->p0 and Q7->q3
    651     vtrn.16       d0, d4                @row1 & 3
    652     vtrn.16       d8, d12               @row 5 & 7
    653     vtrn.16       d1, d5                @row9 & row11
    654     vtrn.16       d9, d13               @row13 & row15
    655     vtrn.32       d0, d8                @row1 & row5
    656     vtrn.32       d1, d9                @row9 & 13
    657     @now Q0->p3 & Q4->q0
    658     @starting processing as p0 and q0 are now ready
    659     @now Q1->p2 & Q5->q1
    660     vpush         {q7}                  @saving in stack
    661     vtrn.32       d4, d12               @row3 & 7
    662     vmov.i16      q14, #2
    663     vtrn.32       d5, d13               @row11 & row15
    664     vaddl.u8      q8, d6, d8            @p0+q0 L
    665     vtrn.32       d2, d10               @row2 &6
    666     vaddl.u8      q9, d7, d9            @p0+q0 H
    667     vtrn.32       d3, d11               @row10&row14
    668     vaddw.u8      q10, q8, d4           @p0+q0+p1 L
    669     vaddw.u8      q11, q9, d5           @p0+q0+p1 H
    670     vaddl.u8      q12, d2, d10          @p2+q1 L
    671     vaddl.u8      q13, d3, d11          @p2+q1 H
    672     vmla.u16      q12, q10, q14         @p2 + X2(p1) + X2(p0) + X2(q0) + q1 L
    673     vmla.u16      q13, q11, q14         @p2 + X2(p1) + X2(p0) + X2(q0) + q1 H
    674     vmov.i8       q14, #2
    675     vaddw.u8      q8, q10, d2           @p0+q0+p1+p2 L
    676     vaddw.u8      q9, q11, d3           @p0+q0+p1+p2 H
    677     vdup.i8       q15, r2               @duplicate alpha
    678     vrshrn.u16    d20, q8, #2           @(p2 + p1 + p0 + q0 + 2) >> 2)L p1'
    679     vrshrn.u16    d21, q9, #2           @(p2 + p1 + p0 + q0 + 2) >> 2)H p1'
    680     vabd.u8       q11, q3, q4           @ABD(p0-q0)
    681     vsra.u8       q14, q15, #2          @alpha >>2 +2
    682     vabd.u8       q15, q1, q3           @Ap = ABD(p2-p0)
    683     vrshrn.u16    d24, q12, #3          @((p2 + X2(p1) + X2(p0) + X2(q0) + q1 + 4) >> 3) L p0'
    684     vrshrn.u16    d25, q13, #3          @((p2 + X2(p1) + X2(p0) + X2(q0) + q1 + 4) >> 3) H p0'
    685     vdup.i8       q13, r3               @beta
    686     vcgt.u8       q14, q14, q11         @ABS(p0 - q0) <((Alpha >>2) + 2)
    687     vaddl.u8      q11, d6, d10          @p0+q1 L
    688     vcgt.u8       q7, q13, q15          @beta>Ap
    689     vaddl.u8      q15, d7, d11          @p0+q1 H
    690     vaddw.u8      q11, q11, d4          @p0+q1+p1 L
    691     vaddw.u8      q15, q15, d5          @p0+q1+p1 H
    692     vaddw.u8      q11, q11, d4          @p0+q1+2*p1 L
    693     vaddw.u8      q15, q15, d5          @p0+q1+2*p1 H
    694     vand          q7, q7, q14           @(Ap < Beta && ABS(p0 - q0) <((Alpha >>2) + 2)
    695     vrshrn.u16    d22, q11, #2          @((X2(p1) + p0 + q1 + 2) >> 2) L p0"
    696     vrshrn.u16    d23, q15, #2          @((X2(p1) + p0 + q1 + 2) >> 2) H p0"
    697     vaddl.u8      q15, d2, d0           @p2+p3 L
    698     vbif          q12, q11, q7          @p0' or p0 "
    699     vaddl.u8      q11, d3, d1           @p2+p3 H
    700     vadd.u16      q15, q15, q15         @2*(p2+p3) L
    701     vadd.u16      q11, q11, q11         @2*(p2+p3)H
    702     vadd.u16      q8, q8, q15           @(X2(p3) + X3(p2) + p1 + p0 + q0) L
    703     vadd.u16      q9, q9, q11           @(X2(p3) + X3(p2) + p1 + p0 + q0) H
    704     vabd.u8       q15, q6, q4           @Aq = abs(q2-q0)
    705     vabd.u8       q11, q5, q4           @ABS(Q1-Q0)
    706     vrshrn.u16    d16, q8, #3           @((X2(p3) + X3(p2) + p1 + p0 + q0 + 4) >> 3); L p2'
    707     vrshrn.u16    d17, q9, #3           @((X2(p3) + X3(p2) + p1 + p0 + q0 + 4) >> 3); H p2'
    708     vabd.u8       q9, q2, q3            @ABS(p1-p0)
    709     vcgt.u8       q15, q13, q15         @Aq < Beta
    710     vcge.u8       q11, q11, q13         @ABS(q1 - q0) >= Beta
    711     vcge.u8       q9, q9, q13           @ABS(p1 - p0) >= beta
    712     vdup.i8       q13, r2               @duplicate alpha
    713     vand          q15, q15, q14         @(Aq < Beta && ABS(p0 - q0) <((Alpha >>2) + 2))
    714     vabd.u8       q14, q3, q4           @abs(p0-q0)
    715     vorr          q11, q11, q9          @ABS(p1 - p0) >= Beta || ABS(q1 - q0) >= Beta
    716     vaddl.u8      q9, d6, d8            @p0+q0 L
    717     vcge.u8       q14, q14, q13         @ABS(p0 - q0) >= Alpha
    718     vaddl.u8      q13, d7, d9           @p0+q0 H
    719     vaddw.u8      q9, q9, d10           @p0+q0+q1 L
    720     vorr          q11, q11, q14         @ABS(p1 - p0) >= Beta || ABS(q1 - q0) >= Beta||ABS(p0 - q0) >= Alpha
    721     vaddw.u8      q13, q13, d11         @p0+q0+q1 H
    722     vbic          q7, q7, q11           @final condn for p's
    723     vmov.i8       q14, #2
    724     vbif          q3, q12, q11          @final p0
    725     vbit          q1, q8, q7            @final p2
    726     vbif          q10, q2, q7           @final p1
    727     vaddl.u8      q12, d8, d4           @q0+p1 L
    728     vmlal.u8      q12, d10, d28         @X2(q1) + q0 + p1 L
    729     vaddl.u8      q8, d9, d5            @q0+p1 H
    730     vmlal.u8      q8, d11, d28          @X2(q1) + q0 + p1 H
    731     vmov.i16      q14, #2
    732     vaddl.u8      q7, d4, d12           @p1+q2 L
    733     vmla.u16      q7, q9, q14           @p1 + X2(p0) + X2(q0) + X2(q1) + q2L
    734     vaddl.u8      q2, d5, d13           @p1+q2H
    735     vmla.u16      q2, q13, q14          @p1 + X2(p0) + X2(q0) + X2(q1) + q2H
    736     vrshrn.u16    d24, q12, #2          @(X2(q1) + q0 + p1 + 2) >> 2; L q0'
    737     vrshrn.u16    d25, q8, #2           @(X2(q1) + q0 + p1 + 2) >> 2; H q0'
    738     vaddw.u8      q9, q9, d12           @p0 + q0 + q1 + q2 L
    739     vaddw.u8      q13, q13, d13         @p0 + q0 + q1 + q2 H
    740     vrshrn.u16    d16, q7, #3           @(p1 + X2(p0) + X2(q0) + X2(q1) + q2 + 4) >> 3 L qo"
    741     vpop          {q7}
    742     vrshrn.u16    d17, q2, #3           @(p1 + X2(p0) + X2(q0) + X2(q1) + q2 + 4) >> 3 H qo"
    743     vrshrn.u16    d4, q9, #2            @p0 + q0 + q1 + q2 + 2)>>2 L q1'
    744     vrshrn.u16    d5, q13, #2           @p0 + q0 + q1 + q2 + 2)>>2 H q1'
    745     vbit          q12, q8, q15          @q0' or q0"
    746     vbic          q15, q15, q11         @final condn for q's
    747     vtrn.8        d0, d2                @row1 &2
    748     vbit          q5, q2, q15           @final q1
    749     vtrn.8        d1, d3                @row9 &10
    750     vaddl.u8      q8, d12, d14          @q2+q3 L
    751     vtrn.8        d20, d6               @row3&row4
    752     vaddl.u8      q2, d13, d15          @q2+q3 H
    753     vtrn.8        d21, d7               @row11 & 12
    754     vmla.u16      q9, q8, q14           @X2(q3) + X3(q2) + q1 + q0 + p0 L
    755     vtrn.16       d2, d6                @row2 & row4
    756     vmla.u16      q13, q2, q14          @X2(q3) + X3(q2) + q1 + q0 + p0 H
    757     vtrn.16       d3, d7                @row10 & 12
    758     vbif          q4, q12, q11          @final q0
    759     vtrn.16       d0, d20               @row1 & 3
    760     vrshrn.u16    d18, q9, #3           @(X2(q3) + X3(q2) + q1 + q0 + p0 + 4) >> 3; L
    761     vtrn.16       d1, d21               @row9 & row11
    762     vrshrn.u16    d19, q13, #3          @(X2(q3) + X3(q2) + q1 + q0 + p0 + 4) >> 3; H
    763     vtrn.8        d8, d10               @row5&6
    764     vbit          q6, q9, q15           @final q2
    765     vtrn.8        d9, d11               @row13 &14
    766     vtrn.8        d12, d14              @row7 & 8
    767     vtrn.8        d13, d15              @row15 & 16
    768     vtrn.16       d10, d14              @row6 & row8
    769     vtrn.16       d11, d15              @row14 & row16
    770     @now Q3 ->p0 and Q7->q3
    771     vtrn.16       d8, d12               @row 5 & 7
    772     vtrn.16       d9, d13               @row13 & row15
    773     sub           r0, r0, r1, lsl#4     @restore pointer
    774     vtrn.32       d6, d14               @row4 & 8
    775     vtrn.32       d7, d15               @row 12 & 16
    776     vtrn.32       d0, d8                @row1 & row5
    777     vtrn.32       d1, d9                @row9 & 13
    778     vtrn.32       d2, d10               @row2 &6
    779     vtrn.32       d3, d11               @row10&row14
    780     vtrn.32       d20, d12              @row3 & 7
    781     vtrn.32       d21, d13              @row11 & row15
    782     vst1.8        d0, [r0], r1          @row1
    783     vst1.8        d2, [r0], r1          @row2
    784     vst1.8        d20, [r0], r1         @row3
    785     vst1.8        d6, [r0], r1          @row4
    786     vst1.8        d8, [r0], r1          @row5
    787     vst1.8        d10, [r0], r1         @row6
    788     vst1.8        d12, [r0], r1         @row7
    789     vst1.8        d14, [r0], r1         @row8
    790     vst1.8        d1, [r0], r1          @row9
    791     vst1.8        d3, [r0], r1          @row10
    792     vst1.8        d21, [r0], r1         @row11
    793     vst1.8        d7, [r0], r1          @row12
    794     vst1.8        d9, [r0], r1          @row13
    795     vst1.8        d11, [r0], r1         @row14
    796     vst1.8        d13, [r0], r1         @row15
    797     vst1.8        d15, [r0], r1         @row16
    798     vpop          {d8 - d15}
    799     ldmfd         sp!, {r12, pc}
    800 
    801 
    802 
    803 @**
    804 @*******************************************************************************
    805 @*
    806 @* @brief
    807 @*     Performs filtering of a luma block vertical edge when the
    808 @*     boundary strength is set to 4 on calling twice
    809 @*
    810 @* @par Description:
    811 @*    This operation is described in  Sec. 8.7.2.4 under the title
    812 @*    "Filtering process for edges for bS equal to 4" in ITU T Rec H.264.
    813 @*
    814 @* @param[in] r0 - pu1_src
    815 @*  Pointer to the src sample q0
    816 @*
    817 @* @param[in] r1 - src_strd
    818 @*  Source stride
    819 @*
    820 @* @param[in] r2 - alpha
    821 @*  Alpha Value for the boundary
    822 @*
    823 @* @param[in] r3 - beta
    824 @*  Beta Value for the boundary
    825 @*
    826 @* @returns
    827 @*  None
    828 @*
    829 @* @remarks
    830 @*  None
    831 @*
    832 @*******************************************************************************
    833 @*
    834 
    835     .global ih264_deblk_luma_vert_bs4_mbaff_a9
    836 
    837 ih264_deblk_luma_vert_bs4_mbaff_a9:
    838 
    839     stmfd         sp!, {lr}
    840 
    841     sub           r0, r0, #4            @pointer uc_edgePixel-4
    842     vpush         {d8 - d15}
    843     @loading [p3:p2],[p1:p0]:[q0:q1]:[q2:q3] for every row
    844     vld4.16       {d0[0], d2[0], d4[0], d6[0]}, [r0], r1
    845     vld4.16       {d0[1], d2[1], d4[1], d6[1]}, [r0], r1
    846     vld4.16       {d0[2], d2[2], d4[2], d6[2]}, [r0], r1
    847     vld4.16       {d0[3], d2[3], d4[3], d6[3]}, [r0], r1
    848     vld4.16       {d1[0], d3[0], d5[0], d7[0]}, [r0], r1
    849     vld4.16       {d1[1], d3[1], d5[1], d7[1]}, [r0], r1
    850     vld4.16       {d1[2], d3[2], d5[2], d7[2]}, [r0], r1
    851     vld4.16       {d1[3], d3[3], d5[3], d7[3]}, [r0], r1
    852 
    853     vuzp.8        d0, d1                @D0->p3, D1->p2
    854     vuzp.8        d2, d3                @D2->p1, D3->p0
    855     vuzp.8        d4, d5                @D4->q0, D5->q1
    856     vuzp.8        d6, d7                @D6->q2, D7->q3
    857 
    858     vmov.i16      q14, #2
    859     vaddl.u8      q4, d3, d4            @p0+q0
    860     vaddw.u8      q5, q4, d2            @p0+q0+p1
    861     vaddl.u8      q6, d1, d5            @p2+q1
    862     vmla.u16      q6, q5, q14           @p2 + X2(p1) + X2(p0) + X2(q0) + q1
    863 
    864     vmov.i8       d14, #2
    865     vaddw.u8      q4, q5, d1            @p0+q0+p1+p2
    866     vdup.i8       d15, r2               @duplicate alpha
    867     vrshrn.u16    d10, q4, #2           @(p2 + p1 + p0 + q0 + 2) >> 2) p1'
    868     vabd.u8       d11, d3, d4           @ABD(p0-q0)
    869     vsra.u8       d14, d15, #2          @alpha >>2 +2
    870     vabd.u8       d15, d1, d3           @Ap = ABD(p2-p0)
    871     vrshrn.u16    d12, q6, #3           @((p2 + X2(p1) + X2(p0) + X2(q0) + q1 + 4) >> 3) p0'
    872     vdup.i8       d13, r3               @beta
    873     vcgt.u8       d14, d14, d11         @ABS(p0 - q0) <((Alpha >>2) + 2)
    874     vaddl.u8      q8, d3, d5            @p0+q1
    875     vcgt.u8       d26, d13, d15         @beta>Ap
    876     vaddw.u8      q8, q8, d2            @p0+q1+p1
    877     vaddw.u8      q8, q8, d2            @p0+q1+2*p1
    878     vand          d26, d26, d14         @(Ap < Beta && ABS(p0 - q0) <((Alpha >>2) + 2)
    879     vrshrn.u16    d11, q8, #2           @((X2(p1) + p0 + q1 + 2) >> 2) p0"
    880     vbif          d12, d11, d26         @p0' or p0 "
    881     vaddl.u8      q9, d1, d0            @p2+p3
    882     vadd.u16      q9, q9, q9            @2*(p2+p3)
    883     vadd.u16      q4, q4, q9            @(X2(p3) + X3(p2) + p1 + p0 + q0)
    884     vabd.u8       d15, d6, d4           @Aq = abs(q2-q0)
    885     vabd.u8       d11, d5, d4           @ABS(q1-q0)
    886     vrshrn.u16    d8, q4, #3            @((X2(p3) + X3(p2) + p1 + p0 + q0 + 4) >> 3); p2'
    887     vabd.u8       d9, d2, d3            @ABS(p1-p0)
    888     vcgt.u8       d15, d13, d15         @Aq < Beta
    889     vcge.u8       d11, d11, d13         @ABS(q1 - q0) >= Beta
    890     vcge.u8       d9, d9, d13           @ABS(p1 - p0) >= beta
    891     vdup.i8       d13, r2               @duplicate alpha
    892     vand          d15, d15, d14         @(Aq < Beta && ABS(p0 - q0) <((Alpha >>2) + 2))
    893     vabd.u8       d14, d3, d4           @abs(p0-q0)
    894     vorr          d11, d11, d9          @ABS(p1 - p0) >= Beta || ABS(q1 - q0) >= Beta
    895     vcge.u8       d14, d14, d13         @ABS(p0 - q0) >= Alpha
    896     vaddl.u8      q10, d3, d4           @p0+q0
    897     vorr          d11, d11, d14         @ABS(p1 - p0) >= Beta || ABS(q1 - q0) >= Beta||ABS(p0 - q0) >= Alpha
    898     vaddw.u8      q10, q10, d5          @p0+q0+q1
    899     vbic          d26, d26, d11         @final condn for p's
    900     vmov.i8       d14, #2
    901     vbif          d3, d12, d11          @final p0
    902     vbit          d1, d8, d26           @final p2
    903     vbif          d10, d2, d26          @final p1
    904     vaddl.u8      q6, d4, d2            @q0+p1
    905     vmlal.u8      q6, d5, d14           @X2(q1) + q0 + p1
    906 
    907     vaddl.u8      q11, d2, d6           @p1+q2
    908     vmla.u16      q11, q10, q14         @p1 + X2(p0) + X2(q0) + X2(q1) + q2
    909     vrshrn.u16    d12, q6, #2           @(X2(q1) + q0 + p1 + 2) >> 2; q0'
    910     vaddw.u8      q10, q10, d6          @p0 + q0 + q1 + q2
    911     vrshrn.u16    d8, q11, #3           @(p1 + X2(p0) + X2(q0) + X2(q1) + q2 + 4) >> 3 qo"
    912 
    913     vrshrn.u16    d2, q10, #2           @p0 + q0 + q1 + q2 + 2)>>2 q1'
    914     vbit          d12, d8, d15          @q0' or q0"
    915     vbic          d15, d15, d11         @final condn for q's
    916     vbit          d5, d2, d15           @final q1
    917     vaddl.u8      q12, d6, d7           @q2+q3
    918     vmla.u16      q10, q12, q14         @X2(q3) + X3(q2) + q1 + q0 + p0
    919     vbif          d4, d12, d11          @final q0
    920     vrshrn.u16    d9, q10, #3           @(X2(q3) + X3(q2) + q1 + q0 + p0 + 4) >> 3;
    921     vbit          d6, d9, d15           @final q2
    922     vand          d2, d10, d10          @D0->p3, D1->p2, D2->p1, D3->p0, D4->q0, D5->q1, D6->q2, D7->q3
    923 
    924     vzip.8        d0, d1                @D0,D1 -> [p3:p2]
    925     vzip.8        d2, d3                @D2,D3 -> [p1:p0]
    926     vzip.8        d4, d5                @D4,D5 -> [q0:q1]
    927     vzip.8        d6, d7                @D6,D7 -> [q2:q3]
    928 
    929     sub           r0, r0, r1, lsl#3     @restore pointer
    930 
    931     @storing [p3:p2],[p1:p0]:[q0:q1]:[q2:q3] in every row
    932     vst4.16       {d0[0], d2[0], d4[0], d6[0]}, [r0], r1
    933     vst4.16       {d0[1], d2[1], d4[1], d6[1]}, [r0], r1
    934     vst4.16       {d0[2], d2[2], d4[2], d6[2]}, [r0], r1
    935     vst4.16       {d0[3], d2[3], d4[3], d6[3]}, [r0], r1
    936     vst4.16       {d1[0], d3[0], d5[0], d7[0]}, [r0], r1
    937     vst4.16       {d1[1], d3[1], d5[1], d7[1]}, [r0], r1
    938     vst4.16       {d1[2], d3[2], d5[2], d7[2]}, [r0], r1
    939     vst4.16       {d1[3], d3[3], d5[3], d7[3]}, [r0], r1
    940     vpop          {d8 - d15}
    941     ldmfd         sp!, {pc}
    942 
    943 
    944 
    945 @**
    946 @*******************************************************************************
    947 @*
    948 @* @brief
    949 @*     Performs filtering of a luma block vertical edge for cases where the
    950 @*     boundary strength is less than 4 on calling twice
    951 @*
    952 @* @par Description:
    953 @*    This operation is described in  Sec. 8.7.2.4 under the title
    954 @*    "Filtering process for edges for bS equal to 4" in ITU T Rec H.264.
    955 @*
    956 @* @param[in] r0 - pu1_src
    957 @*  Pointer to the src sample q0
    958 @*
    959 @* @param[in] r1 - src_strd
    960 @*  Source stride
    961 @*
    962 @* @param[in] r2 - alpha
    963 @*  Alpha Value for the boundary
    964 @*
    965 @* @param[in] r3 - beta
    966 @*  Beta Value for the boundary
    967 @*
    968 @* @param[in] sp(0) - u4_bs
    969 @*  Packed Boundary strength array
    970 @*
    971 @* @param[in] sp(4) - pu1_cliptab
    972 @*  tc0_table
    973 @*
    974 @* @returns
    975 @*  None
    976 @*
    977 @* @remarks
    978 @*  None
    979 @*
    980 @*******************************************************************************
    981 @*
    982 
    983     .global ih264_deblk_luma_vert_bslt4_mbaff_a9
    984 
    985 ih264_deblk_luma_vert_bslt4_mbaff_a9:
    986 
    987     stmfd         sp!, {r12, lr}
    988 
    989     sub           r0, r0, #4            @pointer uc_edgePixel-4
    990     ldr           r12, [sp, #8]         @r12 = ui_Bs
    991     ldr           r14, [sp, #12]        @r14 = pu1_ClipTab
    992     vpush         {d8 - d15}
    993     @loading [p3:p2],[p1:p0]:[q0:q1]:[q2:q3] for every row
    994     vld4.16       {d0[0], d2[0], d4[0], d6[0]}, [r0], r1
    995     vld4.16       {d0[1], d2[1], d4[1], d6[1]}, [r0], r1
    996     vld4.16       {d0[2], d2[2], d4[2], d6[2]}, [r0], r1
    997     vld4.16       {d0[3], d2[3], d4[3], d6[3]}, [r0], r1
    998     vld4.16       {d1[0], d3[0], d5[0], d7[0]}, [r0], r1
    999     vld4.16       {d1[1], d3[1], d5[1], d7[1]}, [r0], r1
   1000     vld4.16       {d1[2], d3[2], d5[2], d7[2]}, [r0], r1
   1001     vld4.16       {d1[3], d3[3], d5[3], d7[3]}, [r0], r1
   1002 
   1003     vuzp.8        d0, d1                @D0->p3, D1->p2
   1004     vuzp.8        d2, d3                @D2->p1, D3->p0
   1005     vuzp.8        d4, d5                @D4->q0, D5->q1
   1006     vuzp.8        d6, d7                @D6->q2, D7->q3
   1007 
   1008     rev           r12, r12              @reversing ui_bs
   1009     vmov.32       d8[0], r12            @D8[0] = ui_Bs
   1010     vld1.32       d9[0], [r14]          @D9[0] contains cliptab
   1011     vmovl.u8      q15, d8               @D30 = ui_Bs in each 16 bt scalar
   1012     vtbl.8        d8, {d9}, d30         @puc_ClipTab[ui_Bs]
   1013     vsli.16       d8, d8, #8            @D8 = C0
   1014 
   1015     vrhadd.u8     d10, d3, d4           @((p0 + q0 + 1) >> 1)
   1016     vmov.i8       d31, #2
   1017     vabd.u8       d11, d3, d4           @ABS(p0 - q0)
   1018     vaddl.u8      q6, d10, d1           @(p2 + ((p0 + q0 + 1) >> 1)
   1019     vmlsl.u8      q6, d2, d31           @(p2 + ((p0 + q0 + 1) >> 1) - (p1 << 1))
   1020     vdup.8        d14, r2               @alpha
   1021     vcle.u8       d11, d14, d11         @ABS(p0 - q0) >= Alpha(Alpha <=ABS(p0 - q0))
   1022     vdup.i8       d14, r3               @beta
   1023     vabd.u8       d15, d5, d4           @ABS(q1 - q0)
   1024     vqshrn.s16    d12, q6, #1           @((p2 + ((p0 + q0 + 1) >> 1) - (p1 << 1)) >> 1)
   1025     vcge.u8       d15, d15, d14         @ABS(q1 - q0) >= Beta
   1026     vabd.u8       d13, d2, d3           @ABS(p1 - p0)
   1027     vmin.s8       d12, d12, d8          @min(deltap1 ,C0)
   1028     vorr          d11, d11, d15         @ABS(q1 - q0) >= Beta ||ABS(p0 - q0) >= Alpha
   1029     vneg.s8       d15, d8               @-C0
   1030     vcge.u8       d13, d13, d14         @ABS(p1 - p0) >= Beta
   1031     vmax.s8       d12, d12, d15         @max(deltap1,-C0)
   1032     vorr          d11, d11, d13         @ABS(p0 - q0) >= Alpha  || ABS(q1 - q0) >= Beta ||  ABS(p1 - p0) >= Beta)
   1033     vceq.u16      d13, d30, #0          @ui_bs == 0
   1034     vaddl.u8      q14, d10, d6          @q2 + ((p0 + q0 + 1) >> 1)
   1035     vsubw.u8      q14, q14, d5          @q2 + ((p0 + q0 + 1) >> 1) - q1
   1036     vsubw.u8      q14, q14, d5          @q2 + ((p0 + q0 + 1) >> 1) - 2*q1
   1037     vorr          d13, d13, d11         @(ABS(p0 - q0) >= Alpha  || ABS(q1 - q0) >= Beta || ABS(p1 - p0) >= Beta))
   1038                                         @|| (ui_bs == 0)
   1039     vqshrn.s16    d9, q14, #1           @(q2 + ((p0 + q0 + 1) >> 1) - (q1 << 1)) >> 1
   1040     vabd.u8       d11, d1, d3           @Ap = ABS(p2 - p0)
   1041     vabd.u8       d10, d6, d4           @Aq= ABS(q2 - q0)
   1042     vclt.u8       d11, d11, d14         @Ap < Beta
   1043     vmin.s8       d9, d9, d8            @min(deltaq1,C0)
   1044     vclt.u8       d10, d10, d14         @Aq < Beta
   1045     vmax.s8       d9, d9, d15           @max(deltaq1,-C0)
   1046     vsubl.u8      q7, d4, d3            @q0 - p0
   1047     vshl.s16      q7, q7, #2            @(q0 - p0) << 2
   1048     vsub.u8       d8, d8, d11           @C0 + (Ap < Beta)
   1049     vaddw.u8      q7, q7, d2            @((q0 - p0) << 2) + p1
   1050     vsubw.u8      q7, q7, d5            @((q0 - p0) << 2) + (p1 - q1)
   1051     vbic          d11, d11, d13         @final condition for p1
   1052     vrshr.s16     q15, q7, #3           @delta = (((q0 - p0) << 2) + (p1 - q1) + 4) >> 3
   1053     vsub.u8       d8, d8, d10           @C0 + (Ap < Beta) + (Aq < Beta)
   1054     vbic          d10, d10, d13         @final condition for q1
   1055     vabs.s16      q14, q15
   1056     vmovn.i16     d15, q14              @abs(delta)
   1057     vand          d12, d12, d11         @delatp1
   1058     vand          d9, d9, d10           @deltaq1
   1059     vmin.u8       d15, d15, d8          @min((abs(delta),C)
   1060     vadd.i8       d2, d2, d12           @p1+deltap1
   1061     vadd.i8       d5, d5, d9            @q1+deltaq1
   1062     vbic          d15, d15, d13         @abs(delta) of pixels to be changed only
   1063     vcge.s16      q14, q15, #0
   1064     vmovn.i16     d14, q14              @sign(delta)
   1065     vqsub.u8      d11, d3, d15          @clip(p0-delta)
   1066     vqadd.u8      d3, d3, d15           @clip(p0+delta)
   1067     vqadd.u8      d12, d4, d15          @clip(q0+delta)
   1068     vqsub.u8      d4, d4, d15           @clip(q0-delta)
   1069     vbif          d3, d11, d14          @p0
   1070     vbif          d4, d12, d14          @q0
   1071 
   1072     sub           r0, r0, r1, lsl#3     @restore pointer
   1073                                         @D0->p3, D1->p2, D2->p1, D3->p0, D4->q0, D5->q1, D6->q2, D7->q3
   1074     vzip.8        d0, d1                @D0,D1 -> [p3:p2]
   1075     vzip.8        d2, d3                @D2,D3 -> [p1:p0]
   1076     vzip.8        d4, d5                @D4,D5 -> [q0:q1]
   1077     vzip.8        d6, d7                @D6,D7 -> [q2:q3]
   1078 
   1079     @storing [p3:p2],[p1:p0]:[q0:q1]:[q2:q3] in every row
   1080     vst4.16       {d0[0], d2[0], d4[0], d6[0]}, [r0], r1
   1081     vst4.16       {d0[1], d2[1], d4[1], d6[1]}, [r0], r1
   1082     vst4.16       {d0[2], d2[2], d4[2], d6[2]}, [r0], r1
   1083     vst4.16       {d0[3], d2[3], d4[3], d6[3]}, [r0], r1
   1084     vst4.16       {d1[0], d3[0], d5[0], d7[0]}, [r0], r1
   1085     vst4.16       {d1[1], d3[1], d5[1], d7[1]}, [r0], r1
   1086     vst4.16       {d1[2], d3[2], d5[2], d7[2]}, [r0], r1
   1087     vst4.16       {d1[3], d3[3], d5[3], d7[3]}, [r0], r1
   1088     vpop          {d8 - d15}
   1089     ldmfd         sp!, {r12, pc}
   1090 
   1091 
   1092 
   1093