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
35956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	.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            r7, #1
73956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	VLD1.S16       {Q0, Q1}, [r14]!
74956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	VLD1.S16       {Q2, Q3}, [r14]!
75956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	VLD1.S16       {Q4, Q5}, [r14]!
76956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	VLD1.S16       {Q6, Q7}, [r14]!
77956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
78956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMULL.S16      Q10, D0, D0
79956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16      Q10, D1, D1
80956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16      Q10, D2, D2
81956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16      Q10, D3, D3
82956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16      Q10, D4, D4
83956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16      Q10, D5, D5
84956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16      Q10, D6, D6
85956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16      Q10, D7, D7
86956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16      Q10, D8, D8
87956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16      Q10, D9, D9
88956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	VMLAL.S16      Q10, D10, D10
89956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	VMLAL.S16      Q10, D11, D11
90956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	VMLAL.S16      Q10, D12, D12
91956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	VMLAL.S16      Q10, D13, D13
92956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	VMLAL.S16      Q10, D14, D14
93956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	VMLAL.S16      Q10, D15, D15
94956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
95956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VQADD.S32      D20, D20, D21
96956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMOV.S32       r9,  D20[0]
97956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMOV.S32       r10, D20[1]
98b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        QADD           r6, r9, r10
99956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	QADD           r6, r6, r6
100956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        QADD           r9, r6, r7                   @L_tmp = (L_tmp << 1) + 1;
101956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	CLZ            r7, r9
102956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	SUB            r6, r7, #1                   @exp = norm_l(L_tmp)
103956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        RSB            r7, r6, #32                  @exp = 32 - exp
104b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	MOV            r6, r7, ASR #1
105956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	RSB            r7, r6, #0                   @scale = -(exp >> 1)
106b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
107956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        @loop for every possible period
108956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	@for(t = t_min@ t <= t_max@ t++)
109956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	@r7 --- scale r4 --- t_min r8 --- excf[]
110956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
111b676a05348e4c516fa8b57e33b10548e6142c3f8Mans RullgardLOOPFOR:
112956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD            r14, r13, #20                @copy of excf[]
113956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV            r12, r1                      @copy of xn[]
114956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV            r8, #0x8000
115956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
116956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VLD1.S16       {Q0, Q1}, [r14]!                 @ load 16 excf[]
117b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        VLD1.S16       {Q2, Q3}, [r14]!                 @ load 16 excf[]
118956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VLD1.S16       {Q4, Q5}, [r12]!                 @ load 16 x[]
119956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	VLD1.S16       {Q6, Q7}, [r12]!                 @ load 16 x[]
120956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMULL.S16    Q10, D0, D0                      @L_tmp1 += excf[] * excf[]
121b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        VMULL.S16    Q11, D0, D8                      @L_tmp  += x[] * excf[]
122956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q10, D1, D1
123956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q11, D1, D9
124956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q10, D2, D2
125b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        VMLAL.S16    Q11, D2, D10
126956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q10, D3, D3
127956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q11, D3, D11
128956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q10, D4, D4
129956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q11, D4, D12
130956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q10, D5, D5
131956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q11, D5, D13
132956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q10, D6, D6
133956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q11, D6, D14
134956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q10, D7, D7
135956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q11, D7, D15
136956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
137956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	VLD1.S16       {Q0, Q1}, [r14]!                 @ load 16 excf[]
138956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VLD1.S16       {Q2, Q3}, [r14]!                 @ load 16 excf[]
139956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VLD1.S16       {Q4, Q5}, [r12]!                 @ load 16 x[]
140956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VLD1.S16       {Q6, Q7}, [r12]!                 @ load 16 x[]
141956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q10, D0, D0
142956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q11, D0, D8
143956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q10, D1, D1
144956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q11, D1, D9
145956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q10, D2, D2
146b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        VMLAL.S16    Q11, D2, D10
147956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q10, D3, D3
148956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q11, D3, D11
149956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q10, D4, D4
150956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q11, D4, D12
151956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q10, D5, D5
152956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q11, D5, D13
153956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q10, D6, D6
154956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q11, D6, D14
155956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q10, D7, D7
156956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMLAL.S16    Q11, D7, D15
157956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
158956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VQADD.S32      D20, D20, D21
159956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VQADD.S32      D22, D22, D23
160956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
161956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	VPADD.S32      D20, D20, D20                   @D20[0] --- L_tmp1 << 1
162956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	VPADD.S32      D22, D22, D22                   @D22[0] --- L_tmp << 1
163956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
164956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	VMOV.S32       r6, D20[0]
165b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        VMOV.S32       r5, D22[0]
166956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
167956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	@r5 --- L_tmp, r6 --- L_tmp1
168956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV            r10, #1
169956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD            r5, r10, r5, LSL #1                     @L_tmp = (L_tmp << 1) + 1
170956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD            r6, r10, r6, LSL #1                     @L_tmp1 = (L_tmp1 << 1) + 1
171b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
172b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	CLZ            r10, r5
173956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	CMP            r5, #0
174956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	RSBLT          r11, r5, #0
175956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	CLZLT          r10, r11
176956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	SUB            r10, r10, #1                 @exp = norm_l(L_tmp)
177b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
178956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV            r5, r5, LSL r10              @L_tmp = (L_tmp << exp)
179956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	RSB            r10, r10, #30                @exp_corr = 30 - exp
180956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV            r11, r5, ASR #16             @corr = extract_h(L_tmp)
181956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
182956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	CLZ            r5, r6
183956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	SUB            r5, r5, #1
184956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV            r6, r6, LSL r5               @L_tmp = (L_tmp1 << exp)
185956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	RSB            r5, r5, #30                  @exp_norm = 30 - exp
186956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
187956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	@r10 --- exp_corr, r11 --- corr
188956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	@r6  --- L_tmp, r5 --- exp_norm
189956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
190956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	@Isqrt_n(&L_tmp, &exp_norm)
191956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
192956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV            r14, r0
193b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	MOV            r12, r1
194956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
195956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        STMFD          sp!, {r0 - r4, r7 - r12, r14}
196956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD            r1, sp, #4
197956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD            r0, sp, #0
198956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	STR            r6, [sp]
199956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	STRH           r5, [sp, #4]
200956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	BL             Isqrt_n
201956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	LDR            r6, [sp]
202956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	LDRSH          r5, [sp, #4]
203956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDMFD          sp!, {r0 - r4, r7 - r12, r14}
204956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV            r0, r14
205956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV            r1, r12
206956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
207956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
208956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV            r6, r6, ASR #16              @norm = extract_h(L_tmp)
209956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MUL            r12, r6, r11
210956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD            r12, r12, r12                @L_tmp = vo_L_mult(corr, norm)
211b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
212956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD            r6, r10, r5
213956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD            r6, r6, r7                   @exp_corr + exp_norm + scale
214956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
215956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        CMP            r6, #0
216956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        RSBLT          r6, r6, #0
217956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOVLT          r12, r12, ASR r6
218956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MOVGT          r12, r12, LSL r6             @L_tmp = L_shl(L_tmp, exp_corr + exp_norm + scale)
219956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
220956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        ADD            r12, r12, r8
221956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MOV            r12, r12, ASR #16            @vo_round(L_tmp)
222956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
223956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDR            r5, [r13, #CORR_NORM]        @ get corr_norm address
224956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	LDR            r6, [r13, #T_MAX]            @ get t_max
225956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD            r10, r5, r4, LSL #1          @ get corr_norm[t] address
226956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	STRH           r12, [r10]                   @ corr_norm[t] = vo_round(L_tmp)
227956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
228956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	CMP            r4, r6
229956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	BEQ            Norm_corr_asm_end
230b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
231b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	ADD            r4, r4, #1                   @ t_min ++
232956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	RSB            r5, r4, #0                   @ k
233956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
234956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV            r6, #63                      @ i = 63
235956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV            r8, r0                       @ exc[]
236956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV            r9, r2                       @ h[]
237956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD            r10, r13, #20                @ excf[]
238956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
239956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD            r8, r8, r5, LSL #1           @ exc[k] address
240956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD            r9, r9, r6, LSL #1           @ h[i] address
241956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD            r10, r10, r6, LSL #1         @ excf[i] address
242956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	LDRSH          r11, [r8]                    @ tmp = exc[k]
243956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
244956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongLOOPK:
245956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDRSH          r8, [r9], #-2                @ load h[i]
246956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	LDRSH          r12, [r10, #-2]              @ load excf[i - 1]
247956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MUL            r14, r11, r8
248956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV            r8, r14, ASR #15
249956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	ADD            r14, r8, r12
250956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	STRH           r14, [r10], #-2
251956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	SUBS           r6, r6, #1
252956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	BGT            LOOPK
253956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
254956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	LDRSH          r8, [r9]                     @ load h[0]
255956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MUL            r14, r11, r8
256956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDR            r6, [r13, #T_MAX]            @ get t_max
257956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV            r8, r14, ASR #15
258b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	STRH           r8, [r10]
259956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
260956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	CMP            r4, r6
261956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	BLE            LOOPFOR
262956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
263b676a05348e4c516fa8b57e33b10548e6142c3f8Mans RullgardNorm_corr_asm_end:
264b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
265b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        ADD            r13, r13, #voSTACK
266956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDMFD          r13!, {r4 - r12, r15}
267b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
2683f7149c1c8f211c9ef5eb6c4012f078d9d08387bChih-Hung Hsieh        .end
269956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
270956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
271