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_chroma_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_chroma_vert_bs4_bp_a9()                  */
     29 @/*                      ih264_deblk_chroma_vert_bslt4_bp_a9()                */
     30 @/*                      ih264_deblk_chroma_horz_bs4_bp_a9()                  */
     31 @/*                      ih264_deblk_chroma_horz_bslt4_bp_a9()                */
     32 @/*                      ih264_deblk_chroma_vert_bs4_mbaff_bp_a9()            */
     33 @/*                      ih264_deblk_chroma_vert_bslt4_mbaff_bp_a9()          */
     34 @/*                      ih264_deblk_chroma_vert_bs4_a9()                     */
     35 @/*                      ih264_deblk_chroma_vert_bslt4_a9()                   */
     36 @/*                      ih264_deblk_chroma_horz_bs4_a9()                     */
     37 @/*                      ih264_deblk_chroma_horz_bslt4_a9()                   */
     38 @/*                      ih264_deblk_chroma_vert_bs4_mbaff_a9()               */
     39 @/*                      ih264_deblk_chroma_vert_bslt4_mbaff_a9()             */
     40 @/*                                                                           */
     41 @/*  Issues / Problems : None                                                 */
     42 @/*                                                                           */
     43 @/*  Revision History  :                                                      */
     44 @/*                                                                           */
     45 @/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
     46 @/*         28 11 2013   Ittiam          Draft                                */
     47 @/*         05 01 2015   Kaushik         Added double-call functions for      */
     48 @/*                      Senthoor        vertical deblocking, and high        */
     49 @/*                                      profile functions.                   */
     50 @/*                                                                           */
     51 @/*****************************************************************************/
     52 
     53 
     54 .text
     55 .p2align 2
     56 
     57 @**
     58 @*******************************************************************************
     59 @*
     60 @* @brief
     61 @*     Performs filtering of a chroma block horizontal edge when the
     62 @*     boundary strength is set to 4
     63 @*
     64 @* @par Description:
     65 @*    This operation is described in  Sec. 8.7.2.4 under the title
     66 @*    "Filtering process for edges for bS equal to 4" in ITU T Rec H.264.
     67 @*
     68 @* @param[in] r0 - pu1_src
     69 @*  Pointer to the src sample q0
     70 @*
     71 @* @param[in] r1 - src_strd
     72 @*  Source stride
     73 @*
     74 @* @param[in] r2 - alpha
     75 @*  Alpha Value for the boundary
     76 @*
     77 @* @param[in] r3 - beta
     78 @*  Beta Value for the boundary
     79 @*
     80 @* @returns
     81 @*  None
     82 @*
     83 @* @remarks
     84 @*  None
     85 @*
     86 @*******************************************************************************
     87 @*
     88 
     89     .global ih264_deblk_chroma_horz_bs4_bp_a9
     90 
     91 ih264_deblk_chroma_horz_bs4_bp_a9:
     92 
     93     stmfd         sp!, {r4, lr}         @
     94     vpush         {d8 - d15}
     95     sub           r0, r0, r1, lsl #1    @R0 = uc_edgePixel pointing to p1 of chroma
     96     vld2.8        {d6, d7}, [r0], r1    @D6 = p1u , D7 = p1v
     97     mov           r4, r0                @Keeping a backup of the pointer p0 of chroma
     98     vld2.8        {d4, d5}, [r0], r1    @D4 = p0u , D5 = p0v
     99     vdup.8        q10, r2               @Q10 contains alpha
    100     vld2.8        {d0, d1}, [r0], r1    @D0 = q0u , D1 = q0v
    101     vaddl.u8      q4, d6, d0            @
    102     vaddl.u8      q5, d7, d1            @Q4,Q5 = q0 + p1
    103     vmov.i8       d31, #2               @
    104     vld2.8        {d2, d3}, [r0]        @D2 = q1u , D3 = q1v
    105     vabd.u8       q13, q3, q2           @Q13 = ABS(p1 - p0)
    106     vmlal.u8      q4, d2, d31           @
    107     vmlal.u8      q5, d3, d31           @Q5,Q4 = (X2(q1U) + q0U + p1U)
    108     vabd.u8       q11, q2, q0           @Q11 = ABS(p0 - q0)
    109     vabd.u8       q12, q1, q0           @Q12 = ABS(q1 - q0)
    110     vaddl.u8      q7, d4, d2            @
    111     vaddl.u8      q14, d5, d3           @Q14,Q7 = P0 + Q1
    112     vdup.8        q8, r3                @Q8 contains beta
    113     vmlal.u8      q7, d6, d31           @
    114     vmlal.u8      q14, d7, d31          @Q14,Q7 = (X2(p1U) + p0U + q1U)
    115     vcge.u8       q9, q11, q10          @Q9 = ( ABS(p0 - q0) >= Alpha )
    116     vcge.u8       q12, q12, q8          @Q12= ( ABS(q1 - q0) >= Beta )
    117     vcge.u8       q13, q13, q8          @Q13= ( ABS(p1 - p0) >= Beta )
    118     vrshrn.u16    d8, q4, #2            @
    119     vrshrn.u16    d9, q5, #2            @Q4 = (X2(q1U) + q0U + p1U + 2) >> 2
    120     vorr          q9, q9, q12           @Q9 = ( ABS(p0 - q0) >= Alpha ) | ( ABS(q1 - q0) >= Beta )
    121     vrshrn.u16    d10, q7, #2           @
    122     vrshrn.u16    d11, q14, #2          @Q5 = (X2(p1U) + p0U + q1U + 2) >> 2
    123     vorr          q9, q9, q13           @Q9 = ( ABS(p0 - q0) >= Alpha ) | ( ABS(q1 - q0) >= Beta ) | ( ABS(p1 - p0) >= Beta )
    124     vbit          q5, q2, q9            @
    125     vbit          q4, q0, q9            @
    126     vst2.8        {d10, d11}, [r4], r1  @
    127     vst2.8        {d8, d9}, [r4]        @
    128     vpop          {d8 - d15}
    129     ldmfd         sp!, {r4, pc}         @
    130 
    131 
    132 
    133 @**
    134 @*******************************************************************************
    135 @*
    136 @* @brief
    137 @*     Performs filtering of a chroma block vertical edge when the
    138 @*     boundary strength is set to 4
    139 @*
    140 @* @par Description:
    141 @*    This operation is described in  Sec. 8.7.2.4 under the title
    142 @*    "Filtering process for edges for bS equal to 4" in ITU T Rec H.264.
    143 @*
    144 @* @param[in] r0 - pu1_src
    145 @*  Pointer to the src sample q0
    146 @*
    147 @* @param[in] r1 - src_strd
    148 @*  Source stride
    149 @*
    150 @* @param[in] r2 - alpha
    151 @*  Alpha Value for the boundary
    152 @*
    153 @* @param[in] r3 - beta
    154 @*  Beta Value for the boundary
    155 @*
    156 @* @returns
    157 @*  None
    158 @*
    159 @* @remarks
    160 @*  None
    161 @*
    162 @*******************************************************************************
    163 @*
    164 
    165     .global ih264_deblk_chroma_vert_bs4_bp_a9
    166 
    167 ih264_deblk_chroma_vert_bs4_bp_a9:
    168 
    169     stmfd         sp!, {r12, r14}
    170     vpush         {d8 - d15}
    171     sub           r0, r0, #4            @point r0 to p1u of row0.
    172     mov           r12, r0               @keep a back up of r0 for buffer write
    173 
    174     vld4.16       {d0[0], d2[0], d4[0], d6[0]}, [r0], r1
    175     vld4.16       {d0[1], d2[1], d4[1], d6[1]}, [r0], r1
    176     vld4.16       {d0[2], d2[2], d4[2], d6[2]}, [r0], r1
    177     vld4.16       {d0[3], d2[3], d4[3], d6[3]}, [r0], r1
    178 
    179     vld4.16       {d1[0], d3[0], d5[0], d7[0]}, [r0], r1
    180     vld4.16       {d1[1], d3[1], d5[1], d7[1]}, [r0], r1
    181     vld4.16       {d1[2], d3[2], d5[2], d7[2]}, [r0], r1
    182     vld4.16       {d1[3], d3[3], d5[3], d7[3]}, [r0], r1
    183 
    184     vdup.8        q11, r2               @Q4 = alpha
    185     vdup.8        q12, r3               @Q5 = beta
    186     vmov.i8       d31, #2
    187 
    188     vabd.u8       q4, q1, q2            @|p0-q0|
    189     vabd.u8       q5, q3, q2            @|q1-q0|
    190     vabd.u8       q6, q0, q1            @|p1-p0|
    191     vaddl.u8      q7, d2, d6
    192     vaddl.u8      q8, d3, d7            @(p0 + q1)
    193     vclt.u8       q4, q4, q11           @|p0-q0| < alpha ?
    194     vclt.u8       q5, q5, q12           @|q1-q0| < beta ?
    195     vclt.u8       q6, q6, q12           @|p1-p0| < beta ?
    196     vmlal.u8      q7, d0, d31
    197     vmlal.u8      q8, d1, d31           @2*p1 + (p0 + q1)
    198     vaddl.u8      q9, d0, d4
    199     vaddl.u8      q10, d1, d5           @(p1 + q0)
    200     vand.u8       q4, q4, q5            @|p0-q0| < alpha && |q1-q0| < beta
    201     vmlal.u8      q9, d6, d31
    202     vmlal.u8      q10, d7, d31          @2*q1 + (p1 + q0)
    203 
    204     vrshrn.i16    d14, q7, #2
    205     vrshrn.i16    d15, q8, #2           @(2*p1 + (p0 + q1) + 2) >> 2
    206     vand.u8       q4, q4, q6            @|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta
    207     vrshrn.i16    d18, q9, #2
    208     vrshrn.i16    d19, q10, #2          @(2*q1 + (p1 + q0) + 2) >> 2
    209 
    210     vbit          q1, q7, q4
    211     vbit          q2, q9, q4
    212 
    213     vst4.16       {d0[0], d2[0], d4[0], d6[0]}, [r12], r1
    214     vst4.16       {d0[1], d2[1], d4[1], d6[1]}, [r12], r1
    215     vst4.16       {d0[2], d2[2], d4[2], d6[2]}, [r12], r1
    216     vst4.16       {d0[3], d2[3], d4[3], d6[3]}, [r12], r1
    217 
    218     vst4.16       {d1[0], d3[0], d5[0], d7[0]}, [r12], r1
    219     vst4.16       {d1[1], d3[1], d5[1], d7[1]}, [r12], r1
    220     vst4.16       {d1[2], d3[2], d5[2], d7[2]}, [r12], r1
    221     vst4.16       {d1[3], d3[3], d5[3], d7[3]}, [r12], r1
    222     vpop          {d8 - d15}
    223     ldmfd         sp!, {r12, pc}
    224 
    225 
    226 
    227 @**
    228 @*******************************************************************************
    229 @*
    230 @* @brief
    231 @*     Performs filtering of a chroma block horizontal edge for cases where the
    232 @*     boundary strength is less than 4
    233 @*
    234 @* @par Description:
    235 @*    This operation is described in  Sec. 8.7.2.4 under the title
    236 @*    "Filtering process for edges for bS equal to 4" in ITU T Rec H.264.
    237 @*
    238 @* @param[in] r0 - pu1_src
    239 @*  Pointer to the src sample q0
    240 @*
    241 @* @param[in] r1 - src_strd
    242 @*  Source stride
    243 @*
    244 @* @param[in] r2 - alpha
    245 @*  Alpha Value for the boundary
    246 @*
    247 @* @param[in] r3 - beta
    248 @*  Beta Value for the boundary
    249 @*
    250 @* @param[in] sp(0) - u4_bs
    251 @*  Packed Boundary strength array
    252 @*
    253 @* @param[in] sp(4) - pu1_cliptab
    254 @*  tc0_table
    255 @*
    256 @* @returns
    257 @*  None
    258 @*
    259 @* @remarks
    260 @*  None
    261 @*
    262 @*******************************************************************************
    263 @*
    264 
    265     .global ih264_deblk_chroma_horz_bslt4_bp_a9
    266 
    267 ih264_deblk_chroma_horz_bslt4_bp_a9:
    268 
    269     stmfd         sp!, {r4-r6, lr}      @
    270 
    271     ldrd          r4, r5, [sp, #0x10]   @r4 = u4_bs , r5 = pu1_cliptab
    272     vpush         {d8 - d15}
    273     sub           r0, r0, r1, lsl #1    @R0 = uc_edgePixelU pointing to p2 of chroma U
    274     rev           r4, r4                @
    275     vmov.32       d12[0], r4            @d12[0] = ui_Bs
    276     vld1.32       d16[0], [r5]          @D16[0] contains cliptab
    277     vld2.8        {d6, d7}, [r0], r1    @Q3=p1
    278     vtbl.8        d14, {d16}, d12       @
    279     vmovl.u8      q6, d12               @q6 = uc_Bs in each 16 bit scalar
    280     mov           r6, r0                @Keeping a backup of the pointer to chroma U P0
    281     vld2.8        {d4, d5}, [r0], r1    @Q2=p0
    282     vmov.i8       d30, #1               @
    283     vdup.8        q10, r2               @Q10 contains alpha
    284     vld2.8        {d0, d1}, [r0], r1    @Q0=q0
    285     vmovl.u8      q7, d14               @
    286     vld2.8        {d2, d3}, [r0]        @Q1=q1
    287     vsubl.u8      q5, d1, d5            @
    288     vsubl.u8      q4, d0, d4            @Q5,Q4 = (q0 - p0)
    289     vabd.u8       q13, q3, q2           @Q13 = ABS(p1 - p0)
    290     vshl.i16      q5, q5, #2            @Q5 = (q0 - p0)<<2
    291     vabd.u8       q11, q2, q0           @Q11 = ABS(p0 - q0)
    292     vshl.i16      q4, q4, #2            @Q4 = (q0 - p0)<<2
    293     vsli.16       q7, q7, #8            @
    294     vabd.u8       q12, q1, q0           @Q12 = ABS(q1 - q0)
    295     vcge.u8       q9, q11, q10          @Q9 = ( ABS(p0 - q0) >= Alpha )
    296     vsubl.u8      q10, d6, d2           @Q10 = (p1 - q1)L
    297     vsubl.u8      q3, d7, d3            @Q3 = (p1 - q1)H
    298     vdup.8        q8, r3                @Q8 contains beta
    299     vadd.i16      q4, q4, q10           @
    300     vadd.i16      q5, q5, q3            @Q5,Q4 = [ (q0 - p0)<<2 ] + (p1 - q1)
    301     vcge.u8       q12, q12, q8          @Q12= ( ABS(q1 - q0) >= Beta )
    302     vcgt.s16      d12, d12, #0          @Q6 = (us_Bs > 0)
    303     vqrshrn.s16   d8, q4, #3            @
    304     vqrshrn.s16   d9, q5, #3            @Q4 = i_macro = (((q0 - p0)<<2) + (p1 - q1) + 4)>>3
    305     vadd.i8       d14, d14, d30         @Q7 = C = C0+1
    306     vcge.u8       q13, q13, q8          @Q13= ( ABS(p1 - p0) >= Beta )
    307     vorr          q9, q9, q12           @Q9 = ( ABS(p0 - q0) >= Alpha ) | ( ABS(q1 - q0) >= Beta )
    308     vabs.s8       q3, q4                @Q4 = ABS (i_macro)
    309     vmov.i8       d15, d14              @
    310     vmov.i8       d13, d12              @
    311     vorr          q9, q9, q13           @Q9 = ( ABS(p0 - q0) >= Alpha ) | ( ABS(q1 - q0) >= Beta ) | ( ABS(p1 - p0) >= Beta )
    312     vmin.u8       q7, q3, q7            @Q7 = delta = (ABS(i_macro) > C) ? C : ABS(i_macro)
    313     vbic          q6, q6, q9            @final condition
    314     vcge.s8       q4, q4, #0            @Q4  = (i_macro >= 0)
    315     vand          q7, q7, q6            @Making delta zero in places where values shouldn be filterd
    316     vqadd.u8      q8, q2, q7            @Q8  = p0 + delta
    317     vqsub.u8      q2, q2, q7            @Q2 = p0 - delta
    318     vqadd.u8      q9, q0, q7            @Q9 = q0 + delta
    319     vqsub.u8      q0, q0, q7            @Q0 = q0 - delta
    320     vbif          q8, q2, q4            @Q8  = (i_macro >= 0 ) ? (p0+delta) : (p0-delta)
    321     vbif          q0, q9, q4            @Q0  = (i_macro >= 0 ) ? (q0-delta) : (q0+delta)
    322     vst2.8        {d16, d17}, [r6], r1  @
    323     vst2.8        {d0, d1}, [r6]        @
    324     vpop          {d8 - d15}
    325     ldmfd         sp!, {r4-r6, pc}      @
    326 
    327 
    328 
    329 @**
    330 @*******************************************************************************
    331 @*
    332 @* @brief
    333 @*     Performs filtering of a chroma block vertical edge for cases where the
    334 @*     boundary strength is less than 4
    335 @*
    336 @* @par Description:
    337 @*    This operation is described in  Sec. 8.7.2.4 under the title
    338 @*    "Filtering process for edges for bS equal to 4" in ITU T Rec H.264.
    339 @*
    340 @* @param[in] r0 - pu1_src
    341 @*  Pointer to the src sample q0
    342 @*
    343 @* @param[in] r1 - src_strd
    344 @*  Source stride
    345 @*
    346 @* @param[in] r2 - alpha
    347 @*  Alpha Value for the boundary
    348 @*
    349 @* @param[in] r3 - beta
    350 @*  Beta Value for the boundary
    351 @*
    352 @* @param[in] sp(0) - u4_bs
    353 @*  Packed Boundary strength array
    354 @*
    355 @* @param[in] sp(4) - pu1_cliptab
    356 @*  tc0_table
    357 @*
    358 @* @returns
    359 @*  None
    360 @*
    361 @* @remarks
    362 @*  None
    363 @*
    364 @*******************************************************************************
    365 @*
    366 
    367     .global ih264_deblk_chroma_vert_bslt4_bp_a9
    368 
    369 ih264_deblk_chroma_vert_bslt4_bp_a9:
    370 
    371     stmfd         sp!, {r10-r12, r14}
    372 
    373     sub           r0, r0, #4            @point r0 to p1u of row0.
    374     ldr           r11, [sp, #16]        @r12 = ui_Bs
    375 
    376     ldr           r10, [sp, #20]        @r14 = puc_ClipTab
    377     mov           r12, r0               @keep a back up of r0 for buffer write
    378     vpush         {d8 - d15}
    379     vld4.16       {d0[0], d2[0], d4[0], d6[0]}, [r0], r1
    380     vld4.16       {d0[1], d2[1], d4[1], d6[1]}, [r0], r1
    381     vld4.16       {d0[2], d2[2], d4[2], d6[2]}, [r0], r1
    382     vld4.16       {d0[3], d2[3], d4[3], d6[3]}, [r0], r1
    383 
    384     vld4.16       {d1[0], d3[0], d5[0], d7[0]}, [r0], r1
    385     vld4.16       {d1[1], d3[1], d5[1], d7[1]}, [r0], r1
    386     vld4.16       {d1[2], d3[2], d5[2], d7[2]}, [r0], r1
    387     vld4.16       {d1[3], d3[3], d5[3], d7[3]}, [r0], r1
    388 
    389 
    390     vdup.8        q11, r2               @Q4 = alpha
    391     vabd.u8       q4, q1, q2            @|p0-q0|
    392     vdup.8        q12, r3               @Q5 = beta
    393     vabd.u8       q5, q3, q2            @|q1-q0|
    394     vabd.u8       q6, q0, q1            @|p1-p0|
    395     vclt.u8       q4, q4, q11           @|p0-q0| < alpha ?
    396     vsubl.u8      q7, d0, d6
    397     vclt.u8       q5, q5, q12           @|q1-q0| < beta ?
    398     vsubl.u8      q8, d1, d7            @(p1 - q1)
    399     vclt.u8       q6, q6, q12           @|p1-p0| < beta ?
    400     vsubl.u8      q9, d4, d2
    401     vand.u8       q4, q4, q5            @|p0-q0| < alpha && |q1-q0| < beta
    402     vsubl.u8      q10, d5, d3           @(q0 - p0)
    403     vmov.u16      q14, #4
    404     vld1.32       {d24[0]}, [r10]       @Load ClipTable
    405     rev           r11, r11              @Blocking strengths
    406     vand.u8       q4, q4, q6            @|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta
    407 
    408     vmov.32       d10[0], r11
    409 
    410     vmla.s16      q7, q9, q14
    411     vmla.s16      q8, q10, q14          @4*(q0 - p0) + (p1 - q1)
    412 
    413     vmovl.u8      q5, d10
    414 
    415 
    416     vsli.u16      d10, d10, #8
    417     vmovl.u16     q5, d10
    418     vsli.u32      q5, q5, #16
    419     vtbl.8        d12, {d24}, d10
    420     vtbl.8        d13, {d24}, d11       @tC0
    421     vmov.u8       q12, #1
    422     vadd.u8       q6, q6, q12           @tC0 + 1
    423     vcge.u8       q5, q5, q12           @u4_bS > 0 ?
    424     vand.u8       q4, q4, q5            @|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta && u4_bs != 0
    425 
    426     @ Q0 - Q3(inputs),
    427     @ Q4 (|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta && u4_bs != 0),
    428     @ Q6 (tC)
    429 
    430     vrshr.s16     q7, q7, #3
    431     vrshr.s16     q8, q8, #3            @(((q0 - p0) << 2) + (p1 - q1) + 4) >> 3)
    432 
    433     vcgt.s16      q9, q7, #0
    434     vcgt.s16      q10, q8, #0
    435     vmovn.i16     d18, q9
    436     vmovn.i16     d19, q10              @Q9 = sign(delta)
    437     vabs.s16      q7, q7
    438     vabs.s16      q8, q8
    439     vmovn.u16     d14, q7
    440     vmovn.u16     d15, q8
    441     vmin.u8       q7, q7, q6            @Q7 = |delta|
    442 
    443     vqadd.u8      q10, q1, q7           @p0+|delta|
    444     vqadd.u8      q11, q2, q7           @q0+|delta|
    445     vqsub.u8      q12, q1, q7           @p0-|delta|
    446     vqsub.u8      q13, q2, q7           @q0-|delta|
    447 
    448     vbit          q12, q10, q9          @p0 + delta
    449     vbit          q11, q13, q9          @q0 - delta
    450 
    451     vbit          q1, q12, q4
    452     vbit          q2, q11, q4
    453 
    454     vst4.16       {d0[0], d2[0], d4[0], d6[0]}, [r12], r1
    455     vst4.16       {d0[1], d2[1], d4[1], d6[1]}, [r12], r1
    456     vst4.16       {d0[2], d2[2], d4[2], d6[2]}, [r12], r1
    457     vst4.16       {d0[3], d2[3], d4[3], d6[3]}, [r12], r1
    458 
    459     vst4.16       {d1[0], d3[0], d5[0], d7[0]}, [r12], r1
    460     vst4.16       {d1[1], d3[1], d5[1], d7[1]}, [r12], r1
    461     vst4.16       {d1[2], d3[2], d5[2], d7[2]}, [r12], r1
    462     vst4.16       {d1[3], d3[3], d5[3], d7[3]}, [r12], r1
    463     vpop          {d8 - d15}
    464     ldmfd         sp!, {r10-r12, pc}
    465 
    466 
    467 
    468 @**
    469 @*******************************************************************************
    470 @*
    471 @* @brief
    472 @*     Performs filtering of a chroma block vertical edge when the
    473 @*     boundary strength is set to 4 on calling twice
    474 @*
    475 @* @par Description:
    476 @*    This operation is described in  Sec. 8.7.2.4 under the title
    477 @*    "Filtering process for edges for bS equal to 4" in ITU T Rec H.264.
    478 @*
    479 @* @param[in] r0 - pu1_src
    480 @*  Pointer to the src sample q0
    481 @*
    482 @* @param[in] r1 - src_strd
    483 @*  Source stride
    484 @*
    485 @* @param[in] r2 - alpha
    486 @*  Alpha Value for the boundary
    487 @*
    488 @* @param[in] r3 - beta
    489 @*  Beta Value for the boundary
    490 @*
    491 @* @returns
    492 @*  None
    493 @*
    494 @* @remarks
    495 @*  None
    496 @*
    497 @*******************************************************************************
    498 @*
    499 
    500     .global ih264_deblk_chroma_vert_bs4_mbaff_bp_a9
    501 
    502 ih264_deblk_chroma_vert_bs4_mbaff_bp_a9:
    503 
    504     stmfd         sp!, {r12, r14}
    505     vpush         {d8 - d15}
    506     sub           r0, r0, #4            @point r0 to p1u of row0.
    507     mov           r12, r0               @keep a back up of r0 for buffer write
    508 
    509     vld4.16       {d0[0], d1[0], d2[0], d3[0]}, [r0], r1
    510     vld4.16       {d0[1], d1[1], d2[1], d3[1]}, [r0], r1
    511     vld4.16       {d0[2], d1[2], d2[2], d3[2]}, [r0], r1
    512     vld4.16       {d0[3], d1[3], d2[3], d3[3]}, [r0], r1
    513 
    514     vdup.8        d11, r2               @D11 = alpha
    515     vdup.8        d12, r3               @D12 = beta
    516     vmov.i8       d31, #2
    517 
    518     vabd.u8       d4, d1, d2            @|p0-q0|
    519     vabd.u8       d5, d3, d2            @|q1-q0|
    520     vabd.u8       d6, d0, d1            @|p1-p0|
    521     vaddl.u8      q14, d1, d3           @(p0 + q1)
    522     vclt.u8       d4, d4, d11           @|p0-q0| < alpha ?
    523     vclt.u8       d5, d5, d12           @|q1-q0| < beta ?
    524     vclt.u8       d6, d6, d12           @|p1-p0| < beta ?
    525     vmlal.u8      q14, d0, d31          @2*p1 + (p0 + q1)
    526     vaddl.u8      q13, d0, d2           @(p1 + q0)
    527     vand.u8       d4, d4, d5            @|p0-q0| < alpha && |q1-q0| < beta
    528     vmlal.u8      q13, d3, d31          @2*q1 + (p1 + q0)
    529 
    530     vrshrn.i16    d7, q14, #2           @(2*p1 + (p0 + q1) + 2) >> 2
    531     vand.u8       d4, d4, d6            @|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta
    532     vrshrn.i16    d9, q13, #2           @(2*q1 + (p1 + q0) + 2) >> 2
    533 
    534     vbit          d1, d7, d4
    535     vbit          d2, d9, d4
    536 
    537     vst4.16       {d0[0], d1[0], d2[0], d3[0]}, [r12], r1
    538     vst4.16       {d0[1], d1[1], d2[1], d3[1]}, [r12], r1
    539     vst4.16       {d0[2], d1[2], d2[2], d3[2]}, [r12], r1
    540     vst4.16       {d0[3], d1[3], d2[3], d3[3]}, [r12], r1
    541     vpop          {d8 - d15}
    542     ldmfd         sp!, {r12, pc}
    543 
    544 
    545 
    546 @**
    547 @*******************************************************************************
    548 @*
    549 @* @brief
    550 @*     Performs filtering of a chroma block vertical edge for cases where the
    551 @*     boundary strength is less than 4 on calling twice
    552 @*
    553 @* @par Description:
    554 @*    This operation is described in  Sec. 8.7.2.4 under the title
    555 @*    "Filtering process for edges for bS equal to 4" in ITU T Rec H.264.
    556 @*
    557 @* @param[in] r0 - pu1_src
    558 @*  Pointer to the src sample q0
    559 @*
    560 @* @param[in] r1 - src_strd
    561 @*  Source stride
    562 @*
    563 @* @param[in] r2 - alpha
    564 @*  Alpha Value for the boundary
    565 @*
    566 @* @param[in] r3 - beta
    567 @*  Beta Value for the boundary
    568 @*
    569 @* @param[in] sp(0) - u4_bs
    570 @*  Packed Boundary strength array
    571 @*
    572 @* @param[in] sp(4) - pu1_cliptab
    573 @*  tc0_table
    574 @*
    575 @* @returns
    576 @*  None
    577 @*
    578 @* @remarks
    579 @*  None
    580 @*
    581 @*******************************************************************************
    582 @*
    583 
    584     .global ih264_deblk_chroma_vert_bslt4_mbaff_bp_a9
    585 
    586 ih264_deblk_chroma_vert_bslt4_mbaff_bp_a9:
    587 
    588     stmfd         sp!, {r10-r12, r14}
    589 
    590     sub           r0, r0, #4            @point r0 to p1u of row0.
    591     ldr           r11, [sp, #16]        @r11 = ui_Bs
    592 
    593     ldr           r10, [sp, #20]        @r10 = puc_ClipTab
    594     mov           r12, r0               @keep a back up of r0 for buffer write
    595     vpush         {d8 - d15}
    596     vld4.16       {d0[0], d1[0], d2[0], d3[0]}, [r0], r1
    597     vld4.16       {d0[1], d1[1], d2[1], d3[1]}, [r0], r1
    598     vld4.16       {d0[2], d1[2], d2[2], d3[2]}, [r0], r1
    599     vld4.16       {d0[3], d1[3], d2[3], d3[3]}, [r0], r1
    600 
    601     vdup.8        d11, r2               @D11 = alpha
    602     vabd.u8       d4, d1, d2            @|p0-q0|
    603     vdup.8        d12, r3               @D12 = beta
    604     vabd.u8       d5, d3, d2            @|q1-q0|
    605     vabd.u8       d6, d0, d1            @|p1-p0|
    606     vclt.u8       d4, d4, d11           @|p0-q0| < alpha ?
    607     vclt.u8       d5, d5, d12           @|q1-q0| < beta ?
    608     vsubl.u8      q14, d0, d3           @(p1 - q1)
    609     vclt.u8       d6, d6, d12           @|p1-p0| < beta ?
    610     vand.u8       d4, d4, d5            @|p0-q0| < alpha && |q1-q0| < beta
    611     vsubl.u8      q12, d2, d1           @(q0 - p0)
    612     vmov.u16      q10, #4
    613 
    614     vld1.32       {d31[0]}, [r10]       @Load ClipTable
    615     rev           r11, r11              @Blocking strengths
    616     vand.u8       d4, d4, d6            @|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta
    617     vmov.32       d22[0], r11
    618     vmla.s16      q14, q12, q10         @4*(q0 - p0) + (p1 - q1)
    619     vmovl.u8      q11, d22
    620     vsli.u16      d22, d22, #8
    621     vtbl.8        d6, {d31}, d22        @tC0
    622     vmov.u8       d12, #1
    623     vadd.u8       d6, d6, d12           @tC0 + 1
    624     vcge.u8       d5, d22, d12          @u4_bS > 0 ?
    625     vand.u8       d4, d4, d5            @|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta && u4_bs != 0
    626 
    627     @ D0 - D3(inputs),
    628     @ D4 (|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta && u4_bs != 0),
    629     @ D6 (tC)
    630 
    631     vrshr.s16     q14, q14, #3          @(((q0 - p0) << 2) + (p1 - q1) + 4) >> 3)
    632 
    633     vcgt.s16      q13, q14, #0
    634     vmovn.i16     d9, q13               @D9 = sign(delta)
    635     vabs.s16      q14, q14
    636     vmovn.u16     d7, q14
    637     vmin.u8       d7, d7, d6            @D7 = |delta|
    638 
    639     vqadd.u8      d10, d1, d7           @p0+|delta|
    640     vqadd.u8      d11, d2, d7           @q0+|delta|
    641     vqsub.u8      d12, d1, d7           @p0-|delta|
    642     vqsub.u8      d13, d2, d7           @q0-|delta|
    643 
    644     vbit          d12, d10, d9          @p0 + delta
    645     vbit          d11, d13, d9          @q0 - delta
    646 
    647     vbit          d1, d12, d4
    648     vbit          d2, d11, d4
    649 
    650     vst4.16       {d0[0], d1[0], d2[0], d3[0]}, [r12], r1
    651     vst4.16       {d0[1], d1[1], d2[1], d3[1]}, [r12], r1
    652     vst4.16       {d0[2], d1[2], d2[2], d3[2]}, [r12], r1
    653     vst4.16       {d0[3], d1[3], d2[3], d3[3]}, [r12], r1
    654     vpop          {d8 - d15}
    655     ldmfd         sp!, {r10-r12, pc}
    656 
    657 
    658 
    659 @**
    660 @*******************************************************************************
    661 @*
    662 @* @brief
    663 @*     Performs filtering of a chroma block horizontal edge when the
    664 @*     boundary strength is set to 4 in high profile
    665 @*
    666 @* @par Description:
    667 @*    This operation is described in  Sec. 8.7.2.4 under the title
    668 @*    "Filtering process for edges for bS equal to 4" in ITU T Rec H.264.
    669 @*
    670 @* @param[in] r0 - pu1_src
    671 @*  Pointer to the src sample q0
    672 @*
    673 @* @param[in] r1 - src_strd
    674 @*  Source stride
    675 @*
    676 @* @param[in] r2 - alpha_cb
    677 @*  Alpha Value for the boundary in U
    678 @*
    679 @* @param[in] r3 - beta_cb
    680 @*  Beta Value for the boundary in U
    681 @*
    682 @* @param[in] sp(0) - alpha_cr
    683 @*  Alpha Value for the boundary in V
    684 @*
    685 @* @param[in] sp(4) - beta_cr
    686 @*  Beta Value for the boundary in V
    687 @*
    688 @* @returns
    689 @*  None
    690 @*
    691 @* @remarks
    692 @*  None
    693 @*
    694 @*******************************************************************************
    695 @*
    696 
    697     .global ih264_deblk_chroma_horz_bs4_a9
    698 
    699 ih264_deblk_chroma_horz_bs4_a9:
    700 
    701     stmfd         sp!, {r4-r6, lr}      @
    702 
    703     ldr           r5, [sp, #16]         @R5 = alpha_cr
    704     ldr           r6, [sp, #20]         @R6 = beta_cr
    705     vpush         {d8 - d15}
    706     sub           r0, r0, r1, lsl #1    @R0 = uc_edgePixel pointing to p1 of chroma
    707     vld2.8        {d6, d7}, [r0], r1    @D6 = p1u , D7 = p1v
    708     mov           r4, r0                @Keeping a backup of the pointer p0 of chroma
    709     vld2.8        {d4, d5}, [r0], r1    @D4 = p0u , D5 = p0v
    710     vdup.8        d20, r2               @D20 contains alpha_cb
    711     vdup.8        d21, r5               @D21 contains alpha_cr
    712     vld2.8        {d0, d1}, [r0], r1    @D0 = q0u , D1 = q0v
    713     vaddl.u8      q4, d6, d0            @
    714     vaddl.u8      q5, d7, d1            @Q4,Q5 = q0 + p1
    715     vmov.i8       d31, #2               @
    716     vld2.8        {d2, d3}, [r0]        @D2 = q1u , D3 = q1v
    717     vabd.u8       q13, q3, q2           @Q13 = ABS(p1 - p0)
    718     vmlal.u8      q4, d2, d31           @
    719     vmlal.u8      q5, d3, d31           @Q5,Q4 = (X2(q1U) + q0U + p1U)
    720     vabd.u8       q11, q2, q0           @Q11 = ABS(p0 - q0)
    721     vabd.u8       q12, q1, q0           @Q12 = ABS(q1 - q0)
    722     vaddl.u8      q7, d4, d2            @
    723     vaddl.u8      q14, d5, d3           @Q14,Q7 = P0 + Q1
    724     vdup.8        d16, r3               @D16 contains beta_cb
    725     vdup.8        d17, r6               @D17 contains beta_cr
    726     vmlal.u8      q7, d6, d31           @
    727     vmlal.u8      q14, d7, d31          @Q14,Q7 = (X2(p1U) + p0U + q1U)
    728     vcge.u8       q9, q11, q10          @Q9 = ( ABS(p0 - q0) >= Alpha )
    729     vcge.u8       q12, q12, q8          @Q12= ( ABS(q1 - q0) >= Beta )
    730     vcge.u8       q13, q13, q8          @Q13= ( ABS(p1 - p0) >= Beta )
    731     vrshrn.u16    d8, q4, #2            @
    732     vrshrn.u16    d9, q5, #2            @Q4 = (X2(q1U) + q0U + p1U + 2) >> 2
    733     vorr          q9, q9, q12           @Q9 = ( ABS(p0 - q0) >= Alpha ) | ( ABS(q1 - q0) >= Beta )
    734     vrshrn.u16    d10, q7, #2           @
    735     vrshrn.u16    d11, q14, #2          @Q5 = (X2(p1U) + p0U + q1U + 2) >> 2
    736     vorr          q9, q9, q13           @Q9 = ( ABS(p0 - q0) >= Alpha ) | ( ABS(q1 - q0) >= Beta ) | ( ABS(p1 - p0) >= Beta )
    737     vbit          q5, q2, q9            @
    738     vbit          q4, q0, q9            @
    739     vst2.8        {d10, d11}, [r4], r1  @
    740     vst2.8        {d8, d9}, [r4]        @
    741     vpop          {d8 - d15}
    742     ldmfd         sp!, {r4-r6, pc}      @
    743 
    744 
    745 
    746 @**
    747 @*******************************************************************************
    748 @*
    749 @* @brief
    750 @*     Performs filtering of a chroma block vertical edge when the
    751 @*     boundary strength is set to 4 in high profile
    752 @*
    753 @* @par Description:
    754 @*    This operation is described in  Sec. 8.7.2.4 under the title
    755 @*    "Filtering process for edges for bS equal to 4" in ITU T Rec H.264.
    756 @*
    757 @* @param[in] r0 - pu1_src
    758 @*  Pointer to the src sample q0
    759 @*
    760 @* @param[in] r1 - src_strd
    761 @*  Source stride
    762 @*
    763 @* @param[in] r2 - alpha_cb
    764 @*  Alpha Value for the boundary in U
    765 @*
    766 @* @param[in] r3 - beta_cb
    767 @*  Beta Value for the boundary in U
    768 @*
    769 @* @param[in] sp(0) - alpha_cr
    770 @*  Alpha Value for the boundary in V
    771 @*
    772 @* @param[in] sp(4) - beta_cr
    773 @*  Beta Value for the boundary in V
    774 @*
    775 @* @returns
    776 @*  None
    777 @*
    778 @* @remarks
    779 @*  None
    780 @*
    781 @*******************************************************************************
    782 @*
    783 
    784     .global ih264_deblk_chroma_vert_bs4_a9
    785 
    786 ih264_deblk_chroma_vert_bs4_a9:
    787 
    788     stmfd         sp!, {r4, r5, r12, r14}
    789 
    790     sub           r0, r0, #4            @point r0 to p1u of row0.
    791     mov           r12, r0               @keep a back up of r0 for buffer write
    792 
    793     ldr           r4, [sp, #16]         @r4 = alpha_cr
    794     ldr           r5, [sp, #20]         @r5 = beta_cr
    795     add           r2, r2, r4, lsl #8    @r2 = (alpha_cr,alpha_cb)
    796     add           r3, r3, r5, lsl #8    @r3 = (beta_cr,beta_cb)
    797     vpush         {d8 - d15}
    798     vld4.16       {d0[0], d2[0], d4[0], d6[0]}, [r0], r1
    799     vld4.16       {d0[1], d2[1], d4[1], d6[1]}, [r0], r1
    800     vld4.16       {d0[2], d2[2], d4[2], d6[2]}, [r0], r1
    801     vld4.16       {d0[3], d2[3], d4[3], d6[3]}, [r0], r1
    802 
    803     vld4.16       {d1[0], d3[0], d5[0], d7[0]}, [r0], r1
    804     vld4.16       {d1[1], d3[1], d5[1], d7[1]}, [r0], r1
    805     vld4.16       {d1[2], d3[2], d5[2], d7[2]}, [r0], r1
    806     vld4.16       {d1[3], d3[3], d5[3], d7[3]}, [r0], r1
    807 
    808     vdup.16       q11, r2               @Q11 = alpha
    809     vdup.16       q12, r3               @Q12 = beta
    810     vmov.i8       d31, #2
    811 
    812     vabd.u8       q4, q1, q2            @|p0-q0|
    813     vabd.u8       q5, q3, q2            @|q1-q0|
    814     vabd.u8       q6, q0, q1            @|p1-p0|
    815     vaddl.u8      q7, d2, d6
    816     vaddl.u8      q8, d3, d7            @(p0 + q1)
    817     vclt.u8       q4, q4, q11           @|p0-q0| < alpha ?
    818     vclt.u8       q5, q5, q12           @|q1-q0| < beta ?
    819     vclt.u8       q6, q6, q12           @|p1-p0| < beta ?
    820     vmlal.u8      q7, d0, d31
    821     vmlal.u8      q8, d1, d31           @2*p1 + (p0 + q1)
    822     vaddl.u8      q9, d0, d4
    823     vaddl.u8      q10, d1, d5           @(p1 + q0)
    824     vand.u8       q4, q4, q5            @|p0-q0| < alpha && |q1-q0| < beta
    825     vmlal.u8      q9, d6, d31
    826     vmlal.u8      q10, d7, d31          @2*q1 + (p1 + q0)
    827 
    828     vrshrn.i16    d14, q7, #2
    829     vrshrn.i16    d15, q8, #2           @(2*p1 + (p0 + q1) + 2) >> 2
    830     vand.u8       q4, q4, q6            @|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta
    831     vrshrn.i16    d18, q9, #2
    832     vrshrn.i16    d19, q10, #2          @(2*q1 + (p1 + q0) + 2) >> 2
    833 
    834     vbit          q1, q7, q4
    835     vbit          q2, q9, q4
    836 
    837     vst4.16       {d0[0], d2[0], d4[0], d6[0]}, [r12], r1
    838     vst4.16       {d0[1], d2[1], d4[1], d6[1]}, [r12], r1
    839     vst4.16       {d0[2], d2[2], d4[2], d6[2]}, [r12], r1
    840     vst4.16       {d0[3], d2[3], d4[3], d6[3]}, [r12], r1
    841 
    842     vst4.16       {d1[0], d3[0], d5[0], d7[0]}, [r12], r1
    843     vst4.16       {d1[1], d3[1], d5[1], d7[1]}, [r12], r1
    844     vst4.16       {d1[2], d3[2], d5[2], d7[2]}, [r12], r1
    845     vst4.16       {d1[3], d3[3], d5[3], d7[3]}, [r12], r1
    846     vpop          {d8 - d15}
    847     ldmfd         sp!, {r4, r5, r12, pc}
    848 
    849 
    850 
    851 @**
    852 @*******************************************************************************
    853 @*
    854 @* @brief
    855 @*     Performs filtering of a chroma block horizontal edge for cases where the
    856 @*     boundary strength is less than 4 in high profile
    857 @*
    858 @* @par Description:
    859 @*    This operation is described in  Sec. 8.7.2.4 under the title
    860 @*    "Filtering process for edges for bS equal to 4" in ITU T Rec H.264.
    861 @*
    862 @* @param[in] r0 - pu1_src
    863 @*  Pointer to the src sample q0
    864 @*
    865 @* @param[in] r1 - src_strd
    866 @*  Source stride
    867 @*
    868 @* @param[in] r2 - alpha_cb
    869 @*  Alpha Value for the boundary in U
    870 @*
    871 @* @param[in] r3 - beta_cb
    872 @*  Beta Value for the boundary in U
    873 @*
    874 @* @param[in] sp(0) - alpha_cr
    875 @*  Alpha Value for the boundary in V
    876 @*
    877 @* @param[in] sp(4) - beta_cr
    878 @*  Beta Value for the boundary in V
    879 @*
    880 @* @param[in] sp(8) - u4_bs
    881 @*  Packed Boundary strength array
    882 @*
    883 @* @param[in] sp(12) - pu1_cliptab_cb
    884 @*  tc0_table for U
    885 @*
    886 @* @param[in] sp(16) - pu1_cliptab_cr
    887 @*  tc0_table for V
    888 @*
    889 @* @returns
    890 @*  None
    891 @*
    892 @* @remarks
    893 @*  None
    894 @*
    895 @*******************************************************************************
    896 @*
    897 
    898     .global ih264_deblk_chroma_horz_bslt4_a9
    899 
    900 ih264_deblk_chroma_horz_bslt4_a9:
    901 
    902     stmfd         sp!, {r4-r9, lr}      @
    903 
    904     ldrd          r4, r5, [sp, #28]     @R4 = alpha_cr , R5 = beta_cr
    905     ldr           r7, [sp, #36]         @R7 = u4_bs
    906     ldrd          r8, r9, [sp, #40]     @R8 = pu1_cliptab_cb , R9 = pu1_cliptab_cr
    907     sub           r0, r0, r1, lsl #1    @R0 = uc_edgePixelU pointing to p1 of chroma U
    908     vpush         {d8 - d15}
    909     rev           r7, r7                @
    910     vmov.32       d12[0], r7            @D12[0] = ui_Bs
    911 
    912     vld1.32       d16[0], [r8]          @D16[0] contains cliptab_cb
    913     vld1.32       d17[0], [r9]          @D17[0] contains cliptab_cr
    914     vld2.8        {d6, d7}, [r0], r1    @Q3=p1
    915     vtbl.8        d14, {d16}, d12       @Retreiving cliptab values for U
    916     vtbl.8        d28, {d17}, d12       @Retrieving cliptab values for V
    917     vmovl.u8      q6, d12               @Q6 = uc_Bs in each 16 bit scalar
    918     mov           r6, r0                @Keeping a backup of the pointer to chroma U P0
    919     vld2.8        {d4, d5}, [r0], r1    @Q2=p0
    920     vmov.i8       d30, #1               @
    921     vdup.8        d20, r2               @D20 contains alpha_cb
    922     vdup.8        d21, r4               @D21 contains alpha_cr
    923     vld2.8        {d0, d1}, [r0], r1    @Q0=q0
    924     vmovl.u8      q7, d14               @
    925     vmovl.u8      q14, d28              @
    926     vmov.i16      d15, d28              @D14 has cliptab values for U, D15 for V
    927     vld2.8        {d2, d3}, [r0]        @Q1=q1
    928     vsubl.u8      q5, d1, d5            @
    929     vsubl.u8      q4, d0, d4            @Q5,Q4 = (q0 - p0)
    930     vabd.u8       q13, q3, q2           @Q13 = ABS(p1 - p0)
    931     vshl.i16      q5, q5, #2            @Q5 = (q0 - p0)<<2
    932     vabd.u8       q11, q2, q0           @Q11 = ABS(p0 - q0)
    933     vshl.i16      q4, q4, #2            @Q4 = (q0 - p0)<<2
    934     vsli.16       q7, q7, #8            @
    935     vabd.u8       q12, q1, q0           @Q12 = ABS(q1 - q0)
    936     vcge.u8       q9, q11, q10          @Q9 = ( ABS(p0 - q0) >= Alpha )
    937     vsubl.u8      q10, d6, d2           @Q10 = (p1 - q1)L
    938     vsubl.u8      q3, d7, d3            @Q3 = (p1 - q1)H
    939     vdup.8        d16, r3               @Q8 contains beta_cb
    940     vdup.8        d17, r5               @Q8 contains beta_cr
    941     vadd.i16      q4, q4, q10           @
    942     vadd.i16      q5, q5, q3            @Q5,Q4 = [ (q0 - p0)<<2 ] + (p1 - q1)
    943     vcge.u8       q12, q12, q8          @Q12= ( ABS(q1 - q0) >= Beta )
    944     vcgt.s16      d12, d12, #0          @Q6 = (us_Bs > 0)
    945     vqrshrn.s16   d8, q4, #3            @
    946     vqrshrn.s16   d9, q5, #3            @Q4 = i_macro = (((q0 - p0)<<2) + (p1 - q1) + 4)>>3
    947     vadd.i8       d14, d14, d30         @D14 = C = C0+1 for U
    948     vcge.u8       q13, q13, q8          @Q13= ( ABS(p1 - p0) >= Beta )
    949     vorr          q9, q9, q12           @Q9 = ( ABS(p0 - q0) >= Alpha ) | ( ABS(q1 - q0) >= Beta )
    950     vabs.s8       q3, q4                @Q4 = ABS (i_macro)
    951     vadd.i8       d15, d15, d30         @D15 = C = C0+1 for V
    952     vmov.i8       d13, d12              @
    953     vorr          q9, q9, q13           @Q9 = ( ABS(p0 - q0) >= Alpha ) | ( ABS(q1 - q0) >= Beta ) | ( ABS(p1 - p0) >= Beta )
    954     vmin.u8       q7, q3, q7            @Q7 = delta = (ABS(i_macro) > C) ? C : ABS(i_macro)
    955     vbic          q6, q6, q9            @final condition
    956     vcge.s8       q4, q4, #0            @Q4  = (i_macro >= 0)
    957     vand          q7, q7, q6            @Making delta zero in places where values shouldn be filterd
    958     vqadd.u8      q8, q2, q7            @Q8 = p0 + delta
    959     vqsub.u8      q2, q2, q7            @Q2 = p0 - delta
    960     vqadd.u8      q9, q0, q7            @Q9 = q0 + delta
    961     vqsub.u8      q0, q0, q7            @Q0 = q0 - delta
    962     vbif          q8, q2, q4            @Q8 = (i_macro >= 0 ) ? (p0+delta) : (p0-delta)
    963     vbif          q0, q9, q4            @Q0 = (i_macro >= 0 ) ? (q0-delta) : (q0+delta)
    964     vst2.8        {d16, d17}, [r6], r1  @
    965     vst2.8        {d0, d1}, [r6]        @
    966     vpop          {d8 - d15}
    967     ldmfd         sp!, {r4-r9, pc}      @
    968 
    969 
    970 
    971 @**
    972 @*******************************************************************************
    973 @*
    974 @* @brief
    975 @*     Performs filtering of a chroma block vertical edge for cases where the
    976 @*     boundary strength is less than 4 in high profile
    977 @*
    978 @* @par Description:
    979 @*    This operation is described in  Sec. 8.7.2.4 under the title
    980 @*    "Filtering process for edges for bS equal to 4" in ITU T Rec H.264.
    981 @*
    982 @* @param[in] r0 - pu1_src
    983 @*  Pointer to the src sample q0
    984 @*
    985 @* @param[in] r1 - src_strd
    986 @*  Source stride
    987 @*
    988 @* @param[in] r2 - alpha_cb
    989 @*  Alpha Value for the boundary in U
    990 @*
    991 @* @param[in] r3 - beta_cb
    992 @*  Beta Value for the boundary in U
    993 @*
    994 @* @param[in] sp(0) - alpha_cr
    995 @*  Alpha Value for the boundary in V
    996 @*
    997 @* @param[in] sp(4) - beta_cr
    998 @*  Beta Value for the boundary in V
    999 @*
   1000 @* @param[in] sp(8) - u4_bs
   1001 @*  Packed Boundary strength array
   1002 @*
   1003 @* @param[in] sp(12) - pu1_cliptab_cb
   1004 @*  tc0_table for U
   1005 @*
   1006 @* @param[in] sp(16) - pu1_cliptab_cr
   1007 @*  tc0_table for V
   1008 @*
   1009 @* @returns
   1010 @*  None
   1011 @*
   1012 @* @remarks
   1013 @*  None
   1014 @*
   1015 @*******************************************************************************
   1016 @*
   1017 
   1018     .global ih264_deblk_chroma_vert_bslt4_a9
   1019 
   1020 ih264_deblk_chroma_vert_bslt4_a9:
   1021 
   1022     stmfd         sp!, {r4-r7, r10-r12, r14}
   1023 
   1024     sub           r0, r0, #4            @point r0 to p1u of row0.
   1025     ldrd          r4, r5, [sp, #32]     @R4 = alpha_cr , R5 = beta_cr
   1026     add           r2, r2, r4, lsl #8
   1027     add           r3, r3, r5, lsl #8
   1028     ldr           r6, [sp, #40]         @R6 = u4_bs
   1029     ldrd          r10, r11, [sp, #44]   @R10 = pu1_cliptab_cb , R11 = pu1_cliptab_cr
   1030     vpush         {d8 - d15}
   1031     mov           r12, r0               @keep a back up of R0 for buffer write
   1032 
   1033     vld4.16       {d0[0], d2[0], d4[0], d6[0]}, [r0], r1
   1034     vld4.16       {d0[1], d2[1], d4[1], d6[1]}, [r0], r1
   1035     vld4.16       {d0[2], d2[2], d4[2], d6[2]}, [r0], r1
   1036     vld4.16       {d0[3], d2[3], d4[3], d6[3]}, [r0], r1
   1037 
   1038     vld4.16       {d1[0], d3[0], d5[0], d7[0]}, [r0], r1
   1039     vld4.16       {d1[1], d3[1], d5[1], d7[1]}, [r0], r1
   1040     vld4.16       {d1[2], d3[2], d5[2], d7[2]}, [r0], r1
   1041     vld4.16       {d1[3], d3[3], d5[3], d7[3]}, [r0], r1
   1042 
   1043 
   1044     vdup.16       q11, r2               @Q11 = alpha
   1045     vabd.u8       q4, q1, q2            @|p0-q0|
   1046     vdup.16       q12, r3               @Q12 = beta
   1047     vabd.u8       q5, q3, q2            @|q1-q0|
   1048     vabd.u8       q6, q0, q1            @|p1-p0|
   1049     vclt.u8       q4, q4, q11           @|p0-q0| < alpha ?
   1050     vsubl.u8      q7, d0, d6
   1051     vclt.u8       q5, q5, q12           @|q1-q0| < beta ?
   1052     vsubl.u8      q8, d1, d7            @(p1 - q1)
   1053     vclt.u8       q6, q6, q12           @|p1-p0| < beta ?
   1054     vsubl.u8      q9, d4, d2
   1055     vand.u8       q4, q4, q5            @|p0-q0| < alpha && |q1-q0| < beta
   1056     vsubl.u8      q10, d5, d3           @(q0 - p0)
   1057     vmov.u16      q14, #4
   1058     vld1.32       {d24[0]}, [r10]       @Load ClipTable for U
   1059     vld1.32       {d25[0]}, [r11]       @Load ClipTable for V
   1060     rev           r6, r6                @Blocking strengths
   1061     vand.u8       q4, q4, q6            @|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta
   1062 
   1063     vmov.32       d10[0], r6
   1064 
   1065     vmla.s16      q7, q9, q14
   1066     vmla.s16      q8, q10, q14          @4*(q0 - p0) + (p1 - q1)
   1067 
   1068     vmovl.u8      q5, d10
   1069     vsli.u16      d10, d10, #8
   1070     vtbl.8        d12, {d24}, d10       @tC0 for U
   1071     vtbl.8        d13, {d25}, d10       @tC0 for V
   1072     vzip.8        d12, d13
   1073     vmovl.u16     q5, d10
   1074     vsli.u32      q5, q5, #16
   1075     vmov.u8       q12, #1
   1076     vadd.u8       q6, q6, q12           @tC0 + 1
   1077     vcge.u8       q5, q5, q12           @u4_bS > 0 ?
   1078     vand.u8       q4, q4, q5            @|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta && u4_bs != 0
   1079 
   1080     @ Q0 - Q3(inputs),
   1081     @ Q4 (|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta && u4_bs != 0),
   1082     @ Q6 (tC)
   1083 
   1084     vrshr.s16     q7, q7, #3
   1085     vrshr.s16     q8, q8, #3            @(((q0 - p0) << 2) + (p1 - q1) + 4) >> 3)
   1086 
   1087     vcgt.s16      q9, q7, #0
   1088     vcgt.s16      q10, q8, #0
   1089     vmovn.i16     d18, q9
   1090     vmovn.i16     d19, q10              @Q9 = sign(delta)
   1091     vabs.s16      q7, q7
   1092     vabs.s16      q8, q8
   1093     vmovn.u16     d14, q7
   1094     vmovn.u16     d15, q8
   1095     vmin.u8       q7, q7, q6            @Q7 = |delta|
   1096 
   1097     vqadd.u8      q10, q1, q7           @p0+|delta|
   1098     vqadd.u8      q11, q2, q7           @q0+|delta|
   1099     vqsub.u8      q12, q1, q7           @p0-|delta|
   1100     vqsub.u8      q13, q2, q7           @q0-|delta|
   1101 
   1102     vbit          q12, q10, q9          @p0 + delta
   1103     vbit          q11, q13, q9          @q0 - delta
   1104 
   1105     vbit          q1, q12, q4
   1106     vbit          q2, q11, q4
   1107 
   1108     vst4.16       {d0[0], d2[0], d4[0], d6[0]}, [r12], r1
   1109     vst4.16       {d0[1], d2[1], d4[1], d6[1]}, [r12], r1
   1110     vst4.16       {d0[2], d2[2], d4[2], d6[2]}, [r12], r1
   1111     vst4.16       {d0[3], d2[3], d4[3], d6[3]}, [r12], r1
   1112 
   1113     vst4.16       {d1[0], d3[0], d5[0], d7[0]}, [r12], r1
   1114     vst4.16       {d1[1], d3[1], d5[1], d7[1]}, [r12], r1
   1115     vst4.16       {d1[2], d3[2], d5[2], d7[2]}, [r12], r1
   1116     vst4.16       {d1[3], d3[3], d5[3], d7[3]}, [r12], r1
   1117     vpop          {d8 - d15}
   1118     ldmfd         sp!, {r4-r7, r10-r12, pc}
   1119 
   1120 
   1121 
   1122 @**
   1123 @*******************************************************************************
   1124 @*
   1125 @* @brief
   1126 @*     Performs filtering of a chroma block vertical edge when the
   1127 @*     boundary strength is set to 4 on calling twice in high profile
   1128 @*
   1129 @* @par Description:
   1130 @*    This operation is described in  Sec. 8.7.2.4 under the title
   1131 @*    "Filtering process for edges for bS equal to 4" in ITU T Rec H.264.
   1132 @*
   1133 @* @param[in] r0 - pu1_src
   1134 @*  Pointer to the src sample q0
   1135 @*
   1136 @* @param[in] r1 - src_strd
   1137 @*  Source stride
   1138 @*
   1139 @* @param[in] r2 - alpha_cb
   1140 @*  Alpha Value for the boundary in U
   1141 @*
   1142 @* @param[in] r3 - beta_cb
   1143 @*  Beta Value for the boundary in U
   1144 @*
   1145 @* @param[in] sp(0) - alpha_cr
   1146 @*  Alpha Value for the boundary in V
   1147 @*
   1148 @* @param[in] sp(4) - beta_cr
   1149 @*  Beta Value for the boundary in V
   1150 @*
   1151 @* @returns
   1152 @*  None
   1153 @*
   1154 @* @remarks
   1155 @*  None
   1156 @*
   1157 @*******************************************************************************
   1158 @*
   1159 
   1160     .global ih264_deblk_chroma_vert_bs4_mbaff_a9
   1161 
   1162 ih264_deblk_chroma_vert_bs4_mbaff_a9:
   1163 
   1164     stmfd         sp!, {r4, r5, r12, r14}
   1165 
   1166     sub           r0, r0, #4            @point r0 to p1u of row0.
   1167     mov           r12, r0               @keep a back up of r0 for buffer write
   1168     ldrd          r4, r5, [sp, #16]     @R4 = alpha_cr , R5 = beta_cr
   1169     add           r2, r2, r4, lsl #8
   1170     add           r3, r3, r5, lsl #8
   1171     vpush         {d8 - d15}
   1172     vld4.16       {d0[0], d1[0], d2[0], d3[0]}, [r0], r1
   1173     vld4.16       {d0[1], d1[1], d2[1], d3[1]}, [r0], r1
   1174     vld4.16       {d0[2], d1[2], d2[2], d3[2]}, [r0], r1
   1175     vld4.16       {d0[3], d1[3], d2[3], d3[3]}, [r0], r1
   1176 
   1177     vdup.16       d11, r2               @D11 = alpha
   1178     vdup.16       d12, r3               @D12 = beta
   1179     vmov.i8       d31, #2
   1180 
   1181     vabd.u8       d4, d1, d2            @|p0-q0|
   1182     vabd.u8       d5, d3, d2            @|q1-q0|
   1183     vabd.u8       d6, d0, d1            @|p1-p0|
   1184     vaddl.u8      q14, d1, d3           @(p0 + q1)
   1185     vclt.u8       d4, d4, d11           @|p0-q0| < alpha ?
   1186     vclt.u8       d5, d5, d12           @|q1-q0| < beta ?
   1187     vclt.u8       d6, d6, d12           @|p1-p0| < beta ?
   1188     vmlal.u8      q14, d0, d31          @2*p1 + (p0 + q1)
   1189     vaddl.u8      q13, d0, d2           @(p1 + q0)
   1190     vand.u8       d4, d4, d5            @|p0-q0| < alpha && |q1-q0| < beta
   1191     vmlal.u8      q13, d3, d31          @2*q1 + (p1 + q0)
   1192 
   1193     vrshrn.i16    d7, q14, #2           @(2*p1 + (p0 + q1) + 2) >> 2
   1194     vand.u8       d4, d4, d6            @|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta
   1195     vrshrn.i16    d9, q13, #2           @(2*q1 + (p1 + q0) + 2) >> 2
   1196 
   1197     vbit          d1, d7, d4
   1198     vbit          d2, d9, d4
   1199 
   1200     vst4.16       {d0[0], d1[0], d2[0], d3[0]}, [r12], r1
   1201     vst4.16       {d0[1], d1[1], d2[1], d3[1]}, [r12], r1
   1202     vst4.16       {d0[2], d1[2], d2[2], d3[2]}, [r12], r1
   1203     vst4.16       {d0[3], d1[3], d2[3], d3[3]}, [r12], r1
   1204     vpop          {d8 - d15}
   1205     ldmfd         sp!, {r4, r5, r12, pc}
   1206 
   1207 
   1208 
   1209 @**
   1210 @*******************************************************************************
   1211 @*
   1212 @* @brief
   1213 @*     Performs filtering of a chroma block vertical edge for cases where the
   1214 @*     boundary strength is less than 4 on calling twice in high profile
   1215 @*
   1216 @* @par Description:
   1217 @*    This operation is described in  Sec. 8.7.2.4 under the title
   1218 @*    "Filtering process for edges for bS equal to 4" in ITU T Rec H.264.
   1219 @*
   1220 @* @param[in] r0 - pu1_src
   1221 @*  Pointer to the src sample q0
   1222 @*
   1223 @* @param[in] r1 - src_strd
   1224 @*  Source stride
   1225 @*
   1226 @* @param[in] r2 - alpha_cb
   1227 @*  Alpha Value for the boundary in U
   1228 @*
   1229 @* @param[in] r3 - beta_cb
   1230 @*  Beta Value for the boundary in U
   1231 @*
   1232 @* @param[in] sp(0) - alpha_cr
   1233 @*  Alpha Value for the boundary in V
   1234 @*
   1235 @* @param[in] sp(4) - beta_cr
   1236 @*  Beta Value for the boundary in V
   1237 @*
   1238 @* @param[in] sp(8) - u4_bs
   1239 @*  Packed Boundary strength array
   1240 @*
   1241 @* @param[in] sp(12) - pu1_cliptab_cb
   1242 @*  tc0_table for U
   1243 @*
   1244 @* @param[in] sp(16) - pu1_cliptab_cr
   1245 @*  tc0_table for V
   1246 @*
   1247 @* @returns
   1248 @*  None
   1249 @*
   1250 @* @remarks
   1251 @*  None
   1252 @*
   1253 @*******************************************************************************
   1254 @*
   1255 
   1256     .global ih264_deblk_chroma_vert_bslt4_mbaff_a9
   1257 
   1258 ih264_deblk_chroma_vert_bslt4_mbaff_a9:
   1259 
   1260     stmfd         sp!, {r4-r6, r10-r12, r14}
   1261 
   1262     sub           r0, r0, #4            @point r0 to p1u of row0.
   1263     mov           r12, r0               @keep a back up of r0 for buffer write
   1264 
   1265     ldrd          r4, r5, [sp, #28]     @R4 = alpha_cr , R5 = beta_cr
   1266     add           r2, r2, r4, lsl #8
   1267     add           r3, r3, r5, lsl #8
   1268     ldr           r6, [sp, #36]         @R6 = u4_bs
   1269     ldrd          r10, r11, [sp, #40]   @R10 = pu1_cliptab_cb , R11 = pu1_cliptab_cr
   1270     vpush         {d8 - d15}
   1271     vld4.16       {d0[0], d1[0], d2[0], d3[0]}, [r0], r1
   1272     vld4.16       {d0[1], d1[1], d2[1], d3[1]}, [r0], r1
   1273     vld4.16       {d0[2], d1[2], d2[2], d3[2]}, [r0], r1
   1274     vld4.16       {d0[3], d1[3], d2[3], d3[3]}, [r0], r1
   1275 
   1276     vdup.16       d11, r2               @D11 = alpha
   1277     vabd.u8       d4, d1, d2            @|p0-q0|
   1278     vdup.16       d12, r3               @D12 = beta
   1279     vabd.u8       d5, d3, d2            @|q1-q0|
   1280     vabd.u8       d6, d0, d1            @|p1-p0|
   1281     vclt.u8       d4, d4, d11           @|p0-q0| < alpha ?
   1282     vclt.u8       d5, d5, d12           @|q1-q0| < beta ?
   1283     vsubl.u8      q14, d0, d3           @(p1 - q1)
   1284     vclt.u8       d6, d6, d12           @|p1-p0| < beta ?
   1285     vand.u8       d4, d4, d5            @|p0-q0| < alpha && |q1-q0| < beta
   1286     vsubl.u8      q12, d2, d1           @(q0 - p0)
   1287     vmov.u16      q10, #4
   1288 
   1289     vld1.32       {d31[1]}, [r10]       @Load ClipTable for U
   1290     vld1.32       {d31[0]}, [r11]       @Load ClipTable for V
   1291     rev           r6, r6                @Blocking strengths
   1292     vand.u8       d4, d4, d6            @|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta
   1293     vmov.32       d22[0], r6
   1294     vmla.s16      q14, q12, q10         @4*(q0 - p0) + (p1 - q1)
   1295     vmovl.u8      q11, d22
   1296     vsli.u16      d22, d22, #8
   1297     vmov.u16      d13, #4
   1298     vadd.u8       d22, d22, d13
   1299     vtbl.8        d6, {d31}, d22        @tC0
   1300     vmov.u8       d12, #1
   1301     vsub.u8       d22, d22, d13
   1302     vadd.u8       d6, d6, d12           @tC0 + 1
   1303     vcge.u8       d5, d22, d12          @u4_bS > 0 ?
   1304     vand.u8       d4, d4, d5            @|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta && u4_bs != 0
   1305 
   1306     @ D0 - D3(inputs),
   1307     @ D4 (|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta && u4_bs != 0),
   1308     @ D6 (tC)
   1309 
   1310     vrshr.s16     q14, q14, #3          @(((q0 - p0) << 2) + (p1 - q1) + 4) >> 3)
   1311 
   1312     vcgt.s16      q13, q14, #0
   1313     vmovn.i16     d9, q13               @D9 = sign(delta)
   1314     vabs.s16      q14, q14
   1315     vmovn.u16     d7, q14
   1316     vmin.u8       d7, d7, d6            @D7 = |delta|
   1317 
   1318     vqadd.u8      d10, d1, d7           @p0+|delta|
   1319     vqadd.u8      d11, d2, d7           @q0+|delta|
   1320     vqsub.u8      d12, d1, d7           @p0-|delta|
   1321     vqsub.u8      d13, d2, d7           @q0-|delta|
   1322 
   1323     vbit          d12, d10, d9          @p0 + delta
   1324     vbit          d11, d13, d9          @q0 - delta
   1325 
   1326     vbit          d1, d12, d4
   1327     vbit          d2, d11, d4
   1328 
   1329     vst4.16       {d0[0], d1[0], d2[0], d3[0]}, [r12], r1
   1330     vst4.16       {d0[1], d1[1], d2[1], d3[1]}, [r12], r1
   1331     vst4.16       {d0[2], d1[2], d2[2], d3[2]}, [r12], r1
   1332     vst4.16       {d0[3], d1[3], d2[3], d3[3]}, [r12], r1
   1333     vpop          {d8 - d15}
   1334     ldmfd         sp!, {r4-r6, r10-r12, pc}
   1335 
   1336 
   1337 
   1338