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