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