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