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 @//---------------------------------------------------------------------------- 23 @// File Name : impeg2_idct.s 24 @// 25 @// Description : This file has the Idct Implementations for the 26 @// MPEG2 SP decoder on neon platform. 27 @// 28 @// Reference Document : 29 @// 30 @// Revision History : 31 @// Date Author Detail Description 32 @// ------------ ---------------- ---------------------------------- 33 @// Feb 22, 2008 Naveen Kumar T Created 34 @// 35 @//------------------------------------------------------------------------- 36 @*/ 37 38 @/* 39 @// ---------------------------------------------------------------------------- 40 @// Include Files 41 @// ---------------------------------------------------------------------------- 42 @*/ 43 44 .text 45 .p2align 2 46 .equ idct_stg1_shift , 12 47 .equ idct_stg2_shift , 16 48 .equ idct_stg1_round , (1 << (idct_stg1_shift - 1)) 49 .equ idct_stg2_round , (1 << (idct_stg2_shift - 1)) 50 @/* 51 @// ---------------------------------------------------------------------------- 52 @// Struct/Union Types and Define 53 @// ---------------------------------------------------------------------------- 54 @*/ 55 56 @/* 57 @// ---------------------------------------------------------------------------- 58 @// Static Global Data section variables 59 @// ---------------------------------------------------------------------------- 60 @*/ 61 @//--------------------------- NONE -------------------------------------------- 62 63 @/* 64 @// ---------------------------------------------------------------------------- 65 @// Static Prototype Functions 66 @// ---------------------------------------------------------------------------- 67 @*/ 68 @// -------------------------- NONE -------------------------------------------- 69 70 @/* 71 @// ---------------------------------------------------------------------------- 72 @// Exported functions 73 @// ---------------------------------------------------------------------------- 74 @*/ 75 76 .extern gai2_impeg2_idct_q15 77 .hidden gai2_impeg2_idct_q15 78 .extern gai2_impeg2_idct_q11 79 .hidden gai2_impeg2_idct_q11 80 .extern gai2_impeg2_idct_first_col_q15 81 .hidden gai2_impeg2_idct_first_col_q15 82 .extern gai2_impeg2_idct_first_col_q11 83 .hidden gai2_impeg2_idct_first_col_q11 84 .extern gai2_impeg2_mismatch_stg2_additive 85 .hidden gai2_impeg2_mismatch_stg2_additive 86 87 gai2_impeg2_idct_q15_addr1: 88 .long gai2_impeg2_idct_q15 - q15lbl1 - 8 89 gai2_impeg2_idct_q15_addr2: 90 .long gai2_impeg2_idct_q15 - q15lbl2 - 8 91 gai2_impeg2_idct_q11_addr1: 92 .long gai2_impeg2_idct_q11 - q11lbl1 - 8 93 gai2_impeg2_idct_q11_addr2: 94 .long gai2_impeg2_idct_q11 - q11lbl2 - 8 95 gai2_impeg2_idct_first_col_q15_addr1: 96 .long gai2_impeg2_idct_first_col_q15 - fcq15_lbl1 - 8 97 gai2_impeg2_idct_first_col_q15_addr2: 98 .long gai2_impeg2_idct_first_col_q15 - fcq15_lbl2 - 8 99 gai2_impeg2_idct_first_col_q15_addr3: 100 .long gai2_impeg2_idct_first_col_q15 - fcq15_lbl3 - 8 101 gai2_impeg2_mismatch_stg2_additive_addr: 102 .long gai2_impeg2_mismatch_stg2_additive - additive_lbl - 8 103 gai2_impeg2_idct_first_col_q11_addr1: 104 .long gai2_impeg2_idct_first_col_q11 - fcq11_lbl1 - 8 105 gai2_impeg2_idct_first_col_q11_addr2: 106 .long gai2_impeg2_idct_first_col_q11 - fcq11_lbl2 - 8 107 108 .global impeg2_idct_recon_dc_a9q 109 impeg2_idct_recon_dc_a9q: 110 stmfd sp!, {r4, r6, r12, lr} 111 @//r0: pi2_src 112 @//r1: pi2_tmp - not used, used as pred_strd 113 @//r2: pu1_pred 114 @//r3: pu1_dst 115 @//r4: used as scratch 116 @//r5: 117 118 ldr r1, [sp, #20] @//pred_strd 119 ldr r6, [sp, #24] @//dst_strd 120 121 ldr r14, gai2_impeg2_idct_q15_addr1 122 q15lbl1: 123 add r14, r14, pc 124 ldrsh r12, [r14] 125 ldrsh r4, [r0] 126 127 vld1.8 d0, [r2], r1 128 mul r4, r4, r12 129 130 vld1.8 d1, [r2], r1 131 add r4, #idct_stg1_round 132 133 vld1.8 d2, [r2], r1 134 asr r4, r4, #idct_stg1_shift 135 136 ldr r14, gai2_impeg2_idct_q11_addr1 137 q11lbl1: 138 add r14, r14, pc 139 ldrsh r12, [r14] 140 141 vld1.8 d3, [r2], r1 142 mul r4, r4, r12 143 144 vld1.8 d4, [r2], r1 145 add r4, #idct_stg2_round 146 147 vld1.8 d5, [r2], r1 148 asr r4, r4, #idct_stg2_shift 149 150 vld1.8 d6, [r2], r1 151 vdup.s16 q15, r4 152 153 154 vld1.8 d7, [r2], r1 155 156 vaddw.u8 q4, q15, d0 157 158 vaddw.u8 q5, q15, d1 159 vqmovun.s16 d0, q4 160 161 vaddw.u8 q6, q15, d2 162 vqmovun.s16 d1, q5 163 vst1.8 d0, [r3], r6 164 165 vaddw.u8 q7, q15, d3 166 vqmovun.s16 d2, q6 167 vst1.8 d1, [r3], r6 168 169 vaddw.u8 q8, q15, d4 170 vqmovun.s16 d3, q7 171 vst1.8 d2, [r3], r6 172 173 vaddw.u8 q9, q15, d5 174 vqmovun.s16 d4, q8 175 vst1.8 d3, [r3], r6 176 177 vaddw.u8 q10, q15, d6 178 vqmovun.s16 d5, q9 179 vst1.8 d4, [r3], r6 180 181 vaddw.u8 q11, q15, d7 182 vqmovun.s16 d6, q10 183 vst1.8 d5, [r3], r6 184 185 vqmovun.s16 d7, q11 186 vst1.8 d6, [r3], r6 187 188 189 vst1.8 d7, [r3], r6 190 191 ldmfd sp!, {r4, r6, r12, pc} 192 193 194 195 196 .global impeg2_idct_recon_dc_mismatch_a9q 197 impeg2_idct_recon_dc_mismatch_a9q: 198 stmfd sp!, {r4-r12, lr} 199 200 ldr r1, [sp, #44] @//pred_strd 201 ldr r6, [sp, #48] @//dst_strd 202 203 ldr r14, gai2_impeg2_idct_q15_addr2 204 q15lbl2: 205 add r14, r14, pc 206 ldrsh r12, [r14] 207 ldrsh r4, [r0] 208 209 mul r4, r4, r12 210 add r4, #idct_stg1_round 211 asr r4, r4, #idct_stg1_shift 212 213 ldr r14, gai2_impeg2_idct_q11_addr2 214 q11lbl2: 215 add r14, r14, pc 216 ldrsh r12, [r14] 217 mul r4, r4, r12 218 vdup.s32 q0, r4 219 220 mov r14, #16 @//Increment for table read 221 ldr r4, gai2_impeg2_mismatch_stg2_additive_addr 222 additive_lbl: 223 add r4, r4, pc 224 225 vld1.16 {q1}, [r4], r14 226 227 vld1.8 d30, [r2], r1 228 vmovl.s16 q4, d2 229 vmovl.s16 q5, d3 230 vraddhn.s32 d12, q0, q4 231 vraddhn.s32 d13, q0, q5 232 vaddw.u8 q7, q6, d30 233 vqmovun.s16 d30, q7 234 vst1.8 d30, [r3], r6 235 236 vld1.16 {q1}, [r4], r14 237 vld1.8 d30, [r2], r1 238 vmovl.s16 q4, d2 239 vmovl.s16 q5, d3 240 vraddhn.s32 d12, q0, q4 241 vraddhn.s32 d13, q0, q5 242 vaddw.u8 q7, q6, d30 243 vqmovun.s16 d30, q7 244 vst1.8 d30, [r3], r6 245 246 vld1.16 {q1}, [r4], r14 247 vld1.8 d30, [r2], r1 248 vmovl.s16 q4, d2 249 vmovl.s16 q5, d3 250 vraddhn.s32 d12, q0, q4 251 vraddhn.s32 d13, q0, q5 252 vaddw.u8 q7, q6, d30 253 vqmovun.s16 d30, q7 254 vst1.8 d30, [r3], r6 255 256 vld1.16 {q1}, [r4], r14 257 vld1.8 d30, [r2], r1 258 vmovl.s16 q4, d2 259 vmovl.s16 q5, d3 260 vraddhn.s32 d12, q0, q4 261 vraddhn.s32 d13, q0, q5 262 vaddw.u8 q7, q6, d30 263 vqmovun.s16 d30, q7 264 vst1.8 d30, [r3], r6 265 266 vld1.16 {q1}, [r4], r14 267 vld1.8 d30, [r2], r1 268 vmovl.s16 q4, d2 269 vmovl.s16 q5, d3 270 vraddhn.s32 d12, q0, q4 271 vraddhn.s32 d13, q0, q5 272 vaddw.u8 q7, q6, d30 273 vqmovun.s16 d30, q7 274 vst1.8 d30, [r3], r6 275 276 vld1.16 {q1}, [r4], r14 277 vld1.8 d30, [r2], r1 278 vmovl.s16 q4, d2 279 vmovl.s16 q5, d3 280 vraddhn.s32 d12, q0, q4 281 vraddhn.s32 d13, q0, q5 282 vaddw.u8 q7, q6, d30 283 vqmovun.s16 d30, q7 284 vst1.8 d30, [r3], r6 285 286 vld1.16 {q1}, [r4], r14 287 vld1.8 d30, [r2], r1 288 vmovl.s16 q4, d2 289 vmovl.s16 q5, d3 290 vraddhn.s32 d12, q0, q4 291 vraddhn.s32 d13, q0, q5 292 vaddw.u8 q7, q6, d30 293 vqmovun.s16 d30, q7 294 vst1.8 d30, [r3], r6 295 296 vld1.16 {q1}, [r4], r14 297 vld1.8 d30, [r2], r1 298 vmovl.s16 q4, d2 299 vmovl.s16 q5, d3 300 vraddhn.s32 d12, q0, q4 301 vraddhn.s32 d13, q0, q5 302 vaddw.u8 q7, q6, d30 303 vqmovun.s16 d30, q7 304 vst1.8 d30, [r3], r6 305 306 307 ldmfd sp!, {r4-r12, pc} 308 309 310 311 312 @/** 313 @ ******************************************************************************* 314 @ * 315 @ * ;brief 316 @ * This function performs Inverse transform and reconstruction for 8x8 317 @ * input block 318 @ * 319 @ * ;par Description: 320 @ * Performs inverse transform and adds the prediction data and clips output 321 @ * to 8 bit 322 @ * 323 @ * ;param[in] pi2_src 324 @ * Input 8x8 coefficients 325 @ * 326 @ * ;param[in] pi2_tmp 327 @ * Temporary 8x8 buffer for storing inverse 328 @ * 329 @ * transform 330 @ * 1st stage output 331 @ * 332 @ * ;param[in] pu1_pred 333 @ * Prediction 8x8 block 334 @ * 335 @ * ;param[out] pu1_dst 336 @ * Output 8x8 block 337 @ * 338 @ * ;param[in] src_strd 339 @ * Input stride 340 @ * 341 @ * ;param[in] pred_strd 342 @ * Prediction stride 343 @ * 344 @ * ;param[in] dst_strd 345 @ * Output Stride 346 @ * 347 @ * ;param[in] shift 348 @ * Output shift 349 @ * 350 @ * ;param[in] zero_cols 351 @ * Zero columns in pi2_src 352 @ * 353 @ * ;returns Void 354 @ * 355 @ * ;remarks 356 @ * None 357 @ * 358 @ ******************************************************************************* 359 @ */ 360 361 @void impeg2_itrans_recon_8x8(WORD16 *pi2_src, 362 @ WORD16 *pi2_tmp, 363 @ UWORD8 *pu1_pred, 364 @ UWORD8 *pu1_dst, 365 @ WORD32 src_strd, 366 @ WORD32 pred_strd, 367 @ WORD32 dst_strd, 368 @ WORD32 zero_cols 369 @ WORD32 zero_rows ) 370 371 @**************Variables Vs Registers************************* 372 @ r0 => *pi2_src 373 @ r1 => *pi2_tmp 374 @ r2 => *pu1_pred 375 @ r3 => *pu1_dst 376 @ src_strd 377 @ pred_strd 378 @ dst_strd 379 @ zero_cols 380 381 382 383 .global impeg2_idct_recon_a9q 384 impeg2_idct_recon_a9q: 385 @//Register Usage Reference - loading and Until IDCT of columns 386 @// Cosine Constants - D0 387 @// Sine Constants - D1 388 @// Row 0 First Half - D2 - y0 389 @// Row 1 First Half - D6 - y1 390 @// Row 2 First Half - D3 - y2 391 @// Row 3 First Half - D7 - y3 392 @// Row 4 First Half - D10 - y4 393 @// Row 5 First Half - D14 - y5 394 @// Row 6 First Half - D11 - y6 395 @// Row 7 First Half - D15 - y7 396 397 @// Row 0 Second Half - D4 - y0 398 @// Row 1 Second Half - D8 - y1 399 @// Row 2 Second Half - D5 - y2 400 @// Row 3 Second Half - D9 - y3 401 @// Row 4 Second Half - D12 - y4 402 @// Row 5 Second Half - D16 - y5 403 @// Row 6 Second Half - D13 - y6 404 @// Row 7 Second Half - D17 - y7 405 406 @// Copy the input pointer to another register 407 @// Step 1 : load all constants 408 stmfd sp!, {r4-r12, lr} 409 410 ldr r8, [sp, #44] @ prediction stride 411 ldr r7, [sp, #48] @ destination stride 412 ldr r6, [sp, #40] @ src stride 413 ldr r12, [sp, #52] 414 ldr r11, [sp, #56] 415 mov r6, r6, lsl #1 @ x sizeof(word16) 416 add r9, r0, r6, lsl #1 @ 2 rows 417 418 add r10, r6, r6, lsl #1 @ 3 rows 419 420 sub r10, r10, #8 @ - 4 cols * sizeof(WORD16) 421 sub r5, r6, #8 @ src_strd - 4 cols * sizeof(WORD16) 422 423 424 ldr r14, gai2_impeg2_idct_first_col_q15_addr1 425 fcq15_lbl1: 426 add r14, r14, pc 427 vld1.16 {d0, d1}, [r14] @//D0,D1 are used for storing the constant data 428 429 @//Step 2 Load all the input data 430 @//Step 3 Operate first 4 colums at a time 431 432 and r11, r11, #0xff 433 and r12, r12, #0xff 434 435 cmp r11, #0xf0 436 bge skip_last4_rows 437 438 439 vld1.16 d2, [r0]! 440 vld1.16 d3, [r9]! 441 vld1.16 d4, [r0], r5 442 vmull.s16 q10, d2, d0[0] @// y0 * cos4(part of c0 and c1) 443 vld1.16 d5, [r9], r5 444 vmull.s16 q9, d3, d1[2] @// y2 * sin2 (Q3 is freed by this time)(part of d1) 445 vld1.16 d6, [r0]! 446 vld1.16 d7, [r9]! 447 vmull.s16 q12, d6, d0[1] @// y1 * cos1(part of b0) 448 vld1.16 d8, [r0], r10 449 vmull.s16 q13, d6, d0[3] @// y1 * cos3(part of b1) 450 vld1.16 d9, [r9], r10 451 vmull.s16 q14, d6, d1[1] @// y1 * sin3(part of b2) 452 vld1.16 d10, [r0]! 453 vmull.s16 q15, d6, d1[3] @// y1 * sin1(part of b3) 454 vld1.16 d11, [r9]! 455 vmlal.s16 q12, d7, d0[3] @// y1 * cos1 + y3 * cos3(part of b0) 456 vld1.16 d12, [r0], r5 457 vmlsl.s16 q13, d7, d1[3] @// y1 * cos3 - y3 * sin1(part of b1) 458 vld1.16 d13, [r9], r5 459 vmlsl.s16 q14, d7, d0[1] @// y1 * sin3 - y3 * cos1(part of b2) 460 vld1.16 d14, [r0]! 461 vmlsl.s16 q15, d7, d1[1] @// y1 * sin1 - y3 * sin3(part of b3) 462 vld1.16 d15, [r9]! 463 vmull.s16 q11, d10, d0[0] @// y4 * cos4(part of c0 and c1) 464 vld1.16 d16, [r0], r10 465 vmull.s16 q3, d3, d0[2] @// y2 * cos2(part of d0) 466 vld1.16 d17, [r9], r10 467 468 @/* This following was activated when alignment is not there */ 469 @// VLD1.16 D2,[r0]! 470 @// VLD1.16 D3,[r2]! 471 @// VLD1.16 D4,[r0]! 472 @// VLD1.16 D5,[r2]! 473 @// VLD1.16 D6,[r0]! 474 @// VLD1.16 D7,[r2]! 475 @// VLD1.16 D8,[r0],r3 476 @// VLD1.16 D9,[r2],r3 477 @// VLD1.16 D10,[r0]! 478 @// VLD1.16 D11,[r2]! 479 @// VLD1.16 D12,[r0]! 480 @// VLD1.16 D13,[r2]! 481 @// VLD1.16 D14,[r0]! 482 @// VLD1.16 D15,[r2]! 483 @// VLD1.16 D16,[r0],r3 484 @// VLD1.16 D17,[r2],r3 485 486 487 488 489 vmlal.s16 q12, d14, d1[1] @// y1 * cos1 + y3 * cos3 + y5 * sin3(part of b0) 490 vmlsl.s16 q13, d14, d0[1] @// y1 * cos3 - y3 * sin1 - y5 * cos1(part of b1) 491 vmlal.s16 q14, d14, d1[3] @// y1 * sin3 - y3 * cos1 + y5 * sin1(part of b2) 492 vmlal.s16 q15, d14, d0[3] @// y1 * sin1 - y3 * sin3 + y5 * cos3(part of b3) 493 494 vmlsl.s16 q9, d11, d0[2] @// d1 = y2 * sin2 - y6 * cos2(part of a0 and a1) 495 vmlal.s16 q3, d11, d1[2] @// d0 = y2 * cos2 + y6 * sin2(part of a0 and a1) 496 497 vadd.s32 q5, q10, q11 @// c0 = y0 * cos4 + y4 * cos4(part of a0 and a1) 498 vsub.s32 q10, q10, q11 @// c1 = y0 * cos4 - y4 * cos4(part of a0 and a1) 499 500 vmlal.s16 q12, d15, d1[3] @// b0 = y1 * cos1 + y3 * cos3 + y5 * sin3 + y7 * sin1(part of r0,r7) 501 vmlsl.s16 q13, d15, d1[1] @// b1 = y1 * cos3 - y3 * sin1 - y5 * cos1 - y7 * sin3(part of r1,r6) 502 vmlal.s16 q14, d15, d0[3] @// b2 = y1 * sin3 - y3 * cos1 + y5 * sin1 + y7 * cos3(part of r2,r5) 503 vmlsl.s16 q15, d15, d0[1] @// b3 = y1 * sin1 - y3 * sin3 + y5 * cos3 - y7 * cos1(part of r3,r4) 504 505 vadd.s32 q7, q5, q3 @// a0 = c0 + d0(part of r0,r7) 506 vsub.s32 q5, q5, q3 @// a3 = c0 - d0(part of r3,r4) 507 vsub.s32 q11, q10, q9 @// a2 = c1 - d1(part of r2,r5) 508 vadd.s32 q9, q10, q9 @// a1 = c1 + d1(part of r1,r6) 509 510 vadd.s32 q10, q7, q12 @// a0 + b0(part of r0) 511 vsub.s32 q3, q7, q12 @// a0 - b0(part of r7) 512 513 vadd.s32 q12, q11, q14 @// a2 + b2(part of r2) 514 vsub.s32 q11, q11, q14 @// a2 - b2(part of r5) 515 516 vadd.s32 q14, q9, q13 @// a1 + b1(part of r1) 517 vsub.s32 q9, q9, q13 @// a1 - b1(part of r6) 518 519 vadd.s32 q13, q5, q15 @// a3 + b3(part of r3) 520 vsub.s32 q15, q5, q15 @// a3 - b3(part of r4) 521 522 vqrshrn.s32 d2, q10, #idct_stg1_shift @// r0 = (a0 + b0 + rnd) >> 7(IDCT_STG1_SHIFT) 523 vqrshrn.s32 d15, q3, #idct_stg1_shift @// r7 = (a0 - b0 + rnd) >> 7(IDCT_STG1_SHIFT) 524 vqrshrn.s32 d3, q12, #idct_stg1_shift @// r2 = (a2 + b2 + rnd) >> 7(IDCT_STG1_SHIFT) 525 vqrshrn.s32 d14, q11, #idct_stg1_shift @// r5 = (a2 - b2 + rnd) >> 7(IDCT_STG1_SHIFT) 526 vqrshrn.s32 d6, q14, #idct_stg1_shift @// r1 = (a1 + b1 + rnd) >> 7(IDCT_STG1_SHIFT) 527 vqrshrn.s32 d11, q9, #idct_stg1_shift @// r6 = (a1 - b1 + rnd) >> 7(IDCT_STG1_SHIFT) 528 vqrshrn.s32 d7, q13, #idct_stg1_shift @// r3 = (a3 + b3 + rnd) >> 7(IDCT_STG1_SHIFT) 529 vqrshrn.s32 d10, q15, #idct_stg1_shift @// r4 = (a3 - b3 + rnd) >> 7(IDCT_STG1_SHIFT) 530 531 532 b last4_cols 533 534 535 536 skip_last4_rows: 537 538 539 ldr r14, gai2_impeg2_idct_first_col_q15_addr2 540 fcq15_lbl2: 541 add r14, r14, pc 542 vld1.16 {d0, d1}, [r14] @//D0,D1 are used for storing the constant data 543 544 vld1.16 d2, [r0]! 545 vld1.16 d3, [r9]! 546 vld1.16 d4, [r0], r5 547 vld1.16 d5, [r9], r5 548 vld1.16 d6, [r0]! 549 vld1.16 d7, [r9]! 550 vld1.16 d8, [r0], r10 551 vld1.16 d9, [r9], r10 552 553 554 555 vmov.s16 q6, #0 556 vmov.s16 q8, #0 557 558 559 560 561 vmull.s16 q12, d6, d0[1] @// y1 * cos1(part of b0) 562 vmull.s16 q13, d6, d0[3] @// y1 * cos3(part of b1) 563 vmull.s16 q14, d6, d1[1] @// y1 * sin3(part of b2) 564 vmull.s16 q15, d6, d1[3] @// y1 * sin1(part of b3) 565 566 vmlal.s16 q12, d7, d0[3] @// y1 * cos1 + y3 * cos3(part of b0) 567 vmlsl.s16 q13, d7, d1[3] @// y1 * cos3 - y3 * sin1(part of b1) 568 vmlsl.s16 q14, d7, d0[1] @// y1 * sin3 - y3 * cos1(part of b2) 569 vmlsl.s16 q15, d7, d1[1] @// y1 * sin1 - y3 * sin3(part of b3) 570 571 vmull.s16 q9, d3, d1[2] @// y2 * sin2 (Q3 is freed by this time)(part of d1) 572 vmull.s16 q3, d3, d0[2] @// y2 * cos2(part of d0) 573 574 vmull.s16 q10, d2, d0[0] @// y0 * cos4(part of c0 and c1) 575 576 577 vadd.s32 q7, q10, q3 @// a0 = c0 + d0(part of r0,r7) 578 vsub.s32 q5, q10, q3 @// a3 = c0 - d0(part of r3,r4) 579 vsub.s32 q11, q10, q9 @// a2 = c1 - d1(part of r2,r5) 580 vadd.s32 q9, q10, q9 @// a1 = c1 + d1(part of r1,r6) 581 582 vadd.s32 q10, q7, q12 @// a0 + b0(part of r0) 583 vsub.s32 q3, q7, q12 @// a0 - b0(part of r7) 584 585 vadd.s32 q12, q11, q14 @// a2 + b2(part of r2) 586 vsub.s32 q11, q11, q14 @// a2 - b2(part of r5) 587 588 vadd.s32 q14, q9, q13 @// a1 + b1(part of r1) 589 vsub.s32 q9, q9, q13 @// a1 - b1(part of r6) 590 591 vadd.s32 q13, q5, q15 @// a3 + b3(part of r3) 592 vsub.s32 q15, q5, q15 @// a3 - b3(part of r4) 593 594 vqrshrn.s32 d2, q10, #idct_stg1_shift @// r0 = (a0 + b0 + rnd) >> 7(IDCT_STG1_SHIFT) 595 vqrshrn.s32 d15, q3, #idct_stg1_shift @// r7 = (a0 - b0 + rnd) >> 7(IDCT_STG1_SHIFT) 596 vqrshrn.s32 d3, q12, #idct_stg1_shift @// r2 = (a2 + b2 + rnd) >> 7(IDCT_STG1_SHIFT) 597 vqrshrn.s32 d14, q11, #idct_stg1_shift @// r5 = (a2 - b2 + rnd) >> 7(IDCT_STG1_SHIFT) 598 vqrshrn.s32 d6, q14, #idct_stg1_shift @// r1 = (a1 + b1 + rnd) >> 7(IDCT_STG1_SHIFT) 599 vqrshrn.s32 d11, q9, #idct_stg1_shift @// r6 = (a1 - b1 + rnd) >> 7(IDCT_STG1_SHIFT) 600 vqrshrn.s32 d7, q13, #idct_stg1_shift @// r3 = (a3 + b3 + rnd) >> 7(IDCT_STG1_SHIFT) 601 vqrshrn.s32 d10, q15, #idct_stg1_shift @// r4 = (a3 - b3 + rnd) >> 7(IDCT_STG1_SHIFT) 602 603 604 last4_cols: 605 606 607 cmp r12, #0xf0 608 bge skip_last4cols 609 610 ldr r14, gai2_impeg2_idct_first_col_q15_addr3 611 fcq15_lbl3: 612 add r14, r14, pc 613 vld1.16 {d0, d1}, [r14] @//D0,D1 are used for storing the constant data 614 615 vmull.s16 q12, d8, d0[1] @// y1 * cos1(part of b0) 616 vmull.s16 q13, d8, d0[3] @// y1 * cos3(part of b1) 617 vmull.s16 q14, d8, d1[1] @// y1 * sin3(part of b2) 618 vmull.s16 q15, d8, d1[3] @// y1 * sin1(part of b3) 619 620 vmlal.s16 q12, d9, d0[3] @// y1 * cos1 + y3 * cos3(part of b0) 621 vmlsl.s16 q13, d9, d1[3] @// y1 * cos3 - y3 * sin1(part of b1) 622 vmlsl.s16 q14, d9, d0[1] @// y1 * sin3 - y3 * cos1(part of b2) 623 vmlsl.s16 q15, d9, d1[1] @// y1 * sin1 - y3 * sin3(part of b3) 624 625 vmull.s16 q9, d5, d1[2] @// y2 * sin2 (Q4 is freed by this time)(part of d1) 626 vmull.s16 q4, d5, d0[2] @// y2 * cos2(part of d0) 627 628 vmull.s16 q10, d4, d0[0] @// y0 * cos4(part of c0 and c1) 629 vmull.s16 q11, d12, d0[0] @// y4 * cos4(part of c0 and c1) 630 631 vmlal.s16 q12, d16, d1[1] @// y1 * cos1 + y3 * cos3 + y5 * sin3(part of b0) 632 vmlsl.s16 q13, d16, d0[1] @// y1 * cos3 - y3 * sin1 - y5 * cos1(part of b1) 633 vmlal.s16 q14, d16, d1[3] @// y1 * sin3 - y3 * cos1 + y5 * sin1(part of b2) 634 vmlal.s16 q15, d16, d0[3] @// y1 * sin1 - y3 * sin3 + y5 * cos3(part of b3) 635 636 vmlsl.s16 q9, d13, d0[2] @// d1 = y2 * sin2 - y6 * cos2(part of a0 and a1) 637 vmlal.s16 q4, d13, d1[2] @// d0 = y2 * cos2 + y6 * sin2(part of a0 and a1) 638 639 vadd.s32 q6, q10, q11 @// c0 = y0 * cos4 + y4 * cos4(part of a0 and a1) 640 vsub.s32 q10, q10, q11 @// c1 = y0 * cos4 - y4 * cos4(part of a0 and a1) 641 642 vmlal.s16 q12, d17, d1[3] @// b0 = y1 * cos1 + y3 * cos3 + y5 * sin3 + y7 * sin1(part of e0,e7) 643 vmlsl.s16 q13, d17, d1[1] @// b1 = y1 * cos3 - y3 * sin1 - y5 * cos1 - y7 * sin3(part of e1,e6) 644 vmlal.s16 q14, d17, d0[3] @// b2 = y1 * sin3 - y3 * cos1 + y5 * sin1 + y7 * cos3(part of e2,e5) 645 vmlsl.s16 q15, d17, d0[1] @// b3 = y1 * sin1 - y3 * sin3 + y5 * cos3 - y7 * cos1(part of e3,e4) 646 647 vadd.s32 q8, q6, q4 @// a0 = c0 + d0(part of e0,e7) 648 vsub.s32 q6, q6, q4 @// a3 = c0 - d0(part of e3,e4) 649 vsub.s32 q11, q10, q9 @// a2 = c1 - d1(part of e2,e5) 650 vadd.s32 q9, q10, q9 @// a1 = c1 + d1(part of e1,e6) 651 652 vadd.s32 q10, q8, q12 @// a0 + b0(part of e0) 653 vsub.s32 q4, q8, q12 @// a0 - b0(part of e7) 654 655 vadd.s32 q12, q11, q14 @// a2 + b2(part of e2) 656 vsub.s32 q11, q11, q14 @// a2 - b2(part of e5) 657 658 vadd.s32 q14, q9, q13 @// a1 + b1(part of e1) 659 vsub.s32 q9, q9, q13 @// a1 - b1(part of e6) 660 661 vadd.s32 q13, q6, q15 @// a3 + b3(part of e3) 662 vsub.s32 q15, q6, q15 @// a3 - b3(part of r4) 663 664 vqrshrn.s32 d4, q10, #idct_stg1_shift @// r0 = (a0 + b0 + rnd) >> 7(IDCT_STG1_SHIFT) 665 vqrshrn.s32 d17, q4, #idct_stg1_shift @// r7 = (a0 - b0 + rnd) >> 7(IDCT_STG1_SHIFT) 666 vqrshrn.s32 d5, q12, #idct_stg1_shift @// r2 = (a2 + b2 + rnd) >> 7(IDCT_STG1_SHIFT) 667 vqrshrn.s32 d16, q11, #idct_stg1_shift @// r5 = (a2 - b2 + rnd) >> 7(IDCT_STG1_SHIFT) 668 vqrshrn.s32 d8, q14, #idct_stg1_shift @// r1 = (a1 + b1 + rnd) >> 7(IDCT_STG1_SHIFT) 669 vqrshrn.s32 d13, q9, #idct_stg1_shift @// r6 = (a1 - b1 + rnd) >> 7(IDCT_STG1_SHIFT) 670 vqrshrn.s32 d9, q13, #idct_stg1_shift @// r3 = (a3 + b3 + rnd) >> 7(IDCT_STG1_SHIFT) 671 vqrshrn.s32 d12, q15, #idct_stg1_shift @// r4 = (a3 - b3 + rnd) >> 7(IDCT_STG1_SHIFT) 672 b end_skip_last4cols 673 674 675 676 skip_last4cols: 677 678 679 680 ldr r14, gai2_impeg2_idct_first_col_q11_addr1 681 fcq11_lbl1: 682 add r14, r14, pc 683 vld1.16 {d0, d1}, [r14] @//D0,D1 are used for storing the constant data 684 685 686 687 vtrn.16 q1, q3 @//[r3,r1],[r2,r0] first qudrant transposing 688 689 vtrn.16 q5, q7 @//[r7,r5],[r6,r4] third qudrant transposing 690 691 692 vtrn.32 d6, d7 @//r0,r1,r2,r3 first qudrant transposing continued..... 693 vtrn.32 d2, d3 @//r0,r1,r2,r3 first qudrant transposing continued..... 694 695 vtrn.32 d10, d11 @//r4,r5,r6,r7 third qudrant transposing continued..... 696 vtrn.32 d14, d15 @//r4,r5,r6,r7 third qudrant transposing continued..... 697 698 699 vmull.s16 q12, d6, d0[1] @// y1 * cos1(part of b0) 700 vmull.s16 q13, d6, d0[3] @// y1 * cos3(part of b1) 701 vmull.s16 q14, d6, d1[1] @// y1 * sin3(part of b2) 702 vmull.s16 q15, d6, d1[3] @// y1 * sin1(part of b3) 703 704 vmlal.s16 q12, d7, d0[3] @// y1 * cos1 + y3 * cos3(part of b0) 705 vmlsl.s16 q13, d7, d1[3] @// y1 * cos3 - y3 * sin1(part of b1) 706 vmlsl.s16 q14, d7, d0[1] @// y1 * sin3 - y3 * cos1(part of b2) 707 vmlsl.s16 q15, d7, d1[1] @// y1 * sin1 - y3 * sin3(part of b3) 708 709 vmull.s16 q10, d2, d0[0] @// y0 * cos4(part of c0 and c1) 710 @ VMULL.S16 Q11,D4,D0[0] ;// y4 * cos4(part of c0 and c1) 711 712 vmull.s16 q9, d3, d1[2] @// y2 * sin2 (Q3 is freed by this time)(part of d1) 713 vmull.s16 q3, d3, d0[2] @// y2 * cos2(part of d0) 714 715 716 717 718 vsub.s32 q11, q10, q3 @// a3 = c0 - d0(part of r3,r4) 719 vadd.s32 q2, q10, q3 @// a0 = c0 + d0(part of r0,r7) 720 721 722 vadd.s32 q1, q2, q12 723 724 vsub.s32 q3, q2, q12 725 726 vadd.s32 q4, q11, q15 727 728 vsub.s32 q12, q11, q15 729 730 vqrshrn.s32 d5, q4, #idct_stg2_shift 731 vqrshrn.s32 d2, q1, #idct_stg2_shift 732 vqrshrn.s32 d9, q3, #idct_stg2_shift 733 vqrshrn.s32 d6, q12, #idct_stg2_shift 734 735 vsub.s32 q11, q10, q9 @// a2 = c1 - d1(part of r2,r5) 736 vadd.s32 q9, q10, q9 @// a1 = c1 + d1(part of r1,r6) 737 738 739 vadd.s32 q15, q11, q14 740 741 vsub.s32 q12, q11, q14 742 743 vadd.s32 q14, q9, q13 744 745 vsub.s32 q11, q9, q13 746 vqrshrn.s32 d4, q15, #idct_stg2_shift 747 vqrshrn.s32 d7, q12, #idct_stg2_shift 748 vqrshrn.s32 d3, q14, #idct_stg2_shift 749 vqrshrn.s32 d8, q11, #idct_stg2_shift 750 751 752 753 754 755 756 757 758 759 760 vmull.s16 q12, d14, d0[1] @// y1 * cos1(part of b0) 761 762 vmull.s16 q13, d14, d0[3] @// y1 * cos3(part of b1) 763 vmull.s16 q14, d14, d1[1] @// y1 * sin3(part of b2) 764 vmull.s16 q15, d14, d1[3] @// y1 * sin1(part of b3) 765 766 vmlal.s16 q12, d15, d0[3] @// y1 * cos1 + y3 * cos3(part of b0) 767 vtrn.16 d2, d3 768 vmlsl.s16 q13, d15, d1[3] @// y1 * cos3 - y3 * sin1(part of b1) 769 vtrn.16 d4, d5 770 vmlsl.s16 q14, d15, d0[1] @// y1 * sin3 - y3 * cos1(part of b2) 771 vtrn.16 d6, d7 772 vmlsl.s16 q15, d15, d1[1] @// y1 * sin1 - y3 * sin3(part of b3) 773 vtrn.16 d8, d9 774 vmull.s16 q10, d10, d0[0] @// y0 * cos4(part of c0 and c1) 775 vtrn.32 d2, d4 776 777 vtrn.32 d3, d5 778 vmull.s16 q9, d11, d1[2] @// y2 * sin2 (Q7 is freed by this time)(part of d1) 779 vtrn.32 d6, d8 780 vmull.s16 q7, d11, d0[2] @// y2 * cos2(part of d0) 781 vtrn.32 d7, d9 782 783 784 add r4, r2, r8, lsl #1 @ r4 = r2 + pred_strd * 2 => r4 points to 3rd row of pred data 785 786 787 add r5, r8, r8, lsl #1 @ 788 789 790 add r0, r3, r7, lsl #1 @ r0 points to 3rd row of dest data 791 792 793 add r10, r7, r7, lsl #1 @ 794 795 796 vswp d3, d6 797 798 799 vswp d5, d8 800 801 802 vsub.s32 q11, q10, q7 @// a3 = c0 - d0(part of r3,r4) 803 vadd.s32 q6, q10, q7 @// a0 = c0 + d0(part of r0,r7) 804 805 806 vadd.s32 q0, q6, q12 807 808 809 vsub.s32 q12, q6, q12 810 811 812 vadd.s32 q6, q11, q15 813 814 815 vsub.s32 q7, q11, q15 816 817 vqrshrn.s32 d10, q0, #idct_stg2_shift 818 vqrshrn.s32 d17, q12, #idct_stg2_shift 819 vqrshrn.s32 d13, q6, #idct_stg2_shift 820 vqrshrn.s32 d14, q7, #idct_stg2_shift 821 822 vsub.s32 q11, q10, q9 @// a2 = c1 - d1(part of r2,r5) 823 vadd.s32 q9, q10, q9 @// a1 = c1 + d1(part of r1,r6) 824 825 826 vadd.s32 q0, q11, q14 827 828 829 vsub.s32 q12, q11, q14 830 831 832 vadd.s32 q14, q9, q13 833 834 835 vsub.s32 q13, q9, q13 836 vld1.8 d18, [r2], r8 837 838 vqrshrn.s32 d12, q0, #idct_stg2_shift 839 vld1.8 d20, [r2], r5 840 841 842 vqrshrn.s32 d15, q12, #idct_stg2_shift 843 vld1.8 d19, [r2], r8 844 845 846 847 848 vqrshrn.s32 d11, q14, #idct_stg2_shift 849 vld1.8 d22, [r4], r8 850 851 852 853 854 vqrshrn.s32 d16, q13, #idct_stg2_shift 855 vld1.8 d21, [r2], r5 856 857 858 b pred_buff_addition 859 end_skip_last4cols: 860 861 ldr r14, gai2_impeg2_idct_first_col_q11_addr2 862 fcq11_lbl2: 863 add r14, r14, pc 864 vld1.16 {d0, d1}, [r14] @//D0,D1 are used for storing the constant data 865 866 867 @/* Now the Idct of columns is done, transpose so that row idct done efficiently(step5) */ 868 vtrn.16 q1, q3 @//[r3,r1],[r2,r0] first qudrant transposing 869 vtrn.16 q2, q4 @//[r3,r1],[r2,r0] second qudrant transposing 870 vtrn.16 q5, q7 @//[r7,r5],[r6,r4] third qudrant transposing 871 vtrn.16 q6, q8 @//[r7,r5],[r6,r4] fourth qudrant transposing 872 873 vtrn.32 d6, d7 @//r0,r1,r2,r3 first qudrant transposing continued..... 874 vtrn.32 d2, d3 @//r0,r1,r2,r3 first qudrant transposing continued..... 875 vtrn.32 d4, d5 @//r0,r1,r2,r3 second qudrant transposing continued..... 876 vtrn.32 d8, d9 @//r0,r1,r2,r3 second qudrant transposing continued..... 877 vtrn.32 d10, d11 @//r4,r5,r6,r7 third qudrant transposing continued..... 878 vtrn.32 d14, d15 @//r4,r5,r6,r7 third qudrant transposing continued..... 879 vtrn.32 d12, d13 @//r4,r5,r6,r7 fourth qudrant transposing continued..... 880 vtrn.32 d16, d17 @//r4,r5,r6,r7 fourth qudrant transposing continued..... 881 882 @//step6 Operate on first four rows and find their idct 883 @//Register Usage Reference - storing and IDCT of rows 884 @// Cosine Constants - D0 885 @// Sine Constants - D1 886 @// Element 0 First four - D2 - y0 887 @// Element 1 First four - D6 - y1 888 @// Element 2 First four - D3 - y2 889 @// Element 3 First four - D7 - y3 890 @// Element 4 First four - D4 - y4 891 @// Element 5 First four - D8 - y5 892 @// Element 6 First four - D5 - y6 893 @// Element 7 First four - D9 - y7 894 @// Element 0 Second four - D10 - y0 895 @// Element 1 Second four - D14 - y1 896 @// Element 2 Second four - D11 - y2 897 @// Element 3 Second four - D15 - y3 898 @// Element 4 Second four - D12 - y4 899 @// Element 5 Second four - D16 - y5 900 @// Element 6 Second four - D13 - y6 901 @// Element 7 Second four - D17 - y7 902 903 @// Map between first kernel code seq and current 904 @// D2 -> D2 905 @// D6 -> D6 906 @// D3 -> D3 907 @// D7 -> D7 908 @// D10 -> D4 909 @// D14 -> D8 910 @// D11 -> D5 911 @// D15 -> D9 912 @// Q3 -> Q3 913 @// Q5 -> Q2 914 @// Q7 -> Q4 915 916 vmull.s16 q12, d6, d0[1] @// y1 * cos1(part of b0) 917 vmull.s16 q13, d6, d0[3] @// y1 * cos3(part of b1) 918 vmull.s16 q14, d6, d1[1] @// y1 * sin3(part of b2) 919 vmull.s16 q15, d6, d1[3] @// y1 * sin1(part of b3) 920 921 vmlal.s16 q12, d7, d0[3] @// y1 * cos1 + y3 * cos3(part of b0) 922 vmlsl.s16 q13, d7, d1[3] @// y1 * cos3 - y3 * sin1(part of b1) 923 vmlsl.s16 q14, d7, d0[1] @// y1 * sin3 - y3 * cos1(part of b2) 924 vmlsl.s16 q15, d7, d1[1] @// y1 * sin1 - y3 * sin3(part of b3) 925 926 vmull.s16 q10, d2, d0[0] @// y0 * cos4(part of c0 and c1) 927 vmull.s16 q11, d4, d0[0] @// y4 * cos4(part of c0 and c1) 928 929 vmull.s16 q9, d3, d1[2] @// y2 * sin2 (Q3 is freed by this time)(part of d1) 930 vmull.s16 q3, d3, d0[2] @// y2 * cos2(part of d0) 931 932 933 vmlal.s16 q12, d8, d1[1] @// y1 * cos1 + y3 * cos3 + y5 * sin3(part of b0) 934 vmlsl.s16 q13, d8, d0[1] @// y1 * cos3 - y3 * sin1 - y5 * cos1(part of b1) 935 vmlal.s16 q14, d8, d1[3] @// y1 * sin3 - y3 * cos1 + y5 * sin1(part of b2) 936 vmlal.s16 q15, d8, d0[3] @// y1 * sin1 - y3 * sin3 + y5 * cos3(part of b3) 937 938 vmlsl.s16 q9, d5, d0[2] @// d1 = y2 * sin2 - y6 * cos2(part of a0 and a1) 939 vmlal.s16 q3, d5, d1[2] @// d0 = y2 * cos2 + y6 * sin2(part of a0 and a1) 940 941 vadd.s32 q1, q10, q11 @// c0 = y0 * cos4 + y4 * cos4(part of a0 and a1) 942 vsub.s32 q10, q10, q11 @// c1 = y0 * cos4 - y4 * cos4(part of a0 and a1) 943 944 vmlal.s16 q12, d9, d1[3] @// b0 = y1 * cos1 + y3 * cos3 + y5 * sin3 + y7 * sin1(part of r0,r7) 945 vmlsl.s16 q13, d9, d1[1] @// b1 = y1 * cos3 - y3 * sin1 - y5 * cos1 - y7 * sin3(part of r1,r6) 946 vmlal.s16 q14, d9, d0[3] @// b2 = y1 * sin3 - y3 * cos1 + y5 * sin1 + y7 * cos3(part of r2,r5) 947 vmlsl.s16 q15, d9, d0[1] @// b3 = y1 * sin1 - y3 * sin3 + y5 * cos3 - y7 * cos1(part of r3,r4) 948 949 vsub.s32 q11, q1, q3 @// a3 = c0 - d0(part of r3,r4) 950 vadd.s32 q2, q1, q3 @// a0 = c0 + d0(part of r0,r7) 951 952 953 vadd.s32 q1, q2, q12 954 955 vsub.s32 q3, q2, q12 956 957 vadd.s32 q4, q11, q15 958 959 vsub.s32 q12, q11, q15 960 961 vqrshrn.s32 d5, q4, #idct_stg2_shift 962 vqrshrn.s32 d2, q1, #idct_stg2_shift 963 vqrshrn.s32 d9, q3, #idct_stg2_shift 964 vqrshrn.s32 d6, q12, #idct_stg2_shift 965 966 vsub.s32 q11, q10, q9 @// a2 = c1 - d1(part of r2,r5) 967 vadd.s32 q9, q10, q9 @// a1 = c1 + d1(part of r1,r6) 968 969 970 vadd.s32 q15, q11, q14 971 972 vsub.s32 q12, q11, q14 973 974 vadd.s32 q14, q9, q13 975 976 vsub.s32 q11, q9, q13 977 vqrshrn.s32 d4, q15, #idct_stg2_shift 978 vqrshrn.s32 d7, q12, #idct_stg2_shift 979 vqrshrn.s32 d3, q14, #idct_stg2_shift 980 vqrshrn.s32 d8, q11, #idct_stg2_shift 981 982 983 984 985 986 987 988 989 990 991 vmull.s16 q12, d14, d0[1] @// y1 * cos1(part of b0) 992 993 vmull.s16 q13, d14, d0[3] @// y1 * cos3(part of b1) 994 vmull.s16 q14, d14, d1[1] @// y1 * sin3(part of b2) 995 vmull.s16 q15, d14, d1[3] @// y1 * sin1(part of b3) 996 997 vmlal.s16 q12, d15, d0[3] @// y1 * cos1 + y3 * cos3(part of b0) 998 vtrn.16 d2, d3 999 vmlsl.s16 q13, d15, d1[3] @// y1 * cos3 - y3 * sin1(part of b1) 1000 vtrn.16 d4, d5 1001 vmlsl.s16 q14, d15, d0[1] @// y1 * sin3 - y3 * cos1(part of b2) 1002 vtrn.16 d6, d7 1003 vmlsl.s16 q15, d15, d1[1] @// y1 * sin1 - y3 * sin3(part of b3) 1004 vtrn.16 d8, d9 1005 vmull.s16 q10, d10, d0[0] @// y0 * cos4(part of c0 and c1) 1006 vtrn.32 d2, d4 1007 vmull.s16 q11, d12, d0[0] @// y4 * cos4(part of c0 and c1) 1008 vtrn.32 d3, d5 1009 vmull.s16 q9, d11, d1[2] @// y2 * sin2 (Q7 is freed by this time)(part of d1) 1010 vtrn.32 d6, d8 1011 vmull.s16 q7, d11, d0[2] @// y2 * cos2(part of d0) 1012 vtrn.32 d7, d9 1013 vmlal.s16 q12, d16, d1[1] @// y1 * cos1 + y3 * cos3 + y5 * sin3(part of b0) 1014 1015 add r4, r2, r8, lsl #1 @ r4 = r2 + pred_strd * 2 => r4 points to 3rd row of pred data 1016 vmlsl.s16 q13, d16, d0[1] @// y1 * cos3 - y3 * sin1 - y5 * cos1(part of b1) 1017 1018 add r5, r8, r8, lsl #1 @ 1019 vmlal.s16 q14, d16, d1[3] @// y1 * sin3 - y3 * cos1 + y5 * sin1(part of b2) 1020 1021 add r0, r3, r7, lsl #1 @ r0 points to 3rd row of dest data 1022 vmlal.s16 q15, d16, d0[3] @// y1 * sin1 - y3 * sin3 + y5 * cos3(part of b3) 1023 1024 add r10, r7, r7, lsl #1 @ 1025 vmlsl.s16 q9, d13, d0[2] @// d1 = y2 * sin2 - y6 * cos2(part of a0 and a1) 1026 1027 1028 vmlal.s16 q7, d13, d1[2] @// d0 = y2 * cos2 + y6 * sin2(part of a0 and a1) 1029 1030 vadd.s32 q6, q10, q11 @// c0 = y0 * cos4 + y4 * cos4(part of a0 and a1) 1031 vsub.s32 q10, q10, q11 @// c1 = y0 * cos4 - y4 * cos4(part of a0 and a1) 1032 1033 vmlal.s16 q12, d17, d1[3] @// b0 = y1 * cos1 + y3 * cos3 + y5 * sin3 + y7 * sin1(part of r0,r7) 1034 vswp d3, d6 1035 vmlsl.s16 q13, d17, d1[1] @// b1 = y1 * cos3 - y3 * sin1 - y5 * cos1 - y7 * sin3(part of r1,r6) 1036 1037 vswp d5, d8 1038 vmlal.s16 q14, d17, d0[3] @// b2 = y1 * sin3 - y3 * cos1 + y5 * sin1 + y7 * cos3(part of r2,r5) 1039 vmlsl.s16 q15, d17, d0[1] @// b3 = y1 * sin1 - y3 * sin3 + y5 * cos3 - y7 * cos1(part of r3,r4) 1040 1041 vsub.s32 q11, q6, q7 @// a3 = c0 - d0(part of r3,r4) 1042 vadd.s32 q6, q6, q7 @// a0 = c0 + d0(part of r0,r7) 1043 1044 1045 vadd.s32 q0, q6, q12 1046 1047 1048 vsub.s32 q12, q6, q12 1049 1050 1051 vadd.s32 q6, q11, q15 1052 1053 1054 vsub.s32 q7, q11, q15 1055 1056 vqrshrn.s32 d10, q0, #idct_stg2_shift 1057 vqrshrn.s32 d17, q12, #idct_stg2_shift 1058 vqrshrn.s32 d13, q6, #idct_stg2_shift 1059 vqrshrn.s32 d14, q7, #idct_stg2_shift 1060 1061 vsub.s32 q11, q10, q9 @// a2 = c1 - d1(part of r2,r5) 1062 vadd.s32 q9, q10, q9 @// a1 = c1 + d1(part of r1,r6) 1063 1064 1065 vadd.s32 q0, q11, q14 1066 1067 1068 vsub.s32 q12, q11, q14 1069 1070 1071 vadd.s32 q14, q9, q13 1072 1073 1074 vsub.s32 q13, q9, q13 1075 vld1.8 d18, [r2], r8 1076 1077 vqrshrn.s32 d12, q0, #idct_stg2_shift 1078 vld1.8 d20, [r2], r5 1079 1080 1081 vqrshrn.s32 d15, q12, #idct_stg2_shift 1082 vld1.8 d19, [r2], r8 1083 1084 1085 1086 1087 vqrshrn.s32 d11, q14, #idct_stg2_shift 1088 vld1.8 d22, [r4], r8 1089 1090 1091 1092 1093 vqrshrn.s32 d16, q13, #idct_stg2_shift 1094 vld1.8 d21, [r2], r5 1095 1096 1097 1098 1099 pred_buff_addition: 1100 1101 1102 vtrn.16 d10, d11 1103 vld1.8 d24, [r4], r5 1104 1105 vtrn.16 d12, d13 1106 vld1.8 d23, [r4], r8 1107 1108 vaddw.u8 q1, q1, d18 1109 vld1.8 d25, [r4], r5 1110 1111 vtrn.16 d14, d15 1112 vaddw.u8 q2, q2, d22 1113 1114 vtrn.16 d16, d17 1115 vaddw.u8 q3, q3, d20 1116 1117 vtrn.32 d10, d12 1118 vaddw.u8 q4, q4, d24 1119 1120 vtrn.32 d11, d13 1121 vtrn.32 d14, d16 1122 vtrn.32 d15, d17 1123 1124 vswp d11, d14 1125 vswp d13, d16 1126 1127 @ Row values stored in the q register. 1128 1129 @Q1 :r0 1130 @Q3: r1 1131 @Q2: r2 1132 @Q4: r3 1133 @Q5: r4 1134 @Q7: r5 1135 @Q6: r6 1136 @Q8: r7 1137 1138 1139 1140 @/// Adding the prediction buffer 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 @ Load prediction data 1151 1152 1153 1154 1155 1156 @Adding recon with prediction 1157 1158 1159 1160 1161 1162 vaddw.u8 q5, q5, d19 1163 vqmovun.s16 d2, q1 1164 vaddw.u8 q7, q7, d21 1165 vqmovun.s16 d4, q2 1166 vaddw.u8 q6, q6, d23 1167 vqmovun.s16 d6, q3 1168 vaddw.u8 q8, q8, d25 1169 vqmovun.s16 d8, q4 1170 1171 1172 1173 1174 1175 1176 1177 vst1.8 {d2}, [r3], r7 1178 vqmovun.s16 d10, q5 1179 vst1.8 {d6}, [r3], r10 1180 vqmovun.s16 d14, q7 1181 vst1.8 {d4}, [r0], r7 1182 vqmovun.s16 d12, q6 1183 vst1.8 {d8}, [r0], r10 1184 vqmovun.s16 d16, q8 1185 1186 1187 1188 1189 1190 1191 1192 vst1.8 {d10}, [r3], r7 1193 vst1.8 {d14}, [r3], r10 1194 vst1.8 {d12}, [r0], r7 1195 vst1.8 {d16}, [r0], r10 1196 1197 1198 1199 1200 1201 ldmfd sp!, {r4-r12, pc} 1202 1203 1204 1205