1956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@/*
2956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** Copyright 2003-2010, VisualOn, Inc.
3956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ **
4956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** Licensed under the Apache License, Version 2.0 (the "License");
5956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** you may not use this file except in compliance with the License.
6956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** You may obtain a copy of the License at
7956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ **
8956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ **     http://www.apache.org/licenses/LICENSE-2.0
9956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ **
10956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** Unless required by applicable law or agreed to in writing, software
11956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** distributed under the License is distributed on an "AS IS" BASIS,
12956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** See the License for the specific language governing permissions and
14956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** limitations under the License.
15956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ */
16956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
17956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@static void Norm_Corr (Word16 exc[],                    /* (i)     : excitation buffer          */
18956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@                       Word16 xn[],                     /* (i)     : target vector              */
19956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@                       Word16 h[],                      /* (i) Q15 : impulse response of synth/wgt filters */
20956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@                       Word16 L_subfr,                  /* (i)     : sub-frame length */
21956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@                       Word16 t_min,                    /* (i)     : minimum value of pitch lag.   */
22956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@                       Word16 t_max,                    /* (i)     : maximum value of pitch lag.   */
23956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@                       Word16 corr_norm[])              /* (o) Q15 : normalized correlation    */
24956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@
25956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
26956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ r0 --- exc[]
27956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ r1 --- xn[]
28956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ r2 --- h[]
29956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ r3 --- L_subfr
30956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ r4 --- t_min
31956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ r5 --- t_max
32956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ r6 --- corr_norm[]
33956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
34956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
35b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	.section  .text
36b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        .global   Norm_corr_asm
37956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        .extern   Convolve_asm
38956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        .extern   Isqrt_n
39956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@******************************
40956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ constant
41956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@******************************
42956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong.equ         EXC           ,   0
43956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong.equ         XN            ,   4
44956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong.equ         H             ,   8
45956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong.equ         L_SUBFR       ,   12
46956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong.equ         voSTACK       ,   172
47956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong.equ         T_MIN         ,   212
48956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong.equ         T_MAX         ,   216
49956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong.equ         CORR_NORM     ,   220
50b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
51956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongNorm_corr_asm:
52956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
53b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        STMFD      r13!, {r4 - r12, r14}
54956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        SUB        r13, r13, #voSTACK
55b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
56956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        ADD        r8, r13, #20                 @get the excf[L_SUBFR]
57956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDR        r4, [r13, #T_MIN]            @get t_min
58956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        RSB        r11, r4, #0                  @k = -t_min
59b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        ADD        r5, r0, r11, LSL #1          @get the &exc[k]
60b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
61956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        @transfer Convolve function
62956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        STMFD       sp!, {r0 - r3}
63956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MOV         r0, r5
64956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MOV         r1, r2
65956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MOV         r2, r8                       @r2 --- excf[]
66956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        BL          Convolve_asm
67956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDMFD       sp!, {r0 - r3}
68956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
69956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        @ r8 --- excf[]
70956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
71b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	MOV         r14, r1                       @copy xn[] address
72956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MOV         r5, #64
73956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MOV         r6, #0                       @L_tmp = 0
74956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MOV         r7, #1
75956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
76956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongLOOP1:
77956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDR         r9,  [r14], #4
78956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	LDR         r10, [r14], #4
79956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	LDR         r11, [r14], #4
80956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	LDR         r12, [r14], #4
81956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	SMLABB      r6, r9, r9, r6               @L_tmp += (xn[i] * xn[i])
82956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	SMLATT      r6, r9, r9, r6               @L_tmp += (xn[i+1] * xn[i+1])
83956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        SMLABB      r6, r10, r10, r6
84956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	SMLATT      r6, r10, r10, r6
85956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	SMLABB      r6, r11, r11, r6
86956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        SMLATT      r6, r11, r11, r6
87956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        SMLABB      r6, r12, r12, r6
88956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        SMLATT      r6, r12, r12, r6
89956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        SUBS        r5, r5, #8
90956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        BNE         LOOP1
91956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
92956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD         r9, r7, r6, LSL #1           @L_tmp = (L_tmp << 1) + 1
93956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	CLZ         r7, r9
94956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	SUB         r6, r7, #1                   @exp = norm_l(L_tmp)
95956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        RSB         r7, r6, #32                  @exp = 32 - exp
96b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	MOV         r6, r7, ASR #1
97956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	RSB         r7, r6, #0                   @scale = -(exp >> 1)
98b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
99956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        @loop for every possible period
100956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	@for(t = t_min@ t <= t_max@ t++)
101956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	@r7 --- scale r4 --- t_min r8 --- excf[]
102956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
103b676a05348e4c516fa8b57e33b10548e6142c3f8Mans RullgardLOOPFOR:
104956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MOV         r5, #0                       @L_tmp  = 0
105956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV         r6, #0                       @L_tmp1 = 0
106b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	MOV         r9, #64
107956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV         r12, r1                      @copy of xn[]
108956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD         r14, r13, #20                @copy of excf[]
109956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV         r8, #0x8000
110b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
111956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongLOOPi:
112956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	LDR         r11, [r14], #4               @load excf[i], excf[i+1]
113956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDR         r10, [r12], #4               @load xn[i], xn[i+1]
114956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	SMLABB      r6, r11, r11, r6             @L_tmp1 += excf[i] * excf[i]
115956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	SMLATT      r6, r11, r11, r6             @L_tmp1 += excf[i+1] * excf[i+1]
116956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        SMLABB      r5, r10, r11, r5             @L_tmp += xn[i] * excf[i]
117956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	SMLATT      r5, r10, r11, r5             @L_tmp += xn[i+1] * excf[i+1]
118956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	LDR         r11, [r14], #4               @load excf[i+2], excf[i+3]
119956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	LDR         r10, [r12], #4               @load xn[i+2], xn[i+3]
120956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        SMLABB      r6, r11, r11, r6
121956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	SMLATT      r6, r11, r11, r6
122956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	SMLABB      r5, r10, r11, r5
123956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	SMLATT      r5, r10, r11, r5
124956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	SUBS        r9, r9, #4
125956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        BNE         LOOPi
126956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
127956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	@r5 --- L_tmp, r6 --- L_tmp1
128956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV         r10, #1
129956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD         r5, r10, r5, LSL #1          @L_tmp = (L_tmp << 1) + 1
130956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD         r6, r10, r6, LSL #1          @L_tmp1 = (L_tmp1 << 1) + 1
131b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
132b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	CLZ         r10, r5
133956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	CMP         r5, #0
134956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	RSBLT       r11, r5, #0
135956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	CLZLT       r10, r11
136956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	SUB         r10, r10, #1                 @exp = norm_l(L_tmp)
137b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
138956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV         r5, r5, LSL r10              @L_tmp = (L_tmp << exp)
139956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	RSB         r10, r10, #30                @exp_corr = 30 - exp
140956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV         r11, r5, ASR #16             @corr = extract_h(L_tmp)
141956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
142956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	CLZ         r5, r6
143956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	SUB         r5, r5, #1
144956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV         r6, r6, LSL r5               @L_tmp = (L_tmp1 << exp)
145956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	RSB         r5, r5, #30                  @exp_norm = 30 - exp
146956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
147956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	@r10 --- exp_corr, r11 --- corr
148956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	@r6  --- L_tmp, r5 --- exp_norm
149956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
150956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	@Isqrt_n(&L_tmp, &exp_norm)
151956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
152956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV         r14, r0
153b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	MOV         r12, r1
154956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
155956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        STMFD       sp!, {r0 - r4, r7 - r12, r14}
156956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD         r1, sp, #4
157956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD         r0, sp, #0
158956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	STR         r6, [sp]
159956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	STRH        r5, [sp, #4]
160956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	BL          Isqrt_n
161956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	LDR         r6, [sp]
162956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	LDRSH       r5, [sp, #4]
163956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDMFD       sp!, {r0 - r4, r7 - r12, r14}
164956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV         r0, r14
165956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV         r1, r12
166956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
167956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
168956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV         r6, r6, ASR #16              @norm = extract_h(L_tmp)
169956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MUL         r12, r6, r11
170956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD         r12, r12, r12                @L_tmp = vo_L_mult(corr, norm)
171b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
172956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD         r6, r10, r5
173956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD         r6, r6, r7                   @exp_corr + exp_norm + scale
174956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
175956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        CMP         r6, #0
176956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        RSBLT       r6, r6, #0
177956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOVLT       r12, r12, ASR r6
178956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MOVGT       r12, r12, LSL r6             @L_tmp = L_shl(L_tmp, exp_corr + exp_norm + scale)
179956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
180956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        ADD         r12, r12, r8
181956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MOV         r12, r12, ASR #16            @vo_round(L_tmp)
182956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
183956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDR         r5, [r13, #CORR_NORM]        @ get corr_norm address
184956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	LDR         r6, [r13, #T_MAX]            @ get t_max
185956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD         r10, r5, r4, LSL #1          @ get corr_norm[t] address
186956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	STRH        r12, [r10]                   @ corr_norm[t] = vo_round(L_tmp)
187956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
188956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	CMP         r4, r6
189956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	BEQ         Norm_corr_asm_end
190b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
191956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD         r4, r4, #1                   @ t_min ++
192b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
193956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	RSB         r5, r4, #0                   @ k
194956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
195956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV         r6, #63                      @ i = 63
196956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV         r8, r0                       @ exc[]
197956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV         r9, r2                       @ h[]
198956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD         r10, r13, #20                @ excf[]
199956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
200956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD         r8, r8, r5, LSL #1           @ exc[k] address
201956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD         r9, r9, r6, LSL #1           @ h[i] address
202956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD         r10, r10, r6, LSL #1         @ excf[i] address
203956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	LDRSH       r11, [r8]                    @ tmp = exc[k]
204956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
205956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongLOOPK:
206956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDRSH       r8, [r9], #-2                @ load h[i]
207956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	LDRSH       r12, [r10, #-2]              @ load excf[i - 1]
208956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MUL         r14, r11, r8
209956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV         r8, r14, ASR #15
210956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD         r14, r8, r12
211956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	STRH        r14, [r10], #-2
212956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	SUBS        r6, r6, #1
213956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	BGT         LOOPK
214956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
215956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	LDRSH       r8, [r9]                     @ load h[0]
216956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MUL         r14, r11, r8
217956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDR         r6, [r13, #T_MAX]            @ get t_max
218956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV         r8, r14, ASR #15
219b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	STRH        r8, [r10]
220956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
221956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	CMP         r4, r6
222956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	BLE         LOOPFOR
223956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
224b676a05348e4c516fa8b57e33b10548e6142c3f8Mans RullgardNorm_corr_asm_end:
225b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
226b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        ADD            r13, r13, #voSTACK
227956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDMFD          r13!, {r4 - r12, r15}
228b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
2293f7149c1c8f211c9ef5eb6c4012f078d9d08387bChih-Hung Hsieh        .end
230956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
231956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
232