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