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         r5, #64
7317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MOV         r6, #0                       @L_tmp = 0
7417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MOV         r7, #1
7517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
7617299ab50ceb70d904e610e3b2d7fb2361a11e03James DongLOOP1:
7717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDR         r9,  [r14], #4
7817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	LDR         r10, [r14], #4
7917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	LDR         r11, [r14], #4
8017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	LDR         r12, [r14], #4
8117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	SMLABB      r6, r9, r9, r6               @L_tmp += (xn[i] * xn[i])
8217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	SMLATT      r6, r9, r9, r6               @L_tmp += (xn[i+1] * xn[i+1])
8317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        SMLABB      r6, r10, r10, r6
8417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	SMLATT      r6, r10, r10, r6
8517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	SMLABB      r6, r11, r11, r6
8617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        SMLATT      r6, r11, r11, r6
8717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        SMLABB      r6, r12, r12, r6
8817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        SMLATT      r6, r12, r12, r6
8917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        SUBS        r5, r5, #8
9017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        BNE         LOOP1
9117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
9217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD         r9, r7, r6, LSL #1           @L_tmp = (L_tmp << 1) + 1
9317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	CLZ         r7, r9
9417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	SUB         r6, r7, #1                   @exp = norm_l(L_tmp)
9517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        RSB         r7, r6, #32                  @exp = 32 - exp
9617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV         r6, r7, ASR #1
9717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	RSB         r7, r6, #0                   @scale = -(exp >> 1)
9817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
9917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        @loop for every possible period
10017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	@for(t = t_min@ t <= t_max@ t++)
10117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	@r7 --- scale r4 --- t_min r8 --- excf[]
10217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
10317299ab50ceb70d904e610e3b2d7fb2361a11e03James DongLOOPFOR:
10417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MOV         r5, #0                       @L_tmp  = 0
10517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV         r6, #0                       @L_tmp1 = 0
10617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV         r9, #64
10717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV         r12, r1                      @copy of xn[]
10817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD         r14, r13, #20                @copy of excf[]
10917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV         r8, #0x8000
11017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
11117299ab50ceb70d904e610e3b2d7fb2361a11e03James DongLOOPi:
11217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	LDR         r11, [r14], #4               @load excf[i], excf[i+1]
11317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDR         r10, [r12], #4               @load xn[i], xn[i+1]
11417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	SMLABB      r6, r11, r11, r6             @L_tmp1 += excf[i] * excf[i]
11517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	SMLATT      r6, r11, r11, r6             @L_tmp1 += excf[i+1] * excf[i+1]
11617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        SMLABB      r5, r10, r11, r5             @L_tmp += xn[i] * excf[i]
11717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	SMLATT      r5, r10, r11, r5             @L_tmp += xn[i+1] * excf[i+1]
11817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	LDR         r11, [r14], #4               @load excf[i+2], excf[i+3]
11917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	LDR         r10, [r12], #4               @load xn[i+2], xn[i+3]
12017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        SMLABB      r6, r11, r11, r6
12117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	SMLATT      r6, r11, r11, r6
12217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	SMLABB      r5, r10, r11, r5
12317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	SMLATT      r5, r10, r11, r5
12417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	SUBS        r9, r9, #4
12517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        BNE         LOOPi
12617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
12717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	@r5 --- L_tmp, r6 --- L_tmp1
12817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV         r10, #1
12917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD         r5, r10, r5, LSL #1          @L_tmp = (L_tmp << 1) + 1
13017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD         r6, r10, r6, LSL #1          @L_tmp1 = (L_tmp1 << 1) + 1
13117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
13217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	CLZ         r10, r5
13317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	CMP         r5, #0
13417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	RSBLT       r11, r5, #0
13517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	CLZLT       r10, r11
13617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	SUB         r10, r10, #1                 @exp = norm_l(L_tmp)
13717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
13817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV         r5, r5, LSL r10              @L_tmp = (L_tmp << exp)
13917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	RSB         r10, r10, #30                @exp_corr = 30 - exp
14017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV         r11, r5, ASR #16             @corr = extract_h(L_tmp)
14117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
14217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	CLZ         r5, r6
14317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	SUB         r5, r5, #1
14417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV         r6, r6, LSL r5               @L_tmp = (L_tmp1 << exp)
14517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	RSB         r5, r5, #30                  @exp_norm = 30 - exp
14617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
14717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	@r10 --- exp_corr, r11 --- corr
14817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	@r6  --- L_tmp, r5 --- exp_norm
14917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
15017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	@Isqrt_n(&L_tmp, &exp_norm)
15117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
15217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV         r14, r0
15317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV         r12, r1
15417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
15517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        STMFD       sp!, {r0 - r4, r7 - r12, r14}
15617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD         r1, sp, #4
15717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD         r0, sp, #0
15817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	STR         r6, [sp]
15917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	STRH        r5, [sp, #4]
16017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	BL          Isqrt_n
16117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	LDR         r6, [sp]
16217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	LDRSH       r5, [sp, #4]
16317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDMFD       sp!, {r0 - r4, r7 - r12, r14}
16417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV         r0, r14
16517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV         r1, r12
16617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
16717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
16817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV         r6, r6, ASR #16              @norm = extract_h(L_tmp)
16917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MUL         r12, r6, r11
17017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD         r12, r12, r12                @L_tmp = vo_L_mult(corr, norm)
17117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
17217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD         r6, r10, r5
17317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD         r6, r6, r7                   @exp_corr + exp_norm + scale
17417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
17517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        CMP         r6, #0
17617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        RSBLT       r6, r6, #0
17717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOVLT       r12, r12, ASR r6
17817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MOVGT       r12, r12, LSL r6             @L_tmp = L_shl(L_tmp, exp_corr + exp_norm + scale)
17917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
18017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        ADD         r12, r12, r8
18117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        MOV         r12, r12, ASR #16            @vo_round(L_tmp)
18217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
18317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDR         r5, [r13, #CORR_NORM]        @ get corr_norm address
18417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	LDR         r6, [r13, #T_MAX]            @ get t_max
18517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD         r10, r5, r4, LSL #1          @ get corr_norm[t] address
18617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	STRH        r12, [r10]                   @ corr_norm[t] = vo_round(L_tmp)
18717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
18817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	CMP         r4, r6
18917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	BEQ         Norm_corr_asm_end
19017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
19117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD         r4, r4, #1                   @ t_min ++
19217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
19317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	RSB         r5, r4, #0                   @ k
19417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
19517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV         r6, #63                      @ i = 63
19617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV         r8, r0                       @ exc[]
19717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV         r9, r2                       @ h[]
19817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD         r10, r13, #20                @ excf[]
19917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
20017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD         r8, r8, r5, LSL #1           @ exc[k] address
20117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD         r9, r9, r6, LSL #1           @ h[i] address
20217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD         r10, r10, r6, LSL #1         @ excf[i] address
20317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	LDRSH       r11, [r8]                    @ tmp = exc[k]
20417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
20517299ab50ceb70d904e610e3b2d7fb2361a11e03James DongLOOPK:
20617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDRSH       r8, [r9], #-2                @ load h[i]
20717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	LDRSH       r12, [r10, #-2]              @ load excf[i - 1]
20817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MUL         r14, r11, r8
20917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV         r8, r14, ASR #15
21017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	ADD         r14, r8, r12
21117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	STRH        r14, [r10], #-2
21217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	SUBS        r6, r6, #1
21317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	BGT         LOOPK
21417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
21517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	LDRSH       r8, [r9]                     @ load h[0]
21617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MUL         r14, r11, r8
21717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDR         r6, [r13, #T_MAX]            @ get t_max
21817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	MOV         r8, r14, ASR #15
21917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	STRH        r8, [r10]
22017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
22117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	CMP         r4, r6
22217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	BLE         LOOPFOR
22317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
22417299ab50ceb70d904e610e3b2d7fb2361a11e03James DongNorm_corr_asm_end:
22517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
22617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        ADD            r13, r13, #voSTACK
22717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        LDMFD          r13!, {r4 - r12, r15}
22817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
22917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        .END
23017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
23117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
232