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