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