summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Norm_Corr_opt.s
blob: 49bdc2b4bcf9aaf3b7d7c6b1d2a04eb944fed63c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
@/*
@ ** Copyright 2003-2010, VisualOn, Inc.
@ **
@ ** 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.
@ */

@static void Norm_Corr (Word16 exc[],                    /* (i)     : excitation buffer          */
@                       Word16 xn[],                     /* (i)     : target vector              */
@                       Word16 h[],                      /* (i) Q15 : impulse response of synth/wgt filters */
@                       Word16 L_subfr,                  /* (i)     : sub-frame length */
@                       Word16 t_min,                    /* (i)     : minimum value of pitch lag.   */
@                       Word16 t_max,                    /* (i)     : maximum value of pitch lag.   */
@                       Word16 corr_norm[])              /* (o) Q15 : normalized correlation    */
@

@ r0 --- exc[]
@ r1 --- xn[]
@ r2 --- h[]
@ r3 --- L_subfr
@ r4 --- t_min
@ r5 --- t_max
@ r6 --- corr_norm[]


	.section  .text
        .global   Norm_corr_asm
        .extern   Convolve_asm
        .extern   Isqrt_n
@******************************
@ constant
@******************************
.equ         EXC           ,   0
.equ         XN            ,   4
.equ         H             ,   8
.equ         L_SUBFR       ,   12
.equ         voSTACK       ,   172
.equ         T_MIN         ,   212
.equ         T_MAX         ,   216
.equ         CORR_NORM     ,   220

Norm_corr_asm:

        STMFD      r13!, {r4 - r12, r14}
        SUB        r13, r13, #voSTACK

        ADD        r8, r13, #20                 @get the excf[L_SUBFR]
        LDR        r4, [r13, #T_MIN]            @get t_min
        RSB        r11, r4, #0                  @k = -t_min
        ADD        r5, r0, r11, LSL #1          @get the &exc[k]

        @transfer Convolve function
        STMFD       sp!, {r0 - r3}
        MOV         r0, r5
        MOV         r1, r2
        MOV         r2, r8                       @r2 --- excf[]
        BL          Convolve_asm
        LDMFD       sp!, {r0 - r3}

        @ r8 --- excf[]

	MOV         r14, r1                       @copy xn[] address
        MOV         r5, #64
        MOV         r6, #0                       @L_tmp = 0
        MOV         r7, #1

LOOP1:
        LDR         r9,  [r14], #4
	LDR         r10, [r14], #4
	LDR         r11, [r14], #4
	LDR         r12, [r14], #4
	SMLABB      r6, r9, r9, r6               @L_tmp += (xn[i] * xn[i])
	SMLATT      r6, r9, r9, r6               @L_tmp += (xn[i+1] * xn[i+1])
        SMLABB      r6, r10, r10, r6
	SMLATT      r6, r10, r10, r6
	SMLABB      r6, r11, r11, r6
        SMLATT      r6, r11, r11, r6
        SMLABB      r6, r12, r12, r6
        SMLATT      r6, r12, r12, r6
        SUBS        r5, r5, #8
        BNE         LOOP1

	ADD         r9, r7, r6, LSL #1           @L_tmp = (L_tmp << 1) + 1
	CLZ         r7, r9
	SUB         r6, r7, #1                   @exp = norm_l(L_tmp)
        RSB         r7, r6, #32                  @exp = 32 - exp
	MOV         r6, r7, ASR #1
	RSB         r7, r6, #0                   @scale = -(exp >> 1)

        @loop for every possible period
	@for(t = t_min@ t <= t_max@ t++)
	@r7 --- scale r4 --- t_min r8 --- excf[]

LOOPFOR:
        MOV         r5, #0                       @L_tmp  = 0
	MOV         r6, #0                       @L_tmp1 = 0
	MOV         r9, #64
	MOV         r12, r1                      @copy of xn[]
	ADD         r14, r13, #20                @copy of excf[]
	MOV         r8, #0x8000

LOOPi:
	LDR         r11, [r14], #4               @load excf[i], excf[i+1]
        LDR         r10, [r12], #4               @load xn[i], xn[i+1]
	SMLABB      r6, r11, r11, r6             @L_tmp1 += excf[i] * excf[i]
	SMLATT      r6, r11, r11, r6             @L_tmp1 += excf[i+1] * excf[i+1]
        SMLABB      r5, r10, r11, r5             @L_tmp += xn[i] * excf[i]
	SMLATT      r5, r10, r11, r5             @L_tmp += xn[i+1] * excf[i+1]
	LDR         r11, [r14], #4               @load excf[i+2], excf[i+3]
	LDR         r10, [r12], #4               @load xn[i+2], xn[i+3]
        SMLABB      r6, r11, r11, r6
	SMLATT      r6, r11, r11, r6
	SMLABB      r5, r10, r11, r5
	SMLATT      r5, r10, r11, r5
	SUBS        r9, r9, #4
        BNE         LOOPi

	@r5 --- L_tmp, r6 --- L_tmp1
	MOV         r10, #1
	ADD         r5, r10, r5, LSL #1          @L_tmp = (L_tmp << 1) + 1
	ADD         r6, r10, r6, LSL #1          @L_tmp1 = (L_tmp1 << 1) + 1

	CLZ         r10, r5
	CMP         r5, #0
	RSBLT       r11, r5, #0
	CLZLT       r10, r11
	SUB         r10, r10, #1                 @exp = norm_l(L_tmp)

	MOV         r5, r5, LSL r10              @L_tmp = (L_tmp << exp)
	RSB         r10, r10, #30                @exp_corr = 30 - exp
	MOV         r11, r5, ASR #16             @corr = extract_h(L_tmp)

	CLZ         r5, r6
	SUB         r5, r5, #1
	MOV         r6, r6, LSL r5               @L_tmp = (L_tmp1 << exp)
	RSB         r5, r5, #30                  @exp_norm = 30 - exp

	@r10 --- exp_corr, r11 --- corr
	@r6  --- L_tmp, r5 --- exp_norm

	@Isqrt_n(&L_tmp, &exp_norm)

	MOV         r14, r0
	MOV         r12, r1

        STMFD       sp!, {r0 - r4, r7 - r12, r14}
	ADD         r1, sp, #4
	ADD         r0, sp, #0
	STR         r6, [sp]
	STRH        r5, [sp, #4]
	BL          Isqrt_n
	LDR         r6, [sp]
	LDRSH       r5, [sp, #4]
        LDMFD       sp!, {r0 - r4, r7 - r12, r14}
	MOV         r0, r14
	MOV         r1, r12


	MOV         r6, r6, ASR #16              @norm = extract_h(L_tmp)
	MUL         r12, r6, r11
	ADD         r12, r12, r12                @L_tmp = vo_L_mult(corr, norm)

	ADD         r6, r10, r5
	ADD         r6, r6, r7                   @exp_corr + exp_norm + scale

        CMP         r6, #0
        RSBLT       r6, r6, #0
	MOVLT       r12, r12, ASR r6
        MOVGT       r12, r12, LSL r6             @L_tmp = L_shl(L_tmp, exp_corr + exp_norm + scale)

        ADD         r12, r12, r8
        MOV         r12, r12, ASR #16            @vo_round(L_tmp)

        LDR         r5, [r13, #CORR_NORM]        @ get corr_norm address
	LDR         r6, [r13, #T_MAX]            @ get t_max
	ADD         r10, r5, r4, LSL #1          @ get corr_norm[t] address
	STRH        r12, [r10]                   @ corr_norm[t] = vo_round(L_tmp)

	CMP         r4, r6
	BEQ         Norm_corr_asm_end

	ADD         r4, r4, #1                   @ t_min ++

	RSB         r5, r4, #0                   @ k

	MOV         r6, #63                      @ i = 63
	MOV         r8, r0                       @ exc[]
	MOV         r9, r2                       @ h[]
	ADD         r10, r13, #20                @ excf[]

	ADD         r8, r8, r5, LSL #1           @ exc[k] address
	ADD         r9, r9, r6, LSL #1           @ h[i] address
	ADD         r10, r10, r6, LSL #1         @ excf[i] address
	LDRSH       r11, [r8]                    @ tmp = exc[k]

LOOPK:
        LDRSH       r8, [r9], #-2                @ load h[i]
	LDRSH       r12, [r10, #-2]              @ load excf[i - 1]
	MUL         r14, r11, r8
	MOV         r8, r14, ASR #15
	ADD         r14, r8, r12
	STRH        r14, [r10], #-2
	SUBS        r6, r6, #1
	BGT         LOOPK

	LDRSH       r8, [r9]                     @ load h[0]
	MUL         r14, r11, r8
        LDR         r6, [r13, #T_MAX]            @ get t_max
	MOV         r8, r14, ASR #15
	STRH        r8, [r10]

	CMP         r4, r6
	BLE         LOOPFOR

Norm_corr_asm_end:

        ADD            r13, r13, #voSTACK
        LDMFD          r13!, {r4 - r12, r15}

        .END