ih264_deblk_chroma_a9.s revision a2b49e5f0574dee76f81507f288143d83a4b7c1a
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
91ih264_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
167ih264_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
267ih264_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
369ih264_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
502ih264_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
586ih264_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
699ih264_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
786ih264_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
900ih264_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
1020ih264_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
1162ih264_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
1258ih264_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