1a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin@ 2a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin@ Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin@ 4a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin@ Use of this source code is governed by a BSD-style license 5a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin@ that can be found in the LICENSE file in the root of the source 6a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin@ tree. An additional intellectual property rights grant can be found 7a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin@ in the file PATENTS. All contributing project authors may 8a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin@ be found in the AUTHORS file in the root of the source tree. 9a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin@ 10a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 11a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin@ Contains a function for the core loop in the normalized lattice AR 12a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin@ filter routine for iSAC codec, optimized for ARMv7 platforms. 13a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin@ 14a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin@ Output is bit-exact with the reference C code in lattic_c.c 15a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin@ 16a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin@ Register usage: 17a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin@ 18a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin@ r0: &ar_g_Q0 19a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin@ r1: &ar_f_Q0 20a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin@ r2: &cth_Q15 21a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin@ r3: &sth_Q15 22a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin@ r4: out loop counter 23a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin@ r5: tmpAR 24a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin@ r9: inner loop counter 25a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin@ r12: constant #16384 26a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin@ r6, r7, r8, r10, r11: scratch 27a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 28a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include "settings.h" 29a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 30a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin.arch armv7-a 31a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin.global WebRtcIsacfix_FilterArLoop 32a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin.align 2 33a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 34a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinWebRtcIsacfix_FilterArLoop: 35a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin.fnstart 36a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 37a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin.save {r4-r11} 38a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin push {r4-r11} 39a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 40a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin add r1, #2 @ &ar_f_Q0[1] 41a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin mov r12, #16384 42a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin mov r4, #HALF_SUBFRAMELEN 43a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin sub r4, #1 @ Outer loop counter = HALF_SUBFRAMELEN - 1 44a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 45a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinHALF_SUBFRAME_LOOP: @ for(n = 0; n < HALF_SUBFRAMELEN - 1; n++) 46a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 47a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin ldr r9, [sp, #32] @ Restore the inner loop counter to order_coef 48a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin ldrh r5, [r1] @ tmpAR = ar_f_Q0[n+1] 49a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin add r0, r9, asl #1 @ Restore r0 to &ar_g_Q0[order_coef] 50a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin add r2, r9, asl #1 @ Restore r2 to &cth_Q15[order_coef] 51a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin add r3, r9, asl #1 @ Restore r3 to &sth_Q15[order_coef] 52a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 53a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinORDER_COEF_LOOP: @ for(k = order_coef - 1 ; k >= 0; k--) 54a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 55a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin ldrh r7, [r3, #-2]! @ sth_Q15[k] 56a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin ldrh r6, [r2, #-2]! @ cth_Q15[k] 57a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 58a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin ldrh r8, [r0, #-2] @ ar_g_Q0[k] 59a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin smlabb r11, r7, r5, r12 @ sth_Q15[k] * tmpAR + 16384 60a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin smlabb r10, r6, r5, r12 @ cth_Q15[k] * tmpAR + 16384 61a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin smulbb r7, r7, r8 @ sth_Q15[k] * ar_g_Q0[k] 62a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin smlabb r11, r6, r8, r11 @ cth_Q15[k]*ar_g_Q0[k]+(sth_Q15[k]*tmpAR+16384) 63a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 64a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin sub r10, r10, r7 @ cth_Q15[k]*tmpAR+16384-(sth_Q15[k]*ar_g_Q0[k]) 65a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin ssat r11, #16, r11, asr #15 66a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin ssat r5, #16, r10, asr #15 67a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin strh r11, [r0], #-2 @ Output: ar_g_Q0[k+1] 68a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 69a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin subs r9, #1 70a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin bgt ORDER_COEF_LOOP 71a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 72a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin strh r5, [r0] @ Output: ar_g_Q0[0] = tmpAR; 73a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin strh r5, [r1], #2 @ Output: ar_f_Q0[n+1] = tmpAR; 74a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 75a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin subs r4, #1 76a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin bne HALF_SUBFRAME_LOOP 77a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 78a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin pop {r4-r11} 79a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin bx lr 80a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 81a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin.fnend 82a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 83