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