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