gfiber / vendor / opensource / webrtc / d73f3b5ff617e5b395e2af72e29289b87a1873e9 / . / trunk / src / modules / audio_coding / codecs / iSAC / fix / source / lattice_armv7.S

@ | |

@ 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 "settings.h" | |

.arch armv7-a | |

.global WebRtcIsacfix_FilterArLoop | |

.align 2 | |

WebRtcIsacfix_FilterArLoop: | |

.fnstart | |

.save {r4-r11} | |

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 - 1 ; k >= 0; k--) | |

ldrh r7, [r3, #-2]! @ sth_Q15[k] | |

ldrh r6, [r2, #-2]! @ cth_Q15[k] | |

ldrh r8, [r0, #-2] @ ar_g_Q0[k] | |

smlabb r11, r7, r5, r12 @ sth_Q15[k] * tmpAR + 16384 | |

smlabb r10, r6, r5, r12 @ cth_Q15[k] * tmpAR + 16384 | |

smulbb r7, r7, r8 @ sth_Q15[k] * ar_g_Q0[k] | |

smlabb r11, r6, r8, r11 @ cth_Q15[k]*ar_g_Q0[k]+(sth_Q15[k]*tmpAR+16384) | |

sub r10, r10, r7 @ cth_Q15[k]*tmpAR+16384-(sth_Q15[k]*ar_g_Q0[k]) | |

ssat r11, #16, r11, asr #15 | |

ssat r5, #16, r10, asr #15 | |

strh r11, [r0], #-2 @ Output: ar_g_Q0[k+1] | |

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 | |

.fnend | |