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.data 23.p2align 2 24 25scratch_intrapred_luma_4x4_prediction: 26 .long ver, hor, d_c, dia_dl 27 .long dia_dr, ver_r, hor_d, ver_l 28 .long hor_u 29 30 31.text 32.p2align 2 33 34scratch_intrapred_luma_4x4_prediction_addr1: 35 .long scratch_intrapred_luma_4x4_prediction - scrintra_4x4 - 8 36 37 38 39@/** 40@****************************************************************************** 41@* 42@* @brief :Evaluate best intra 4x4 mode 43@* and do the prediction. 44@* 45@* @par Description 46@* This function evaluates 4x4 modes and compute corresponding sad 47@* and return the buffer predicted with best mode. 48@* 49@* @param[in] pu1_src 50@* UWORD8 pointer to the source 51@* 52@** @param[in] pu1_ngbr_pels 53@* UWORD8 pointer to neighbouring pels 54@* 55@* @param[out] pu1_dst 56@* UWORD8 pointer to the destination 57@* 58@* @param[in] src_strd 59@* integer source stride 60@* 61@* @param[in] dst_strd 62@* integer destination stride 63@* 64@* @param[in] u4_n_avblty 65@* availability of neighbouring pixels 66@* 67@* @param[in] u4_intra_mode 68@* Pointer to the variable in which best mode is returned 69@* 70@* @param[in] pu4_sadmin 71@* Pointer to the variable in which minimum cost is returned 72@* 73@* @param[in] u4_valid_intra_modes 74@* Says what all modes are valid 75@* 76@* * @param[in] u4_lambda 77@* Lamda value for computing cost from SAD 78@* 79@* @param[in] u4_predictd_mode 80@* Predicted mode for cost computation 81@* 82@* 83@* 84@* @return none 85@* 86@****************************************************************************** 87@*/ 88@void ih264e_evaluate_intra_4x4_modes(UWORD8 *pu1_src, 89@ UWORD8 *pu1_ngbr_pels, 90@ UWORD8 *pu1_dst, 91@ UWORD32 src_strd, 92@ UWORD32 dst_strd, 93@ WORD32 u4_n_avblty, 94@ UWORD32 *u4_intra_mode, 95@ WORD32 *pu4_sadmin, 96@ UWORD32 u4_valid_intra_modes, 97@ UWORD32 u4_lambda, 98@ UWORD32 u4_predictd_mode) 99 100 101 102 .global ih264e_evaluate_intra_4x4_modes_a9q 103 104ih264e_evaluate_intra_4x4_modes_a9q: 105 106@r0 = pu1_src, 107@r1 = pu1_ngbr_pels_i16, 108@r2 = pu1_dst, 109@r3 = src_strd, 110@r4 = dst_strd, 111@r5 = u4_n_avblty, 112@r6 = u4_intra_mode, 113@r7 = pu4_sadmin 114@r8 = u4_valid_intra_modes 115@r0 =u4_lambda 116@r1 = u4_predictd_mode 117 118 119 stmfd sp!, {r4-r12, r14} @store register values to stack 120 121@-------------------- 122 ldr r5, [sp, #44] @r5 = u4_n_avblty, 123@---------------------- 124 vpush {d8-d15} 125@Loading neighbours 126 vld1.32 {q0}, [r1] 127 add r4, r1, #12 128 vld1.8 d1[5], [r4] 129 vld1.8 d1[7], [r1] 130 @-------------------------------- 131 ldr r8, [sp, #120] @u4_valid_intra_modes 132@---------------------------------------------- 133 134 135 136@ LOADING pu1_src 137 vld1.32 {d20[0]}, [r0], r3 138 vext.8 q1, q0, q0, #1 139 vld1.32 {d20[1]}, [r0], r3 140 mov r11, #1 141 vld1.32 {d21[0]}, [r0], r3 142 lsl r11, r11, #30 143 vld1.32 {d21[1]}, [r0], r3 144 145 146 147@-------------------------------- 148 ldr r0, [sp, #124] @r0 =u4_lambda 149 ldr r1, [sp, #128] @r1 = u4_predictd_mode 150@------ 151 152 153vert: 154 ands r10, r8, #01 @VERT sad ?? 155 beq horz 156 vdup.32 q2, d2[1] 157 vabdl.u8 q14, d4, d20 158 vabal.u8 q14, d4, d21 159 vadd.i16 d28, d29, d28 160 subs r6, r1, #0 161 vpaddl.u16 d28, d28 @ 162 lslne r6, r0, #2 163 vpaddl.u32 d28, d28 @/ 164 moveq r6, r0 @ 165 vmov.u32 r9, d28[0] @ vert 166 add r9, r6, r9 167 168 subs r6, r11, r9 169 movgt r11, r9 170 movgt r12, #0 171 172horz: 173 ands r10, r8, #02 @HORZ sad ?? 174 beq dc 175 vdup.32 q3, d0[0] 176 vmov.32 q4, q3 177 vtrn.8 q3, q4 178 vtrn.16 d7, d6 179 vtrn.16 d9, d8 180 vtrn.32 d9, d7 181 vtrn.32 d8, d6 182 vabdl.u8 q14, d6, d20 183 subs r6, r1, #1 184 vabal.u8 q14, d7, d21 185 vadd.i16 d28, d29, d28 186 lslne r6, r0, #2 187 vpaddl.u16 d28, d28 @ 188 vpaddl.u32 d28, d28 @/ 189 vmov.u32 r9, d28[0] @ 190 moveq r6, r0 @ 191 add r9, r6, r9 192 193 subs r6, r11, r9 194 movgt r11, r9 195 movgt r12, #1 196 197dc: 198 ands r10, r8, #04 @DC sad ?? 199 beq diags 200 vext.8 q4, q0, q0, #5 201 vaddl.u8 q4, d0, d8 202 vpaddl.u16 d8, d8 @ 203 vpaddl.u32 d8, d8 @/ 204 vmov.u32 r4, d8[0] @ 205 mov r14, #1 206 ands r10, r5, #1 207 addne r4, r4, #2 208 addne r14, r14, #1 209 ands r10, r5, #4 210 addne r4, r4, #2 211 addne r14, r14, #1 212 ands r10, r5, #5 213 moveq r4, #128 214 moveq r14, #0 215 subs r6, r1, #2 216 lsr r4, r4, r14 217 vdup.8 q4, r4 218 lslne r6, r0, #2 219 vabdl.u8 q14, d8, d20 220 vabal.u8 q14, d9, d21 221 vadd.i16 d28, d29, d28 222 vpaddl.u16 d28, d28 @ 223 vpaddl.u32 d28, d28 @/ 224 vmov.u32 r9, d28[0] @ 225 226 moveq r6, r0 @ 227 add r9, r6, r9 228 229 subs r6, r11, r9 230 movgt r11, r9 231 movgt r12, #2 232 233diags: 234 ands r10, r8, #504 @/* if modes other than VERT, HORZ and DC are valid ????*/ 235 beq pred 236 @/* Performing FILT11 and FILT121 operation for all neighbour values*/ 237 vext.8 q5, q0, q0, #2 238 vaddl.u8 q6, d0, d2 239 vaddl.u8 q7, d1, d3 240 vaddl.u8 q8, d10, d2 241 vaddl.u8 q9, d11, d3 242 vadd.u16 q12, q10, q11 243 vqrshrun.s16 d10, q6, #1 244 vqrshrun.s16 d11, q7, #1 245 vadd.u16 q11, q6, q8 246 vadd.u16 q12, q7, q9 247 vqrshrun.s16 d12, q11, #2 248 vqrshrun.s16 d13, q12, #2 249 mov r14, #0 250 vdup.32 q13 , r14 251 mov r14, #-1 252 vmov.i32 d26[0], r14 253 254diag_dl: 255 ands r10, r8, #0x08 @DIAG_DL sad ?? 256 beq diag_dr 257 258 vext.8 q15, q6, q6, #5 259 vbit.32 d14, d30, d26 260 vext.8 q15, q6, q6, #15 261 vbit.32 d15, d31, d26 262 vext.8 q15, q6, q6, #2 263 vext.32 q14, q13, q13, #3 264 vbit.32 d14, d30, d28 265 vext.8 q15, q6, q6, #4 266 vbit.32 d15, d30, d28 267 vabdl.u8 q14, d14, d20 268 subs r6, r1, #3 269 vabal.u8 q14, d15, d21 270 vadd.i16 d28, d29, d28 271 vpaddl.u16 d28, d28 @ 272 lslne r6, r0, #2 273 vpaddl.u32 d28, d28 @/ 274 vmov.u32 r9, d28[0] @ 275 276 moveq r6, r0 @ 277 add r9, r6, r9 278 279 subs r6, r11, r9 280 movgt r11, r9 281 movgt r12, #3 282 283diag_dr: 284 ands r10, r8, #16 @DIAG_DR sad ?? 285 beq vert_r 286 287 vext.8 q15, q6, q6, #3 288 vbit.32 d16, d30, d26 289 vext.8 q15, q6, q6, #1 290 vbit.32 d17, d30, d26 291 vext.8 q15, q6, q6, #4 292 vext.32 q14, q13, q13, #3 293 vbit.32 d17, d31, d28 294 vext.8 q15, q6, q6, #6 295 vbit.32 d16, d31, d28 296 vabdl.u8 q14, d16, d20 297 subs r6, r1, #4 298 vabal.u8 q14, d17, d21 299 vadd.i16 d28, d29, d28 300 vpaddl.u16 d28, d28 @ 301 lslne r6, r0, #2 302 vpaddl.u32 d28, d28 @/ 303 vmov.u32 r9, d28[0] @ 304 305 moveq r6, r0 @ 306 add r9, r6, r9 307 308 subs r6, r11, r9 309 movgt r11, r9 310 movgt r12, #4 311 312vert_r: 313 ands r10, r8, #32 @VERT_R sad ?? 314 beq horz_d 315 vext.8 q15, q5, q5, #4 316 vbit.32 d18, d30, d26 317 vext.8 q15, q5, q5, #3 318 vbit.32 d19, d30, d26 319 vext.32 q14, q13, q13, #3 320 vext.8 q15, q6, q6, #15 321 vbit.32 d18, d30, d28 322 vext.8 q15, q6, q6, #14 323 vbit.32 d19, d30, d28 324 mov r14, #0 325 vdup.32 q14 , r14 326 mov r14, #0xff 327 vmov.i8 d28[0], r14 328 vext.8 q15, q6, q6, #2 329 vbit.32 d19, d30, d28 330 vext.32 q14, q14, q14, #3 331 subs r6, r1, #5 332 vext.8 q15, q6, q6, #13 333 vbit.32 d19, d30, d28 334 lslne r6, r0, #2 335 vabdl.u8 q14, d18, d20 336 vabal.u8 q14, d19, d21 337 vadd.i16 d28, d29, d28 338 vpaddl.u16 d28, d28 @ 339 vpaddl.u32 d28, d28 @/ 340 vmov.u32 r9, d28[0] @ 341 342 343 moveq r6, r0 @ 344 add r9, r6, r9 345 346 subs r6, r11, r9 347 movgt r11, r9 348 movgt r12, #5 349 350horz_d: 351 vmov.8 q1, q5 352 vmov.8 q15, q6 353 vzip.8 q1, q15 354 355 ands r10, r8, #64 @HORZ_D sad ?? 356 beq vert_l 357 vext.8 q15, q6, q6, #2 358 vbit.32 d8, d30, d26 359 mov r14, #0 360 vdup.32 q14 , r14 361 mov r14, #0xff 362 vmov.i8 d28[0], r14 363 vext.8 q15, q5, q5, #3 364 vbit.32 d8, d30, d28 365 vext.8 q15, q1, q1, #2 366 vbit.32 d9, d30, d26 367 vext.32 q14, q13, q13, #3 368 vbit.32 d8, d2, d28 369 subs r6, r1, #6 370 vext.8 q15, q1, q1, #12 371 vbit.32 d9, d30, d28 372 vabdl.u8 q14, d8, d20 373 vabal.u8 q14, d9, d21 374 vadd.i16 d28, d29, d28 375 vpaddl.u16 d28, d28 @ 376 lslne r6, r0, #2 377 vpaddl.u32 d28, d28 @/ 378 vmov.u32 r9, d28[0] @ 379 380 381 moveq r6, r0 @ 382 add r9, r6, r9 383 384 subs r6, r11, r9 385 movgt r11, r9 386 movgt r12, #6 387vert_l: 388 ands r10, r8, #128 @VERT_L sad ?? 389 beq horz_u 390 vext.8 q15, q5, q5, #5 391 vbit.32 d24, d30, d26 392 vext.8 q15, q15, q15, #1 393 vbit.32 d25, d30, d26 394 vext.8 q15, q6, q6, #1 395 vext.32 q14, q13, q13, #3 396 vbit.32 d24, d30, d28 397 vext.8 q15, q15, q15, #1 398 subs r6, r1, #7 399 vbit.32 d25, d30, d28 400 vabdl.u8 q14, d24, d20 401 vabal.u8 q14, d25, d21 402 vadd.i16 d28, d29, d28 403 vpaddl.u16 d28, d28 @ 404 lslne r6, r0, #2 405 vpaddl.u32 d28, d28 @/ 406 vmov.u32 r9, d28[0] @ 407 408 moveq r6, r0 @ 409 add r9, r6, r9 410 411 subs r6, r11, r9 412 movgt r11, r9 413 movgt r12, #7 414 415horz_u: 416 ands r10, r8, #256 @HORZ_U sad ?? 417 beq pred 418 vrev64.8 q5, q1 419 vdup.8 q1, d0[0] 420 vext.8 q6, q6, #7 421 mov r14, #0 422 vdup.32 q14 , r14 423 mov r14, #0xff 424 vmov.i8 d28[0], r14 425 vbit.32 d11, d13, d28 426 movw r14, #0xffff 427 vmov.i16 d28[0], r14 428 vext.8 q6, q5, q5, #7 429 subs r6, r1, #8 430 vbit.32 d3, d12, d28 431 vext.8 q6, q5, q5, #3 432 vbit.32 d2, d12, d26 433 vext.32 q14, q13, q13, #3 434 vext.8 q6, q5, q5, #1 435 vbit.32 d2, d12, d28 436 vabdl.u8 q14, d2, d20 437 vabal.u8 q14, d3, d21 438 vadd.i16 d28, d29, d28 439 vpaddl.u16 d28, d28 @ 440 lslne r6, r0, #2 441 vpaddl.u32 d28, d28 @/ 442 vmov.u32 r9, d28[0] @ 443 444 445 moveq r6, r0 @ 446 add r9, r6, r9 447 448 subs r6, r11, r9 449 movgt r11, r9 450 movgt r12, #8 451 452pred: @/*dOING FINAL PREDICTION*/ 453@--------------------------- 454 ldr r7, [sp, #116] @r7 = pu4_sadmin 455 ldr r6, [sp, #112] @ R6 =MODE 456@-------------------------- 457 str r11, [r7] @/STORING MIN SAD*/ 458 str r12, [r6] @/FINAL MODE*/ 459 460 461 ldr r3, scratch_intrapred_luma_4x4_prediction_addr1 462scrintra_4x4: 463 add r3, r3, pc 464 lsl r12, r12, #2 465 add r3, r3, r12 466 467 ldr r5, [r3] 468 and r5, r5, #0xfffffffe 469 470 bx r5 471 472 473ver: 474 vext.8 q0, q0, q0, #1 475 vdup.32 q15, d0[1] 476 b store 477 478hor: 479 vmov.32 q15, q3 480 b store 481 482d_c: 483 vdup.8 q15, r4 484 b store 485 486dia_dl: 487 vmov.32 q15, q7 488 b store 489 490dia_dr: 491 vmov.32 q15, q8 492 b store 493 494ver_r: 495 vmov.32 q15, q9 496 b store 497 498hor_d: 499 vmov.32 q15, q4 500 b store 501 502ver_l: 503 vmov.32 q15, q12 504 b store 505 506hor_u: 507 vmov.32 q15, q1 508 509store: @/* storing to pu1_dst*/ 510 511 ldr r4, [sp, #104] @r4 = dst_strd, 512 513 vst1.32 {d30[0]}, [r2], r4 514 vst1.32 {d30[1]}, [r2], r4 515 vst1.32 {d31[0]}, [r2], r4 516 vst1.32 {d31[1]}, [r2], r4 517 518 519end_func: 520 vpop {d8-d15} 521 ldmfd sp!, {r4-r12, pc} @Restoring registers from stack 522 523 524 525 526 527