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