mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-14 06:10:40 +01:00

This moves it from an API directory (system_wrappers/include/) to a non-API directory, which is exactly what we want for utilities like this. Bug: webrtc:8445 NOPRESUBMIT=true Change-Id: I30d01fcb9cbe1427a7703a3cdd7befae751066b5 Reviewed-on: https://webrtc-review.googlesource.com/21982 Commit-Queue: Karl Wiberg <kwiberg@webrtc.org> Reviewed-by: Henrik Lundin <henrik.lundin@webrtc.org> Cr-Commit-Position: refs/heads/master@{#22550}
77 lines
2.6 KiB
ArmAsm
77 lines
2.6 KiB
ArmAsm
@
|
|
@ Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
|
@
|
|
@ Use of this source code is governed by a BSD-style license
|
|
@ that can be found in the LICENSE file in the root of the source
|
|
@ tree. An additional intellectual property rights grant can be found
|
|
@ in the file PATENTS. All contributing project authors may
|
|
@ be found in the AUTHORS file in the root of the source tree.
|
|
@
|
|
|
|
@ Contains a function for the core loop in the normalized lattice AR
|
|
@ filter routine for iSAC codec, optimized for ARMv7 platforms.
|
|
@
|
|
@ Output is bit-exact with the reference C code in lattic_c.c
|
|
@
|
|
@ Register usage:
|
|
@
|
|
@ r0: &ar_g_Q0
|
|
@ r1: &ar_f_Q0
|
|
@ r2: &cth_Q15
|
|
@ r3: &sth_Q15
|
|
@ r4: out loop counter
|
|
@ r5: tmpAR
|
|
@ r9: inner loop counter
|
|
@ r12: constant #16384
|
|
@ r6, r7, r8, r10, r11: scratch
|
|
|
|
#include "modules/audio_coding/codecs/isac/fix/source/settings.h"
|
|
#include "rtc_base/system/asm_defines.h"
|
|
|
|
GLOBAL_FUNCTION WebRtcIsacfix_FilterArLoop
|
|
.align 2
|
|
DEFINE_FUNCTION WebRtcIsacfix_FilterArLoop
|
|
push {r4-r11}
|
|
|
|
add r1, #2 @ &ar_f_Q0[1]
|
|
mov r12, #16384
|
|
mov r4, #HALF_SUBFRAMELEN
|
|
sub r4, #1 @ Outer loop counter = HALF_SUBFRAMELEN - 1
|
|
|
|
HALF_SUBFRAME_LOOP: @ for (n = 0; n < HALF_SUBFRAMELEN - 1; n++)
|
|
|
|
ldr r9, [sp, #32] @ Restore the inner loop counter to order_coef
|
|
ldrh r5, [r1] @ tmpAR = ar_f_Q0[n+1]
|
|
add r0, r9, asl #1 @ Restore r0 to &ar_g_Q0[order_coef]
|
|
add r2, r9, asl #1 @ Restore r2 to &cth_Q15[order_coef]
|
|
add r3, r9, asl #1 @ Restore r3 to &sth_Q15[order_coef]
|
|
|
|
ORDER_COEF_LOOP: @ for (k = order_coef; k > 0; k--)
|
|
|
|
ldrh r7, [r3, #-2]! @ sth_Q15[k - 1]
|
|
ldrh r6, [r2, #-2]! @ cth_Q15[k - 1]
|
|
|
|
ldrh r8, [r0, #-2] @ ar_g_Q0[k - 1]
|
|
smlabb r11, r7, r5, r12 @ sth_Q15[k - 1] * tmpAR + 16384
|
|
smlabb r10, r6, r5, r12 @ cth_Q15[k - 1] * tmpAR + 16384
|
|
smulbb r7, r7, r8 @ sth_Q15[k - 1] * ar_g_Q0[k - 1]
|
|
smlabb r11, r6, r8, r11 @ cth_Q15[k - 1] * ar_g_Q0[k - 1] +
|
|
@ (sth_Q15[k - 1] * tmpAR + 16384)
|
|
|
|
sub r10, r10, r7 @ cth_Q15[k - 1] * tmpAR + 16384 -
|
|
@ (sth_Q15[k - 1] * ar_g_Q0[k - 1])
|
|
ssat r11, #16, r11, asr #15
|
|
ssat r5, #16, r10, asr #15
|
|
strh r11, [r0], #-2 @ Output: ar_g_Q0[k]
|
|
|
|
subs r9, #1
|
|
bgt ORDER_COEF_LOOP
|
|
|
|
strh r5, [r0] @ Output: ar_g_Q0[0] = tmpAR;
|
|
strh r5, [r1], #2 @ Output: ar_f_Q0[n+1] = tmpAR;
|
|
|
|
subs r4, #1
|
|
bne HALF_SUBFRAME_LOOP
|
|
|
|
pop {r4-r11}
|
|
bx lr
|