@/******************************************************************************
@ *
@ * Copyright (C) 2018 The Android Open Source Project
@ *
@ * Licensed under the Apache License, Version 2.0 (the "License");
@ * you may not use this file except in compliance with the License.
@ * You may obtain a copy of the License at:
@ *
@ * http://www.apache.org/licenses/LICENSE-2.0
@ *
@ * Unless required by applicable law or agreed to in writing, software
@ * distributed under the License is distributed on an "AS IS" BASIS,
@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ * See the License for the specific language governing permissions and
@ * limitations under the License.
@ *
@ *****************************************************************************
@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
@*/


.text
.p2align 2
.global ixheaacd_post_twid_overlap_add_armv7

ixheaacd_post_twid_overlap_add_armv7:

    STMFD           sp!, {R4-R12}
    VPUSH           {d8 - d15}

    LDR             R4, [sp, #100]
    LDR             R5, [sp, #104]
    LDR             R6, [sp, #108]

    LSL             R9, R3, #2
    ASR             R9, R9, #1
    ADD             R6, R6, R9
    SUB             R6, R6, #4

    LDR             R8, =7500
    ADD             R2, R2, R8



    VMOV.S16        D18, #50
    RSB             R9, R5, #15
    VMOV.S32        Q10, #0x00008000
    VDUP.32         Q8, R5
    SUB             R5, R5, #16
    STR             R5, [sp, #116]
    MOV             R8, #1
    LSL             R8, R8, R9
    STR             R8, [sp, #120]


ARM_PROLOGUE:


    LDR             R8, [R1], #4
    LDR             R9, [R1], #4

    LDR             R10, [R2], #4

    SMULWT          R11, R8, R10
    SMULWB          R12, R9, R10
    SMULWB          R5, R8, R10
    SMLAWT          R7, R9, R10, R5
    SUB             R8, R12, R11
    MVN             R5, R7
    ADD             R5, R5, #1

    MOV             R9, #50
    MOV             R12, #-50
    SMULWB          R10, R5, R9
    SMULWB          R11, R8, R12

    ADD             R8, R8, R10
    ADD             R5, R5, R11

    LDR             R11, [sp, #104]
    LDR             R10, [R6], #-32


    SMULWB          R7, R8, R10
    MVN             R8, R8
    ADD             R8, R8, #1
    SMULWT          R12, R8, R10

    CMP             R11, #0
    BLT             NEXT

    RSBS            R9, R11, #16




    LDR             R8, [sp, #120]
    QADD            R5, R5, R8
    ASR             R5, R5, R9

    RSBS            R9, R11, #31
    MOVS            R8, R7, ASR R9
    CMNLT           R8, #1
    MOVLT           R7, #0x80000000
    MVNGT           R7, #0x80000000
    MOVEQ           R7, R7, LSL R11

    RSBS            R9, R11, #31
    MOVS            R8, R12, ASR R9
    CMNLT           R8, #1
    MOVLT           R12, #0x80000000
    MVNGT           R12, #0x80000000
    MOVEQ           R12, R12, LSL R11

    B               NEXT1
NEXT:
    MVN             R11, R11
    ADD             R11, R11, #1
    ASR             R5, R5, R11
    MOV             R8, #0x8000
    QADD            R5, R5, R8
    ASR             R5, R5, #16
    ASR             R7, R7, R11
    ASR             R12, R12, R11

NEXT1:
    LDR             R9, [R4]
    MOV             R8, #0x8000

    STR             R5, [R4], #4


    UXTH            R5, R10, ROR #16
    UXTH            R10, R10


    VDUP.32         D0, R9
    VDUP.32         D2, R10
    VDUP.32         D3, R5
    VZIP.32         D2, D3
    VMULL.S32       Q0, D2, D0
    VQMOVN.S64      D8, Q0


    VDUP.32         D0, R12
    VDUP.32         D1, R7

    VZIP.32         D0, D1
    VQSUB.S32       D8, D0, D8


    VQSHL.S32       D8, D8, #2
    VDUP.32         D0, R8
    VQADD.S32       D8, D8, D0
    VSHR.S32        D8, D8, #16



    LDR             R7, [sp, #112]
    LSL             R10, R7, #1

    ASR             R5, R3, #1
    SMULBB          R5, R10, R5
    ADD             R5, R5, R0
    SUB             R0, R5, R10
    MVN             R9, R10
    ADD             R9, R9, #1

    VST1.16         D8[2], [R0], R9
    VST1.16         D8[0], [R5], R10


    MOV             R8, R1
    LSL             R12, R3, #2

    ADD             R1, R1, R12

    SUB             R1, R1, #40

    MOV             R12, #-32



PROLOGUE_NEON:

    ASR             R3, R3, #2
    SUB             R3, R3, #4
    ASR             R3, R3, #2
    SUB             R3, R3, #2

    VLD2.32         {Q0, Q1}, [R1], R12
    VUZP.16         D0, D1
    VUZP.16         D2, D3

    VREV64.16       Q0, Q0
    VREV64.16       Q1, Q1
    VLD2.16         {D8, D9}, [R2]!

    VLD2.32         {Q2, Q3}, [R8]!
    VMULL.U16       Q15, D0, D9

    VUZP.16         D4, D5
    VMULL.U16       Q14, D2, D8

    VUZP.16         D6, D7
    VMULL.U16       Q13, D0, D8


    VMULL.U16       Q12, D2, D9

    VLD2.32         {Q5, Q6}, [R6], R12
    VSHR.U32        Q15, Q15, #16

    VUZP.16         D10, D11
    VSHR.U32        Q14, Q14, #16

    VUZP.16         D12, D13
    VMLAL.S16       Q15, D1, D9

    VREV64.16       Q5, Q5
    VMLAL.S16       Q14, D3, D8

    VREV64.16       Q6, Q6
    VSHR.U32        Q13, Q13, #16


    VSHR.U32        Q12, Q12, #16

    VMLAL.S16       Q13, D1, D8
    VMLAL.S16       Q12, D3, D9



    VADD.I32        Q15, Q15, Q14
    VNEG.S32        Q15, Q15

    VMULL.U16       Q11, D4, D8

    VSUB.I32        Q14, Q12, Q13


    VMOV            Q13, Q15
    VMOV            Q12, Q14

    VUZP.16         D24, D25


    VUZP.16         D26, D27
    VMULL.U16       Q1, D24, D18

    VMULL.U16       Q0, D26, D18

    VSHR.U32        Q11, Q11, #16
    VMLAL.S16       Q11, D5, D8

    VSHR.U32        Q1, Q1, #16
    VSHR.U32        Q0, Q0, #16
    VMLAL.S16       Q1, D25, D18
    VMLAL.S16       Q0, D27, D18

    VMULL.U16       Q12, D4, D9
    VMULL.U16       Q13, D6, D8

    VNEG.S32        Q1, Q1
    VADD.I32        Q14, Q14, Q0
    VADD.I32        Q15, Q15, Q1

    VMULL.U16       Q0, D6, D9
    VSHR.S32        Q12, Q12, #16
    VMLAL.S16       Q12, D5, D9
    VSHR.S32        Q13, Q13, #16
    VSHR.S32        Q0, Q0, #16
    VMLAL.S16       Q13, D7, D8
    VMLAL.S16       Q0, D7, D9




    VADD.I32        Q11, Q11, Q0
    VNEG.S32        Q11, Q11
    VSUB.I32        Q12, Q13, Q12



    LDR             R11, [sp, #120]
    VDUP.S32        Q7, R11
    VQADD.S32       Q14, Q14, Q7
    LDR             R11, [sp, #116]
    VDUP.S32        Q0, R11
    VQSHL.S32       Q14, Q14, Q0

    VMOV            Q0, Q11
    VMOV            Q7, Q12


    VUZP.16         D24, D25

    VUZP.16         D22, D23
    VMULL.U16       Q4, D24, D18
    VMULL.U16       Q13, D22, D18

    VNEG.S32        Q1, Q15
    VUZP.16         D30, D31

    VUZP.16         D2, D3
    VMULL.U16       Q2, D30, D12

    VMULL.U16       Q3, D2, D13

    VSHR.U32        Q4, Q4, #16
    VSHR.U32        Q13, Q13, #16

    VMLAL.S16       Q4, D25, D18
    VMLAL.S16       Q13, D23, D18

    VSHR.U32        Q2, Q2, #16
    VSHR.U32        Q3, Q3, #16

    VMLAL.S16       Q2, D31, D12
    VMLAL.S16       Q3, D3, D13

    VNEG.S32        Q4, Q4
    VADD.I32        Q7, Q7, Q13
    VADD.I32        Q0, Q0, Q4

    LDR             R11, [sp, #120]
    VDUP.S32        Q4, R11
    VQADD.S32       Q0, Q0, Q4
    LDR             R11, [sp, #116]
    VDUP.S32        Q13, R11
    VQSHL.S32       Q0, Q0, Q13

    VMOV            Q13, Q14

    VLD2.32         {Q14, Q15}, [R4]

    VZIP.32         Q13, Q0
    VST1.32         {Q13}, [R4]!
    VST1.32         {Q0}, [R4]!

    VMOV.S32        D1, #0
    VADDL.S16       Q0, D13, D1


    VMULL.S32       Q13, D28, D0
    VQMOVN.S64      D8, Q13
    VMULL.S32       Q13, D29, D1
    VQMOVN.S64      D9, Q13

    VMOV.S32        D1, #0
    VADDL.S16       Q0, D12, D1


    VMULL.S32       Q12, D28, D0
    VQMOVN.S64      D26, Q12
    VMULL.S32       Q12, D29, D1
    VQMOVN.S64      D27, Q12

    VQSHL.S32       Q2, Q2, Q8
    VQSHL.S32       Q3, Q3, Q8

    VQSUB.S32       Q2, Q2, Q4
    VQSUB.S32       Q3, Q3, Q13

    VNEG.S32        Q13, Q7
    VUZP.16         D14, D15
    VUZP.16         D26, D27

    VMOV.S32        D1, #0
    VADDL.S16       Q0, D10, D1
    VMULL.S32       Q11, D30, D0
    VQMOVN.S64      D24, Q11
    VMULL.S32       Q11, D31, D1
    VQMOVN.S64      D25, Q11
    VMOV.S32        D1, #0
    VADDL.S16       Q0, D11, D1
    VMULL.S32       Q4, D30, D0
    VQMOVN.S64      D22, Q4
    VMULL.S32       Q4, D31, D1
    VQMOVN.S64      D23, Q4
    VMULL.U16       Q4, D26, D11
    VMULL.U16       Q15, D14, D10

    VLD2.32         {Q0, Q1}, [R1], R12

    VUZP.16         D0, D1

    VUZP.16         D2, D3
    VSHR.U32        Q4, Q4, #16

    VREV64.16       Q0, Q0
    VSHR.U32        Q15, Q15, #16

    VREV64.16       Q1, Q1
    VMLAL.S16       Q4, D27, D11

    VMLAL.S16       Q15, D15, D10

    VLD2.32         {Q5, Q6}, [R6], R12
    VQSHL.S32       Q2, Q2, #2

    VUZP.16         D10, D11
    VQSHL.S32       Q3, Q3, #2

    VUZP.16         D12, D13
    VQADD.S32       Q7, Q2, Q10

    VREV64.16       Q5, Q5
    VQADD.S32       Q3, Q3, Q10

    VREV64.16       Q6, Q6
    VSHR.S32        Q7, Q7, #16

    VUZP.16         D14, D15
    VSHR.S32        Q3, Q3, #16

    VUZP.16         D6, D7

    VMOV            D15, D6
    VQSHL.S32       Q4, Q4, Q8

    VLD2.32         {Q2, Q3}, [R8]!
    VQSHL.S32       Q15, Q15, Q8

    VUZP.16         D4, D5
    VQSUB.S32       Q4, Q4, Q12

    VUZP.16         D6, D7
    VQSUB.S32       Q11, Q15, Q11

    VQSHL.S32       Q15, Q4, #2

    VLD2.16         {D8, D9}, [R2]!
    VQSHL.S32       Q11, Q11, #2

    VQADD.S32       Q15, Q15, Q10
    VQADD.S32       Q11, Q11, Q10

    VSHR.S32        Q15, Q15, #16

    VUZP.16         D30, D31
    VSHR.S32        Q11, Q11, #16


    VUZP.16         D22, D23
    VMOV            D23, D30

CORE_LOOP_PTO:
    VST1.16         D14[0], [R0, : 16], R9
    VMULL.U16       Q15, D0, D9

    VST1.16         D22[0], [R0, : 16], R9
    VMULL.U16       Q14, D2, D8

    VST1.16         D14[1], [R0, : 16], R9
    VMULL.U16       Q13, D0, D8

    VST1.16         D22[1], [R0, : 16], R9
    VMULL.U16       Q12, D2, D9

    VST1.16         D14[2], [R0, : 16], R9
    VSHR.U32        Q15, Q15, #16

    VST1.16         D22[2], [R0, : 16], R9
    VSHR.U32        Q14, Q14, #16

    VST1.16         D14[3], [R0, : 16], R9
    VMLAL.S16       Q15, D1, D9

    VST1.16         D22[3], [R0, : 16], R9
    VMLAL.S16       Q14, D3, D8

    VST1.16         D15[0], [R5, : 16], R10
    VSHR.U32        Q13, Q13, #16

    VST1.16         D23[0], [R5, : 16], R10
    VSHR.U32        Q12, Q12, #16

    VST1.16         D15[1], [R5, : 16], R10
    VMLAL.S16       Q13, D1, D8

    VST1.16         D23[1], [R5, : 16], R10
    VMLAL.S16       Q12, D3, D9

    VST1.16         D15[2], [R5, : 16], R10
    VADD.I32        Q15, Q15, Q14

    VST1.16         D23[2], [R5, : 16], R10
    VNEG.S32        Q15, Q15

    VST1.16         D15[3], [R5, : 16], R10

    VST1.16         D23[3], [R5, : 16], R10
    VSUB.I32        Q14, Q12, Q13


    VMOV            Q13, Q15
    VMULL.U16       Q11, D4, D8

    VMOV            Q12, Q14

    VUZP.16         D24, D25


    VUZP.16         D26, D27
    VMULL.U16       Q1, D24, D18
    VMULL.U16       Q0, D26, D18

    VSHR.U32        Q11, Q11, #16
    VMLAL.S16       Q11, D5, D8

    VSHR.U32        Q1, Q1, #16
    VSHR.U32        Q0, Q0, #16
    VMLAL.S16       Q1, D25, D18
    VMLAL.S16       Q0, D27, D18

    VMULL.U16       Q12, D4, D9
    VMULL.U16       Q13, D6, D8

    VNEG.S32        Q1, Q1
    VADD.I32        Q14, Q14, Q0
    VADD.I32        Q15, Q15, Q1

    VMULL.U16       Q0, D6, D9
    VSHR.S32        Q12, Q12, #16
    VMLAL.S16       Q12, D5, D9
    VSHR.S32        Q13, Q13, #16
    VSHR.S32        Q0, Q0, #16
    VMLAL.S16       Q13, D7, D8
    VMLAL.S16       Q0, D7, D9



    VADD.I32        Q11, Q11, Q0

    VNEG.S32        Q11, Q11
    VSUB.I32        Q12, Q13, Q12


    LDR             R11, [sp, #120]
    VDUP.S32        Q7, R11
    VQADD.S32       Q14, Q14, Q7
    LDR             R11, [sp, #116]
    VDUP.S32        Q0, R11
    VQSHL.S32       Q14, Q14, Q0


    VMOV            Q0, Q11
    VMOV            Q7, Q12

    VUZP.16         D24, D25

    VUZP.16         D22, D23
    VMULL.U16       Q4, D24, D18
    VMULL.U16       Q13, D22, D18

    VNEG.S32        Q1, Q15

    VUZP.16         D30, D31

    VUZP.16         D2, D3
    VMULL.U16       Q2, D30, D12
    VMULL.U16       Q3, D2, D13

    VSHR.U32        Q4, Q4, #16
    VSHR.U32        Q13, Q13, #16

    VMLAL.S16       Q4, D25, D18
    VMLAL.S16       Q13, D23, D18

    VSHR.U32        Q2, Q2, #16
    VSHR.U32        Q3, Q3, #16

    VMLAL.S16       Q2, D31, D12
    VMLAL.S16       Q3, D3, D13

    VNEG.S32        Q4, Q4
    VADD.I32        Q7, Q7, Q13
    VADD.I32        Q0, Q0, Q4



    LDR             R11, [sp, #120]
    VDUP.S32        Q4, R11
    VQADD.S32       Q0, Q0, Q4
    LDR             R11, [sp, #116]
    VDUP.S32        Q13, R11
    VQSHL.S32       Q0, Q0, Q13
    VMOV            Q13, Q14

    VLD2.32         {Q14, Q15}, [R4]

    VZIP.32         Q13, Q0
    VST1.32         {Q13}, [R4]!
    VST1.32         {Q0}, [R4]!

    VMOV.S32        D1, #0
    VADDL.S16       Q0, D13, D1


    VMULL.S32       Q13, D28, D0
    VQMOVN.S64      D8, Q13
    VMULL.S32       Q13, D29, D1
    VQMOVN.S64      D9, Q13

    VMOV.S32        D1, #0
    VADDL.S16       Q0, D12, D1


    VMULL.S32       Q12, D28, D0
    VQMOVN.S64      D26, Q12
    VMULL.S32       Q12, D29, D1
    VQMOVN.S64      D27, Q12

    VQSHL.S32       Q2, Q2, Q8
    VQSHL.S32       Q3, Q3, Q8



    VQSUB.S32       Q2, Q2, Q4
    VQSUB.S32       Q3, Q3, Q13

    VNEG.S32        Q13, Q7
    VUZP.16         D26, D27

    VMOV.S32        D1, #0
    VADDL.S16       Q0, D10, D1
    VMULL.S32       Q11, D30, D0
    VQMOVN.S64      D24, Q11
    VMULL.S32       Q11, D31, D1
    VQMOVN.S64      D25, Q11

    VMOV.S32        D1, #0
    VADDL.S16       Q0, D11, D1

    VMULL.S32       Q4, D30, D0
    VQMOVN.S64      D22, Q4
    VMULL.S32       Q4, D31, D1
    VQMOVN.S64      D23, Q4


    VUZP.16         D14, D15
    VMULL.U16       Q4, D26, D11
    VMULL.U16       Q15, D14, D10


    VLD2.32         {Q0, Q1}, [R1], R12

    VUZP.16         D0, D1

    VUZP.16         D2, D3
    VSHR.U32        Q4, Q4, #16

    VREV64.16       Q0, Q0
    VSHR.U32        Q15, Q15, #16

    VREV64.16       Q1, Q1
    VMLAL.S16       Q4, D27, D11

    VMLAL.S16       Q15, D15, D10

    VLD2.32         {Q5, Q6}, [R6], R12
    VQSHL.S32       Q2, Q2, #2

    VUZP.16         D10, D11
    VQSHL.S32       Q3, Q3, #2

    VUZP.16         D12, D13
    VQADD.S32       Q7, Q2, Q10

    VREV64.16       Q5, Q5
    VQADD.S32       Q3, Q3, Q10

    VREV64.16       Q6, Q6
    VSHR.S32        Q7, Q7, #16

    VUZP.16         D14, D15
    VSHR.S32        Q3, Q3, #16

    VUZP.16         D6, D7

    VMOV            D15, D6
    VQSHL.S32       Q4, Q4, Q8

    VLD2.32         {Q2, Q3}, [R8]!
    VQSHL.S32       Q15, Q15, Q8

    VUZP.16         D4, D5
    VQSUB.S32       Q4, Q4, Q12

    VUZP.16         D6, D7
    VQSUB.S32       Q11, Q15, Q11

    VQSHL.S32       Q15, Q4, #2

    VLD2.16         {D8, D9}, [R2]!
    VQSHL.S32       Q11, Q11, #2

    VQADD.S32       Q15, Q15, Q10
    VQADD.S32       Q11, Q11, Q10

    VSHR.S32        Q15, Q15, #16

    VUZP.16         D30, D31
    VSHR.S32        Q11, Q11, #16


    VUZP.16         D22, D23
    VMOV            D23, D30

    SUBS            R3, R3, #1
    BNE             CORE_LOOP_PTO





EPILOGUE:

    VST1.16         D14[0], [R0], R9
    VMULL.U16       Q15, D0, D9

    VST1.16         D22[0], [R0], R9
    VMULL.U16       Q14, D2, D8

    VST1.16         D14[1], [R0], R9
    VMULL.U16       Q13, D0, D8

    VST1.16         D22[1], [R0], R9
    VMULL.U16       Q12, D2, D9

    VST1.16         D14[2], [R0], R9
    VSHR.U32        Q15, Q15, #16

    VST1.16         D22[2], [R0], R9
    VSHR.U32        Q14, Q14, #16

    VST1.16         D14[3], [R0], R9
    VMLAL.S16       Q15, D1, D9

    VST1.16         D22[3], [R0], R9
    VMLAL.S16       Q14, D3, D8

    VST1.16         D15[0], [R5], R10
    VSHR.U32        Q13, Q13, #16

    VST1.16         D23[0], [R5], R10
    VSHR.U32        Q12, Q12, #16

    VST1.16         D15[1], [R5], R10
    VMLAL.S16       Q13, D1, D8

    VST1.16         D23[1], [R5], R10
    VMLAL.S16       Q12, D3, D9

    VST1.16         D15[2], [R5], R10
    VADD.I32        Q15, Q15, Q14

    VST1.16         D23[2], [R5], R10
    VNEG.S32        Q15, Q15

    VST1.16         D15[3], [R5], R10


    VST1.16         D23[3], [R5], R10
    VSUB.I32        Q14, Q12, Q13


    VMULL.U16       Q11, D4, D8
    VMOV            Q13, Q15
    VMOV            Q12, Q14

    VMOV            Q13, Q15
    VMOV            Q12, Q14

    VUZP.16         D26, D27
    VUZP.16         D24, D25


    VMULL.U16       Q1, D24, D18
    VMULL.U16       Q0, D26, D18

    VSHR.U32        Q11, Q11, #16
    VMLAL.S16       Q11, D5, D8

    VSHR.U32        Q1, Q1, #16
    VSHR.U32        Q0, Q0, #16
    VMLAL.S16       Q1, D25, D18
    VMLAL.S16       Q0, D27, D18

    VMULL.U16       Q12, D4, D9
    VMULL.U16       Q13, D6, D8

    VNEG.S32        Q1, Q1
    VADD.I32        Q14, Q14, Q0
    VADD.I32        Q15, Q15, Q1

    VMULL.U16       Q0, D6, D9
    VSHR.S32        Q12, Q12, #16
    VMLAL.S16       Q12, D5, D9
    VSHR.S32        Q13, Q13, #16
    VSHR.S32        Q0, Q0, #16
    VMLAL.S16       Q13, D7, D8
    VMLAL.S16       Q0, D7, D9





    VADD.I32        Q11, Q11, Q0
    VNEG.S32        Q11, Q11
    VSUB.I32        Q12, Q13, Q12




    LDR             R11, [sp, #120]
    VDUP.S32        Q7, R11
    VQADD.S32       Q14, Q14, Q7
    LDR             R11, [sp, #116]
    VDUP.S32        Q0, R11
    VQSHL.S32       Q14, Q14, Q0


    VMOV            Q0, Q11
    VMOV            Q7, Q12


    VUZP.16         D22, D23
    VUZP.16         D24, D25

    VMULL.U16       Q4, D24, D18
    VMULL.U16       Q13, D22, D18

    VNEG.S32        Q1, Q15
    VUZP.16         D30, D31
    VUZP.16         D2, D3

    VMULL.U16       Q2, D30, D12
    VMULL.U16       Q3, D2, D13

    VSHR.U32        Q4, Q4, #16
    VSHR.U32        Q13, Q13, #16

    VMLAL.S16       Q4, D25, D18
    VMLAL.S16       Q13, D23, D18

    VSHR.U32        Q2, Q2, #16
    VSHR.U32        Q3, Q3, #16

    VMLAL.S16       Q2, D31, D12
    VMLAL.S16       Q3, D3, D13

    VNEG.S32        Q4, Q4
    VADD.I32        Q7, Q7, Q13
    VADD.I32        Q0, Q0, Q4

    LDR             R11, [sp, #120]
    VDUP.S32        Q4, R11
    VQADD.S32       Q0, Q0, Q4
    LDR             R11, [sp, #116]
    VDUP.S32        Q13, R11
    VQSHL.S32       Q0, Q0, Q13


    VMOV            Q13, Q14

    VLD2.32         {Q14, Q15}, [R4]
    VZIP.32         Q13, Q0
    VST1.32         {Q13}, [R4]!
    VST1.32         {Q0}, [R4]!

    VMOV.S32        D1, #0
    VADDL.S16       Q0, D13, D1

    VMULL.S32       Q13, D28, D0
    VQMOVN.S64      D8, Q13
    VMULL.S32       Q13, D29, D1
    VQMOVN.S64      D9, Q13

    VMOV.S32        D1, #0
    VADDL.S16       Q0, D12, D1

    VMULL.S32       Q12, D28, D0
    VQMOVN.S64      D26, Q12
    VMULL.S32       Q12, D29, D1
    VQMOVN.S64      D27, Q12

    VQSHL.S32       Q2, Q2, Q8
    VQSHL.S32       Q3, Q3, Q8

    VQSUB.S32       Q2, Q2, Q4
    VQSUB.S32       Q3, Q3, Q13

    VNEG.S32        Q13, Q7
    VUZP.16         D14, D15
    VUZP.16         D26, D27

    VMOV.S32        D1, #0
    VADDL.S16       Q0, D10, D1


    VMULL.S32       Q11, D30, D0
    VQMOVN.S64      D24, Q11
    VMULL.S32       Q11, D31, D1
    VQMOVN.S64      D25, Q11

    VMOV.S32        D1, #0
    VADDL.S16       Q0, D11, D1

    VMULL.S32       Q4, D30, D0
    VQMOVN.S64      D22, Q4
    VMULL.S32       Q4, D31, D1
    VQMOVN.S64      D23, Q4


    VMULL.U16       Q4, D26, D11
    VMULL.U16       Q15, D14, D10

    VSHR.U32        Q4, Q4, #16

    VSHR.U32        Q15, Q15, #16

    VMLAL.S16       Q4, D27, D11

    VMLAL.S16       Q15, D15, D10

    VQSHL.S32       Q2, Q2, #2

    VQSHL.S32       Q3, Q3, #2

    VQADD.S32       Q7, Q2, Q10

    VQADD.S32       Q3, Q3, Q10

    VSHR.S32        Q7, Q7, #16

    VUZP.16         D14, D15
    VSHR.S32        Q3, Q3, #16

    VUZP.16         D6, D7

    VMOV            D15, D6
    VQSHL.S32       Q4, Q4, Q8

    VQSHL.S32       Q15, Q15, Q8

    VQSUB.S32       Q4, Q4, Q12

    VQSUB.S32       Q11, Q15, Q11

    VQSHL.S32       Q15, Q4, #2

    VQSHL.S32       Q11, Q11, #2

    VQADD.S32       Q15, Q15, Q10
    VQADD.S32       Q11, Q11, Q10

    VSHR.S32        Q15, Q15, #16

    VUZP.16         D30, D31
    VSHR.S32        Q11, Q11, #16

    VUZP.16         D22, D23
    VMOV            D23, D30




    VST1.16         D14[0], [R0], R9
    VST1.16         D22[0], [R0], R9
    VST1.16         D14[1], [R0], R9
    VST1.16         D22[1], [R0], R9
    VST1.16         D14[2], [R0], R9
    VST1.16         D22[2], [R0], R9
    VST1.16         D14[3], [R0], R9
    VST1.16         D22[3], [R0], R9
    VST1.16         D15[0], [R5], R10
    VST1.16         D23[0], [R5], R10
    VST1.16         D15[1], [R5], R10
    VST1.16         D23[1], [R5], R10
    VST1.16         D15[2], [R5], R10
    VST1.16         D23[2], [R5], R10
    VST1.16         D15[3], [R5], R10
    VST1.16         D23[3], [R5], R10

ARM_EPILOGUE:

ARM_LOOP:

    VLD2.32         {Q0, Q1}, [R1]

    VUZP.16         D0, D1
    VUZP.16         D2, D3

    VREV64.16       Q0, Q0
    VREV64.16       Q1, Q1

    VLD2.16         {D8, D9}, [R2]!

    VLD2.32         {D4, D6}, [R8]!
    VMOV.S32        D5, #0x00000000
    VMOV.S32        D7, #0x00000000

    VLD1.32         D5[0], [R8]!
    VLD1.32         D7[0], [R8]

    MOV             R12, #16

    VUZP.16         D4, D5
    VUZP.16         D6, D7

    ADD             R6, R6, #16

    MOV             R12, #-4
    VLD2.32         {D11, D13}, [R6], R12


    VMOV.S32        D10, #0x00000000

    VLD1.32         D12[1], [R6], R12
    VLD1.32         D10[1], [R6], R12
    VLD1.32         D12[0], [R6], R12

    VUZP.16         D10, D11
    VUZP.16         D12, D13

    VREV64.16       Q5, Q5
    VREV64.16       Q6, Q6

    VMULL.U16       Q15, D0, D9
    VMULL.U16       Q14, D2, D8
    VMULL.U16       Q13, D0, D8
    VMULL.U16       Q12, D2, D9

    VSHR.U32        Q15, Q15, #16
    VSHR.U32        Q14, Q14, #16

    VMLAL.S16       Q15, D1, D9
    VMLAL.S16       Q14, D3, D8

    VSHR.U32        Q13, Q13, #16
    VSHR.U32        Q12, Q12, #16

    VMLAL.S16       Q13, D1, D8
    VMLAL.S16       Q12, D3, D9

    VADD.I32        Q15, Q15, Q14
    VNEG.S32        Q15, Q15

    VMULL.U16       Q11, D4, D8

    VSUB.I32        Q14, Q12, Q13


    VMOV            Q13, Q15
    VMOV            Q12, Q14

    VUZP.16         D26, D27
    VUZP.16         D24, D25


    VMULL.U16       Q1, D24, D18
    VMULL.U16       Q0, D26, D18

    VSHR.U32        Q11, Q11, #16
    VMLAL.S16       Q11, D5, D8

    VSHR.U32        Q1, Q1, #16
    VSHR.U32        Q0, Q0, #16
    VMLAL.S16       Q1, D25, D18
    VMLAL.S16       Q0, D27, D18

    VMULL.U16       Q12, D4, D9
    VMULL.U16       Q13, D6, D8

    VNEG.S32        Q1, Q1
    VADD.I32        Q14, Q14, Q0
    VADD.I32        Q15, Q15, Q1

    VMULL.U16       Q0, D6, D9
    VSHR.S32        Q12, Q12, #16
    VMLAL.S16       Q12, D5, D9
    VSHR.S32        Q13, Q13, #16
    VSHR.S32        Q0, Q0, #16
    VMLAL.S16       Q13, D7, D8
    VMLAL.S16       Q0, D7, D9

    VADD.I32        Q11, Q11, Q0
    VNEG.S32        Q11, Q11
    VSUB.I32        Q12, Q13, Q12

    LDR             R11, [sp, #120]
    VDUP.S32        Q7, R11
    VQADD.S32       Q14, Q14, Q7
    LDR             R11, [sp, #116]
    VDUP.S32        Q0, R11
    VQSHL.S32       Q14, Q14, Q0

    VMOV            Q0, Q11
    VMOV            Q7, Q12

    VUZP.16         D22, D23
    VUZP.16         D24, D25

    VMULL.U16       Q4, D24, D18
    VMULL.U16       Q13, D22, D18

    VNEG.S32        Q1, Q15
    VUZP.16         D30, D31
    VUZP.16         D2, D3

    VMULL.U16       Q2, D30, D12
    VMULL.U16       Q3, D2, D13

    VSHR.U32        Q4, Q4, #16
    VSHR.U32        Q13, Q13, #16

    VMLAL.S16       Q4, D25, D18
    VMLAL.S16       Q13, D23, D18

    VSHR.U32        Q2, Q2, #16
    VSHR.U32        Q3, Q3, #16

    VMLAL.S16       Q2, D31, D12
    VMLAL.S16       Q3, D3, D13

    VNEG.S32        Q4, Q4
    VADD.I32        Q7, Q7, Q13
    VADD.I32        Q0, Q0, Q4

    LDR             R11, [sp, #120]
    VDUP.S32        Q4, R11
    VQADD.S32       Q0, Q0, Q4
    LDR             R11, [sp, #116]
    VDUP.S32        Q13, R11
    VQSHL.S32       Q0, Q0, Q13

    VMOV            Q13, Q14

    MOV             R6, R4

    VLD1.32         {D28, D29}, [R4]!
    VMOV.S32        D31, #0x00000000
    VLD1.32         D30[0], [R4]!
    VLD1.32         D30[1], [R4]!
    VLD1.32         D31[0], [R4]!
    VUZP.32         Q14, Q15


    VST1.32         D26[0], [R6]!
    VST1.32         D0[0], [R6]!
    VST1.32         D26[1], [R6]!
    VST1.32         D0[1], [R6]!
    VST1.32         D27[0], [R6]!
    VST1.32         D1[0], [R6]!
    VST1.32         D27[1], [R6]!

    VMOV.S32        D1, #0
    VADDL.S16       Q0, D13, D1

    VMULL.S32       Q13, D28, D0
    VQMOVN.S64      D8, Q13
    VMULL.S32       Q13, D29, D1
    VQMOVN.S64      D9, Q13

    VMOV.S32        D1, #0
    VADDL.S16       Q0, D12, D1

    VMULL.S32       Q12, D28, D0
    VQMOVN.S64      D26, Q12
    VMULL.S32       Q12, D29, D1
    VQMOVN.S64      D27, Q12

    VQSHL.S32       Q2, Q2, Q8
    VQSHL.S32       Q3, Q3, Q8

    VQSUB.S32       Q2, Q2, Q4
    VQSUB.S32       Q3, Q3, Q13

    VNEG.S32        Q13, Q7
    VUZP.16         D14, D15
    VUZP.16         D26, D27

    VMOV.S32        D1, #0
    VADDL.S16       Q0, D10, D1


    VMULL.S32       Q11, D30, D0
    VQMOVN.S64      D24, Q11
    VMULL.S32       Q11, D31, D1
    VQMOVN.S64      D25, Q11


    VMOV.S32        D1, #0
    VADDL.S16       Q0, D11, D1

    VMULL.S32       Q4, D30, D0
    VQMOVN.S64      D22, Q4
    VMULL.S32       Q4, D31, D1
    VQMOVN.S64      D23, Q4


    VMULL.U16       Q4, D26, D11
    VMULL.U16       Q15, D14, D10

    VSHR.U32        Q4, Q4, #16

    VSHR.U32        Q15, Q15, #16

    VMLAL.S16       Q4, D27, D11

    VMLAL.S16       Q15, D15, D10

    VQSHL.S32       Q2, Q2, #2

    VQSHL.S32       Q3, Q3, #2

    VQADD.S32       Q7, Q2, Q10

    VQADD.S32       Q3, Q3, Q10

    VSHR.S32        Q7, Q7, #16

    VUZP.16         D14, D15
    VSHR.S32        Q3, Q3, #16

    VUZP.16         D6, D7

    VMOV            D15, D6
    VQSHL.S32       Q4, Q4, Q8

    VQSHL.S32       Q15, Q15, Q8

    VQSUB.S32       Q4, Q4, Q12

    VQSUB.S32       Q11, Q15, Q11

    VQSHL.S32       Q15, Q4, #2

    VQSHL.S32       Q11, Q11, #2

    VQADD.S32       Q15, Q15, Q10
    VQADD.S32       Q11, Q11, Q10

    VSHR.S32        Q15, Q15, #16

    VUZP.16         D30, D31
    VSHR.S32        Q11, Q11, #16

    VUZP.16         D22, D23
    VMOV            D23, D30




    VST1.16         D14[0], [R0], R9
    VST1.16         D22[0], [R0], R9
    VST1.16         D14[1], [R0], R9
    VST1.16         D22[1], [R0], R9
    VST1.16         D14[2], [R0], R9
    VST1.16         D22[2], [R0], R9
    VST1.16         D14[3], [R0], R9

    VST1.16         D15[0], [R5], R10
    VST1.16         D23[0], [R5], R10
    VST1.16         D15[1], [R5], R10
    VST1.16         D23[1], [R5], R10
    VST1.16         D15[2], [R5], R10
    VST1.16         D23[2], [R5], R10
    VST1.16         D15[3], [R5], R10

    VPOP            {d8 - d15}
    LDMFD           sp!, {R4-R12}
    BX              LR