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