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

ixheaacd_enery_calc_per_subband_armv7:
    STMFD           sp!, {r4-r12, r14}

    LDR             r10, [sp, #0x34]
    MOV             R4, R2
    MOV             R5, R3
    MOV             R2, R0
    MOV             R3, R1
    SUB             R12, R3, R2
    LDR             r10, [r10, #0]
    ADD             r10, r10, r12, LSL #1
    LDRSH           r9, [r10, #0x20]
    LDR             R1, [sp, #0x28]
    MOV             R1, R1, LSL #1

    SUBS            R5, R5, R4
    LDR             R0, [sp, #0x38]
    LDR             R7, [sp, #0x2C]


    LDR             R8, [sp, #0x30]

    BLE             ENDCALC


    MOVS            R8, R8
    BEQ             HQ_PART


    ADD             R0, R0, R4, LSL #2
    ADD             R0, R0, R2, LSL #8
    SUB             R2, R3, R2
    MOV             R10, #20


    B               LP_SBR_LOOP

HQ_PART:
    ADD             R0, R0, R4, LSL #2
    ADD             R0, R0, R2, LSL #9
    SUB             R2, R3, R2
    MOV             R2, R2, LSL #1
    MOV             R10, #21
    SUB             R1, R1, #1



LP_SBR_LOOP:

    MOV             R6, #0
    MOV             R8, R0
    MOVS            R11, R2
    BLE             STORE_ZEROES
    MOV             R6, #1

LOOP1_CALC_MAX:
    LDR             R4, [R8], #0x100
    LDR             R12, [R8], #0x100
    EOR             R4, R4, R4, ASR #31
    ORR             R6, R6, R4
    EOR             R12, R12, R12, ASR #31
    SUBS            R11, R11, #2
    ORRGE           R6, R6, R12
    BGT             LOOP1_CALC_MAX

CALC_NORM:

    CLZ             R6, R6
    RSBS            R14, R6, R10
    MOV             R6, #0
    MOV             R8, R0
    MOV             R11, R2
    BLE             NEG_SHIFT

LOOP2_APPLY_POS_SHIFT:
    LDR             R4, [R8], #0x100
    LDR             R12, [R8], #0x100
    SUBS            R11, R11, #2
    MOV             R4, R4, ASR R14
    SMLABB          R6, R4, R4, R6
    MOV             R12, R12, ASR R14
    SMLABB          R6, R12, R12, R6
    BGT             LOOP2_APPLY_POS_SHIFT

    B               CONVERT_TO_MANT_EXP

NEG_SHIFT:
    RSB             R12, R14, #0

LOOP2_APPLY_NEG_SHIFT:
    LDR             R4, [R8], #0x100
    LDR             R3, [R8], #0x100
    SUBS            R11, R11, #2
    MOV             R4, R4, LSL R12
    SMLABB          R6, R4, R4, R6
    MOV             R3, R3, LSL R12
    SMLABB          R6, R3, R3, R6
    BGT             LOOP2_APPLY_NEG_SHIFT


CONVERT_TO_MANT_EXP:
    SUB             R14, R14, #23
    ADD             R0, R0, #4
    MOVS            R6, R6
    BEQ             STORE_ZEROES

    CLZ             R12, R6
    RSB             R12, R12, #17
    MOV             R4, R6, ASR  R12

    SMULBB          R11, R4, R9
    ADD             R12, R12, R14, LSL#1

    MOV             R11, R11, ASR #15
    CMP             R11, #0x00008000
    MVNEQ           R11, R11
    STRH            R11, [R7], #2
    ADD             R11, R1, R12
    STRH            R11, [R7], #2
    SUBS            R5, R5, #1
    BGT             LP_SBR_LOOP

    B               ENDCALC

STORE_ZEROES:
    STR             R6, [R7], #4
    SUBS            R5, R5, #1
    BGT             LP_SBR_LOOP

ENDCALC:

    LDMFD           sp!, {r4-r12, r15}