1 @/***************************************************************************** 2 @* 3 @* Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore 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 @/** 19 @ ******************************************************************************* 20 @ * @file 21 @ * ihevc_itrans_recon_8x8_neon.s 22 @ * 23 @ * @brief 24 @ * contains function definitions for single stage inverse transform 25 @ * 26 @ * @author 27 @ * anand s 28 @ * 29 @ * @par list of functions: 30 @ * - ihevc_itrans_recon_32x32() 31 @ * 32 @ * @remarks 33 @ * the input buffer is being corrupted 34 @ * 35 @ ******************************************************************************* 36 @*/ 37 38 @/** 39 @ ******************************************************************************* 40 @ * 41 @ * @brief 42 @ * this function performs inverse transform and reconstruction for 8x8 43 @ * input block 44 @ * 45 @ * @par description: 46 @ * performs inverse transform and adds the prediction data and clips output 47 @ * to 8 bit 48 @ * 49 @ * @param[in] pi2_src 50 @ * input 16x16 coefficients 51 @ * 52 @ * @param[in] pi2_tmp 53 @ * temporary 16x16 buffer for storing inverse 54 @ * 55 @ * transform 56 @ * 1st stage output 57 @ * 58 @ * @param[in] pu1_pred 59 @ * prediction 16x16 block 60 @ * 61 @ * @param[out] pu1_dst 62 @ * output 8x8 block 63 @ * 64 @ * @param[in] src_strd 65 @ * input stride 66 @ * 67 @ * @param[in] pred_strd 68 @ * prediction stride 69 @ * 70 @ * @param[in] dst_strd 71 @ * output stride 72 @ * 73 @ * @param[in] shift 74 @ * output shift 75 @ * 76 @ * @param[in] r12 77 @ * zero columns in pi2_src 78 @ * 79 @ * @returns void 80 @ * 81 @ * @remarks 82 @ * none 83 @ * 84 @ ******************************************************************************* 85 @ */ 86 87 @void ihevc_itrans_recon_32x32(word16 *pi2_src, 88 @ word16 *pi2_tmp, 89 @ uword8 *pu1_pred, 90 @ uword8 *pu1_dst, 91 @ word32 src_strd, 92 @ word32 pred_strd, 93 @ word32 dst_strd, 94 @ word32 r12 95 @ word32 r11 ) 96 97 @**************variables vs registers************************* 98 @ r0 => *pi2_src 99 @ r1 => *pi2_tmp 100 @ r2 => *pu1_pred 101 @ r3 => *pu1_dst 102 @ src_strd 103 @ pred_strd 104 @ dst_strd 105 @ r12 106 @ r11 107 108 109 @d0[0]= 64 d2[0]=83 110 @d0[1]= 90 d2[1]=82 111 @d0[2]= 90 d2[2]=80 112 @d0[3]= 90 d2[3]=78 113 @d1[0]= 89 d3[0]=75 114 @d1[1]= 88 d3[1]=73 115 @d1[2]= 87 d3[2]=70 116 @d1[3]= 85 d3[3]=67 117 118 @d4[0]= 64 d6[0]=36 119 @d4[1]= 61 d6[1]=31 120 @d4[2]= 57 d6[2]=25 121 @d4[3]= 54 d6[3]=22 122 @d5[0]= 50 d7[0]=18 123 @d5[1]= 46 d7[1]=13 124 @d5[2]= 43 d7[2]=9 125 @d5[3]= 38 d7[3]=4 126 127 .text 128 .align 4 129 130 131 132 133 134 .set shift_stage1_idct , 7 135 .set shift_stage2_idct , 12 136 137 @#define zero_cols r12 138 @#define zero_rows r11 139 140 .globl ihevc_itrans_recon_32x32_a9q 141 142 .extern g_ai2_ihevc_trans_32_transpose 143 144 g_ai2_ihevc_trans_32_transpose_addr: 145 .long g_ai2_ihevc_trans_32_transpose - ulbl1 - 8 146 147 r5_addr: .word 0xfffff000 148 r9_addr: .word 0xffff0000 149 150 .type ihevc_itrans_recon_32x32_a9q, %function 151 152 ihevc_itrans_recon_32x32_a9q: 153 154 stmfd sp!,{r0-r12,lr} 155 156 157 @ldr r8,[sp,#56] @ prediction stride 158 @ldr r7,[sp,#64] @ destination stride 159 ldr r6,[sp,#56] @ src stride 160 ldr r12,[sp,#68] 161 ldr r11,[sp,#72] 162 mov r6,r6,lsl #1 @ x sizeof(word16) 163 add r10,r6,r6, lsl #1 @ 3 rows 164 165 166 mov r8,r0 167 168 ldr r14,g_ai2_ihevc_trans_32_transpose_addr 169 ulbl1: 170 add r14,r14,pc 171 vld1.16 {d0,d1,d2,d3},[r14]! 172 vld1.16 {d4,d5,d6,d7},[r14]! 173 174 @registers which are free 175 @ r10,r9,r11,r12 176 mov r9,#0xffffff00 177 mov r10,#0xfffffff0 178 ldr r5,r5_addr 179 ldr r7,r9_addr 180 cmp r12,r10 181 movhs r14,#1 182 bhs stage1 183 184 185 cmp r12,r9 186 movhs r14,#2 187 bhs stage1 188 189 cmp r12,r5 190 movhs r14,#3 191 bhs stage1 192 193 cmp r12,r7 194 movhs r14,#4 195 196 mov r14,#8 197 b stage1 198 @.ltorg 199 200 201 dct_stage1: 202 add r8,r8,#8 203 mov r0,r8 204 205 stage1: 206 vld1.16 d10,[r0],r6 207 vld1.16 d8,[r0],r6 208 vld1.16 d11,[r0],r6 209 vld1.16 d9,[r0],r6 210 211 vmull.s16 q12,d8,d0[1] @// y1 * cos1(part of b0) 212 vmull.s16 q13,d8,d0[3] @// y1 * cos3(part of b1) 213 vmull.s16 q14,d8,d1[1] @// y1 * sin3(part of b2) 214 vmull.s16 q15,d8,d1[3] @// y1 * sin1(part of b3) 215 216 vmlal.s16 q12,d9,d0[3] @// y1 * cos1 + y3 * cos3(part of b0) 217 vmlal.s16 q13,d9,d2[1] @// y1 * cos3 - y3 * sin1(part of b1) 218 vmlal.s16 q14,d9,d3[3] @// y1 * sin3 - y3 * cos1(part of b2) 219 vmlal.s16 q15,d9,d5[1] @// y1 * sin1 - y3 * sin3(part of b3) 220 221 222 223 224 225 vmull.s16 q10,d10,d0[0] 226 vmlal.s16 q10,d11,d0[2] 227 228 229 vmull.s16 q11,d10,d0[0] 230 vmlal.s16 q11,d11,d1[2] 231 232 vmull.s16 q8,d10,d0[0] 233 vmlal.s16 q8,d11,d2[2] 234 235 vmull.s16 q9,d10,d0[0] 236 vmlal.s16 q9,d11,d3[2] 237 cmp r11,r10 238 bhs shift1 239 240 vld1.16 d12,[r0],r6 241 vld1.16 d14,[r0],r6 242 vld1.16 d13,[r0],r6 243 vld1.16 d15,[r0],r6 244 245 246 247 248 249 250 251 vmlal.s16 q12,d14,d1[1] 252 vmlal.s16 q13,d14,d3[3] 253 vmlal.s16 q14,d14,d6[1] 254 vmlsl.s16 q15,d14,d7[1] 255 256 257 vmlal.s16 q12,d15,d1[3] 258 vmlal.s16 q13,d15,d5[1] 259 vmlsl.s16 q14,d15,d7[1] 260 vmlsl.s16 q15,d15,d3[3] 261 262 263 vmlal.s16 q10,d12,d1[0] 264 vmlal.s16 q10,d13,d1[2] 265 vmlal.s16 q11,d12,d3[0] 266 vmlal.s16 q11,d13,d4[2] 267 vmlal.s16 q8,d12,d5[0] 268 vmlal.s16 q8,d13,d7[2] 269 vmlal.s16 q9,d12,d7[0] 270 vmlsl.s16 q9,d13,d5[2] 271 272 cmp r11,r9 273 bhs shift1 274 275 vld1.16 d10,[r0],r6 276 vld1.16 d8,[r0],r6 277 vld1.16 d11,[r0],r6 278 vld1.16 d9,[r0],r6 279 280 281 vmlal.s16 q12,d8,d2[1] @// y1 * cos1(part of b0) 282 vmlal.s16 q13,d8,d6[3] @// y1 * cos3(part of b1) 283 vmlsl.s16 q14,d8,d4[3] @// y1 * sin3(part of b2) 284 vmlsl.s16 q15,d8,d0[1] @// y1 * sin1(part of b3) 285 286 vmlal.s16 q12,d9,d2[3] @// y1 * cos1 + y3 * cos3(part of b0) 287 vmlsl.s16 q13,d9,d7[3] @// y1 * cos3 - y3 * sin1(part of b1) 288 vmlsl.s16 q14,d9,d2[1] @// y1 * sin3 - y3 * cos1(part of b2) 289 vmlsl.s16 q15,d9,d3[1] @// y1 * sin1 - y3 * sin3(part of b3) 290 291 292 293 294 295 vmlal.s16 q10,d10,d2[0] 296 vmlal.s16 q10,d11,d2[2] 297 298 299 vmlal.s16 q11,d10,d6[0] 300 vmlal.s16 q11,d11,d7[2] 301 302 vmlsl.s16 q8,d10,d6[0] 303 vmlsl.s16 q8,d11,d3[2] 304 305 vmlsl.s16 q9,d10,d2[0] 306 vmlsl.s16 q9,d11,d1[2] 307 308 cmp r11,r5 309 bhs shift1 310 311 312 vld1.16 d12,[r0],r6 313 vld1.16 d14,[r0],r6 314 vld1.16 d13,[r0],r6 315 vld1.16 d15,[r0],r6 316 317 318 319 320 321 322 323 324 325 vmlal.s16 q12,d14,d3[1] 326 vmlsl.s16 q13,d14,d6[1] 327 vmlsl.s16 q14,d14,d0[1] 328 vmlsl.s16 q15,d14,d6[3] 329 330 331 vmlal.s16 q12,d15,d3[3] 332 vmlsl.s16 q13,d15,d4[3] 333 vmlsl.s16 q14,d15,d2[3] 334 vmlal.s16 q15,d15,d5[3] 335 336 337 vmlal.s16 q10,d12,d3[0] 338 vmlal.s16 q10,d13,d3[2] 339 vmlsl.s16 q11,d12,d7[0] 340 vmlsl.s16 q11,d13,d5[2] 341 vmlsl.s16 q8,d12,d1[0] 342 vmlsl.s16 q8,d13,d1[2] 343 vmlsl.s16 q9,d12,d5[0] 344 vmlal.s16 q9,d13,d7[2] 345 346 cmp r11,r7 347 bhs shift1 348 349 350 vld1.16 d10,[r0],r6 351 vld1.16 d8,[r0],r6 352 vld1.16 d11,[r0],r6 353 vld1.16 d9,[r0],r6 354 355 356 357 vmlal.s16 q12,d8,d4[1] @// y1 * cos1(part of b0) 358 vmlsl.s16 q13,d8,d3[1] @// y1 * cos3(part of b1) 359 vmlsl.s16 q14,d8,d5[1] @// y1 * sin3(part of b2) 360 vmlal.s16 q15,d8,d2[1] @// y1 * sin1(part of b3) 361 362 vmlal.s16 q12,d9,d4[3] @// y1 * cos1 + y3 * cos3(part of b0) 363 vmlsl.s16 q13,d9,d1[3] @// y1 * cos3 - y3 * sin1(part of b1) 364 vmlsl.s16 q14,d9,d7[3] @// y1 * sin3 - y3 * cos1(part of b2) 365 vmlal.s16 q15,d9,d1[1] @// y1 * sin1 - y3 * sin3(part of b3) 366 367 368 369 370 371 vmlal.s16 q10,d10,d0[0] 372 vmlal.s16 q10,d11,d4[2] 373 374 375 vmlsl.s16 q11,d10,d0[0] 376 vmlsl.s16 q11,d11,d2[2] 377 378 vmlsl.s16 q8,d10,d0[0] 379 vmlsl.s16 q8,d11,d6[2] 380 381 vmlal.s16 q9,d10,d0[0] 382 vmlal.s16 q9,d11,d0[2] 383 384 385 386 vld1.16 d12,[r0],r6 387 vld1.16 d14,[r0],r6 388 vld1.16 d13,[r0],r6 389 vld1.16 d15,[r0],r6 390 391 392 393 394 vmlal.s16 q12,d14,d5[1] 395 vmlsl.s16 q13,d14,d0[2] 396 vmlal.s16 q14,d14,d5[3] 397 vmlal.s16 q15,d14,d4[3] 398 399 400 vmlal.s16 q12,d15,d5[3] 401 vmlsl.s16 q13,d15,d1[1] 402 vmlal.s16 q14,d15,d3[1] 403 vmlsl.s16 q15,d15,d7[3] 404 405 406 vmlal.s16 q10,d12,d5[0] 407 vmlal.s16 q10,d13,d5[2] 408 vmlsl.s16 q11,d12,d1[0] 409 vmlsl.s16 q11,d13,d0[2] 410 vmlal.s16 q8,d12,d7[0] 411 vmlal.s16 q8,d13,d4[2] 412 vmlal.s16 q9,d12,d3[0] 413 vmlal.s16 q9,d13,d6[2] 414 415 416 vld1.16 d10,[r0],r6 417 vld1.16 d8,[r0],r6 418 vld1.16 d11,[r0],r6 419 vld1.16 d9,[r0],r6 420 421 422 423 424 425 426 427 vmlal.s16 q12,d8,d6[1] @// y1 * cos1(part of b0) 428 vmlsl.s16 q13,d8,d2[3] @// y1 * cos3(part of b1) 429 vmlal.s16 q14,d8,d0[1] @// y1 * sin3(part of b2) 430 vmlsl.s16 q15,d8,d4[1] @// y1 * sin1(part of b3) 431 432 vmlal.s16 q12,d9,d6[3] @// y1 * cos1 + y3 * cos3(part of b0) 433 vmlsl.s16 q13,d9,d4[1] @// y1 * cos3 - y3 * sin1(part of b1) 434 vmlal.s16 q14,d9,d1[3] @// y1 * sin3 - y3 * cos1(part of b2) 435 vmlsl.s16 q15,d9,d0[1] @// y1 * sin1 - y3 * sin3(part of b3) 436 437 438 439 440 441 vmlal.s16 q10,d10,d6[0] 442 vmlal.s16 q10,d11,d6[2] 443 444 445 vmlsl.s16 q11,d10,d2[0] 446 vmlsl.s16 q11,d11,d3[2] 447 448 vmlal.s16 q8,d10,d2[0] 449 vmlal.s16 q8,d11,d0[2] 450 451 vmlsl.s16 q9,d10,d6[0] 452 vmlsl.s16 q9,d11,d2[2] 453 454 vld1.16 d12,[r0],r6 455 vld1.16 d14,[r0],r6 456 vld1.16 d13,[r0],r6 457 vld1.16 d15,[r0],r6 458 459 460 vmlal.s16 q12,d14,d7[1] 461 vmlsl.s16 q13,d14,d5[3] 462 vmlal.s16 q14,d14,d4[1] 463 vmlsl.s16 q15,d14,d2[3] 464 465 466 vmlal.s16 q12,d15,d7[3] 467 vmlsl.s16 q13,d15,d7[1] 468 vmlal.s16 q14,d15,d6[3] 469 vmlsl.s16 q15,d15,d6[1] 470 471 472 vmlal.s16 q10,d12,d7[0] 473 vmlal.s16 q10,d13,d7[2] 474 vmlsl.s16 q11,d12,d5[0] 475 vmlsl.s16 q11,d13,d6[2] 476 vmlal.s16 q8,d12,d3[0] 477 vmlal.s16 q8,d13,d5[2] 478 vmlsl.s16 q9,d12,d1[0] 479 vmlsl.s16 q9,d13,d4[2] 480 481 482 483 shift1: 484 vadd.s32 q4,q10,q12 485 vsub.s32 q5,q10,q12 486 487 vadd.s32 q6,q11,q13 488 vsub.s32 q12,q11,q13 489 490 vadd.s32 q7,q8,q14 491 vsub.s32 q13,q8,q14 492 493 494 vadd.s32 q8,q9,q15 495 vsub.s32 q14,q9,q15 496 497 498 vqrshrn.s32 d30,q4,#shift_stage1_idct @// r0 = (a0 + b0 + rnd) >> 7(shift_stage1_idct) 499 vqrshrn.s32 d19,q5,#shift_stage1_idct @// r7 = (a0 - b0 + rnd) >> 7(shift_stage1_idct) 500 vqrshrn.s32 d31,q7,#shift_stage1_idct @// r2 = (a2 + b2 + rnd) >> 7(shift_stage1_idct) 501 vqrshrn.s32 d18,q13,#shift_stage1_idct @// r5 = (a2 - b2 + rnd) >> 7(shift_stage1_idct) 502 vqrshrn.s32 d12,q6,#shift_stage1_idct @// r1 = (a1 + b1 + rnd) >> 7(shift_stage1_idct) 503 vqrshrn.s32 d15,q12,#shift_stage1_idct @// r6 = (a1 - b1 + rnd) >> 7(shift_stage1_idct) 504 vqrshrn.s32 d13,q8,#shift_stage1_idct @// r3 = (a3 + b3 + rnd) >> 7(shift_stage1_idct) 505 vqrshrn.s32 d14,q14,#shift_stage1_idct @// r4 = (a3 - b3 + rnd) >> 7(shift_stage1_idct) 506 507 508 @ registers used q15,q14,q6,q7 509 510 511 vtrn.16 q15,q6 512 vtrn.16 q7,q9 513 514 vtrn.32 d30,d31 515 vtrn.32 d12,d13 516 vtrn.32 d14,d15 517 vtrn.32 d18,d19 518 519 520 @ d30 =r0 1- 4 values 521 @ d31 =r2 1- 4 values 522 @ d12=r1 1- 4 values 523 @ d13=r3 1- 4 values 524 @ d14 =r0 28-31 values 525 @ d15 =r2 28- 31 values 526 @ d18=r1 28- 31 values 527 @ d19=r3 28- 31 values 528 529 530 531 vst1.16 {q15},[r1]! 532 vst1.16 {q6},[r1]! 533 add r1,r1,#192 534 vst1.16 {q7},[r1]! 535 vst1.16 {q9},[r1]! 536 sub r1,r1,#224 537 538 mov r0,r8 539 540 541 542 543 544 vld1.16 d10,[r0],r6 545 vld1.16 d8,[r0],r6 546 vld1.16 d11,[r0],r6 547 vld1.16 d9,[r0],r6 548 549 550 551 552 vmull.s16 q12,d8,d2[1] @// y1 * cos1(part of b0) 553 vmull.s16 q13,d8,d2[3] @// y1 * cos3(part of b1) 554 vmull.s16 q14,d8,d3[1] @// y1 * sin3(part of b2) 555 vmull.s16 q15,d8,d3[3] @// y1 * sin1(part of b3) 556 557 vmlal.s16 q12,d9,d6[3] @// y1 * cos1 + y3 * cos3(part of b0) 558 vmlsl.s16 q13,d9,d7[3] @// y1 * cos3 - y3 * sin1(part of b1) 559 vmlsl.s16 q14,d9,d6[1] @// y1 * sin3 - y3 * cos1(part of b2) 560 vmlsl.s16 q15,d9,d4[3] @// y1 * sin1 - y3 * sin3(part of b3) 561 562 563 564 565 566 vmull.s16 q10,d10,d0[0] 567 vmlal.s16 q10,d11,d4[2] 568 569 570 vmull.s16 q11,d10,d0[0] 571 vmlal.s16 q11,d11,d5[2] 572 573 vmull.s16 q8,d10,d0[0] 574 vmlal.s16 q8,d11,d6[2] 575 576 vmull.s16 q9,d10,d0[0] 577 vmlal.s16 q9,d11,d7[2] 578 cmp r11,r10 579 bhs shift2 580 581 vld1.16 d12,[r0],r6 582 vld1.16 d14,[r0],r6 583 vld1.16 d13,[r0],r6 584 vld1.16 d15,[r0],r6 585 586 587 vmlsl.s16 q12,d14,d4[3] 588 vmlsl.s16 q13,d14,d2[1] 589 vmlsl.s16 q14,d14,d0[1] 590 vmlsl.s16 q15,d14,d2[3] 591 592 593 vmlsl.s16 q12,d15,d0[3] 594 vmlsl.s16 q13,d15,d3[1] 595 vmlsl.s16 q14,d15,d6[3] 596 vmlal.s16 q15,d15,d5[3] 597 598 599 vmlsl.s16 q10,d12,d7[0] 600 vmlsl.s16 q10,d13,d2[2] 601 vmlsl.s16 q11,d12,d5[0] 602 vmlsl.s16 q11,d13,d0[2] 603 vmlsl.s16 q8,d12,d3[0] 604 vmlsl.s16 q8,d13,d3[2] 605 vmlsl.s16 q9,d12,d1[0] 606 vmlsl.s16 q9,d13,d6[2] 607 608 cmp r11,r9 609 bhs shift2 610 611 612 vld1.16 d10,[r0],r6 613 vld1.16 d8,[r0],r6 614 vld1.16 d11,[r0],r6 615 vld1.16 d9,[r0],r6 616 617 618 619 620 621 622 623 vmlsl.s16 q12,d8,d4[1] @// y1 * cos1(part of b0) 624 vmlal.s16 q13,d8,d7[1] @// y1 * cos3(part of b1) 625 vmlal.s16 q14,d8,d2[3] @// y1 * sin3(part of b2) 626 vmlal.s16 q15,d8,d1[3] @// y1 * sin1(part of b3) 627 628 vmlal.s16 q12,d9,d7[1] @// y1 * cos1 + y3 * cos3(part of b0) 629 vmlal.s16 q13,d9,d1[3] @// y1 * cos3 - y3 * sin1(part of b1) 630 vmlal.s16 q14,d9,d3[3] @// y1 * sin3 - y3 * cos1(part of b2) 631 vmlsl.s16 q15,d9,d6[3] @// y1 * sin1 - y3 * sin3(part of b3) 632 633 634 635 636 637 vmlsl.s16 q10,d10,d2[0] 638 vmlsl.s16 q10,d11,d6[2] 639 640 641 vmlsl.s16 q11,d10,d6[0] 642 vmlal.s16 q11,d11,d4[2] 643 644 vmlal.s16 q8,d10,d6[0] 645 vmlal.s16 q8,d11,d0[2] 646 647 vmlal.s16 q9,d10,d2[0] 648 vmlal.s16 q9,d11,d5[2] 649 650 cmp r11,r5 651 bhs shift2 652 653 654 vld1.16 d12,[r0],r6 655 vld1.16 d14,[r0],r6 656 vld1.16 d13,[r0],r6 657 vld1.16 d15,[r0],r6 658 659 660 661 662 663 vmlal.s16 q12,d14,d2[3] 664 vmlal.s16 q13,d14,d3[3] 665 vmlsl.s16 q14,d14,d5[3] 666 vmlsl.s16 q15,d14,d0[3] 667 668 669 vmlal.s16 q12,d15,d1[3] 670 vmlsl.s16 q13,d15,d6[3] 671 vmlsl.s16 q14,d15,d0[3] 672 vmlal.s16 q15,d15,d7[3] 673 674 675 vmlal.s16 q10,d12,d5[0] 676 vmlal.s16 q10,d13,d0[2] 677 vmlal.s16 q11,d12,d1[0] 678 vmlal.s16 q11,d13,d6[2] 679 vmlal.s16 q8,d12,d7[0] 680 vmlsl.s16 q8,d13,d2[2] 681 vmlsl.s16 q9,d12,d3[0] 682 vmlsl.s16 q9,d13,d4[2] 683 684 685 cmp r11,r7 686 bhs shift2 687 688 689 vld1.16 d10,[r0],r6 690 vld1.16 d8,[r0],r6 691 vld1.16 d11,[r0],r6 692 vld1.16 d9,[r0],r6 693 694 695 696 697 698 699 700 vmlal.s16 q12,d8,d6[1] @// y1 * cos1(part of b0) 701 vmlsl.s16 q13,d8,d1[1] @// y1 * cos3(part of b1) 702 vmlsl.s16 q14,d8,d7[1] @// y1 * sin3(part of b2) 703 vmlal.s16 q15,d8,d0[3] @// y1 * sin1(part of b3) 704 705 vmlsl.s16 q12,d9,d5[1] @// y1 * cos1 + y3 * cos3(part of b0) 706 vmlsl.s16 q13,d9,d4[1] @// y1 * cos3 - y3 * sin1(part of b1) 707 vmlal.s16 q14,d9,d2[1] @// y1 * sin3 - y3 * cos1(part of b2) 708 vmlal.s16 q15,d9,d7[1] @// y1 * sin1 - y3 * sin3(part of b3) 709 710 711 712 713 714 vmlal.s16 q10,d10,d0[0] 715 vmlsl.s16 q10,d11,d7[2] 716 717 718 vmlsl.s16 q11,d10,d0[0] 719 vmlsl.s16 q11,d11,d1[2] 720 721 vmlsl.s16 q8,d10,d0[0] 722 vmlal.s16 q8,d11,d5[2] 723 724 vmlal.s16 q9,d10,d0[0] 725 vmlal.s16 q9,d11,d3[2] 726 727 728 729 vld1.16 d12,[r0],r6 730 vld1.16 d14,[r0],r6 731 vld1.16 d13,[r0],r6 732 vld1.16 d15,[r0],r6 733 734 735 vmlsl.s16 q12,d14,d0[1] 736 vmlal.s16 q13,d14,d6[1] 737 vmlal.s16 q14,d14,d4[1] 738 vmlsl.s16 q15,d14,d1[1] 739 740 741 vmlsl.s16 q12,d15,d3[3] 742 vmlal.s16 q13,d15,d0[1] 743 vmlsl.s16 q14,d15,d5[1] 744 vmlsl.s16 q15,d15,d6[1] 745 746 747 vmlsl.s16 q10,d12,d3[0] 748 vmlsl.s16 q10,d13,d1[2] 749 vmlsl.s16 q11,d12,d7[0] 750 vmlal.s16 q11,d13,d3[2] 751 vmlal.s16 q8,d12,d1[0] 752 vmlal.s16 q8,d13,d7[2] 753 vmlsl.s16 q9,d12,d5[0] 754 vmlsl.s16 q9,d13,d2[2] 755 756 vld1.16 d10,[r0],r6 757 vld1.16 d8,[r0],r6 758 vld1.16 d11,[r0],r6 759 vld1.16 d9,[r0],r6 760 761 762 763 764 vmlal.s16 q12,d8,d7[3] @// y1 * cos1(part of b0) 765 vmlal.s16 q13,d8,d4[3] @// y1 * cos3(part of b1) 766 vmlsl.s16 q14,d8,d1[1] @// y1 * sin3(part of b2) 767 vmlal.s16 q15,d8,d2[1] @// y1 * sin1(part of b3) 768 769 vmlal.s16 q12,d9,d3[1] @// y1 * cos1 + y3 * cos3(part of b0) 770 vmlsl.s16 q13,d9,d5[3] @// y1 * cos3 - y3 * sin1(part of b1) 771 vmlsl.s16 q14,d9,d7[3] @// y1 * sin3 - y3 * cos1(part of b2) 772 vmlal.s16 q15,d9,d5[1] @// y1 * sin1 - y3 * sin3(part of b3) 773 774 775 776 777 778 vmlsl.s16 q10,d10,d6[0] 779 vmlal.s16 q10,d11,d5[2] 780 781 782 vmlal.s16 q11,d10,d2[0] 783 vmlal.s16 q11,d11,d7[2] 784 785 vmlsl.s16 q8,d10,d2[0] 786 vmlsl.s16 q8,d11,d4[2] 787 788 vmlal.s16 q9,d10,d6[0] 789 vmlal.s16 q9,d11,d1[2] 790 791 792 vld1.16 d12,[r0],r6 793 vld1.16 d14,[r0],r6 794 vld1.16 d13,[r0],r6 795 vld1.16 d15,[r0],r6 796 797 798 799 800 801 vmlal.s16 q12,d14,d1[1] 802 vmlsl.s16 q13,d14,d0[3] 803 vmlal.s16 q14,d14,d1[3] 804 vmlsl.s16 q15,d14,d3[1] 805 806 807 vmlal.s16 q12,d15,d5[3] 808 vmlsl.s16 q13,d15,d5[1] 809 vmlal.s16 q14,d15,d4[3] 810 vmlsl.s16 q15,d15,d4[1] 811 812 813 vmlal.s16 q10,d12,d1[0] 814 vmlal.s16 q10,d13,d3[2] 815 vmlsl.s16 q11,d12,d3[0] 816 vmlsl.s16 q11,d13,d2[2] 817 vmlal.s16 q8,d12,d5[0] 818 vmlal.s16 q8,d13,d1[2] 819 vmlsl.s16 q9,d12,d7[0] 820 vmlsl.s16 q9,d13,d0[2] 821 822 shift2: 823 vadd.s32 q4,q10,q12 824 vsub.s32 q5,q10,q12 825 826 vadd.s32 q6,q11,q13 827 vsub.s32 q12,q11,q13 828 829 vadd.s32 q7,q8,q14 830 vsub.s32 q13,q8,q14 831 832 833 vadd.s32 q8,q9,q15 834 vsub.s32 q14,q9,q15 835 836 837 vqrshrn.s32 d30,q4,#shift_stage1_idct @// r0 = (a0 + b0 + rnd) >> 7(shift_stage1_idct) 838 vqrshrn.s32 d19,q5,#shift_stage1_idct @// r7 = (a0 - b0 + rnd) >> 7(shift_stage1_idct) 839 vqrshrn.s32 d31,q7,#shift_stage1_idct @// r2 = (a2 + b2 + rnd) >> 7(shift_stage1_idct) 840 vqrshrn.s32 d18,q13,#shift_stage1_idct @// r5 = (a2 - b2 + rnd) >> 7(shift_stage1_idct) 841 vqrshrn.s32 d12,q6,#shift_stage1_idct @// r1 = (a1 + b1 + rnd) >> 7(shift_stage1_idct) 842 vqrshrn.s32 d15,q12,#shift_stage1_idct @// r6 = (a1 - b1 + rnd) >> 7(shift_stage1_idct) 843 vqrshrn.s32 d13,q8,#shift_stage1_idct @// r3 = (a3 + b3 + rnd) >> 7(shift_stage1_idct) 844 vqrshrn.s32 d14,q14,#shift_stage1_idct @// r4 = (a3 - b3 + rnd) >> 7(shift_stage1_idct) 845 846 vtrn.16 q15,q6 847 vtrn.16 q7,q9 848 849 vtrn.32 d30,d31 850 vtrn.32 d12,d13 851 vtrn.32 d14,d15 852 vtrn.32 d18,d19 853 854 855 vst1.16 {q15},[r1]! 856 vst1.16 {q6},[r1]! 857 add r1,r1,#128 858 vst1.16 {q7},[r1]! 859 vst1.16 {q9},[r1]! 860 sub r1,r1,#160 861 mov r0,r8 862 863 864 865 vld1.16 d10,[r0],r6 866 vld1.16 d8,[r0],r6 867 vld1.16 d11,[r0],r6 868 vld1.16 d9,[r0],r6 869 870 871 vmull.s16 q12,d8,d4[1] @// y1 * cos1(part of b0) 872 vmull.s16 q13,d8,d4[3] @// y1 * cos3(part of b1) 873 vmull.s16 q14,d8,d5[1] @// y1 * sin3(part of b2) 874 vmull.s16 q15,d8,d5[3] @// y1 * sin1(part of b3) 875 876 vmlsl.s16 q12,d9,d3[1] @// y1 * cos1 + y3 * cos3(part of b0) 877 vmlsl.s16 q13,d9,d1[3] @// y1 * cos3 - y3 * sin1(part of b1) 878 vmlsl.s16 q14,d9,d0[2] @// y1 * sin3 - y3 * cos1(part of b2) 879 vmlsl.s16 q15,d9,d1[1] @// y1 * sin1 - y3 * sin3(part of b3) 880 881 882 883 884 885 vmull.s16 q10,d10,d0[0] 886 vmlsl.s16 q10,d11,d7[2] 887 888 889 vmull.s16 q11,d10,d0[0] 890 vmlsl.s16 q11,d11,d6[2] 891 892 vmull.s16 q8,d10,d0[0] 893 vmlsl.s16 q8,d11,d5[2] 894 895 vmull.s16 q9,d10,d0[0] 896 vmlsl.s16 q9,d11,d4[2] 897 898 cmp r11,r10 899 bhs shift3 900 901 vld1.16 d12,[r0],r6 902 vld1.16 d14,[r0],r6 903 vld1.16 d13,[r0],r6 904 vld1.16 d15,[r0],r6 905 906 907 908 909 vmlsl.s16 q12,d14,d5[1] 910 vmlsl.s16 q13,d14,d7[3] 911 vmlal.s16 q14,d14,d5[3] 912 vmlal.s16 q15,d14,d3[1] 913 914 915 vmlal.s16 q12,d15,d2[1] 916 vmlal.s16 q13,d15,d1[1] 917 vmlal.s16 q14,d15,d4[3] 918 vmlsl.s16 q15,d15,d7[3] 919 920 921 vmlsl.s16 q10,d12,d1[0] 922 vmlal.s16 q10,d13,d6[2] 923 vmlsl.s16 q11,d12,d3[0] 924 vmlal.s16 q11,d13,d3[2] 925 vmlsl.s16 q8,d12,d5[0] 926 vmlal.s16 q8,d13,d0[2] 927 vmlsl.s16 q9,d12,d7[0] 928 vmlal.s16 q9,d13,d2[2] 929 930 cmp r11,r9 931 bhs shift3 932 933 vld1.16 d10,[r0],r6 934 vld1.16 d8,[r0],r6 935 vld1.16 d11,[r0],r6 936 vld1.16 d9,[r0],r6 937 938 vmlal.s16 q12,d8,d6[1] @// y1 * cos1(part of b0) 939 vmlsl.s16 q13,d8,d5[1] @// y1 * cos3(part of b1) 940 vmlsl.s16 q14,d8,d0[3] @// y1 * sin3(part of b2) 941 vmlsl.s16 q15,d8,d3[3] @// y1 * sin1(part of b3) 942 943 vmlsl.s16 q12,d9,d1[1] @// y1 * cos1 + y3 * cos3(part of b0) 944 vmlsl.s16 q13,d9,d4[1] @// y1 * cos3 - y3 * sin1(part of b1) 945 vmlal.s16 q14,d9,d6[1] @// y1 * sin3 - y3 * cos1(part of b2) 946 vmlal.s16 q15,d9,d0[1] @// y1 * sin1 - y3 * sin3(part of b3) 947 948 949 950 951 952 vmlal.s16 q10,d10,d2[0] 953 vmlsl.s16 q10,d11,d5[2] 954 955 956 vmlal.s16 q11,d10,d6[0] 957 vmlsl.s16 q11,d11,d0[2] 958 959 vmlsl.s16 q8,d10,d6[0] 960 vmlsl.s16 q8,d11,d4[2] 961 962 vmlsl.s16 q9,d10,d2[0] 963 vmlal.s16 q9,d11,d6[2] 964 965 cmp r11,r5 966 bhs shift3 967 968 969 vld1.16 d12,[r0],r6 970 vld1.16 d14,[r0],r6 971 vld1.16 d13,[r0],r6 972 vld1.16 d15,[r0],r6 973 974 975 976 977 978 979 vmlsl.s16 q12,d14,d7[1] 980 vmlal.s16 q13,d14,d2[1] 981 vmlal.s16 q14,d14,d4[1] 982 vmlsl.s16 q15,d14,d5[1] 983 984 985 vmlal.s16 q12,d15,d0[3] 986 vmlal.s16 q13,d15,d7[1] 987 vmlsl.s16 q14,d15,d1[1] 988 vmlsl.s16 q15,d15,d6[1] 989 990 991 vmlsl.s16 q10,d12,d3[0] 992 vmlal.s16 q10,d13,d4[2] 993 vmlal.s16 q11,d12,d7[0] 994 vmlal.s16 q11,d13,d2[2] 995 vmlal.s16 q8,d12,d1[0] 996 vmlsl.s16 q8,d13,d6[2] 997 vmlal.s16 q9,d12,d5[0] 998 vmlsl.s16 q9,d13,d0[2] 999 1000 1001 cmp r11,r7 1002 bhs shift3 1003 1004 1005 vld1.16 d10,[r0],r6 1006 vld1.16 d8,[r0],r6 1007 vld1.16 d11,[r0],r6 1008 vld1.16 d9,[r0],r6 1009 1010 1011 vmlsl.s16 q12,d8,d7[3] @// y1 * cos1(part of b0) 1012 vmlsl.s16 q13,d8,d0[1] @// y1 * cos3(part of b1) 1013 vmlal.s16 q14,d8,d6[3] @// y1 * sin3(part of b2) 1014 vmlal.s16 q15,d8,d1[3] @// y1 * sin1(part of b3) 1015 1016 vmlsl.s16 q12,d9,d0[1] @// y1 * cos1 + y3 * cos3(part of b0) 1017 vmlal.s16 q13,d9,d5[3] @// y1 * cos3 - y3 * sin1(part of b1) 1018 vmlal.s16 q14,d9,d3[3] @// y1 * sin3 - y3 * cos1(part of b2) 1019 vmlsl.s16 q15,d9,d2[3] @// y1 * sin1 - y3 * sin3(part of b3) 1020 1021 1022 1023 1024 1025 vmlal.s16 q10,d10,d0[0] 1026 vmlsl.s16 q10,d11,d3[2] 1027 1028 1029 vmlsl.s16 q11,d10,d0[0] 1030 vmlsl.s16 q11,d11,d5[2] 1031 1032 vmlsl.s16 q8,d10,d0[0] 1033 vmlal.s16 q8,d11,d1[2] 1034 1035 vmlal.s16 q9,d10,d0[0] 1036 vmlal.s16 q9,d11,d7[2] 1037 1038 1039 vld1.16 d12,[r0],r6 1040 vld1.16 d14,[r0],r6 1041 vld1.16 d13,[r0],r6 1042 vld1.16 d15,[r0],r6 1043 1044 1045 1046 vmlal.s16 q12,d14,d6[3] 1047 vmlal.s16 q13,d14,d3[3] 1048 vmlsl.s16 q14,d14,d1[3] 1049 vmlal.s16 q15,d14,d7[1] 1050 1051 1052 vmlal.s16 q12,d15,d1[3] 1053 vmlsl.s16 q13,d15,d2[3] 1054 vmlal.s16 q14,d15,d7[1] 1055 vmlal.s16 q15,d15,d4[1] 1056 1057 1058 vmlsl.s16 q10,d12,d5[0] 1059 vmlal.s16 q10,d13,d2[2] 1060 vmlal.s16 q11,d12,d1[0] 1061 vmlsl.s16 q11,d13,d7[2] 1062 vmlsl.s16 q8,d12,d7[0] 1063 vmlsl.s16 q8,d13,d3[2] 1064 vmlsl.s16 q9,d12,d3[0] 1065 vmlal.s16 q9,d13,d1[2] 1066 1067 1068 1069 vld1.16 d10,[r0],r6 1070 vld1.16 d8,[r0],r6 1071 vld1.16 d11,[r0],r6 1072 vld1.16 d9,[r0],r6 1073 1074 1075 1076 1077 vmlsl.s16 q12,d8,d5[3] @// y1 * cos1(part of b0) 1078 vmlsl.s16 q13,d8,d6[3] @// y1 * cos3(part of b1) 1079 vmlal.s16 q14,d8,d3[1] @// y1 * sin3(part of b2) 1080 vmlsl.s16 q15,d8,d0[1] @// y1 * sin1(part of b3) 1081 1082 vmlsl.s16 q12,d9,d2[3] @// y1 * cos1 + y3 * cos3(part of b0) 1083 vmlal.s16 q13,d9,d0[1] @// y1 * cos3 - y3 * sin1(part of b1) 1084 vmlsl.s16 q14,d9,d2[1] @// y1 * sin3 - y3 * cos1(part of b2) 1085 vmlal.s16 q15,d9,d4[3] @// y1 * sin1 - y3 * sin3(part of b3) 1086 1087 1088 1089 1090 1091 vmlal.s16 q10,d10,d6[0] 1092 vmlsl.s16 q10,d11,d1[2] 1093 1094 1095 vmlsl.s16 q11,d10,d2[0] 1096 vmlal.s16 q11,d11,d4[2] 1097 1098 vmlal.s16 q8,d10,d2[0] 1099 vmlsl.s16 q8,d11,d7[2] 1100 1101 vmlsl.s16 q9,d10,d6[0] 1102 vmlsl.s16 q9,d11,d5[2] 1103 1104 1105 vld1.16 d12,[r0],r6 1106 vld1.16 d14,[r0],r6 1107 vld1.16 d13,[r0],r6 1108 vld1.16 d15,[r0],r6 1109 1110 vmlal.s16 q12,d14,d4[3] 1111 vmlsl.s16 q13,d14,d6[1] 1112 vmlal.s16 q14,d14,d7[3] 1113 vmlal.s16 q15,d14,d6[3] 1114 1115 1116 vmlal.s16 q12,d15,d3[3] 1117 vmlsl.s16 q13,d15,d3[1] 1118 vmlal.s16 q14,d15,d2[3] 1119 vmlsl.s16 q15,d15,d2[1] 1120 1121 1122 vmlsl.s16 q10,d12,d7[0] 1123 vmlal.s16 q10,d13,d0[2] 1124 vmlal.s16 q11,d12,d5[0] 1125 vmlsl.s16 q11,d13,d1[2] 1126 vmlsl.s16 q8,d12,d3[0] 1127 vmlal.s16 q8,d13,d2[2] 1128 vmlal.s16 q9,d12,d1[0] 1129 vmlsl.s16 q9,d13,d3[2] 1130 1131 shift3: 1132 vadd.s32 q4,q10,q12 1133 vsub.s32 q5,q10,q12 1134 1135 vadd.s32 q6,q11,q13 1136 vsub.s32 q12,q11,q13 1137 1138 vadd.s32 q7,q8,q14 1139 vsub.s32 q13,q8,q14 1140 1141 1142 vadd.s32 q8,q9,q15 1143 vsub.s32 q14,q9,q15 1144 1145 1146 vqrshrn.s32 d30,q4,#shift_stage1_idct @// r0 = (a0 + b0 + rnd) >> 7(shift_stage1_idct) 1147 vqrshrn.s32 d19,q5,#shift_stage1_idct @// r7 = (a0 - b0 + rnd) >> 7(shift_stage1_idct) 1148 vqrshrn.s32 d31,q7,#shift_stage1_idct @// r2 = (a2 + b2 + rnd) >> 7(shift_stage1_idct) 1149 vqrshrn.s32 d18,q13,#shift_stage1_idct @// r5 = (a2 - b2 + rnd) >> 7(shift_stage1_idct) 1150 vqrshrn.s32 d12,q6,#shift_stage1_idct @// r1 = (a1 + b1 + rnd) >> 7(shift_stage1_idct) 1151 vqrshrn.s32 d15,q12,#shift_stage1_idct @// r6 = (a1 - b1 + rnd) >> 7(shift_stage1_idct) 1152 vqrshrn.s32 d13,q8,#shift_stage1_idct @// r3 = (a3 + b3 + rnd) >> 7(shift_stage1_idct) 1153 vqrshrn.s32 d14,q14,#shift_stage1_idct @// r4 = (a3 - b3 + rnd) >> 7(shift_stage1_idct) 1154 1155 vtrn.16 q15,q6 1156 vtrn.16 q7,q9 1157 1158 vtrn.32 d30,d31 1159 vtrn.32 d12,d13 1160 vtrn.32 d14,d15 1161 vtrn.32 d18,d19 1162 1163 1164 vst1.16 {q15},[r1]! 1165 vst1.16 {q6},[r1]! 1166 add r1,r1,#64 1167 vst1.16 {q7},[r1]! 1168 vst1.16 {q9},[r1]! 1169 sub r1,r1,#96 1170 1171 mov r0,r8 1172 1173 1174 1175 vld1.16 d10,[r0],r6 1176 vld1.16 d8,[r0],r6 1177 vld1.16 d11,[r0],r6 1178 vld1.16 d9,[r0],r6 1179 1180 1181 vmull.s16 q12,d8,d6[1] @// y1 * cos1(part of b0) 1182 vmull.s16 q13,d8,d6[3] @// y1 * cos3(part of b1) 1183 vmull.s16 q14,d8,d7[1] @// y1 * sin3(part of b2) 1184 vmull.s16 q15,d8,d7[3] @// y1 * sin1(part of b3) 1185 1186 vmlsl.s16 q12,d9,d2[3] @// y1 * cos1 + y3 * cos3(part of b0) 1187 vmlsl.s16 q13,d9,d4[1] @// y1 * cos3 - y3 * sin1(part of b1) 1188 vmlsl.s16 q14,d9,d5[3] @// y1 * sin3 - y3 * cos1(part of b2) 1189 vmlsl.s16 q15,d9,d7[1] @// y1 * sin1 - y3 * sin3(part of b3) 1190 1191 1192 1193 1194 1195 vmull.s16 q10,d10,d0[0] 1196 vmlsl.s16 q10,d11,d3[2] 1197 1198 1199 vmull.s16 q11,d10,d0[0] 1200 vmlsl.s16 q11,d11,d2[2] 1201 1202 vmull.s16 q8,d10,d0[0] 1203 vmlsl.s16 q8,d11,d1[2] 1204 1205 vmull.s16 q9,d10,d0[0] 1206 vmlsl.s16 q9,d11,d0[2] 1207 1208 cmp r11,r10 1209 bhs shift4 1210 1211 vld1.16 d12,[r0],r6 1212 vld1.16 d14,[r0],r6 1213 vld1.16 d13,[r0],r6 1214 vld1.16 d15,[r0],r6 1215 1216 1217 1218 1219 1220 1221 vmlal.s16 q12,d14,d0[1] 1222 vmlal.s16 q13,d14,d1[3] 1223 vmlal.s16 q14,d14,d4[1] 1224 vmlal.s16 q15,d14,d6[3] 1225 1226 1227 vmlsl.s16 q12,d15,d4[1] 1228 vmlsl.s16 q13,d15,d0[3] 1229 vmlsl.s16 q14,d15,d2[3] 1230 vmlsl.s16 q15,d15,d6[1] 1231 1232 1233 vmlal.s16 q10,d12,d7[0] 1234 vmlal.s16 q10,d13,d5[2] 1235 vmlal.s16 q11,d12,d5[0] 1236 vmlsl.s16 q11,d13,d7[2] 1237 vmlal.s16 q8,d12,d3[0] 1238 vmlsl.s16 q8,d13,d4[2] 1239 vmlal.s16 q9,d12,d1[0] 1240 vmlsl.s16 q9,d13,d1[2] 1241 1242 cmp r11,r9 1243 bhs shift4 1244 1245 vld1.16 d10,[r0],r6 1246 vld1.16 d8,[r0],r6 1247 vld1.16 d11,[r0],r6 1248 vld1.16 d9,[r0],r6 1249 1250 1251 1252 vmlal.s16 q12,d8,d7[3] @// y1 * cos1(part of b0) 1253 vmlal.s16 q13,d8,d3[1] @// y1 * cos3(part of b1) 1254 vmlal.s16 q14,d8,d1[1] @// y1 * sin3(part of b2) 1255 vmlal.s16 q15,d8,d5[3] @// y1 * sin1(part of b3) 1256 1257 vmlal.s16 q12,d9,d4[3] @// y1 * cos1 + y3 * cos3(part of b0) 1258 vmlsl.s16 q13,d9,d5[3] @// y1 * cos3 - y3 * sin1(part of b1) 1259 vmlsl.s16 q14,d9,d0[1] @// y1 * sin3 - y3 * cos1(part of b2) 1260 vmlsl.s16 q15,d9,d5[1] @// y1 * sin1 - y3 * sin3(part of b3) 1261 1262 1263 1264 1265 1266 vmlsl.s16 q10,d10,d2[0] 1267 vmlal.s16 q10,d11,d1[2] 1268 1269 1270 vmlsl.s16 q11,d10,d6[0] 1271 vmlal.s16 q11,d11,d3[2] 1272 1273 vmlal.s16 q8,d10,d6[0] 1274 vmlsl.s16 q8,d11,d7[2] 1275 1276 vmlal.s16 q9,d10,d2[0] 1277 vmlsl.s16 q9,d11,d2[2] 1278 1279 cmp r11,r5 1280 bhs shift4 1281 1282 1283 vld1.16 d12,[r0],r6 1284 vld1.16 d14,[r0],r6 1285 vld1.16 d13,[r0],r6 1286 vld1.16 d15,[r0],r6 1287 1288 1289 1290 1291 1292 1293 vmlsl.s16 q12,d14,d1[1] 1294 vmlsl.s16 q13,d14,d7[3] 1295 vmlal.s16 q14,d14,d1[3] 1296 vmlal.s16 q15,d14,d4[3] 1297 1298 1299 vmlal.s16 q12,d15,d2[1] 1300 vmlal.s16 q13,d15,d5[1] 1301 vmlsl.s16 q14,d15,d3[1] 1302 vmlsl.s16 q15,d15,d4[1] 1303 1304 1305 vmlsl.s16 q10,d12,d5[0] 1306 vmlsl.s16 q10,d13,d7[2] 1307 vmlsl.s16 q11,d12,d1[0] 1308 vmlal.s16 q11,d13,d1[2] 1309 vmlsl.s16 q8,d12,d7[0] 1310 vmlal.s16 q8,d13,d5[2] 1311 vmlal.s16 q9,d12,d3[0] 1312 vmlsl.s16 q9,d13,d3[2] 1313 1314 cmp r11,r7 1315 bhs shift4 1316 1317 1318 vld1.16 d10,[r0],r6 1319 vld1.16 d8,[r0],r6 1320 vld1.16 d11,[r0],r6 1321 vld1.16 d9,[r0],r6 1322 1323 1324 vmlsl.s16 q12,d8,d5[3] @// y1 * cos1(part of b0) 1325 vmlsl.s16 q13,d8,d2[3] @// y1 * cos3(part of b1) 1326 vmlal.s16 q14,d8,d4[3] @// y1 * sin3(part of b2) 1327 vmlal.s16 q15,d8,d3[3] @// y1 * sin1(part of b3) 1328 1329 vmlsl.s16 q12,d9,d6[3] @// y1 * cos1 + y3 * cos3(part of b0) 1330 vmlal.s16 q13,d9,d0[3] @// y1 * cos3 - y3 * sin1(part of b1) 1331 vmlsl.s16 q14,d9,d6[1] @// y1 * sin3 - y3 * cos1(part of b2) 1332 vmlsl.s16 q15,d9,d3[1] @// y1 * sin1 - y3 * sin3(part of b3) 1333 1334 1335 1336 1337 1338 vmlal.s16 q10,d10,d0[0] 1339 vmlsl.s16 q10,d11,d0[2] 1340 1341 1342 vmlsl.s16 q11,d10,d0[0] 1343 vmlal.s16 q11,d11,d6[2] 1344 1345 vmlsl.s16 q8,d10,d0[0] 1346 vmlal.s16 q8,d11,d2[2] 1347 1348 vmlal.s16 q9,d10,d0[0] 1349 vmlsl.s16 q9,d11,d4[2] 1350 1351 1352 1353 1354 vld1.16 d12,[r0],r6 1355 vld1.16 d14,[r0],r6 1356 vld1.16 d13,[r0],r6 1357 vld1.16 d15,[r0],r6 1358 1359 1360 1361 1362 1363 1364 vmlal.s16 q12,d14,d3[1] 1365 vmlsl.s16 q13,d14,d2[1] 1366 vmlal.s16 q14,d14,d7[3] 1367 vmlal.s16 q15,d14,d2[3] 1368 1369 1370 vmlsl.s16 q12,d15,d0[3] 1371 vmlal.s16 q13,d15,d4[3] 1372 vmlal.s16 q14,d15,d6[3] 1373 vmlsl.s16 q15,d15,d2[1] 1374 1375 1376 vmlal.s16 q10,d12,d3[0] 1377 vmlsl.s16 q10,d13,d6[2] 1378 vmlal.s16 q11,d12,d7[0] 1379 vmlsl.s16 q11,d13,d4[2] 1380 vmlsl.s16 q8,d12,d1[0] 1381 vmlal.s16 q8,d13,d0[2] 1382 vmlal.s16 q9,d12,d5[0] 1383 vmlsl.s16 q9,d13,d5[2] 1384 1385 1386 vld1.16 d10,[r0],r6 1387 vld1.16 d8,[r0],r6 1388 vld1.16 d11,[r0],r6 1389 vld1.16 d9,[r0],r6 1390 1391 1392 1393 1394 1395 vmlal.s16 q12,d8,d3[3] @// y1 * cos1(part of b0) 1396 vmlsl.s16 q13,d8,d7[1] @// y1 * cos3(part of b1) 1397 vmlsl.s16 q14,d8,d5[1] @// y1 * sin3(part of b2) 1398 vmlal.s16 q15,d8,d1[3] @// y1 * sin1(part of b3) 1399 1400 vmlsl.s16 q12,d9,d7[1] @// y1 * cos1 + y3 * cos3(part of b0) 1401 vmlsl.s16 q13,d9,d6[1] @// y1 * cos3 - y3 * sin1(part of b1) 1402 vmlal.s16 q14,d9,d3[3] @// y1 * sin3 - y3 * cos1(part of b2) 1403 vmlsl.s16 q15,d9,d1[1] @// y1 * sin1 - y3 * sin3(part of b3) 1404 1405 1406 1407 1408 1409 vmlsl.s16 q10,d10,d6[0] 1410 vmlal.s16 q10,d11,d2[2] 1411 1412 1413 vmlal.s16 q11,d10,d2[0] 1414 vmlsl.s16 q11,d11,d0[2] 1415 1416 vmlsl.s16 q8,d10,d2[0] 1417 vmlal.s16 q8,d11,d3[2] 1418 1419 vmlal.s16 q9,d10,d6[0] 1420 vmlsl.s16 q9,d11,d6[2] 1421 1422 1423 vld1.16 d12,[r0],r6 1424 vld1.16 d14,[r0],r6 1425 vld1.16 d13,[r0],r6 1426 vld1.16 d15,[r0],r6 1427 1428 1429 1430 1431 vmlsl.s16 q12,d14,d5[1] 1432 vmlal.s16 q13,d14,d3[3] 1433 vmlsl.s16 q14,d14,d2[1] 1434 vmlal.s16 q15,d14,d0[3] 1435 1436 1437 vmlal.s16 q12,d15,d1[3] 1438 vmlsl.s16 q13,d15,d1[1] 1439 vmlal.s16 q14,d15,d0[3] 1440 vmlsl.s16 q15,d15,d0[1] 1441 1442 1443 vmlsl.s16 q10,d12,d1[0] 1444 vmlal.s16 q10,d13,d4[2] 1445 vmlal.s16 q11,d12,d3[0] 1446 vmlsl.s16 q11,d13,d5[2] 1447 vmlsl.s16 q8,d12,d5[0] 1448 vmlal.s16 q8,d13,d6[2] 1449 vmlal.s16 q9,d12,d7[0] 1450 vmlsl.s16 q9,d13,d7[2] 1451 1452 shift4: 1453 vadd.s32 q4,q10,q12 1454 vsub.s32 q5,q10,q12 1455 1456 vadd.s32 q6,q11,q13 1457 vsub.s32 q12,q11,q13 1458 1459 vadd.s32 q7,q8,q14 1460 vsub.s32 q13,q8,q14 1461 1462 1463 vadd.s32 q8,q9,q15 1464 vsub.s32 q14,q9,q15 1465 1466 1467 vqrshrn.s32 d30,q4,#shift_stage1_idct @// r0 = (a0 + b0 + rnd) >> 7(shift_stage1_idct) 1468 vqrshrn.s32 d19,q5,#shift_stage1_idct @// r7 = (a0 - b0 + rnd) >> 7(shift_stage1_idct) 1469 vqrshrn.s32 d31,q7,#shift_stage1_idct @// r2 = (a2 + b2 + rnd) >> 7(shift_stage1_idct) 1470 vqrshrn.s32 d18,q13,#shift_stage1_idct @// r5 = (a2 - b2 + rnd) >> 7(shift_stage1_idct) 1471 vqrshrn.s32 d12,q6,#shift_stage1_idct @// r1 = (a1 + b1 + rnd) >> 7(shift_stage1_idct) 1472 vqrshrn.s32 d15,q12,#shift_stage1_idct @// r6 = (a1 - b1 + rnd) >> 7(shift_stage1_idct) 1473 vqrshrn.s32 d13,q8,#shift_stage1_idct @// r3 = (a3 + b3 + rnd) >> 7(shift_stage1_idct) 1474 vqrshrn.s32 d14,q14,#shift_stage1_idct @// r4 = (a3 - b3 + rnd) >> 7(shift_stage1_idct) 1475 1476 vtrn.16 q15,q6 1477 vtrn.16 q7,q9 1478 1479 vtrn.32 d30,d31 1480 vtrn.32 d12,d13 1481 vtrn.32 d14,d15 1482 vtrn.32 d18,d19 1483 1484 1485 vst1.16 {q15},[r1]! 1486 vst1.16 {q6},[r1]! 1487 vst1.16 {q7},[r1]! 1488 vst1.16 {q9},[r1]! 1489 1490 add r1,r1,#96 1491 1492 subs r14,r14,#1 1493 bne dct_stage1 1494 second_stage_dct: 1495 @ mov r0,r1 1496 ldr r0,[sp] 1497 ldr r1,[sp,#4] 1498 ldr r8,[sp,#60] @ prediction stride 1499 ldr r7,[sp,#64] @ destination stride 1500 1501 @ add r4,r2,r8, lsl #1 @ r4 = r2 + pred_strd * 2 => r4 points to 3rd row of pred data 1502 @ add r5,r8,r8, lsl #1 @ 1503 @ sub r0,r0,#512 1504 mov r11,#0xfffffff0 1505 mov r5, #0xffffff00 1506 ldr r6,r5_addr 1507 ldr r9,r9_addr 1508 @ sub r1,r1,#2048 1509 mov r4,r1 1510 mov r10,#240 1511 mov r14,#8 1512 b stage2 1513 1514 @ registers free : 1515 1516 @ arm registers used 1517 @ r8 : predicition stride 1518 @ r7 : destination stride 1519 @ r1: temp buffer 1520 @ r2 : pred buffer 1521 @ r3 : destination buffer 1522 @ r14 : loop counter 1523 @r0 : scratch buffer 1524 @r10 : used as stride 1525 @ r4 : used to store the initial address 1526 @r12 : zero cols 1527 @ r11 : 0xfffffff0 1528 @ r5 : 0xffffff00 1529 dct_stage2: 1530 add r4,r4,#32 1531 mov r1,r4 1532 stage2: 1533 vld1.16 {d10,d11},[r1]! 1534 vld1.16 {d8,d9},[r1],r10 1535 1536 vmull.s16 q12,d8,d0[1] @// y1 * cos1(part of b0) 1537 vmull.s16 q13,d8,d0[3] @// y1 * cos3(part of b1) 1538 vmull.s16 q14,d8,d1[1] @// y1 * sin3(part of b2) 1539 vmull.s16 q15,d8,d1[3] @// y1 * sin1(part of b3) 1540 1541 vmlal.s16 q12,d9,d0[3] @// y1 * cos1 + y3 * cos3(part of b0) 1542 vmlal.s16 q13,d9,d2[1] @// y1 * cos3 - y3 * sin1(part of b1) 1543 vmlal.s16 q14,d9,d3[3] @// y1 * sin3 - y3 * cos1(part of b2) 1544 vmlal.s16 q15,d9,d5[1] @// y1 * sin1 - y3 * sin3(part of b3) 1545 1546 1547 1548 vmull.s16 q10,d10,d0[0] 1549 vmlal.s16 q10,d11,d0[2] 1550 1551 1552 vmull.s16 q11,d10,d0[0] 1553 vmlal.s16 q11,d11,d1[2] 1554 1555 vmull.s16 q8,d10,d0[0] 1556 vmlal.s16 q8,d11,d2[2] 1557 1558 vmull.s16 q9,d10,d0[0] 1559 vmlal.s16 q9,d11,d3[2] 1560 cmp r12,r11 1561 bhs stage2_shift1 1562 1563 vld1.16 {d12,d13},[r1]! 1564 vld1.16 {d14,d15},[r1],r10 1565 1566 1567 1568 1569 1570 1571 vmlal.s16 q12,d14,d1[1] 1572 vmlal.s16 q13,d14,d3[3] 1573 vmlal.s16 q14,d14,d6[1] 1574 vmlsl.s16 q15,d14,d7[1] 1575 1576 1577 vmlal.s16 q12,d15,d1[3] 1578 vmlal.s16 q13,d15,d5[1] 1579 vmlsl.s16 q14,d15,d7[1] 1580 vmlsl.s16 q15,d15,d3[3] 1581 1582 1583 vmlal.s16 q10,d12,d1[0] 1584 vmlal.s16 q10,d13,d1[2] 1585 vmlal.s16 q11,d12,d3[0] 1586 vmlal.s16 q11,d13,d4[2] 1587 vmlal.s16 q8,d12,d5[0] 1588 vmlal.s16 q8,d13,d7[2] 1589 vmlal.s16 q9,d12,d7[0] 1590 vmlsl.s16 q9,d13,d5[2] 1591 cmp r12,r5 1592 bhs stage2_shift1 1593 1594 vld1.16 {d10,d11},[r1]! 1595 vld1.16 {d8,d9},[r1],r10 1596 1597 vmlal.s16 q12,d8,d2[1] @// y1 * cos1(part of b0) 1598 vmlal.s16 q13,d8,d6[3] @// y1 * cos3(part of b1) 1599 vmlsl.s16 q14,d8,d4[3] @// y1 * sin3(part of b2) 1600 vmlsl.s16 q15,d8,d0[1] @// y1 * sin1(part of b3) 1601 1602 vmlal.s16 q12,d9,d2[3] @// y1 * cos1 + y3 * cos3(part of b0) 1603 vmlsl.s16 q13,d9,d7[3] @// y1 * cos3 - y3 * sin1(part of b1) 1604 vmlsl.s16 q14,d9,d2[1] @// y1 * sin3 - y3 * cos1(part of b2) 1605 vmlsl.s16 q15,d9,d3[1] @// y1 * sin1 - y3 * sin3(part of b3) 1606 1607 1608 1609 1610 1611 vmlal.s16 q10,d10,d2[0] 1612 vmlal.s16 q10,d11,d2[2] 1613 1614 1615 vmlal.s16 q11,d10,d6[0] 1616 vmlal.s16 q11,d11,d7[2] 1617 1618 vmlsl.s16 q8,d10,d6[0] 1619 vmlsl.s16 q8,d11,d3[2] 1620 1621 vmlsl.s16 q9,d10,d2[0] 1622 vmlsl.s16 q9,d11,d1[2] 1623 1624 cmp r12,r6 1625 bhs stage2_shift1 1626 1627 1628 vld1.16 {d12,d13},[r1]! 1629 vld1.16 {d14,d15},[r1],r10 1630 1631 1632 1633 1634 1635 vmlal.s16 q12,d14,d3[1] 1636 vmlsl.s16 q13,d14,d6[1] 1637 vmlsl.s16 q14,d14,d0[1] 1638 vmlsl.s16 q15,d14,d6[3] 1639 1640 1641 vmlal.s16 q12,d15,d3[3] 1642 vmlsl.s16 q13,d15,d4[3] 1643 vmlsl.s16 q14,d15,d2[3] 1644 vmlal.s16 q15,d15,d5[3] 1645 1646 1647 vmlal.s16 q10,d12,d3[0] 1648 vmlal.s16 q10,d13,d3[2] 1649 vmlsl.s16 q11,d12,d7[0] 1650 vmlsl.s16 q11,d13,d5[2] 1651 vmlsl.s16 q8,d12,d1[0] 1652 vmlsl.s16 q8,d13,d1[2] 1653 vmlsl.s16 q9,d12,d5[0] 1654 vmlal.s16 q9,d13,d7[2] 1655 1656 cmp r12,r9 1657 bhs stage2_shift1 1658 1659 1660 vld1.16 {d10,d11},[r1]! 1661 vld1.16 {d8,d9},[r1],r10 1662 1663 1664 vmlal.s16 q12,d8,d4[1] @// y1 * cos1(part of b0) 1665 vmlsl.s16 q13,d8,d3[1] @// y1 * cos3(part of b1) 1666 vmlsl.s16 q14,d8,d5[1] @// y1 * sin3(part of b2) 1667 vmlal.s16 q15,d8,d2[1] @// y1 * sin1(part of b3) 1668 1669 vmlal.s16 q12,d9,d4[3] @// y1 * cos1 + y3 * cos3(part of b0) 1670 vmlsl.s16 q13,d9,d1[3] @// y1 * cos3 - y3 * sin1(part of b1) 1671 vmlsl.s16 q14,d9,d7[3] @// y1 * sin3 - y3 * cos1(part of b2) 1672 vmlal.s16 q15,d9,d1[1] @// y1 * sin1 - y3 * sin3(part of b3) 1673 1674 1675 1676 1677 1678 vmlal.s16 q10,d10,d0[0] 1679 vmlal.s16 q10,d11,d4[2] 1680 1681 1682 vmlsl.s16 q11,d10,d0[0] 1683 vmlsl.s16 q11,d11,d2[2] 1684 1685 vmlsl.s16 q8,d10,d0[0] 1686 vmlsl.s16 q8,d11,d6[2] 1687 1688 vmlal.s16 q9,d10,d0[0] 1689 vmlal.s16 q9,d11,d0[2] 1690 1691 vld1.16 {d12,d13},[r1]! 1692 vld1.16 {d14,d15},[r1],r10 1693 1694 1695 1696 1697 1698 vmlal.s16 q12,d14,d5[1] 1699 vmlsl.s16 q13,d14,d0[2] 1700 vmlal.s16 q14,d14,d5[3] 1701 vmlal.s16 q15,d14,d4[3] 1702 1703 1704 vmlal.s16 q12,d15,d5[3] 1705 vmlsl.s16 q13,d15,d1[1] 1706 vmlal.s16 q14,d15,d3[1] 1707 vmlsl.s16 q15,d15,d7[3] 1708 1709 1710 vmlal.s16 q10,d12,d5[0] 1711 vmlal.s16 q10,d13,d5[2] 1712 vmlsl.s16 q11,d12,d1[0] 1713 vmlsl.s16 q11,d13,d0[2] 1714 vmlal.s16 q8,d12,d7[0] 1715 vmlal.s16 q8,d13,d4[2] 1716 vmlal.s16 q9,d12,d3[0] 1717 vmlal.s16 q9,d13,d6[2] 1718 1719 1720 vld1.16 {d10,d11},[r1]! 1721 vld1.16 {d8,d9},[r1],r10 1722 1723 1724 1725 1726 vmlal.s16 q12,d8,d6[1] @// y1 * cos1(part of b0) 1727 vmlsl.s16 q13,d8,d2[3] @// y1 * cos3(part of b1) 1728 vmlal.s16 q14,d8,d0[1] @// y1 * sin3(part of b2) 1729 vmlsl.s16 q15,d8,d4[1] @// y1 * sin1(part of b3) 1730 1731 vmlal.s16 q12,d9,d6[3] @// y1 * cos1 + y3 * cos3(part of b0) 1732 vmlsl.s16 q13,d9,d4[1] @// y1 * cos3 - y3 * sin1(part of b1) 1733 vmlal.s16 q14,d9,d1[3] @// y1 * sin3 - y3 * cos1(part of b2) 1734 vmlsl.s16 q15,d9,d0[1] @// y1 * sin1 - y3 * sin3(part of b3) 1735 1736 1737 1738 1739 1740 vmlal.s16 q10,d10,d6[0] 1741 vmlal.s16 q10,d11,d6[2] 1742 1743 1744 vmlsl.s16 q11,d10,d2[0] 1745 vmlsl.s16 q11,d11,d3[2] 1746 1747 vmlal.s16 q8,d10,d2[0] 1748 vmlal.s16 q8,d11,d0[2] 1749 1750 vmlsl.s16 q9,d10,d6[0] 1751 vmlsl.s16 q9,d11,d2[2] 1752 1753 vld1.16 {d12,d13},[r1]! 1754 vld1.16 {d14,d15},[r1],r10 1755 1756 vmlal.s16 q12,d14,d7[1] 1757 vmlsl.s16 q13,d14,d5[3] 1758 vmlal.s16 q14,d14,d4[1] 1759 vmlsl.s16 q15,d14,d2[3] 1760 1761 1762 vmlal.s16 q12,d15,d7[3] 1763 vmlsl.s16 q13,d15,d7[1] 1764 vmlal.s16 q14,d15,d6[3] 1765 vmlsl.s16 q15,d15,d6[1] 1766 1767 1768 vmlal.s16 q10,d12,d7[0] 1769 vmlal.s16 q10,d13,d7[2] 1770 vmlsl.s16 q11,d12,d5[0] 1771 vmlsl.s16 q11,d13,d6[2] 1772 vmlal.s16 q8,d12,d3[0] 1773 vmlal.s16 q8,d13,d5[2] 1774 vmlsl.s16 q9,d12,d1[0] 1775 vmlsl.s16 q9,d13,d4[2] 1776 1777 stage2_shift1: 1778 vadd.s32 q4,q10,q12 1779 vsub.s32 q5,q10,q12 1780 1781 vadd.s32 q6,q11,q13 1782 vsub.s32 q12,q11,q13 1783 1784 vadd.s32 q7,q8,q14 1785 vsub.s32 q13,q8,q14 1786 1787 1788 vadd.s32 q8,q9,q15 1789 vsub.s32 q14,q9,q15 1790 1791 1792 vqrshrn.s32 d30,q4,#shift_stage2_idct @// r0 = (a0 + b0 + rnd) >> 7(shift_stage2_idct) 1793 vqrshrn.s32 d19,q5,#shift_stage2_idct @// r7 = (a0 - b0 + rnd) >> 7(shift_stage2_idct) 1794 vqrshrn.s32 d31,q7,#shift_stage2_idct @// r2 = (a2 + b2 + rnd) >> 7(shift_stage2_idct) 1795 vqrshrn.s32 d18,q13,#shift_stage2_idct @// r5 = (a2 - b2 + rnd) >> 7(shift_stage2_idct) 1796 vqrshrn.s32 d12,q6,#shift_stage2_idct @// r1 = (a1 + b1 + rnd) >> 7(shift_stage2_idct) 1797 vqrshrn.s32 d15,q12,#shift_stage2_idct @// r6 = (a1 - b1 + rnd) >> 7(shift_stage2_idct) 1798 vqrshrn.s32 d13,q8,#shift_stage2_idct @// r3 = (a3 + b3 + rnd) >> 7(shift_stage2_idct) 1799 vqrshrn.s32 d14,q14,#shift_stage2_idct @// r4 = (a3 - b3 + rnd) >> 7(shift_stage2_idct) 1800 1801 1802 vtrn.16 q15,q6 1803 vtrn.16 q7,q9 1804 1805 vtrn.32 d30,d31 1806 vtrn.32 d12,d13 1807 vtrn.32 d14,d15 1808 vtrn.32 d18,d19 1809 1810 1811 vst1.16 {q15},[r0]! 1812 vst1.16 {q6},[r0]! 1813 vst1.16 {q7},[r0]! 1814 vst1.16 {q9},[r0]! 1815 1816 1817 mov r1,r4 1818 1819 1820 1821 1822 1823 1824 vld1.16 {d10,d11},[r1]! 1825 vld1.16 {d8,d9},[r1],r10 1826 1827 1828 vmull.s16 q12,d8,d2[1] @// y1 * cos1(part of b0) 1829 vmull.s16 q13,d8,d2[3] @// y1 * cos3(part of b1) 1830 vmull.s16 q14,d8,d3[1] @// y1 * sin3(part of b2) 1831 vmull.s16 q15,d8,d3[3] @// y1 * sin1(part of b3) 1832 1833 vmlal.s16 q12,d9,d6[3] @// y1 * cos1 + y3 * cos3(part of b0) 1834 vmlsl.s16 q13,d9,d7[3] @// y1 * cos3 - y3 * sin1(part of b1) 1835 vmlsl.s16 q14,d9,d6[1] @// y1 * sin3 - y3 * cos1(part of b2) 1836 vmlsl.s16 q15,d9,d4[3] @// y1 * sin1 - y3 * sin3(part of b3) 1837 1838 1839 1840 1841 1842 vmull.s16 q10,d10,d0[0] 1843 vmlal.s16 q10,d11,d4[2] 1844 1845 1846 vmull.s16 q11,d10,d0[0] 1847 vmlal.s16 q11,d11,d5[2] 1848 1849 vmull.s16 q8,d10,d0[0] 1850 vmlal.s16 q8,d11,d6[2] 1851 1852 vmull.s16 q9,d10,d0[0] 1853 vmlal.s16 q9,d11,d7[2] 1854 1855 cmp r12,r11 1856 bhs stage2_shift2 1857 1858 vld1.16 {d12,d13},[r1]! 1859 vld1.16 {d14,d15},[r1],r10 1860 1861 1862 vmlsl.s16 q12,d14,d4[3] 1863 vmlsl.s16 q13,d14,d2[1] 1864 vmlsl.s16 q14,d14,d0[1] 1865 vmlsl.s16 q15,d14,d2[3] 1866 1867 1868 vmlsl.s16 q12,d15,d0[3] 1869 vmlsl.s16 q13,d15,d3[1] 1870 vmlsl.s16 q14,d15,d6[3] 1871 vmlal.s16 q15,d15,d5[3] 1872 1873 1874 vmlsl.s16 q10,d12,d7[0] 1875 vmlsl.s16 q10,d13,d2[2] 1876 vmlsl.s16 q11,d12,d5[0] 1877 vmlsl.s16 q11,d13,d0[2] 1878 vmlsl.s16 q8,d12,d3[0] 1879 vmlsl.s16 q8,d13,d3[2] 1880 vmlsl.s16 q9,d12,d1[0] 1881 vmlsl.s16 q9,d13,d6[2] 1882 1883 cmp r12,r5 1884 bhs stage2_shift2 1885 1886 vld1.16 {d10,d11},[r1]! 1887 vld1.16 {d8,d9},[r1],r10 1888 1889 1890 1891 1892 1893 vmlsl.s16 q12,d8,d4[1] @// y1 * cos1(part of b0) 1894 vmlal.s16 q13,d8,d7[1] @// y1 * cos3(part of b1) 1895 vmlal.s16 q14,d8,d2[3] @// y1 * sin3(part of b2) 1896 vmlal.s16 q15,d8,d1[3] @// y1 * sin1(part of b3) 1897 1898 vmlal.s16 q12,d9,d7[1] @// y1 * cos1 + y3 * cos3(part of b0) 1899 vmlal.s16 q13,d9,d1[3] @// y1 * cos3 - y3 * sin1(part of b1) 1900 vmlal.s16 q14,d9,d3[3] @// y1 * sin3 - y3 * cos1(part of b2) 1901 vmlsl.s16 q15,d9,d6[3] @// y1 * sin1 - y3 * sin3(part of b3) 1902 1903 1904 1905 1906 1907 vmlsl.s16 q10,d10,d2[0] 1908 vmlsl.s16 q10,d11,d6[2] 1909 1910 1911 vmlsl.s16 q11,d10,d6[0] 1912 vmlal.s16 q11,d11,d4[2] 1913 1914 vmlal.s16 q8,d10,d6[0] 1915 vmlal.s16 q8,d11,d0[2] 1916 1917 vmlal.s16 q9,d10,d2[0] 1918 vmlal.s16 q9,d11,d5[2] 1919 1920 cmp r12,r6 1921 bhs stage2_shift2 1922 1923 1924 vld1.16 {d12,d13},[r1]! 1925 vld1.16 {d14,d15},[r1],r10 1926 1927 1928 1929 1930 1931 1932 vmlal.s16 q12,d14,d2[3] 1933 vmlal.s16 q13,d14,d3[3] 1934 vmlsl.s16 q14,d14,d5[3] 1935 vmlsl.s16 q15,d14,d0[3] 1936 1937 1938 vmlal.s16 q12,d15,d1[3] 1939 vmlsl.s16 q13,d15,d6[3] 1940 vmlsl.s16 q14,d15,d0[3] 1941 vmlal.s16 q15,d15,d7[3] 1942 1943 1944 vmlal.s16 q10,d12,d5[0] 1945 vmlal.s16 q10,d13,d0[2] 1946 vmlal.s16 q11,d12,d1[0] 1947 vmlal.s16 q11,d13,d6[2] 1948 vmlal.s16 q8,d12,d7[0] 1949 vmlsl.s16 q8,d13,d2[2] 1950 vmlsl.s16 q9,d12,d3[0] 1951 vmlsl.s16 q9,d13,d4[2] 1952 1953 cmp r12,r9 1954 bhs stage2_shift2 1955 1956 1957 vld1.16 {d10,d11},[r1]! 1958 vld1.16 {d8,d9},[r1],r10 1959 1960 1961 1962 vmlal.s16 q12,d8,d6[1] @// y1 * cos1(part of b0) 1963 vmlsl.s16 q13,d8,d1[1] @// y1 * cos3(part of b1) 1964 vmlsl.s16 q14,d8,d7[1] @// y1 * sin3(part of b2) 1965 vmlal.s16 q15,d8,d0[3] @// y1 * sin1(part of b3) 1966 1967 vmlsl.s16 q12,d9,d5[1] @// y1 * cos1 + y3 * cos3(part of b0) 1968 vmlsl.s16 q13,d9,d4[1] @// y1 * cos3 - y3 * sin1(part of b1) 1969 vmlal.s16 q14,d9,d2[1] @// y1 * sin3 - y3 * cos1(part of b2) 1970 vmlal.s16 q15,d9,d7[1] @// y1 * sin1 - y3 * sin3(part of b3) 1971 1972 1973 1974 1975 1976 vmlal.s16 q10,d10,d0[0] 1977 vmlsl.s16 q10,d11,d7[2] 1978 1979 1980 vmlsl.s16 q11,d10,d0[0] 1981 vmlsl.s16 q11,d11,d1[2] 1982 1983 vmlsl.s16 q8,d10,d0[0] 1984 vmlal.s16 q8,d11,d5[2] 1985 1986 vmlal.s16 q9,d10,d0[0] 1987 vmlal.s16 q9,d11,d3[2] 1988 1989 vld1.16 {d12,d13},[r1]! 1990 vld1.16 {d14,d15},[r1],r10 1991 1992 1993 1994 1995 vmlsl.s16 q12,d14,d0[1] 1996 vmlal.s16 q13,d14,d6[1] 1997 vmlal.s16 q14,d14,d4[1] 1998 vmlsl.s16 q15,d14,d1[1] 1999 2000 2001 vmlsl.s16 q12,d15,d3[3] 2002 vmlal.s16 q13,d15,d0[1] 2003 vmlsl.s16 q14,d15,d5[1] 2004 vmlsl.s16 q15,d15,d6[1] 2005 2006 2007 vmlsl.s16 q10,d12,d3[0] 2008 vmlsl.s16 q10,d13,d1[2] 2009 vmlsl.s16 q11,d12,d7[0] 2010 vmlal.s16 q11,d13,d3[2] 2011 vmlal.s16 q8,d12,d1[0] 2012 vmlal.s16 q8,d13,d7[2] 2013 vmlsl.s16 q9,d12,d5[0] 2014 vmlsl.s16 q9,d13,d2[2] 2015 2016 2017 vld1.16 {d10,d11},[r1]! 2018 vld1.16 {d8,d9},[r1],r10 2019 2020 2021 vmlal.s16 q12,d8,d7[3] @// y1 * cos1(part of b0) 2022 vmlal.s16 q13,d8,d4[3] @// y1 * cos3(part of b1) 2023 vmlsl.s16 q14,d8,d1[1] @// y1 * sin3(part of b2) 2024 vmlal.s16 q15,d8,d2[1] @// y1 * sin1(part of b3) 2025 2026 vmlal.s16 q12,d9,d3[1] @// y1 * cos1 + y3 * cos3(part of b0) 2027 vmlsl.s16 q13,d9,d5[3] @// y1 * cos3 - y3 * sin1(part of b1) 2028 vmlsl.s16 q14,d9,d7[3] @// y1 * sin3 - y3 * cos1(part of b2) 2029 vmlal.s16 q15,d9,d5[1] @// y1 * sin1 - y3 * sin3(part of b3) 2030 2031 2032 2033 2034 2035 vmlsl.s16 q10,d10,d6[0] 2036 vmlal.s16 q10,d11,d5[2] 2037 2038 2039 vmlal.s16 q11,d10,d2[0] 2040 vmlal.s16 q11,d11,d7[2] 2041 2042 vmlsl.s16 q8,d10,d2[0] 2043 vmlsl.s16 q8,d11,d4[2] 2044 2045 vmlal.s16 q9,d10,d6[0] 2046 vmlal.s16 q9,d11,d1[2] 2047 2048 2049 vld1.16 {d12,d13},[r1]! 2050 vld1.16 {d14,d15},[r1],r10 2051 2052 2053 2054 vmlal.s16 q12,d14,d1[1] 2055 vmlsl.s16 q13,d14,d0[3] 2056 vmlal.s16 q14,d14,d1[3] 2057 vmlsl.s16 q15,d14,d3[1] 2058 2059 2060 vmlal.s16 q12,d15,d5[3] 2061 vmlsl.s16 q13,d15,d5[1] 2062 vmlal.s16 q14,d15,d4[3] 2063 vmlsl.s16 q15,d15,d4[1] 2064 2065 2066 vmlal.s16 q10,d12,d1[0] 2067 vmlal.s16 q10,d13,d3[2] 2068 vmlsl.s16 q11,d12,d3[0] 2069 vmlsl.s16 q11,d13,d2[2] 2070 vmlal.s16 q8,d12,d5[0] 2071 vmlal.s16 q8,d13,d1[2] 2072 vmlsl.s16 q9,d12,d7[0] 2073 vmlsl.s16 q9,d13,d0[2] 2074 2075 stage2_shift2: 2076 vadd.s32 q4,q10,q12 2077 vsub.s32 q5,q10,q12 2078 2079 vadd.s32 q6,q11,q13 2080 vsub.s32 q12,q11,q13 2081 2082 vadd.s32 q7,q8,q14 2083 vsub.s32 q13,q8,q14 2084 2085 2086 vadd.s32 q8,q9,q15 2087 vsub.s32 q14,q9,q15 2088 2089 2090 vqrshrn.s32 d30,q4,#shift_stage2_idct @// r0 = (a0 + b0 + rnd) >> 7(shift_stage2_idct) 2091 vqrshrn.s32 d19,q5,#shift_stage2_idct @// r7 = (a0 - b0 + rnd) >> 7(shift_stage2_idct) 2092 vqrshrn.s32 d31,q7,#shift_stage2_idct @// r2 = (a2 + b2 + rnd) >> 7(shift_stage2_idct) 2093 vqrshrn.s32 d18,q13,#shift_stage2_idct @// r5 = (a2 - b2 + rnd) >> 7(shift_stage2_idct) 2094 vqrshrn.s32 d12,q6,#shift_stage2_idct @// r1 = (a1 + b1 + rnd) >> 7(shift_stage2_idct) 2095 vqrshrn.s32 d15,q12,#shift_stage2_idct @// r6 = (a1 - b1 + rnd) >> 7(shift_stage2_idct) 2096 vqrshrn.s32 d13,q8,#shift_stage2_idct @// r3 = (a3 + b3 + rnd) >> 7(shift_stage2_idct) 2097 vqrshrn.s32 d14,q14,#shift_stage2_idct @// r4 = (a3 - b3 + rnd) >> 7(shift_stage2_idct) 2098 2099 vtrn.16 q15,q6 2100 vtrn.16 q7,q9 2101 2102 vtrn.32 d30,d31 2103 vtrn.32 d12,d13 2104 vtrn.32 d14,d15 2105 vtrn.32 d18,d19 2106 2107 2108 vst1.16 {q15},[r0]! 2109 vst1.16 {q6},[r0]! 2110 vst1.16 {q7},[r0]! 2111 vst1.16 {q9},[r0]! 2112 2113 2114 2115 mov r1,r4 2116 2117 2118 2119 2120 vld1.16 {d10,d11},[r1]! 2121 vld1.16 {d8,d9},[r1],r10 2122 2123 vmull.s16 q12,d8,d4[1] @// y1 * cos1(part of b0) 2124 vmull.s16 q13,d8,d4[3] @// y1 * cos3(part of b1) 2125 vmull.s16 q14,d8,d5[1] @// y1 * sin3(part of b2) 2126 vmull.s16 q15,d8,d5[3] @// y1 * sin1(part of b3) 2127 2128 vmlsl.s16 q12,d9,d3[1] @// y1 * cos1 + y3 * cos3(part of b0) 2129 vmlsl.s16 q13,d9,d1[3] @// y1 * cos3 - y3 * sin1(part of b1) 2130 vmlsl.s16 q14,d9,d0[2] @// y1 * sin3 - y3 * cos1(part of b2) 2131 vmlsl.s16 q15,d9,d1[1] @// y1 * sin1 - y3 * sin3(part of b3) 2132 2133 2134 2135 2136 2137 vmull.s16 q10,d10,d0[0] 2138 vmlsl.s16 q10,d11,d7[2] 2139 2140 2141 vmull.s16 q11,d10,d0[0] 2142 vmlsl.s16 q11,d11,d6[2] 2143 2144 vmull.s16 q8,d10,d0[0] 2145 vmlsl.s16 q8,d11,d5[2] 2146 2147 vmull.s16 q9,d10,d0[0] 2148 vmlsl.s16 q9,d11,d4[2] 2149 2150 cmp r12,r11 2151 bhs stage2_shift3 2152 2153 vld1.16 {d12,d13},[r1]! 2154 vld1.16 {d14,d15},[r1],r10 2155 2156 vmlsl.s16 q12,d14,d5[1] 2157 vmlsl.s16 q13,d14,d7[3] 2158 vmlal.s16 q14,d14,d5[3] 2159 vmlal.s16 q15,d14,d3[1] 2160 2161 2162 vmlal.s16 q12,d15,d2[1] 2163 vmlal.s16 q13,d15,d1[1] 2164 vmlal.s16 q14,d15,d4[3] 2165 vmlsl.s16 q15,d15,d7[3] 2166 2167 2168 vmlsl.s16 q10,d12,d1[0] 2169 vmlal.s16 q10,d13,d6[2] 2170 vmlsl.s16 q11,d12,d3[0] 2171 vmlal.s16 q11,d13,d3[2] 2172 vmlsl.s16 q8,d12,d5[0] 2173 vmlal.s16 q8,d13,d0[2] 2174 vmlsl.s16 q9,d12,d7[0] 2175 vmlal.s16 q9,d13,d2[2] 2176 2177 cmp r12,r5 2178 bhs stage2_shift3 2179 2180 vld1.16 {d10,d11},[r1]! 2181 vld1.16 {d8,d9},[r1],r10 2182 2183 2184 2185 vmlal.s16 q12,d8,d6[1] @// y1 * cos1(part of b0) 2186 vmlsl.s16 q13,d8,d5[1] @// y1 * cos3(part of b1) 2187 vmlsl.s16 q14,d8,d0[3] @// y1 * sin3(part of b2) 2188 vmlsl.s16 q15,d8,d3[3] @// y1 * sin1(part of b3) 2189 2190 vmlsl.s16 q12,d9,d1[1] @// y1 * cos1 + y3 * cos3(part of b0) 2191 vmlsl.s16 q13,d9,d4[1] @// y1 * cos3 - y3 * sin1(part of b1) 2192 vmlal.s16 q14,d9,d6[1] @// y1 * sin3 - y3 * cos1(part of b2) 2193 vmlal.s16 q15,d9,d0[1] @// y1 * sin1 - y3 * sin3(part of b3) 2194 2195 2196 2197 2198 2199 vmlal.s16 q10,d10,d2[0] 2200 vmlsl.s16 q10,d11,d5[2] 2201 2202 2203 vmlal.s16 q11,d10,d6[0] 2204 vmlsl.s16 q11,d11,d0[2] 2205 2206 vmlsl.s16 q8,d10,d6[0] 2207 vmlsl.s16 q8,d11,d4[2] 2208 2209 vmlsl.s16 q9,d10,d2[0] 2210 vmlal.s16 q9,d11,d6[2] 2211 2212 cmp r12,r6 2213 bhs stage2_shift3 2214 2215 vld1.16 {d12,d13},[r1]! 2216 vld1.16 {d14,d15},[r1],r10 2217 2218 2219 2220 2221 2222 vmlsl.s16 q12,d14,d7[1] 2223 vmlal.s16 q13,d14,d2[1] 2224 vmlal.s16 q14,d14,d4[1] 2225 vmlsl.s16 q15,d14,d5[1] 2226 2227 2228 vmlal.s16 q12,d15,d0[3] 2229 vmlal.s16 q13,d15,d7[1] 2230 vmlsl.s16 q14,d15,d1[1] 2231 vmlsl.s16 q15,d15,d6[1] 2232 2233 2234 vmlsl.s16 q10,d12,d3[0] 2235 vmlal.s16 q10,d13,d4[2] 2236 vmlal.s16 q11,d12,d7[0] 2237 vmlal.s16 q11,d13,d2[2] 2238 vmlal.s16 q8,d12,d1[0] 2239 vmlsl.s16 q8,d13,d6[2] 2240 vmlal.s16 q9,d12,d5[0] 2241 vmlsl.s16 q9,d13,d0[2] 2242 2243 cmp r12,r9 2244 bhs stage2_shift3 2245 2246 2247 vld1.16 {d10,d11},[r1]! 2248 vld1.16 {d8,d9},[r1],r10 2249 2250 2251 vmlsl.s16 q12,d8,d7[3] @// y1 * cos1(part of b0) 2252 vmlsl.s16 q13,d8,d0[1] @// y1 * cos3(part of b1) 2253 vmlal.s16 q14,d8,d6[3] @// y1 * sin3(part of b2) 2254 vmlal.s16 q15,d8,d1[3] @// y1 * sin1(part of b3) 2255 2256 vmlsl.s16 q12,d9,d0[1] @// y1 * cos1 + y3 * cos3(part of b0) 2257 vmlal.s16 q13,d9,d5[3] @// y1 * cos3 - y3 * sin1(part of b1) 2258 vmlal.s16 q14,d9,d3[3] @// y1 * sin3 - y3 * cos1(part of b2) 2259 vmlsl.s16 q15,d9,d2[3] @// y1 * sin1 - y3 * sin3(part of b3) 2260 2261 2262 2263 2264 2265 vmlal.s16 q10,d10,d0[0] 2266 vmlsl.s16 q10,d11,d3[2] 2267 2268 2269 vmlsl.s16 q11,d10,d0[0] 2270 vmlsl.s16 q11,d11,d5[2] 2271 2272 vmlsl.s16 q8,d10,d0[0] 2273 vmlal.s16 q8,d11,d1[2] 2274 2275 vmlal.s16 q9,d10,d0[0] 2276 vmlal.s16 q9,d11,d7[2] 2277 2278 vld1.16 {d12,d13},[r1]! 2279 vld1.16 {d14,d15},[r1],r10 2280 2281 2282 2283 2284 vmlal.s16 q12,d14,d6[3] 2285 vmlal.s16 q13,d14,d3[3] 2286 vmlsl.s16 q14,d14,d1[3] 2287 vmlal.s16 q15,d14,d7[1] 2288 2289 2290 vmlal.s16 q12,d15,d1[3] 2291 vmlsl.s16 q13,d15,d2[3] 2292 vmlal.s16 q14,d15,d7[1] 2293 vmlal.s16 q15,d15,d4[1] 2294 2295 2296 vmlsl.s16 q10,d12,d5[0] 2297 vmlal.s16 q10,d13,d2[2] 2298 vmlal.s16 q11,d12,d1[0] 2299 vmlsl.s16 q11,d13,d7[2] 2300 vmlsl.s16 q8,d12,d7[0] 2301 vmlsl.s16 q8,d13,d3[2] 2302 vmlsl.s16 q9,d12,d3[0] 2303 vmlal.s16 q9,d13,d1[2] 2304 2305 2306 vld1.16 {d10,d11},[r1]! 2307 vld1.16 {d8,d9},[r1],r10 2308 2309 2310 vmlsl.s16 q12,d8,d5[3] @// y1 * cos1(part of b0) 2311 vmlsl.s16 q13,d8,d6[3] @// y1 * cos3(part of b1) 2312 vmlal.s16 q14,d8,d3[1] @// y1 * sin3(part of b2) 2313 vmlsl.s16 q15,d8,d0[1] @// y1 * sin1(part of b3) 2314 2315 vmlsl.s16 q12,d9,d2[3] @// y1 * cos1 + y3 * cos3(part of b0) 2316 vmlal.s16 q13,d9,d0[1] @// y1 * cos3 - y3 * sin1(part of b1) 2317 vmlsl.s16 q14,d9,d2[1] @// y1 * sin3 - y3 * cos1(part of b2) 2318 vmlal.s16 q15,d9,d4[3] @// y1 * sin1 - y3 * sin3(part of b3) 2319 2320 2321 2322 2323 2324 vmlal.s16 q10,d10,d6[0] 2325 vmlsl.s16 q10,d11,d1[2] 2326 2327 2328 vmlsl.s16 q11,d10,d2[0] 2329 vmlal.s16 q11,d11,d4[2] 2330 2331 vmlal.s16 q8,d10,d2[0] 2332 vmlsl.s16 q8,d11,d7[2] 2333 2334 vmlsl.s16 q9,d10,d6[0] 2335 vmlsl.s16 q9,d11,d5[2] 2336 2337 vld1.16 {d12,d13},[r1]! 2338 vld1.16 {d14,d15},[r1],r10 2339 2340 2341 2342 vmlal.s16 q12,d14,d4[3] 2343 vmlsl.s16 q13,d14,d6[1] 2344 vmlal.s16 q14,d14,d7[3] 2345 vmlal.s16 q15,d14,d6[3] 2346 2347 2348 vmlal.s16 q12,d15,d3[3] 2349 vmlsl.s16 q13,d15,d3[1] 2350 vmlal.s16 q14,d15,d2[3] 2351 vmlsl.s16 q15,d15,d2[1] 2352 2353 2354 vmlsl.s16 q10,d12,d7[0] 2355 vmlal.s16 q10,d13,d0[2] 2356 vmlal.s16 q11,d12,d5[0] 2357 vmlsl.s16 q11,d13,d1[2] 2358 vmlsl.s16 q8,d12,d3[0] 2359 vmlal.s16 q8,d13,d2[2] 2360 vmlal.s16 q9,d12,d1[0] 2361 vmlsl.s16 q9,d13,d3[2] 2362 2363 stage2_shift3: 2364 vadd.s32 q4,q10,q12 2365 vsub.s32 q5,q10,q12 2366 2367 vadd.s32 q6,q11,q13 2368 vsub.s32 q12,q11,q13 2369 2370 vadd.s32 q7,q8,q14 2371 vsub.s32 q13,q8,q14 2372 2373 2374 vadd.s32 q8,q9,q15 2375 vsub.s32 q14,q9,q15 2376 2377 2378 vqrshrn.s32 d30,q4,#shift_stage2_idct @// r0 = (a0 + b0 + rnd) >> 7(shift_stage2_idct) 2379 vqrshrn.s32 d19,q5,#shift_stage2_idct @// r11 = (a0 - b0 + rnd) >> 7(shift_stage2_idct) 2380 vqrshrn.s32 d31,q7,#shift_stage2_idct @// r2 = (a2 + b2 + rnd) >> 7(shift_stage2_idct) 2381 vqrshrn.s32 d18,q13,#shift_stage2_idct @// r5 = (a2 - b2 + rnd) >> 7(shift_stage2_idct) 2382 vqrshrn.s32 d12,q6,#shift_stage2_idct @// r1 = (a1 + b1 + rnd) >> 7(shift_stage2_idct) 2383 vqrshrn.s32 d15,q12,#shift_stage2_idct @// r6 = (a1 - b1 + rnd) >> 7(shift_stage2_idct) 2384 vqrshrn.s32 d13,q8,#shift_stage2_idct @// r3 = (a3 + b3 + rnd) >> 7(shift_stage2_idct) 2385 vqrshrn.s32 d14,q14,#shift_stage2_idct @// r4 = (a3 - b3 + rnd) >> 7(shift_stage2_idct) 2386 2387 vtrn.16 q15,q6 2388 vtrn.16 q7,q9 2389 2390 vtrn.32 d30,d31 2391 vtrn.32 d12,d13 2392 vtrn.32 d14,d15 2393 vtrn.32 d18,d19 2394 2395 2396 vst1.16 {q15},[r0]! 2397 vst1.16 {q6},[r0]! 2398 vst1.16 {q7},[r0]! 2399 vst1.16 {q9},[r0]! 2400 2401 2402 2403 2404 mov r1,r4 2405 2406 2407 2408 2409 vld1.16 {d10,d11},[r1]! 2410 vld1.16 {d8,d9},[r1],r10 2411 2412 2413 vmull.s16 q12,d8,d6[1] @// y1 * cos1(part of b0) 2414 vmull.s16 q13,d8,d6[3] @// y1 * cos3(part of b1) 2415 vmull.s16 q14,d8,d7[1] @// y1 * sin3(part of b2) 2416 vmull.s16 q15,d8,d7[3] @// y1 * sin1(part of b3) 2417 2418 vmlsl.s16 q12,d9,d2[3] @// y1 * cos1 + y3 * cos3(part of b0) 2419 vmlsl.s16 q13,d9,d4[1] @// y1 * cos3 - y3 * sin1(part of b1) 2420 vmlsl.s16 q14,d9,d5[3] @// y1 * sin3 - y3 * cos1(part of b2) 2421 vmlsl.s16 q15,d9,d7[1] @// y1 * sin1 - y3 * sin3(part of b3) 2422 2423 2424 2425 2426 2427 vmull.s16 q10,d10,d0[0] 2428 vmlsl.s16 q10,d11,d3[2] 2429 2430 2431 vmull.s16 q11,d10,d0[0] 2432 vmlsl.s16 q11,d11,d2[2] 2433 2434 vmull.s16 q8,d10,d0[0] 2435 vmlsl.s16 q8,d11,d1[2] 2436 2437 vmull.s16 q9,d10,d0[0] 2438 vmlsl.s16 q9,d11,d0[2] 2439 2440 cmp r12,r11 2441 bhs stage2_shift4 2442 vld1.16 {d12,d13},[r1]! 2443 vld1.16 {d14,d15},[r1],r10 2444 2445 2446 2447 2448 2449 2450 vmlal.s16 q12,d14,d0[1] 2451 vmlal.s16 q13,d14,d1[3] 2452 vmlal.s16 q14,d14,d4[1] 2453 vmlal.s16 q15,d14,d6[3] 2454 2455 2456 vmlsl.s16 q12,d15,d4[1] 2457 vmlsl.s16 q13,d15,d0[3] 2458 vmlsl.s16 q14,d15,d2[3] 2459 vmlsl.s16 q15,d15,d6[1] 2460 2461 2462 vmlal.s16 q10,d12,d7[0] 2463 vmlal.s16 q10,d13,d5[2] 2464 vmlal.s16 q11,d12,d5[0] 2465 vmlsl.s16 q11,d13,d7[2] 2466 vmlal.s16 q8,d12,d3[0] 2467 vmlsl.s16 q8,d13,d4[2] 2468 vmlal.s16 q9,d12,d1[0] 2469 vmlsl.s16 q9,d13,d1[2] 2470 2471 cmp r12,r5 2472 bhs stage2_shift4 2473 2474 vld1.16 {d10,d11},[r1]! 2475 vld1.16 {d8,d9},[r1],r10 2476 2477 2478 2479 vmlal.s16 q12,d8,d7[3] @// y1 * cos1(part of b0) 2480 vmlal.s16 q13,d8,d3[1] @// y1 * cos3(part of b1) 2481 vmlal.s16 q14,d8,d1[1] @// y1 * sin3(part of b2) 2482 vmlal.s16 q15,d8,d5[3] @// y1 * sin1(part of b3) 2483 2484 vmlal.s16 q12,d9,d4[3] @// y1 * cos1 + y3 * cos3(part of b0) 2485 vmlsl.s16 q13,d9,d5[3] @// y1 * cos3 - y3 * sin1(part of b1) 2486 vmlsl.s16 q14,d9,d0[1] @// y1 * sin3 - y3 * cos1(part of b2) 2487 vmlsl.s16 q15,d9,d5[1] @// y1 * sin1 - y3 * sin3(part of b3) 2488 2489 2490 2491 2492 2493 vmlsl.s16 q10,d10,d2[0] 2494 vmlal.s16 q10,d11,d1[2] 2495 2496 2497 vmlsl.s16 q11,d10,d6[0] 2498 vmlal.s16 q11,d11,d3[2] 2499 2500 vmlal.s16 q8,d10,d6[0] 2501 vmlsl.s16 q8,d11,d7[2] 2502 2503 vmlal.s16 q9,d10,d2[0] 2504 vmlsl.s16 q9,d11,d2[2] 2505 2506 cmp r12,r6 2507 bhs stage2_shift4 2508 2509 2510 vld1.16 {d12,d13},[r1]! 2511 vld1.16 {d14,d15},[r1],r10 2512 2513 2514 2515 2516 2517 2518 vmlsl.s16 q12,d14,d1[1] 2519 vmlsl.s16 q13,d14,d7[3] 2520 vmlal.s16 q14,d14,d1[3] 2521 vmlal.s16 q15,d14,d4[3] 2522 2523 2524 vmlal.s16 q12,d15,d2[1] 2525 vmlal.s16 q13,d15,d5[1] 2526 vmlsl.s16 q14,d15,d3[1] 2527 vmlsl.s16 q15,d15,d4[1] 2528 2529 2530 vmlsl.s16 q10,d12,d5[0] 2531 vmlsl.s16 q10,d13,d7[2] 2532 vmlsl.s16 q11,d12,d1[0] 2533 vmlal.s16 q11,d13,d1[2] 2534 vmlsl.s16 q8,d12,d7[0] 2535 vmlal.s16 q8,d13,d5[2] 2536 vmlal.s16 q9,d12,d3[0] 2537 vmlsl.s16 q9,d13,d3[2] 2538 2539 cmp r12,r9 2540 bhs stage2_shift4 2541 2542 2543 vld1.16 {d10,d11},[r1]! 2544 vld1.16 {d8,d9},[r1],r10 2545 2546 2547 vmlsl.s16 q12,d8,d5[3] @// y1 * cos1(part of b0) 2548 vmlsl.s16 q13,d8,d2[3] @// y1 * cos3(part of b1) 2549 vmlal.s16 q14,d8,d4[3] @// y1 * sin3(part of b2) 2550 vmlal.s16 q15,d8,d3[3] @// y1 * sin1(part of b3) 2551 2552 vmlsl.s16 q12,d9,d6[3] @// y1 * cos1 + y3 * cos3(part of b0) 2553 vmlal.s16 q13,d9,d0[3] @// y1 * cos3 - y3 * sin1(part of b1) 2554 vmlsl.s16 q14,d9,d6[1] @// y1 * sin3 - y3 * cos1(part of b2) 2555 vmlsl.s16 q15,d9,d3[1] @// y1 * sin1 - y3 * sin3(part of b3) 2556 2557 2558 2559 2560 2561 vmlal.s16 q10,d10,d0[0] 2562 vmlsl.s16 q10,d11,d0[2] 2563 2564 2565 vmlsl.s16 q11,d10,d0[0] 2566 vmlal.s16 q11,d11,d6[2] 2567 2568 vmlsl.s16 q8,d10,d0[0] 2569 vmlal.s16 q8,d11,d2[2] 2570 2571 vmlal.s16 q9,d10,d0[0] 2572 vmlsl.s16 q9,d11,d4[2] 2573 2574 vld1.16 {d12,d13},[r1]! 2575 vld1.16 {d14,d15},[r1],r10 2576 2577 2578 2579 2580 vmlal.s16 q12,d14,d3[1] 2581 vmlsl.s16 q13,d14,d2[1] 2582 vmlal.s16 q14,d14,d7[3] 2583 vmlal.s16 q15,d14,d2[3] 2584 2585 2586 vmlsl.s16 q12,d15,d0[3] 2587 vmlal.s16 q13,d15,d4[3] 2588 vmlal.s16 q14,d15,d6[3] 2589 vmlsl.s16 q15,d15,d2[1] 2590 2591 2592 vmlal.s16 q10,d12,d3[0] 2593 vmlsl.s16 q10,d13,d6[2] 2594 vmlal.s16 q11,d12,d7[0] 2595 vmlsl.s16 q11,d13,d4[2] 2596 vmlsl.s16 q8,d12,d1[0] 2597 vmlal.s16 q8,d13,d0[2] 2598 vmlal.s16 q9,d12,d5[0] 2599 vmlsl.s16 q9,d13,d5[2] 2600 2601 2602 vld1.16 {d10,d11},[r1]! 2603 vld1.16 {d8,d9},[r1],r10 2604 2605 2606 2607 2608 vmlal.s16 q12,d8,d3[3] @// y1 * cos1(part of b0) 2609 vmlsl.s16 q13,d8,d7[1] @// y1 * cos3(part of b1) 2610 vmlsl.s16 q14,d8,d5[1] @// y1 * sin3(part of b2) 2611 vmlal.s16 q15,d8,d1[3] @// y1 * sin1(part of b3) 2612 2613 vmlsl.s16 q12,d9,d7[1] @// y1 * cos1 + y3 * cos3(part of b0) 2614 vmlsl.s16 q13,d9,d6[1] @// y1 * cos3 - y3 * sin1(part of b1) 2615 vmlal.s16 q14,d9,d3[3] @// y1 * sin3 - y3 * cos1(part of b2) 2616 vmlsl.s16 q15,d9,d1[1] @// y1 * sin1 - y3 * sin3(part of b3) 2617 2618 2619 2620 2621 2622 vmlsl.s16 q10,d10,d6[0] 2623 vmlal.s16 q10,d11,d2[2] 2624 2625 2626 vmlal.s16 q11,d10,d2[0] 2627 vmlsl.s16 q11,d11,d0[2] 2628 2629 vmlsl.s16 q8,d10,d2[0] 2630 vmlal.s16 q8,d11,d3[2] 2631 2632 vmlal.s16 q9,d10,d6[0] 2633 vmlsl.s16 q9,d11,d6[2] 2634 2635 2636 vld1.16 {d12,d13},[r1]! 2637 vld1.16 {d14,d15},[r1],r10 2638 2639 2640 2641 vmlsl.s16 q12,d14,d5[1] 2642 vmlal.s16 q13,d14,d3[3] 2643 vmlsl.s16 q14,d14,d2[1] 2644 vmlal.s16 q15,d14,d0[3] 2645 2646 2647 vmlal.s16 q12,d15,d1[3] 2648 vmlsl.s16 q13,d15,d1[1] 2649 vmlal.s16 q14,d15,d0[3] 2650 vmlsl.s16 q15,d15,d0[1] 2651 2652 2653 vmlsl.s16 q10,d12,d1[0] 2654 vmlal.s16 q10,d13,d4[2] 2655 vmlal.s16 q11,d12,d3[0] 2656 vmlsl.s16 q11,d13,d5[2] 2657 vmlsl.s16 q8,d12,d5[0] 2658 vmlal.s16 q8,d13,d6[2] 2659 vmlal.s16 q9,d12,d7[0] 2660 vmlsl.s16 q9,d13,d7[2] 2661 2662 stage2_shift4: 2663 vadd.s32 q4,q10,q12 2664 vsub.s32 q5,q10,q12 2665 2666 vadd.s32 q6,q11,q13 2667 vsub.s32 q12,q11,q13 2668 2669 vadd.s32 q7,q8,q14 2670 vsub.s32 q13,q8,q14 2671 2672 2673 vadd.s32 q8,q9,q15 2674 vsub.s32 q14,q9,q15 2675 2676 2677 vqrshrn.s32 d30,q4,#shift_stage2_idct @// r0 = (a0 + b0 + rnd) >> 7(shift_stage2_idct) 2678 vqrshrn.s32 d19,q5,#shift_stage2_idct @// r11 = (a0 - b0 + rnd) >> 7(shift_stage2_idct) 2679 vqrshrn.s32 d31,q7,#shift_stage2_idct @// r2 = (a2 + b2 + rnd) >> 7(shift_stage2_idct) 2680 vqrshrn.s32 d18,q13,#shift_stage2_idct @// r5 = (a2 - b2 + rnd) >> 7(shift_stage2_idct) 2681 vqrshrn.s32 d12,q6,#shift_stage2_idct @// r1 = (a1 + b1 + rnd) >> 7(shift_stage2_idct) 2682 vqrshrn.s32 d15,q12,#shift_stage2_idct @// r6 = (a1 - b1 + rnd) >> 7(shift_stage2_idct) 2683 vqrshrn.s32 d13,q8,#shift_stage2_idct @// r3 = (a3 + b3 + rnd) >> 7(shift_stage2_idct) 2684 vqrshrn.s32 d14,q14,#shift_stage2_idct @// r4 = (a3 - b3 + rnd) >> 7(shift_stage2_idct) 2685 2686 2687 2688 vtrn.16 q15,q6 2689 vtrn.16 q7,q9 2690 2691 vtrn.32 d30,d31 2692 vtrn.32 d12,d13 2693 vtrn.32 d14,d15 2694 vtrn.32 d18,d19 2695 2696 2697 2698 vst1.16 {q15},[r0]! 2699 vst1.16 {q6},[r0]! 2700 vst1.16 {q7},[r0]! 2701 vst1.16 {q9},[r0]! 2702 2703 2704 2705 2706 sub r0,r0,#256 2707 prediction_buffer: 2708 2709 2710 vld1.16 {d12,d13},[r0]! 2711 vld1.16 {d14,d15},[r0]! 2712 2713 add r0,r0,#32 2714 2715 vld1.16 {d16,d17},[r0]! 2716 vld1.16 {d18,d19},[r0]! 2717 add r0,r0,#32 2718 2719 vld1.16 {d20,d21},[r0]! 2720 vld1.16 {d22,d23},[r0]! 2721 2722 2723 add r0,r0,#32 2724 2725 vld1.16 {d24,d25},[r0]! 2726 vld1.16 {d26,d27},[r0]! 2727 2728 2729 2730 2731 2732 @ d12 =r0 1- 4 values 2733 @ d13 =r2 1- 4 values 2734 @ d14=r1 1- 4 values 2735 @ d15=r3 1- 4 values 2736 2737 @ d16 =r0 5- 8 values 2738 @ d17 =r2 5- 8 values 2739 @ d18=r1 5- 8 values 2740 @ d19=r3 5- 8 values 2741 2742 @ d20 =r0 9- 12 values 2743 @ d21 =r2 9- 12 values 2744 @ d22=r1 9- 12 values 2745 @ d23=r3 9- 12 values 2746 2747 @ d24 =r0 13-16 values 2748 @ d25 =r2 13- 16 values 2749 @ d26=r1 13- 16 values 2750 @ d27=r3 13- 16 values 2751 2752 vswp d13,d16 2753 vswp d21,d24 2754 vswp d15,d18 2755 vswp d23,d26 2756 2757 2758 vld1.8 {d8,d9},[r2],r8 2759 vld1.8 {d10,d11},[r2],r8 2760 vld1.8 {d28,d29},[r2],r8 2761 vld1.8 {d30,d31},[r2],r8 2762 2763 2764 vaddw.u8 q6,q6,d8 2765 vaddw.u8 q10,q10,d9 2766 vaddw.u8 q7,q7,d10 2767 vaddw.u8 q11,q11,d11 2768 vaddw.u8 q8,q8,d28 2769 vaddw.u8 q12,q12,d29 2770 vaddw.u8 q9,q9,d30 2771 vaddw.u8 q13,q13,d31 2772 sub r2,r2,r8,lsl #2 2773 add r2,r2,#16 2774 vqmovun.s16 d12,q6 2775 vqmovun.s16 d13,q10 2776 vqmovun.s16 d20,q7 2777 vqmovun.s16 d21,q11 2778 vqmovun.s16 d14,q8 2779 vqmovun.s16 d15,q12 2780 vqmovun.s16 d22,q9 2781 vqmovun.s16 d23,q13 2782 2783 2784 vst1.8 {d12,d13},[r3],r7 2785 vst1.8 {d20,d21},[r3],r7 2786 vst1.8 {d14,d15},[r3],r7 2787 vst1.8 {d22,d23},[r3],r7 2788 2789 2790 sub r3,r3,r7,lsl #2 2791 add r3,r3,#16 2792 2793 vld1.16 {d12,d13},[r0]! 2794 vld1.16 {d14,d15},[r0]! 2795 2796 sub r0,r0,#96 2797 2798 vld1.16 {d16,d17},[r0]! 2799 vld1.16 {d18,d19},[r0]! 2800 sub r0,r0,#96 2801 2802 vld1.16 {d20,d21},[r0]! 2803 vld1.16 {d22,d23},[r0]! 2804 2805 2806 sub r0,r0,#96 2807 2808 vld1.16 {d24,d25},[r0]! 2809 vld1.16 {d26,d27},[r0]! 2810 2811 2812 sub r0,r0,#64 2813 2814 2815 2816 2817 vswp d13,d16 2818 vswp d21,d24 2819 vswp d15,d18 2820 vswp d23,d26 2821 2822 2823 vld1.8 {d8,d9},[r2],r8 2824 vld1.8 {d10,d11},[r2],r8 2825 vld1.8 {d28,d29},[r2],r8 2826 vld1.8 {d30,d31},[r2],r8 2827 2828 2829 vaddw.u8 q6,q6,d8 2830 vaddw.u8 q10,q10,d9 2831 vaddw.u8 q7,q7,d10 2832 vaddw.u8 q11,q11,d11 2833 vaddw.u8 q8,q8,d28 2834 vaddw.u8 q12,q12,d29 2835 vaddw.u8 q9,q9,d30 2836 vaddw.u8 q13,q13,d31 2837 sub r2,r2,#16 2838 2839 vqmovun.s16 d12,q6 2840 vqmovun.s16 d13,q10 2841 vqmovun.s16 d20,q7 2842 vqmovun.s16 d21,q11 2843 vqmovun.s16 d14,q8 2844 vqmovun.s16 d15,q12 2845 vqmovun.s16 d22,q9 2846 vqmovun.s16 d23,q13 2847 2848 2849 vst1.8 {d12,d13},[r3],r7 2850 vst1.8 {d20,d21},[r3],r7 2851 vst1.8 {d14,d15},[r3],r7 2852 vst1.8 {d22,d23},[r3],r7 2853 2854 sub r3,r3,#16 2855 2856 subs r14,r14,#1 2857 bne dct_stage2 2858 ldmfd sp!,{r0-r12,pc} 2859 2860 2861 2862 2863 2864