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