Home | History | Annotate | Download | only in source
      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 
     31 GLOBAL_FUNCTION WebRtcIsacfix_FilterArLoop
     32 .align  2
     33 DEFINE_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 
     41 HALF_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 
     49 ORDER_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