1 @/****************************************************************************** 2 @ * 3 @ * Copyright (C) 2018 The Android Open Source Project 4 @ * 5 @ * Licensed under the Apache License, Version 2.0 (the "License"); 6 @ * you may not use this file except in compliance with the License. 7 @ * You may obtain a copy of the License at: 8 @ * 9 @ * http://www.apache.org/licenses/LICENSE-2.0 10 @ * 11 @ * Unless required by applicable law or agreed to in writing, software 12 @ * distributed under the License is distributed on an "AS IS" BASIS, 13 @ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 @ * See the License for the specific language governing permissions and 15 @ * limitations under the License. 16 @ * 17 @ ***************************************************************************** 18 @ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19 @*/ 20 21 22 .text 23 .p2align 2 24 25 .global ixheaacd_sbr_imdct_using_fft 26 ixheaacd_sbr_imdct_using_fft: 27 28 STMFD sp!, {r4-r12, lr} 29 VPUSH {D8 - D15} 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 LDR r5, [sp, #0x68] 48 LDR r6, [sp, #0x68+4] 49 LDR r7, [sp, #0x68+8] 50 51 52 53 54 55 56 COND_6: CMP r1, #0x10 57 BNE COND_7 58 MOV r8, #1 59 MOV r4, r7 60 B RADIX_4_FIRST_START 61 62 COND_7: CMP r1, #0x20 63 64 MOV r8, #1 65 MOV r4, r7 66 67 68 69 70 71 72 73 74 75 RADIX_8_FIRST_START: 76 77 78 LSR r9 , r1, #5 79 LSL r1, r1, #1 80 81 RADIX_8_FIRST_LOOP: 82 83 MOV r5 , r2 84 MOV r6 , r2 85 MOV r7 , r2 86 MOV r11 , r2 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 LDRB r12, [r4, #0] 111 ADD r5, r5, r12, LSL #3 112 VLD2.32 {d0[0], d2[0]}, [r5] , r1 113 ADD r5, r5, r1 114 VLD2.32 {d8[0], d10[0]}, [r5] , r1 115 SUB r5, r5, r1, LSL #1 116 VLD2.32 {d4[0], d6[0]}, [r5] , r1 117 ADD r5, r5, r1 118 VLD2.32 {d12[0], d14[0]}, [r5], r1 119 SUB r5, r5, r1, LSL #2 120 121 LDRB r12, [r4, #1] 122 ADD r6, r6, r12, LSL #3 123 VLD2.32 {d0[1], d2[1]}, [r6] , r1 124 ADD r6, r6, r1 125 VLD2.32 {d8[1], d10[1]}, [r6] , r1 126 SUB r6, r6, r1, LSL #1 127 VLD2.32 {d4[1], d6[1]}, [r6] , r1 128 ADD r6, r6, r1 129 VLD2.32 {d12[1], d14[1]}, [r6], r1 130 SUB r6, r6, r1, LSL #2 131 132 133 LDRB r12, [r4, #2] 134 ADD r7, r7, r12 , LSL #3 135 VLD2.32 {d1[0], d3[0]}, [r7] , r1 136 ADD r7, r7, r1 137 VLD2.32 {d9[0], d11[0]}, [r7] , r1 138 SUB r7, r7, r1, LSL #1 139 140 LDRB r12, [r4, #3] 141 ADD r11, r11, r12 , LSL #3 142 VLD2.32 {d1[1], d3[1]}, [r11] , r1 143 ADD r11, r11, r1 144 VLD2.32 {d9[1], d11[1]}, [r11] , r1 145 SUB r11, r11, r1, LSL #1 146 147 148 149 VADD.I32 q8, q0, q4 150 VLD2.32 {d5[0], d7[0]}, [r7] , r1 151 ADD r7, r7, r1 152 153 VSUB.I32 q9, q0, q4 154 VLD2.32 {d13[0], d15[0]}, [r7], r1 155 SUB r7, r7, r1, LSL #2 156 157 158 159 160 VADD.I32 q0, q1, q5 161 VLD2.32 {d5[1], d7[1]}, [r11] , r1 162 ADD r11, r11, r1 163 164 VSUB.I32 q4, q1, q5 165 VLD2.32 {d13[1], d15[1]}, [r11], r1 166 SUB r11, r11, r1, LSL #2 167 168 169 170 ADD r4, r4, #4 171 172 ADD r5, r5, r1, LSR #1 173 ADD r6, r6, r1, LSR #1 174 ADD r7, r7, r1, LSR #1 175 ADD r11, r11, r1, LSR #1 176 177 178 VADD.I32 q1, q2, q6 179 VLD2.32 {d28[0], d30[0]}, [r5] , r1 180 181 182 VSUB.I32 q5, q2, q6 183 VLD2.32 {d20[0], d22[0]}, [r5] , r1 184 185 186 VADD.I32 q2, q3, q7 187 VLD2.32 {d24[0], d26[0]}, [r5] , r1 188 189 190 VSUB.I32 q6, q3, q7 191 VLD2.32 {d28[1], d30[1]}, [r6] , r1 192 193 VADD.S32 q3, q9, q6 194 VLD2.32 {d20[1], d22[1]}, [r6] , r1 195 196 VSUB.S32 q7, q9, q6 197 VLD2.32 {d24[1], d26[1]}, [r6] , r1 198 199 VSUB.S32 q6, q4, q5 200 VLD2.32 {d29[0], d31[0]}, [r7] , r1 201 202 VADD.S32 q9, q4, q5 203 VLD2.32 {d21[0], d23[0]}, [r7] , r1 204 205 VADD.S32 q4, q8, q1 206 VLD2.32 {d25[0], d27[0]}, [r7] , r1 207 208 VSUB.S32 q5, q8, q1 209 VLD2.32 {d29[1], d31[1]}, [r11] , r1 210 211 VADD.S32 q8, q0, q2 212 VLD2.32 {d21[1], d23[1]}, [r11] , r1 213 214 VSUB.S32 q0, q0, q2 215 VLD2.32 {d25[1], d27[1]}, [r11] , r1 216 217 218 VPUSH {q3} 219 VPUSH {q7} 220 221 222 223 224 225 226 227 228 VLD2.32 {d2[0], d4[0]}, [r5], r1 229 230 VADD.I32 q7, q14, q12 231 232 VLD2.32 {d2[1], d4[1]}, [r6] , r1 233 234 VSUB.I32 q3, q14, q12 235 236 VLD2.32 {d3[0], d5[0]}, [r7] , r1 237 238 VADD.I32 q14, q15, q13 239 240 VLD2.32 {d3[1], d5[1]}, [r11] , r1 241 242 VSUB.I32 q12, q15, q13 243 244 245 246 247 248 249 250 251 252 VADD.I32 q15, q10, q1 253 VSUB.I32 q13, q10, q1 254 VADD.I32 q10, q11, q2 255 VSUB.I32 q1, q11, q2 256 257 258 259 VADD.S32 q11, q7, q15 260 VSUB.S32 q2, q7, q15 261 VADD.S32 q7, q14, q10 262 VSUB.S32 q15, q14, q10 263 264 VADD.S32 q14, q3, q12 265 VSUB.S32 q10, q3, q12 266 VADD.S32 q3, q13, q1 267 VSUB.S32 q12, q13, q1 268 269 VADD.S32 q1 , q14, q12 270 VSUB.S32 q13, q14, q12 271 VSUB.S32 q12, q3, q10 272 273 VUZP.16 d2, d3 274 VADD.S32 q14, q3, q10 275 276 VUZP.16 d26, d27 277 VADD.S32 q3, q4, q11 278 279 VUZP.16 d24, d25 280 VSUB.S32 q10, q4, q11 281 282 VUZP.16 d28, d29 283 VADD.S32 q4, q8, q7 284 285 MOVW r14, #0x5a82 286 287 VSUB.S32 q11, q8, q7 288 289 VADD.S32 q8, q5, q15 290 VSUB.S32 q7, q5, q15 291 VSUB.S32 q5, q0, q2 292 VADD.S32 q15, q0, q2 293 294 VPOP {q0} 295 VPOP {q2} 296 VPUSH {q3-q4} 297 VPUSH {q10} 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 VDUP.16 d20, r14 316 317 318 VMULL.u16 q4, d26, d20 319 VMULL.u16 q3, d28, d20 320 321 VPUSH {q7-q8} 322 VPUSH {q5} 323 324 VSHR.S32 q4, q4, #15 325 VSHR.S32 q3, q3, #15 326 327 VQDMLAL.S16 q4, d27, d20 328 VQDMLAL.S16 q3, d29, d20 329 330 331 VPUSH {q11} 332 333 VMULL.u16 q13, d24, d20 334 VMULL.u16 q14, d2, d20 335 336 VADD.S32 q5, q2, q4 337 VSUB.S32 q7, q2, q4 338 339 VADD.S32 q8, q6, q3 340 VSUB.S32 q6, q6, q3 341 342 343 344 345 346 347 VSHR.S32 q13, q13, #15 348 VSHR.S32 q14, q14, #15 349 350 VQDMLAL.S16 q13, d25, d20 351 VQDMLAL.S16 q14, d3, d20 352 353 VPOP {q1} 354 VPOP {q10} 355 356 VADD.S32 q2, q0, q13 357 VSUB.S32 q4, q0, q13 358 359 VADD.S32 q11, q9, q14 360 VSUB.S32 q3, q9, q14 361 362 363 364 365 VPOP {q14} 366 VPOP {q9} 367 VPOP {q0} 368 VPOP {q12, q13} 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 VTRN.32 q12, q5 399 400 VSHL.S32 q12, q12, #1 401 VTRN.32 q9, q2 402 VSHL.S32 q5, q5, #1 403 404 VSHL.S32 q9, q9, #1 405 VTRN.32 q0, q7 406 VSHL.S32 q2, q2, #1 407 408 VSHL.S32 q0, q0, #1 409 VTRN.32 q14, q4 410 VSHL.S32 q7, q7, #1 411 412 VSHL.S32 q14, q14, #1 413 VTRN.32 q13, q6 414 VSHL.S32 q4, q4, #1 415 416 VSHL.S32 q13, q13, #1 417 VTRN.32 q10, q3 418 VSHL.S32 q6, q6, #1 419 420 VSHL.S32 q10, q10, #1 421 VTRN.32 q1, q8 422 VSHL.S32 q3, q3, #1 423 424 VSHL.S32 q1, q1, #1 425 VTRN.32 q15, q11 426 VSHL.S32 q8, q8, #1 427 428 VSHL.S32 q15, q15, #1 429 VSWP d18, d25 430 431 VSHL.S32 q11, q11, #1 432 VSWP d4, d11 433 434 VSWP d1, d28 435 VSWP d15, d8 436 437 VSWP d20, d27 438 VSWP d6, d13 439 440 VSWP d30, d3 441 VSWP d22, d17 442 443 VST2.32 {q12, q13}, [r3]! 444 VST2.32 {q0, q1}, [r3]! 445 446 VST2.32 {q5, q6}, [r3]! 447 VST2.32 {q7, q8}, [r3]! 448 449 VMOV q5, q11 450 451 VST2.32 {q9, q10}, [r3]! 452 VST2.32 {q14, q15}, [r3]! 453 454 VST2.32 {q2, q3}, [r3]! 455 VST2.32 {q4, q5}, [r3]! 456 457 458 SUBS r9, r9, #1 459 BNE RADIX_8_FIRST_LOOP 460 461 LSR r1, r1, #1 462 SUB r3, r1, LSL #3 463 464 MOV r5, #8 465 MOV r4, #32 466 LSR r6, r1, #5 467 468 B RADIX_4_FIRST_ENDS 469 470 RADIX_8_FIRST_ENDS: 471 472 473 474 475 476 477 RADIX_4_FIRST_START: 478 479 480 LSR r9 , r1, #4 481 LSL r1, r1, #1 482 483 RADIX_4_LOOP: 484 485 MOV r5 , r2 486 MOV r6 , r2 487 MOV r7 , r2 488 MOV r11 , r2 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 LDRB r12, [r4, #0] 505 ADD r5, r5, r12, LSL #3 506 507 VLD2.32 {d0[0], d2[0]}, [r5] , r1 508 ADD r5, r5, r1 509 VLD2.32 {d8[0], d10[0]}, [r5] , r1 510 SUB r5, r5, r1, LSL #1 511 VLD2.32 {d4[0], d6[0]}, [r5] , r1 512 ADD r5, r5, r1 513 VLD2.32 {d12[0], d14[0]}, [r5], r1 514 515 LDRB r12, [r4, #1] 516 ADD r6, r6, r12, LSL #3 517 518 VLD2.32 {d0[1], d2[1]}, [r6] , r1 519 ADD r6, r6, r1 520 VLD2.32 {d8[1], d10[1]}, [r6] , r1 521 SUB r6, r6, r1, LSL #1 522 VLD2.32 {d4[1], d6[1]}, [r6] , r1 523 ADD r6, r6, r1 524 VLD2.32 {d12[1], d14[1]}, [r6], r1 525 526 527 LDRB r12, [r4, #2] 528 ADD r7, r7, r12, LSL #3 529 530 VLD2.32 {d1[0], d3[0]}, [r7] , r1 531 ADD r7, r7, r1 532 VLD2.32 {d9[0], d11[0]}, [r7] , r1 533 534 LDRB r12, [r4, #3] 535 ADD r11, r11, r12 , LSL #3 536 537 VLD2.32 {d1[1], d3[1]}, [r11] , r1 538 ADD r11, r11, r1 539 VLD2.32 {d9[1], d11[1]}, [r11] , r1 540 541 542 SUB r7, r7, r1, LSL #1 543 VADD.S32 q8, q0, q4 544 VLD2.32 {d5[0], d7[0]}, [r7] , r1 545 ADD r7, r7, r1 546 VADD.S32 q9, q1, q5 547 VLD2.32 {d13[0], d15[0]}, [r7], r1 548 549 550 551 SUB r11, r11, r1, LSL #1 552 VSUB.S32 q10, q0, q4 553 VLD2.32 {d5[1], d7[1]}, [r11] , r1 554 ADD r11, r11, r1 555 VSUB.S32 q11, q1, q5 556 VLD2.32 {d13[1], d15[1]}, [r11], r1 557 558 559 ADD r4, r4, #4 560 561 VADD.S32 q12, q2, q6 562 VADD.S32 q13, q3, q7 563 VSUB.S32 q14, q2, q6 564 VSUB.S32 q15, q3, q7 565 566 VADD.S32 q0, q8, q12 567 VADD.S32 q1, q9, q13 568 VSUB.S32 q2, q8, q12 569 VSUB.S32 q3, q9, q13 570 571 VADD.S32 q4, q10, q15 572 VSUB.S32 q5, q11, q14 573 VADD.S32 q7, q11, q14 574 VSUB.S32 q6, q10, q15 575 576 577 578 579 VTRN.32 q0, q4 580 581 VSHL.S32 q0, q0, #1 582 VTRN.32 q2, q6 583 VSHL.S32 q4, q4, #1 584 585 VSHL.S32 q2, q2, #1 586 VTRN.32 q1, q5 587 VSHL.S32 q6, q6, #1 588 589 VSHL.S32 q1, q1, #1 590 VTRN.32 q3, q7 591 VSHL.S32 q5, q5, #1 592 593 VSHL.S32 q3, q3, #1 594 VSWP d4, d1 595 596 VSHL.S32 q7, q7, #1 597 VSWP d12, d9 598 599 600 601 VSWP d6, d3 602 VSWP d14, d11 603 604 605 VST2.32 {q0, q1}, [r3]! 606 VST2.32 {q4, q5}, [r3]! 607 608 VST2.32 {q2, q3}, [r3]! 609 VST2.32 {q6, q7}, [r3]! 610 611 612 613 SUBS r9, r9, #1 614 BNE RADIX_4_LOOP 615 616 LSR r1, r1, #1 617 SUB r3, r1, LSL #3 618 MOV r5, #4 619 MOV r4, #64 620 LSR r6, r1, #4 621 622 623 RADIX_4_FIRST_ENDS: 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 PUSH {r3} 647 648 LSR r5, r5, #2 649 650 OUTER_LOOP_R4: 651 652 LDR r14, [sp] 653 654 655 MOV r7, r5 656 MOV r2, #0 657 MOV r9, r0 658 LSL r12 , r5, #5 659 MIDDLE_LOOP_R4: 660 661 662 VLD2.16 {d0[0], d1[0]}, [r9], r2 663 VLD2.16 {d2[0], d3[0]}, [r9], r2 664 ADD r11, r2, r4, LSL #2 665 VLD2.16 {d4[0], d5[0]}, [r9] 666 ADD r10, r0, r11 667 668 669 VLD2.16 {d0[1], d1[1]}, [r10], r11 670 VLD2.16 {d2[1], d3[1]}, [r10], r11 671 ADD r2, r11, r4, LSL #2 672 VLD2.16 {d4[1], d5[1]}, [r10] 673 ADD r9, r0, r2 674 675 676 VLD2.16 {d0[2], d1[2]}, [r9], r2 677 VLD2.16 {d2[2], d3[2]}, [r9], r2 678 ADD r11, r2, r4, LSL #2 679 VLD2.16 {d4[2], d5[2]}, [r9] 680 ADD r10, r0, r11 681 682 683 684 VLD2.16 {d0[3], d1[3]}, [r10], r11 685 VLD2.16 {d2[3], d3[3]}, [r10], r11 686 ADD r2, r11, r4, LSL #2 687 VLD2.16 {d4[3], d5[3]}, [r10] 688 ADD r9, r0, r2 689 690 MOV r10, r6 691 692 693 694 INNER_LOOP_R4: 695 696 VLD2.32 {q3, q4}, [r14], r12 697 698 VSHR.S32 q3, q3, #1 699 VLD4.16 {q5, q6}, [r14], r12 700 VSHR.S32 q4, q4, #1 701 702 VSHR.U16 d10, d10, #1 703 VLD4.16 {q7, q8}, [r14], r12 704 VSHR.U16 d12, d12, #1 705 706 VMULL.S16 q11, d10, d0 707 VMLSL.S16 q11, d12, d1 708 VLD4.16 {q9, q10}, [r14], r12 709 VMULL.S16 q12, d10, d1 710 VMLAL.S16 q12, d12, d0 711 712 VSHR.U16 d14, d14, #1 713 VSHR.U16 d16, d16, #1 714 715 SUB r14, r14, r12, LSL #2 716 717 VSHR.U16 d18, d18, #1 718 VSHR.U16 d20, d20, #1 719 720 VMULL.S16 q13, d14, d2 721 VMLSL.S16 q13, d16, d3 722 723 VSHR.S32 q11, q11, #15 724 725 VMULL.S16 q14, d14, d3 726 VMLAL.S16 q14, d16, d2 727 728 VMULL.S16 q15, d18, d4 729 VMLSL.S16 q15, d20, d5 730 731 VMLAL.S16 q11, d11, d0 732 VMLSL.S16 q11, d13, d1 733 734 VSHR.S32 q12, q12, #15 735 VSHR.S32 q13, q13, #15 736 VSHR.S32 q14, q14, #15 737 VSHR.S32 q15, q15, #15 738 739 740 VMLAL.S16 q12, d11, d1 741 VMLAL.S16 q12, d13, d0 742 743 744 VMULL.S16 q5, d18, d5 745 VMLAL.S16 q5, d20, d4 746 747 748 VMLAL.S16 q13, d15, d2 749 VMLSL.S16 q13, d17, d3 750 751 VMLAL.S16 q14, d15, d3 752 VMLAL.S16 q14, d17, d2 753 754 755 VMLAL.S16 q15, d19, d4 756 VMLSL.S16 q15, d21, d5 757 758 VSHR.S32 q5, q5, #15 759 760 VMLAL.S16 q5, d19, d5 761 VMLAL.S16 q5, d21, d4 762 763 764 765 CMP r7, r5 766 BNE BYPASS_IF 767 768 ADD r14, r14, r12 769 770 LDR r3, [r14], r12 771 ASR r3, r3, #1 772 VMOV.S32 d22[0], r3 773 774 LDR r3, [r14], r12 775 ASR r3, r3, #1 776 VMOV.S32 d26[0], r3 777 778 LDR r3, [r14] 779 ASR r3, r3, #1 780 VMOV.S32 d30[0], r3 781 782 SUB r14, r14, r12, LSL #1 783 ADD r14, r14, #4 784 785 LDR r3, [r14], r12 786 ASR r3, r3, #1 787 VMOV.S32 d24[0], r3 788 789 LDR r3, [r14], r12 790 ASR r3, r3, #1 791 VMOV.S32 d28[0], r3 792 793 LDR r3, [r14], r12 794 ASR r3, r3, #1 795 VMOV.S32 d10[0], r3 796 797 SUB r14, r14, #4 798 799 SUB r14, r14, r12, LSL #2 800 801 BYPASS_IF: 802 803 VADD.S32 q6, q3, q13 804 VADD.S32 q7, q4, q14 805 VSUB.S32 q3, q3, q13 806 VSUB.S32 q4, q4, q14 807 VADD.S32 q8, q11, q15 808 VADD.S32 q9, q12, q5 809 810 VSUB.S32 q15, q11, q15 811 VSUB.S32 q14, q12, q5 812 813 814 VADD.S32 q10, q6, q8 815 VADD.S32 q11, q7, q9 816 VADD.S32 q12, q3, q14 817 VSUB.S32 q13, q4, q15 818 819 VSUB.S32 q6, q6, q8 820 VST2.32 {q10, q11}, [r14], r12 821 VSUB.S32 q7, q7, q9 822 823 VSUB.S32 q8, q3, q14 824 VST2.32 {q12, q13}, [r14], r12 825 VADD.S32 q9, q4, q15 826 827 828 VST2.32 {q6, q7}, [r14], r12 829 VST2.32 {q8, q9}, [r14], r12 830 831 832 833 834 SUBS r10, r10, #1 835 BNE INNER_LOOP_R4 836 837 SUB r14, r14, r1, LSL #3 838 ADD r14, r14, #32 839 840 SUBS r7, r7, #1 841 BNE MIDDLE_LOOP_R4 842 843 844 845 846 LSR r4, r4, #2 847 LSL r5, r5, #2 848 LSR r6, r6, #2 849 SUBS r8, r8, #1 850 BNE OUTER_LOOP_R4 851 END_LOOPS: 852 POP {r3} 853 VPOP {D8 - D15} 854 LDMFD sp!, {r4-r12, pc} 855 856