117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@/*
217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ ** Copyright 2003-2010, VisualOn, Inc.
317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ **
417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ ** Licensed under the Apache License, Version 2.0 (the "License");
517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ ** you may not use this file except in compliance with the License.
617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ ** You may obtain a copy of the License at
717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ **
817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ **     http://www.apache.org/licenses/LICENSE-2.0
917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ **
1017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ ** Unless required by applicable law or agreed to in writing, software
1117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ ** distributed under the License is distributed on an "AS IS" BASIS,
1217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ ** See the License for the specific language governing permissions and
1417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ ** limitations under the License.
1517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ */
1617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@
1717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@static void Norm_Corr (Word16 exc[],                    /* (i)     : excitation buffer          */
1817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@                       Word16 xn[],                     /* (i)     : target vector              */
1917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@                       Word16 h[],                      /* (i) Q15 : impulse response of synth/wgt filters */
2017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@                       Word16 L_subfr,                  /* (i)     : sub-frame length */
2117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@                       Word16 t_min,                    /* (i)     : minimum value of pitch lag.   */
2217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@                       Word16 t_max,                    /* (i)     : maximum value of pitch lag.   */
2317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@                       Word16 corr_norm[])              /* (o) Q15 : normalized correlation    */
2417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@
2517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
2617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ r0 --- exc[]
2717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ r1 --- xn[]
2817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ r2 --- h[]
2917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ r3 --- L_subfr
3017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ r4 --- t_min
3117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ r5 --- t_max
3217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ r6 --- corr_norm[]
3317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
3417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
3517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	.section  .text
3617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        .global    Norm_corr_asm
3717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        .extern    Convolve_asm
3817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        .extern    Isqrt_n
3917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@******************************
4017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@ constant
4117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong@******************************
4217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong.equ    EXC               , 0
4317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong.equ    XN                , 4
4417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong.equ    H                 , 8
4517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong.equ    L_SUBFR           , 12
4617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong.equ    voSTACK           , 172
4717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong.equ    T_MIN             , 212
4817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong.equ    T_MAX             , 216
4917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong.equ    CORR_NORM         , 220
5017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
5117299ab50ceb70d904e610e3b2d7fb2361a11e03James DongNorm_corr_asm:
5217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
5317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        STMFD          r13!, {r4 - r12, r14}
5417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        SUB            r13, r13, #voSTACK
5517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
5617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        ADD            r8, r13, #20                 @get the excf[L_SUBFR]
5717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDR            r4, [r13, #T_MIN]            @get t_min
5817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        RSB            r11, r4, #0                  @k = -t_min
5917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        ADD            r5, r0, r11, LSL #1          @get the &exc[k]
6017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
6117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        @transfer Convolve function
6217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        STMFD          sp!, {r0 - r3}
6317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MOV            r0, r5
6417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MOV            r1, r2
6517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MOV            r2, r8                       @r2 --- excf[]
6617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        BL             Convolve_asm
6717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDMFD          sp!, {r0 - r3}
6817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
6917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        @ r8 --- excf[]
7017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
7117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV            r14, r1                       @copy xn[] address
7217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MOV            r7, #1
7317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	VLD1.S16       {Q0, Q1}, [r14]!
7417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	VLD1.S16       {Q2, Q3}, [r14]!
7517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	VLD1.S16       {Q4, Q5}, [r14]!
7617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	VLD1.S16       {Q6, Q7}, [r14]!
7717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
7817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMULL.S16      Q10, D0, D0
7917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16      Q10, D1, D1
8017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16      Q10, D2, D2
8117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16      Q10, D3, D3
8217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16      Q10, D4, D4
8317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16      Q10, D5, D5
8417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16      Q10, D6, D6
8517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16      Q10, D7, D7
8617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16      Q10, D8, D8
8717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16      Q10, D9, D9
8817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	VMLAL.S16      Q10, D10, D10
8917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	VMLAL.S16      Q10, D11, D11
9017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	VMLAL.S16      Q10, D12, D12
9117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	VMLAL.S16      Q10, D13, D13
9217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	VMLAL.S16      Q10, D14, D14
9317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	VMLAL.S16      Q10, D15, D15
9417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
9517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VQADD.S32      D20, D20, D21
9617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMOV.S32       r9,  D20[0]
9717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMOV.S32       r10, D20[1]
9817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        QADD           r6, r9, r10
9917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	QADD           r6, r6, r6
10017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        QADD           r9, r6, r7                   @L_tmp = (L_tmp << 1) + 1;
10117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	CLZ            r7, r9
10217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	SUB            r6, r7, #1                   @exp = norm_l(L_tmp)
10317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        RSB            r7, r6, #32                  @exp = 32 - exp
10417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV            r6, r7, ASR #1
10517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	RSB            r7, r6, #0                   @scale = -(exp >> 1)
10617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
10717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        @loop for every possible period
10817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	@for(t = t_min@ t <= t_max@ t++)
10917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	@r7 --- scale r4 --- t_min r8 --- excf[]
11017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
11117299ab50ceb70d904e610e3b2d7fb2361a11e03James DongLOOPFOR:
11217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD            r14, r13, #20                @copy of excf[]
11317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV            r12, r1                      @copy of xn[]
11417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV            r8, #0x8000
11517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
11617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VLD1.S16       {Q0, Q1}, [r14]!                 @ load 16 excf[]
11717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VLD1.S16       {Q2, Q3}, [r14]!                 @ load 16 excf[]
11817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VLD1.S16       {Q4, Q5}, [r12]!                 @ load 16 x[]
11917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	VLD1.S16       {Q6, Q7}, [r12]!                 @ load 16 x[]
12017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMULL.S16    Q10, D0, D0                      @L_tmp1 += excf[] * excf[]
12117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMULL.S16    Q11, D0, D8                      @L_tmp  += x[] * excf[]
12217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q10, D1, D1
12317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q11, D1, D9
12417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q10, D2, D2
12517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q11, D2, D10
12617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q10, D3, D3
12717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q11, D3, D11
12817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q10, D4, D4
12917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q11, D4, D12
13017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q10, D5, D5
13117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q11, D5, D13
13217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q10, D6, D6
13317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q11, D6, D14
13417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q10, D7, D7
13517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q11, D7, D15
13617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
13717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	VLD1.S16       {Q0, Q1}, [r14]!                 @ load 16 excf[]
13817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VLD1.S16       {Q2, Q3}, [r14]!                 @ load 16 excf[]
13917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VLD1.S16       {Q4, Q5}, [r12]!                 @ load 16 x[]
14017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VLD1.S16       {Q6, Q7}, [r12]!                 @ load 16 x[]
14117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q10, D0, D0
14217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q11, D0, D8
14317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q10, D1, D1
14417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q11, D1, D9
14517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q10, D2, D2
14617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q11, D2, D10
14717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q10, D3, D3
14817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q11, D3, D11
14917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q10, D4, D4
15017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q11, D4, D12
15117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q10, D5, D5
15217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q11, D5, D13
15317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q10, D6, D6
15417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q11, D6, D14
15517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q10, D7, D7
15617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMLAL.S16    Q11, D7, D15
15717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
15817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VQADD.S32      D20, D20, D21
15917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VQADD.S32      D22, D22, D23
16017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
16117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	VPADD.S32      D20, D20, D20                   @D20[0] --- L_tmp1 << 1
16217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	VPADD.S32      D22, D22, D22                   @D22[0] --- L_tmp << 1
16317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
16417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	VMOV.S32       r6, D20[0]
16517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        VMOV.S32       r5, D22[0]
16617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
16717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	@r5 --- L_tmp, r6 --- L_tmp1
16817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV            r10, #1
16917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD            r5, r10, r5, LSL #1                     @L_tmp = (L_tmp << 1) + 1
17017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD            r6, r10, r6, LSL #1                     @L_tmp1 = (L_tmp1 << 1) + 1
17117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
17217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	CLZ            r10, r5
17317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	CMP            r5, #0
17417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	RSBLT          r11, r5, #0
17517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	CLZLT          r10, r11
17617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	SUB            r10, r10, #1                 @exp = norm_l(L_tmp)
17717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
17817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV            r5, r5, LSL r10              @L_tmp = (L_tmp << exp)
17917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	RSB            r10, r10, #30                @exp_corr = 30 - exp
18017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV            r11, r5, ASR #16             @corr = extract_h(L_tmp)
18117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
18217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	CLZ            r5, r6
18317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	SUB            r5, r5, #1
18417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV            r6, r6, LSL r5               @L_tmp = (L_tmp1 << exp)
18517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	RSB            r5, r5, #30                  @exp_norm = 30 - exp
18617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
18717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	@r10 --- exp_corr, r11 --- corr
18817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	@r6  --- L_tmp, r5 --- exp_norm
18917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
19017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	@Isqrt_n(&L_tmp, &exp_norm)
19117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
19217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV            r14, r0
19317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV            r12, r1
19417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
19517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        STMFD          sp!, {r0 - r4, r7 - r12, r14}
19617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD            r1, sp, #4
19717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD            r0, sp, #0
19817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	STR            r6, [sp]
19917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	STRH           r5, [sp, #4]
20017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	BL             Isqrt_n
20117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	LDR            r6, [sp]
20217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	LDRSH          r5, [sp, #4]
20317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDMFD          sp!, {r0 - r4, r7 - r12, r14}
20417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV            r0, r14
20517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV            r1, r12
20617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
20717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
20817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV            r6, r6, ASR #16              @norm = extract_h(L_tmp)
20917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MUL            r12, r6, r11
21017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD            r12, r12, r12                @L_tmp = vo_L_mult(corr, norm)
21117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
21217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD            r6, r10, r5
21317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD            r6, r6, r7                   @exp_corr + exp_norm + scale
21417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
21517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        CMP            r6, #0
21617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        RSBLT          r6, r6, #0
21717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOVLT          r12, r12, ASR r6
21817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MOVGT          r12, r12, LSL r6             @L_tmp = L_shl(L_tmp, exp_corr + exp_norm + scale)
21917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
22017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        ADD            r12, r12, r8
22117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MOV            r12, r12, ASR #16            @vo_round(L_tmp)
22217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
22317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDR            r5, [r13, #CORR_NORM]        @ get corr_norm address
22417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	LDR            r6, [r13, #T_MAX]            @ get t_max
22517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD            r10, r5, r4, LSL #1          @ get corr_norm[t] address
22617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	STRH           r12, [r10]                   @ corr_norm[t] = vo_round(L_tmp)
22717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
22817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	CMP            r4, r6
22917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	BEQ            Norm_corr_asm_end
23017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
23117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD            r4, r4, #1                   @ t_min ++
23217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	RSB            r5, r4, #0                   @ k
23317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
23417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV            r6, #63                      @ i = 63
23517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV            r8, r0                       @ exc[]
23617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV            r9, r2                       @ h[]
23717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD            r10, r13, #20                @ excf[]
23817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
23917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD            r8, r8, r5, LSL #1           @ exc[k] address
24017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD            r9, r9, r6, LSL #1           @ h[i] address
24117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD            r10, r10, r6, LSL #1         @ excf[i] address
24217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	LDRSH          r11, [r8]                    @ tmp = exc[k]
24317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
24417299ab50ceb70d904e610e3b2d7fb2361a11e03James DongLOOPK:
24517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDRSH          r8, [r9], #-2                @ load h[i]
24617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	LDRSH          r12, [r10, #-2]              @ load excf[i - 1]
24717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MUL            r14, r11, r8
24817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV            r8, r14, ASR #15
24917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD            r14, r8, r12
25017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	STRH           r14, [r10], #-2
25117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	SUBS           r6, r6, #1
25217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	BGT            LOOPK
25317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
25417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	LDRSH          r8, [r9]                     @ load h[0]
25517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MUL            r14, r11, r8
25617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDR            r6, [r13, #T_MAX]            @ get t_max
25717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV            r8, r14, ASR #15
25817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	STRH           r8, [r10]
25917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
26017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	CMP            r4, r6
26117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	BLE            LOOPFOR
26217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
26317299ab50ceb70d904e610e3b2d7fb2361a11e03James DongNorm_corr_asm_end:
26417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
26517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        ADD            r13, r13, #voSTACK
26617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDMFD          r13!, {r4 - r12, r15}
26717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
26817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        .END
26917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
27017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
271