@/******************************************************************************
@ *
@ * 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
    .extern ixheaacd_radix4bfly
.hidden ixheaacd_radix4bfly
    .extern ixheaacd_postradixcompute2
.hidden ixheaacd_postradixcompute2
    .extern ixheaacd_postradixcompute4
.hidden ixheaacd_postradixcompute4




    .extern ixheaacd_sbr_imdct_using_fft
.hidden ixheaacd_sbr_imdct_using_fft


    .global ixheaacd_cos_sin_mod
ixheaacd_cos_sin_mod:
    STMFD           SP!, {R4-R12, R14}

    LDR             R5, [R1]
    MOV             R7, R5, ASR #1
    LDR             R4, [R1, #12]
    MOV             R5, R7, ASR #2

    MOV             R8, R0
    MOV             R6, R7, LSL #3


    SUB             R10, SP, #516
    SUB             SP, SP, #516

    AND             R12, R10, #7
    CMP             R12, #0
    ADDNE           R10, R10, #4







    STMFD           SP!, {R0-R3}

    SUB             R6, R6, #4
    ADD             R9, R0, R6

    LDR             R2, [R4], #4
    LDR             R1, [R9], #-4
    LDR             R0, [R8], #4
    ADD             R11, R10, R6
















LOOP1:

    SUBS            R5, R5, #1

    SMULWT          R12, R1, R2
    SMULWB          R6, R0, R2
    SMULWT          R14, R0, R2


    LDR             R0, [R8, #0xFC]

    QSUB            R12, R12, R6

    SMLAWB          R14, R1, R2, R14

    LDR             R1, [R9, #0x104]

    STR             R12, [R10, #4]
    STR             R14, [R10], #8

    SMULWT          R6, R0, R2
    SMULWB          R12, R1, R2
    SMULWT          R14, R1, R2

    LDR             R1, [R8], #4

    QSUB            R12, R12, R6

    SMLAWB          R14, R0, R2, R14

    LDR             R2, [R4], #4
    LDR             R0, [R9], #-4

    STR             R12, [R10, #0xF8]
    STR             R14, [R10, #0xFC]

    SMULWT          R3, R1, R2
    SMULWB          R6, R0, R2
    SMULWT          R12, R0, R2

    LDR             R0, [R9, #0x104]

    QSUB            R3, R3, R6

    SMLAWB          R12, R1, R2, R12

    LDR             R1, [R8, #0xFC]

    STR             R12, [R11, #-4]
    STR             R3, [R11], #-8

    SMULWT          R6, R0, R2
    SMULWB          R14, R1, R2
    SMULWT          R12, R1, R2

    LDR             R1, [R9], #-4

    QSUB            R14, R14, R6

    SMLAWB          R3, R0, R2, R12

    LDR             R2, [R4], #4
    LDR             R0, [R8], #4

    STR             R3, [R11, #0x108]
    STR             R14, [R11, #0x104]

    SMULWT          R12, R1, R2
    SMULWB          R6, R0, R2
    SMULWT          R14, R0, R2

    LDR             R0, [R8, #0xFC]

    QSUB            R12, R12, R6

    SMLAWB          R14, R1, R2, R14

    LDR             R1, [R9, #0x104]

    STR             R12, [R10, #4]
    STR             R14, [R10], #8

    SMULWT          R6, R0, R2
    SMULWB          R12, R1, R2
    SMULWT          R14, R1, R2

    LDR             R1, [R8], #4

    QSUB            R12, R12, R6

    SMLAWB          R14, R0, R2, R14

    LDR             R2, [R4], #4
    LDR             R0, [R9], #-4
    STR             R12, [R10, #0xF8]
    STR             R14, [R10, #0xFC]

    SMULWT          R3, R1, R2
    SMULWB          R6, R0, R2
    SMULWT          R12, R0, R2

    LDR             R0, [R9, #0x104]

    QSUB            R3, R3, R6
    SMLAWB          R12, R1, R2, R12

    LDR             R1, [R8, #0xFC]
    STR             R3, [R11], #-4
    STR             R12, [R11], #-4

    SMULWT          R6, R0, R2
    SMULWB          R3, R1, R2
    SMULWT          R12, R1, R2


    LDRGT           R1, [R9], #-4

    QSUB            R3, R3, R6
    SMLAWB          R12, R0, R2, R12


    LDRGT           R2, [R4], #4
    LDRGT           R0, [R8], #4

    STR             R3, [R11, #0x104]
    STR             R12, [R11, #0x108]


    BGT             LOOP1
    LDR             R1, [SP, #4]
    LDR             R5, [R1]
    LDR             R4, [SP, #8]
    LDR             R0, [SP, #8]
    ADD             R1, SP, #16


    AND             R2, R1, #7
    CMP             R2, #0
    ADDNE           R1, R1, #4


    CMP             R5, #64
    LDR             R5, [SP, #12]
    MOV             R2, #1

    BNE             THIRTY2BAND






    MOV             R2, R1
    MOV             R1, #32
    LDR             R3, [SP]
    STR             R5, [SP, #-4]!
    STR             R5, [SP, #-4]!
    STR             R5, [SP, #-4]!
    STR             R5, [SP, #-4]!

    BL              ixheaacd_sbr_imdct_using_fft
    ADD             SP, SP, #16

    MOV             R0, R4
    MOV             R1, #32
    ADD             R2, SP, #16


    AND             R6, R2, #7
    CMP             R6, #0
    ADDNE           R2, R2, #4


    LDR             R3, [SP]
    ADD             R2, R2, #256
    ADD             R3, R3, #256

    STR             R5, [SP, #-4]!
    STR             R5, [SP, #-4]!
    STR             R5, [SP, #-4]!
    STR             R5, [SP, #-4]!

    BL              ixheaacd_sbr_imdct_using_fft

    ADD             SP, SP, #16

    LDR             R8, [SP]
    LDR             R12, [SP, #4]
    MOV             R3, #32
    LDR             R6, [R8]
    LDR             R11, [R8, #4]

    ADD             R9, R8, #252


    B               LOOP2_PRO

THIRTY2BAND:



    MOV             R2, R1
    MOV             R1, #16
    LDR             R3, [SP]

    STR             R5, [SP, #-4]!
    STR             R5, [SP, #-4]!
    STR             R5, [SP, #-4]!
    STR             R5, [SP, #-4]!

    BL              ixheaacd_sbr_imdct_using_fft
    ADD             SP, SP, #16

    MOV             R0, R4
    MOV             R1, #16
    ADD             R2, SP, #16


    AND             R6, R2, #7
    CMP             R6, #0
    ADDNE           R2, R2, #4


    LDR             R3, [SP]
    ADD             R2, R2, #256
    ADD             R3, R3, #256

    STR             R5, [SP, #-4]!
    STR             R5, [SP, #-4]!
    STR             R5, [SP, #-4]!
    STR             R5, [SP, #-4]!

    BL              ixheaacd_sbr_imdct_using_fft

    ADD             SP, SP, #16
    LDR             R8, [SP]
    LDR             R12, [SP, #4]
    LDR             R6, [R8]
    LDR             R11, [R8, #4]
    ADD             R9, R8, #124




LOOP2_PRO:


















    LDR             R4, [R12, #20]
    MOV             R6, R6, ASR #1
    STR             R6, [R8], #4
    LDR             R0, [R9]
    LDR             R2, [R4], #4
    MOV             R11, R11, ASR #1
    LDR             R1, [R9, #-4]
    RSB             R12, R11, #0
    STR             R12, [R9], #-4

    SMULWT          R14, R1, R2
    SMULWB          R6, R0, R2
    SMULWT          R12, R0, R2

    LDR             R0, [R9, #260]
    QSUB            R14, R14, R6
    SMLAWB          R12, R1, R2, R12

    LDR             R6, [R8, #252]
    LDR             R11, [R8, #256]
    STR             R14, [R8], #4
    STR             R12, [R9], #-4

    MOV             R6, R6, ASR #1
    MOV             R11, R11, ASR #1
    LDR             R1, [R9, #260]

    RSB             R6, R6, #0
    STR             R6, [R9, #264]
    STR             R11, [R8, #248]

    SMULWT          R12, R0, R2
    SMULWT          R14, R1, R2
    SMULWB          R6, R0, R2
    SMLAWB          R12, R1, R2, R12

    MOV             R11, #0
    QSUB            R14, R6, R14
    QSUB            R12, R11, R12
    LDR             R0, [R8, #4]
    LDR             R1, [R8]
    STR             R12, [R8, #252]
    STR             R14, [R9, #260]

    LDR             R5, [SP, #4]
    LDR             R5, [R5]
    MOV             R5, R5, ASR #2
    SUB             R5, R5, #2







LOOP2:
    SMULWB          R12, R0, R2
    SMULWB          R14, R1, R2
    SMULWT          R6, R0, R2
    SMLAWT          R12, R1, R2, R12

    LDR             R10, [R9]
    QSUB            R14, R14, R6
    LDR             R0, [R8, #260]
    LDR             R1, [R8, #256]
    STR             R12, [R8], #4
    STR             R14, [R9], #-4

    SMULWB          R3, R0, R2
    SMULWT          R6, R0, R2
    SMULWB          R14, R1, R2
    SMLAWT          R3, R1, R2, R3

    LDR             R7, [R9, #260]
    QSUB            R6, R6, R14
    QSUB            R3, R11, R3
    LDR             R2, [R4], #4
    LDR             R1, [R9]

    STR             R3, [R9, #260]
    STR             R6, [R8, #252]

    SMULWT          R12, R10, R2
    SMULWT          R14, R1, R2
    SMULWB          R6, R10, R2
    SMLAWB          R12, R1, R2, R12

    LDR             R1, [R9, #256]
    QSUB            R14, R14, R6

    STR             R12, [R9], #-4
    STR             R14, [R8], #4

    SUBS            R5, R5, #1

    SMULWT          R12, R7, R2
    SMULWT          R14, R1, R2
    SMULWB          R6, R7, R2
    SMLAWB          R12, R1, R2, R12

    LDRGE           R0, [R8, #4]
    LDRGE           R1, [R8]

    QSUB            R12, R11, R12
    QSUB            R14, R6, R14

    STR             R12, [R8, #252]
    STR             R14, [R9, #260]

    BGE             LOOP2
ENDLOOP2:

    ADD             SP, SP, #532
    LDMFD           sp!, {r4-r12, r15}