@/******************************************************************************
@ *
@ * 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_over_lap_add2_armv7

ixheaacd_over_lap_add2_armv7:

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

    LDR             R4, [SP, #104]
    LDR             R5, [SP, #108]
    LDR             R6, [SP, #112]
    RSB             R4, R4, #15
    CMP             R4, #31
    MOVGT           R4, #31
    SUB             R9, R4, #1
    MOV             R8, #1
    MOV             R8, R8, LSL R9
    RSB             R4, R4, #0
    VDUP.32         Q11, R4
    VDUP.32         Q10, R8
    MOV             R8, R5
    SUB             R12, R5, #1
    MOV             R9, R5, LSL #2
    MOV             R12, R12, LSL #2
    ADD             R10, R0, R9
    ADD             R7, R1, R12
    VLD2.16         {D0, D1}, [R10]!
    MOV             R11, R6, LSL #2
    SUB             R7, R7, #12
    ADD             R4, R4, #1
    MOV             R12, #-16
    VLD2.16         {D6, D7}, [R7], R12
    MOV             R4, #0x8000
    VREV64.16       D4, D6
    VREV64.16       D5, D7
    MOV             R4, R3

    MOV             R9, R2
    VLD2.16         {D2, D3}, [R3]!

    VMULL.U16       Q13, D0, D2
    VMLSL.U16       Q13, D4, D3
    VLD2.16         {D8, D9}, [R10]!
    VSHR.S32        Q13, Q13, #16
    VLD2.16         {D10, D11}, [R3]!
    VMLAL.S16       Q13, D1, D2
    VMLSL.S16       Q13, D5, D3
    VLD2.16         {D14, D15}, [R7], R12
    VREV64.16       Q6, Q7
    VQADD.S32       Q12, Q13, Q10
    VQSHL.S32       Q12, Q12, Q11
    SUB             R8, R8, #8


LOOP_1:

    VLD2.16         {D0, D1}, [R10]!
    VMULL.U16       Q9, D8, D10
    VLD2.16         {D2, D3}, [R3]!
    VMLSL.U16       Q9, D12, D11
    VLD2.16         {D6, D7}, [R7], R12
    VMULL.U16       Q13, D0, D2
    VREV64.16       D4, D6
    VMLSL.U16       Q13, D4, D3
    VREV64.16       D5, D7
    VSHR.S32        Q9, Q9, #16
    VST1.32         {D24[0]}, [R2], R11
    VMLAL.S16       Q9, D9, D10
    VST1.32         {D24[1]}, [R2], R11
    VSHR.S32        Q13, Q13, #16
    VST1.32         {D25[0]}, [R2], R11
    VMLAL.S16       Q13, D1, D2

    VST1.32         {D25[1]}, [R2], R11
    VMLSL.S16       Q9, D13, D11
    VMLSL.S16       Q13, D5, D3

    VLD2.16         {D8, D9}, [R10]!
    VLD2.16         {D10, D11}, [R3]!


    VLD2.16         {D14, D15}, [R7], R12
    VQADD.S32       Q8, Q9, Q10
    VREV64.16       Q6, Q7
    VQADD.S32       Q12, Q13, Q10
    VQSHL.S32       Q8, Q8, Q11
    VST1.32         D16[0], [R2], R11
    VQSHL.S32       Q12, Q12, Q11


    SUBS            R8, R8, #8

    VST1.32         D16[1], [R2], R11
    VST1.32         D17[0], [R2], R11
    VST1.32         D17[1], [R2], R11


    BGT             LOOP_1


    VST1.32         D24[0], [R2], R11
    VMULL.U16       Q9, D8, D10
    VMLSL.U16       Q9, D12, D11
    VST1.32         D24[1], [R2], R11
    VST1.32         D25[0], [R2], R11
    VSHR.S32        Q9, Q9, #16
    VST1.32         D25[1], [R2], R11
    VMLAL.S16       Q9, D9, D10
    VMLSL.S16       Q9, D13, D11
    MOV             R12, #12
    SMULBB          R7, R5, R6
    MOV             R10, R5, LSL #1
    VQADD.S32       Q8, Q9, Q10
    VQSHL.S32       Q8, Q8, Q11

    VST1.32         D16[0], [R2], R11
    MOV             R7, R7, LSL #2

    VST1.32         D16[1], [R2], R11
    ADD             R7, R7, R9

    VST1.32         D17[0], [R2], R11
    VST1.32         D17[1], [R2], R11

    SUB             R11, R10, #1
    MOV             R10, R11, LSL #2
    ADD             R10, R0, R10
    MOV             R11, R11, LSL #1
    SUB             R10, R10, R12
    MOV             R8, R6, LSL #2
    MOV             R12, #-16
    ADD             R11, R11, R4

    VLD1.32         {D6, D7}, [R10], R12
    SUB             R11, R11, #14


    VREV64.32       D0, D6
    VREV64.32       D1, D7
    VQNEG.S32       D0, D0
    VQNEG.S32       D1, D1
    VUZP.16         D1, D0
    VLD2.16         {D2, D3}, [R11], R12
    VREV64.16       D2, D2
    VREV64.16       D3, D3

    VLD2.16         {D4, D5}, [R1]!

    VMULL.U16       Q13, D1, D3
    VMLSL.U16       Q13, D4, D2
    VSHR.S32        Q13, Q13, #16
    VMLAL.S16       Q13, D0, D3
    VMLSL.S16       Q13, D5, D2
    @VQSHL.S32 Q12,Q13,Q11
    @VQADD.S32 Q12,Q12,Q10
    @VSHR.S32 Q12,Q12,#16
    VQADD.S32       Q12, Q13, Q10
    VQSHL.S32       Q12, Q12, Q11
    VUZP.16         D24, D25


    VLD1.32         {D14, D15}, [R10], R12
    VMULL.U16       Q13, D1, D3
    VMLSL.U16       Q13, D4, D2
    VREV64.32       Q4, Q7
    VQNEG.S32       Q4, Q4
    VLD2.16         {D10, D11}, [R11], R12
    VSHR.S32        Q13, Q13, #16
    VLD2.16         {D12, D13}, [R1]!
    VMLAL.S16       Q13, D0, D3
    VMLSL.S16       Q13, D5, D2
    VUZP.16         D9, D8
    VREV64.16       Q5, Q5
    VQADD.S32       Q12, Q13, Q10
    SUB             R5, R5, #8
    VQSHL.S32       Q12, Q12, Q11





LOOP_2:


    VLD1.32         {D6, D7}, [R10], R12
    VMULL.U16       Q9, D9, D11
    VREV64.32       Q0, Q3
    VQNEG.S32       Q0, Q0
    VUZP.16         D1, D0
    VLD2.16         {D2, D3}, [R11], R12
    VREV64.16       Q1, Q1

    VLD2.16         {D4, D5}, [R1]!
    VMLSL.U16       Q9, D12, D10
    VST1.32         D24[0], [R7], R8
    VMULL.U16       Q13, D1, D3
    VST1.32         D24[1], [R7], R8
    VSHR.S32        Q9, Q9, #16
    VST1.32         D25[0], [R7], R8
    VMLSL.U16       Q13, D4, D2
    VST1.32         D25[1], [R7], R8
    VMLAL.S16       Q9, D8, D11
    VLD1.32         {D14, D15}, [R10], R12
    VSHR.S32        Q13, Q13, #16
    VMLSL.S16       Q9, D13, D10
    VLD2.16         {D10, D11}, [R11], R12
    VMLAL.S16       Q13, D0, D3
    VMLSL.S16       Q13, D5, D2
    VREV64.32       Q4, Q7
    VLD2.16         {D12, D13}, [R1]!
    VQNEG.S32       Q4, Q4
    VREV64.16       Q5, Q5
    VQADD.S32       Q8, Q9, Q10
    VUZP.16         D9, D8
    VQADD.S32       Q12, Q13, Q10
    VQSHL.S32       Q8, Q8, Q11
    SUBS            R5, R5, #8
    VST1.32         D16[0], [R7], R8
    VQSHL.S32       Q12, Q12, Q11
    VST1.32         D16[1], [R7], R8

    VST1.32         D17[0], [R7], R8
    VST1.32         D17[1], [R7], R8

    BGT             LOOP_2

    VST1.32         D24[0], [R7], R8
    VMULL.U16       Q9, D9, D11
    VMLSL.U16       Q9, D12, D10
    VST1.32         D24[1], [R7], R8
    VST1.32         D25[0], [R7], R8
    VSHR.S32        Q9, Q9, #16
    VST1.32         D25[1], [R7], R8

    VMLAL.S16       Q9, D8, D11
    VMLSL.S16       Q9, D13, D10
    VQADD.S32       Q8, Q9, Q10
    VQSHL.S32       Q8, Q8, Q11

    VST1.32         D16[0], [R7], R8
    VST1.32         D16[1], [R7], R8
    VST1.32         D17[0], [R7], R8
    VST1.32         D17[1], [R7], R8

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