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