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