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