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 .extern ixheaacd_radix4bfly 25.hidden ixheaacd_radix4bfly 26 .extern ixheaacd_postradixcompute2 27.hidden ixheaacd_postradixcompute2 28 .extern ixheaacd_sbr_imdct_using_fft 29.hidden ixheaacd_sbr_imdct_using_fft 30 31 .global ixheaacd_dec_DCT2_64_asm 32 .type ixheaacd_dec_DCT2_64_asm, %function 33 34ixheaacd_dec_DCT2_64_asm: 35 36 STMFD sp!, {r0-r3, r4-r12, r14} 37 ADD R2, R1, #252 38 MOV R3, #32 39 MOV R4, #-4 40 41 ADD R2, R2, #4 42 43 44FOR_LOOP: 45 46 VLD2.32 {Q0, Q1}, [R0]! 47 SUBS R3, R3, #4 48 49 VST1.32 {Q0}, [R1]! 50 SUB R2, R2, #16 51 52 VREV64.32 Q1, Q1 53 VSWP D2, D3 54 VST1.32 {Q1}, [R2] 55 BGT FOR_LOOP 56 57 LDR r0, [sp, #8] 58 MOV r1, #32 59 LDR r2, [sp, #4] 60 LDR r3, [sp] 61 62 LDR r4, [sp, #12] 63 STR r4, [sp, #-4]! 64 STR r4, [sp, #-4]! 65 STR r4, [sp, #-4]! 66 STR r4, [sp, #-4]! 67 68 BL ixheaacd_sbr_imdct_using_fft 69 70 ADD sp, sp, #16 71 72 LDR r0, [sp] 73 74 75 LDR r2, [sp, #56] 76 77 VPUSH {D8 - D15} 78 ADD R5, R0, #252 79 VLD1.32 D0, [R0] 80 ADD R3, R2, #2 81 VSHL.S32 D0, D0, #1 82 VST1.32 D0, [R0]! 83 SUB R5, R5, #28 84 85 86 VLD2.32 {Q0, Q1}, [R0]! 87 88 VLD2.32 {Q2, Q3}, [R5]! 89 VREV64.32 Q2, Q2 90 VSWP D4, D5 91 MOV R10, #-8 92 VREV64.32 Q3, Q3 93 ADD R4, R2, #30 94 VSWP D6, D7 95 SUB R4, R4, #6 96 VLD1.16 D8, [R3]! 97 VSUB.I32 Q11, Q3, Q1 98 VLD1.16 D10, [R4], R10 99 VADD.I32 Q10, Q3, Q1 100 VREV64.16 D10, D10 101 VSUB.I32 Q9, Q0, Q2 102 VUZP.16 D20, D21 103 VADD.I32 Q8, Q0, Q2 104 VUZP.16 D18, D19 105 VMULL.U16 Q15, D20, D8 106 VMLSL.U16 Q15, D18, D10 107 VMULL.U16 Q14, D18, D8 108 VMLAL.U16 Q14, D20, D10 109 SUB R11, R0, #32 110 VSHR.S32 Q15, Q15, #16 111 VSHR.U32 Q14, Q14, #16 112 SUB R12, R5, #32 113 VMLAL.S16 Q15, D21, D8 114 VMLSL.S16 Q15, D19, D10 115 116 VLD2.32 {Q0, Q1}, [R0]! 117 SUB R5, R5, #64 118 VMLAL.S16 Q14, D19, D8 119 VLD2.32 {Q2, Q3}, [R5]! 120 VMLAL.S16 Q14, D21, D10 121 VREV64.32 Q2, Q2 122 VSHL.S32 Q15, Q15, #1 123 VSWP D4, D5 124 VSHL.S32 Q14, Q14, #1 125 126 VREV64.32 Q3, Q3 127 VADD.I32 Q13, Q8, Q15 128 VSWP D6, D7 129 VADD.I32 Q12, Q11, Q14 130 131 132 VLD1.16 D8, [R3]! 133 VSUB.I32 Q7, Q14, Q11 134 VLD1.16 D10, [R4], R10 135 136 VSUB.I32 Q6, Q8, Q15 137 VREV64.32 Q7, Q7 138 VREV64.32 Q6, Q6 139 VSWP D14, D15 140 VSWP D12, D13 141 VREV64.16 D10, D10 142 143 144 VSUB.I32 Q11, Q3, Q1 145 VSWP Q13, Q12 146 VADD.I32 Q10, Q3, Q1 147 VST2.32 {Q12, Q13}, [R11]! 148 VSUB.I32 Q9, Q0, Q2 149 150 VADD.I32 Q8, Q0, Q2 151 VST2.32 {Q6, Q7}, [R12] 152 SUB R11, R0, #32 153 154 VUZP.16 D20, D21 155 SUB R12, R5, #32 156 157 VUZP.16 D18, D19 158 SUB R5, R5, #64 159 160 VMULL.U16 Q15, D20, D8 161 VLD2.32 {Q0, Q1}, [R0]! 162 VMLSL.U16 Q15, D18, D10 163 VLD2.32 {Q2, Q3}, [R5]! 164 VMULL.U16 Q14, D18, D8 165 VREV64.32 Q2, Q2 166 VMLAL.U16 Q14, D20, D10 167 VSWP D4, D5 168 VSHR.S32 Q15, Q15, #16 169 VREV64.32 Q3, Q3 170 VMLAL.S16 Q15, D21, D8 171 VMLSL.S16 Q15, D19, D10 172 VSWP D6, D7 173 VSHR.U32 Q14, Q14, #16 174 VMLAL.S16 Q14, D19, D8 175 VLD1.16 D8, [R3]! 176 VMLAL.S16 Q14, D21, D10 177 VSHL.S32 Q15, Q15, #1 178 VLD1.16 D10, [R4], R10 179 180 VSHL.S32 Q14, Q14, #1 181 VREV64.16 D10, D10 182 VADD.I32 Q13, Q8, Q15 183 VADD.I32 Q12, Q11, Q14 184 185 186 VSUB.I32 Q7, Q14, Q11 187 VSUB.I32 Q6, Q8, Q15 188 VREV64.32 Q7, Q7 189 VSUB.I32 Q11, Q3, Q1 190 VREV64.32 Q6, Q6 191 VADD.I32 Q10, Q3, Q1 192 VSWP D14, D15 193 VSUB.I32 Q9, Q0, Q2 194 VSWP D12, D13 195 VADD.I32 Q8, Q0, Q2 196 VSWP Q13, Q12 197 198 199 VUZP.16 D20, D21 200 VUZP.16 D18, D19 201 VMULL.U16 Q15, D20, D8 202 VMLSL.U16 Q15, D18, D10 203 VST2.32 {Q12, Q13}, [R11]! 204 VMULL.U16 Q14, D18, D8 205 VMLAL.U16 Q14, D20, D10 206 VST2.32 {Q6, Q7}, [R12] 207 208 SUB R11, R0, #32 209 VLD2.32 {Q0, Q1}, [R0]! 210 SUB R12, R5, #32 211 SUB R5, R5, #64 212 VSHR.S32 Q15, Q15, #16 213 VLD2.32 {Q2, Q3}, [R5]! 214 VMLAL.S16 Q15, D21, D8 215 VREV64.32 Q2, Q2 216 VMLSL.S16 Q15, D19, D10 217 VSWP D4, D5 218 VSHR.U32 Q14, Q14, #16 219 220 VREV64.32 Q3, Q3 221 VMLAL.S16 Q14, D19, D8 222 VSWP D6, D7 223 VMLAL.S16 Q14, D21, D10 224 VSHL.S32 Q15, Q15, #1 225 226 VLD1.16 D8, [R3]! 227 VSHL.S32 Q14, Q14, #1 228 229 VADD.I32 Q13, Q8, Q15 230 231 VLD1.16 D10, [R4], R10 232 233 VADD.I32 Q12, Q11, Q14 234 235 236 VREV64.16 D10, D10 237 VSUB.I32 Q7, Q14, Q11 238 239 240 VSUB.I32 Q6, Q8, Q15 241 VREV64.32 Q7, Q7 242 VREV64.32 Q6, Q6 243 VSWP D14, D15 244 VSWP D12, D13 245 246 VSWP Q13, Q12 247 VSUB.I32 Q11, Q3, Q1 248 VST2.32 {Q12, Q13}, [R11]! 249 VADD.I32 Q10, Q3, Q1 250 251 VST2.32 {Q6, Q7}, [R12] 252 253 SUB R11, R0, #32 254 255 VSUB.I32 Q9, Q0, Q2 256 VADD.I32 Q8, Q0, Q2 257 VUZP.16 D20, D21 258 SUB R12, R5, #32 259 VUZP.16 D18, D19 260 SUB R5, R5, #64 261 262 VMULL.U16 Q15, D20, D8 263 VMLSL.U16 Q15, D18, D10 264 VMULL.U16 Q14, D18, D8 265 VMLAL.U16 Q14, D20, D10 266 VSHR.S32 Q15, Q15, #16 267 VMLAL.S16 Q15, D21, D8 268 VMLSL.S16 Q15, D19, D10 269 270 VSHR.U32 Q14, Q14, #16 271 VMLAL.S16 Q14, D19, D8 272 VMLAL.S16 Q14, D21, D10 273 274 VSHL.S32 Q15, Q15, #1 275 VSHL.S32 Q14, Q14, #1 276 VADD.I32 Q13, Q8, Q15 277 VADD.I32 Q12, Q11, Q14 278 279 VSUB.I32 Q7, Q14, Q11 280 VSUB.I32 Q6, Q8, Q15 281 VREV64.32 Q7, Q7 282 VREV64.32 Q6, Q6 283 VSWP D14, D15 284 VSWP D12, D13 285 286 287 VSWP Q13, Q12 288 VST2.32 {Q12, Q13}, [R11]! 289 290 VST2.32 {Q6, Q7}, [R12] 291 VPOP {D8 - D15} 292 293 294 295 296 297 298 299 300 301 302 303 304 LDMFD sp!, {r0-r2, r3} 305 LDR R1, [SP, #48] 306 LDR R2, [SP, #44] 307 ADD R3, R1, #126 308 VLD1.32 D0[0], [R0, :32]! 309 SUB R4, R1, #2 310 311 ADD R5, R1, #130 312 VLD1.32 D1[0], [R0, :32]! 313 ADD R7, R2, #4 314 315 MOV R6, #0x8000 316 VDUP.32 Q15, R6 317 318 VADD.I32 D2, D0, D1 319 VSHR.S32 D2, D2, #1 320 VSHL.S32 D2, D2, #4 321 VADD.I32 Q2, Q1, Q15 322 VSHR.S32 Q2, Q2, #16 323 VSUB.I32 D6, D0, D1 324 VST1.16 D4[0], [R1]! 325 MOV R8, #28 326 327 MOV R9, #-2 328 VLD2.32 {Q0, Q1}, [R0]! 329 SUB R4, R4, #6 330 331 SUB R3, R3, #6 332 VLD2.16 {D4, D5}, [R7]! 333 334 VUZP.16 D0, D1 335 336 VUZP.16 D2, D3 337 VMULL.U16 Q14, D0, D4 338 339 VMLSL.U16 Q14, D2, D5 340 VSHR.S32 Q14, Q14, #16 341 VMLAL.S16 Q14, D1, D4 342 VMLSL.S16 Q14, D3, D5 343 344 345 VMULL.U16 Q13, D0, D5 346 VMLAL.U16 Q13, D2, D4 347 VSHR.U32 Q13, Q13, #16 348 VMLAL.S16 Q13, D1, D5 349 VMLAL.S16 Q13, D3, D4 350 351 VSHL.S32 Q12, Q14, #4 352 VLD2.32 {Q0, Q1}, [R0]! 353 VADD.I32 Q12, Q12, Q15 354 355 VSHR.S32 Q12, Q12, #16 356 VUZP.16 D24, D25 357 358 359 VSHL.S32 Q11, Q13, #4 360 VLD2.16 {D4, D5}, [R7]! 361 VADD.I32 Q11, Q11, Q15 362 363 VSHR.S32 Q11, Q11, #16 364 VUZP.16 D22, D23 365 366 367 VQNEG.S16 D20, D22 368 369 VUZP.16 D0, D1 370 VUZP.16 D2, D3 371 SUB R8, R8, #8 372 373LOOP_2: 374 375 VMULL.U16 Q14, D0, D4 376 VST1.16 D24, [R1]! 377 VMLSL.U16 Q14, D2, D5 378 379 VREV64.16 D24, D24 380 VMULL.U16 Q13, D0, D5 381 382 VMLAL.U16 Q13, D2, D4 383 VST1.16 D24, [R4] 384 SUB R4, R4, #8 385 386 VREV64.16 D22, D22 387 VSHR.S32 Q14, Q14, #16 388 VSHR.U32 Q13, Q13, #16 389 VST1.16 D22, [R3] 390 VMLAL.S16 Q14, D1, D4 391 VMLSL.S16 Q14, D3, D5 392 VST1.16 D20, [R5]! 393 VMLAL.S16 Q13, D1, D5 394 VMLAL.S16 Q13, D3, D4 395 VSHL.S32 Q12, Q14, #4 396 397 SUB R3, R3, #8 398 VLD2.32 {Q0, Q1}, [R0]! 399 VSHL.S32 Q11, Q13, #4 400 401 VADD.I32 Q12, Q12, Q15 402 VLD2.16 {D4, D5}, [R7]! 403 404 VADD.I32 Q11, Q11, Q15 405 VUZP.16 D0, D1 406 VSHR.S32 Q12, Q12, #16 407 VUZP.16 D24, D25 408 409 410 VSHR.S32 Q11, Q11, #16 411 VUZP.16 D22, D23 412 SUBS R8, R8, #4 413 414 VUZP.16 D2, D3 415 VQNEG.S16 D20, D22 416 417 BGT LOOP_2 418 419 420 VMULL.U16 Q14, D0, D4 421 VST1.16 D24, [R1]! 422 VMLSL.U16 Q14, D2, D5 423 VREV64.16 D24, D24 424 VMULL.U16 Q13, D0, D5 425 VMLAL.U16 Q13, D2, D4 426 VST1.16 D24, [R4] 427 VSHR.S32 Q14, Q14, #16 428 SUB R4, R4, #8 429 VST1.16 D20, [R5]! 430 431 VMLAL.S16 Q14, D1, D4 432 VMLSL.S16 Q14, D3, D5 433 VREV64.16 D22, D22 434 VSHR.U32 Q13, Q13, #16 435 VST1.16 D22, [R3] 436 SUB R3, R3, #8 437 VMLAL.S16 Q13, D1, D5 438 VSHL.S32 Q12, Q14, #4 439 VMLAL.S16 Q13, D3, D4 440 VADD.I32 Q12, Q12, Q15 441 442 VSHL.S32 Q11, Q13, #4 443 444 VSHR.S32 Q12, Q12, #16 445 VUZP.16 D24, D25 446 VADD.I32 Q11, Q11, Q15 447 448 VST1.16 D24, [R1]! 449 VSHR.S32 Q11, Q11, #16 450 VREV64.16 D24, D24 451 VUZP.16 D22, D23 452 453 VST1.16 D24, [R4] 454 VQNEG.S16 D20, D22 455 456 SUB R4, R4, #2 457 VREV64.16 D22, D22 458 VST1.16 D22, [R3] 459 SUB R3, R3, #2 460 461 VST1.16 D20, [R5]! 462 VLD2.32 {Q0, Q1}, [R0]! 463 464 VLD2.16 {Q2}, [R7] 465 ADD R7, R7, #12 466 VUZP.16 D0, D1 467 VUZP.16 D2, D3 468 469 VMULL.U16 Q14, D0, D4 470 VMLSL.U16 Q14, D2, D5 471 VSHR.S32 Q14, Q14, #16 472 VMLAL.S16 Q14, D1, D4 473 VMLSL.S16 Q14, D3, D5 474 475 VMULL.U16 Q13, D0, D5 476 VMLAL.U16 Q13, D2, D4 477 VSHR.U32 Q13, Q13, #16 478 VMLAL.S16 Q13, D1, D5 479 VMLAL.S16 Q13, D3, D4 480 481 VSHL.S32 Q12, Q14, #4 482 VADD.I32 Q12, Q12, Q15 483 VSHR.S32 Q12, Q12, #16 484 VUZP.16 D24, D25 485 486 VSHL.S32 Q11, Q13, #4 487 VADD.I32 Q11, Q11, Q15 488 VSHR.S32 Q11, Q11, #16 489 VUZP.16 D22, D23 490 491 VQNEG.S16 D20, D22 492 493 VST1.16 D24[0], [R1]! 494 VST1.16 D24[1], [R1]! 495 VST1.16 D24[2], [R1]! 496 497 VST1.16 D24[0], [R4], R9 498 VST1.16 D24[1], [R4], R9 499 VST1.16 D24[2], [R4], R9 500 501 VST1.16 D22[0], [R3], R9 502 VST1.16 D22[1], [R3], R9 503 VST1.16 D22[2], [R3], R9 504 505 VST1.16 D20[0], [R5]! 506 VST1.16 D20[1], [R5]! 507 VST1.16 D20[2], [R5]! 508 VUZP.16 D6, D7 509 VLD1.16 D0, [R7]! 510 VMULL.U16 Q1, D0, D6 511 VSHR.S32 Q1, Q1, #16 512 VMLAL.S16 Q1, D0, D7 513 VSHL.S32 Q1, Q1, #4 514 515 VADD.I32 Q1, Q1, Q15 516 VSHR.S32 Q1, Q1, #16 517 518 VST1.16 D2[0], [R1]! 519 VST1.16 D2[0], [R4], R9 520 521 LDMFD sp!, {r4-r12, r15} 522 523 524