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