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