blob: 2a1e0d76fa40d1ebfe73c06036ae02855a0dd885 [file] [log] [blame]
@/*
@ ** Copyright 2003-2010, VisualOn, Inc.
@ **
@ ** Licensed under the Apache License, Version 2.0 (the "License");
@ ** you may not use this file except in compliance with the License.
@ ** You may obtain a copy of the License at
@ **
@ ** http://www.apache.org/licenses/LICENSE-2.0
@ **
@ ** Unless required by applicable law or agreed to in writing, software
@ ** distributed under the License is distributed on an "AS IS" BASIS,
@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ ** See the License for the specific language governing permissions and
@ ** limitations under the License.
@ */
@**********************************************************************/
@void Syn_filt(
@ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */
@ Word16 x[], /* (i) : input signal */
@ Word16 y[], /* (o) : output signal */
@ Word16 mem[], /* (i/o) : memory associated with this filtering. */
@)
@***********************************************************************
@ a[] --- r0
@ x[] --- r1
@ y[] --- r2
@ mem[] --- r3
@ m --- 16 lg --- 80 update --- 1
.section .text
.global Syn_filt_asm
.extern voAWB_Copy
Syn_filt_asm:
STMFD r13!, {r4 - r12, r14}
SUB r13, r13, #700 @ y_buf[L_FRAME16k + M16k]
MOV r4, r3 @ copy mem[] address
MOV r5, r13 @ copy yy = y_buf address
@ for(i = 0@ i < m@ i++)
@{
@ *yy++ = mem[i]@
@}
LDRH r6, [r4], #2
LDRH r7, [r4], #2
LDRH r8, [r4], #2
LDRH r9, [r4], #2
LDRH r10, [r4], #2
LDRH r11, [r4], #2
LDRH r12, [r4], #2
LDRH r14, [r4], #2
STRH r6, [r5], #2
STRH r7, [r5], #2
STRH r8, [r5], #2
STRH r9, [r5], #2
STRH r10, [r5], #2
STRH r11, [r5], #2
STRH r12, [r5], #2
STRH r14, [r5], #2
LDRH r6, [r4], #2
LDRH r7, [r4], #2
LDRH r8, [r4], #2
LDRH r9, [r4], #2
LDRH r10, [r4], #2
LDRH r11, [r4], #2
LDRH r12, [r4], #2
LDRH r14, [r4], #2
STRH r6, [r5], #2
STRH r7, [r5], #2
STRH r8, [r5], #2
STRH r9, [r5], #2
STRH r10, [r5], #2
STRH r11, [r5], #2
STRH r12, [r5], #2
STRH r14, [r5], #2
LDRSH r5, [r0] @ load a[0]
MOV r8, #0 @ i = 0
MOV r5, r5, ASR #1 @ a0 = a[0] >> 1
@MOV r4, r13
@ load all a[]
LDR r14, =0xffff
LDRSH r6, [r0, #2] @ load a[1]
LDRSH r7, [r0, #4] @ load a[2]
LDRSH r9, [r0, #6] @ load a[3]
LDRSH r11,[r0, #8] @ load a[4]
AND r6, r6, r14
AND r9, r9, r14
ORR r10, r6, r7, LSL #16 @ -a[2] -- -a[1]
ORR r12, r9, r11, LSL #16 @ -a[4] -- -a[3]
STR r10, [r13, #-4]
STR r12, [r13, #-8]
LDRSH r6, [r0, #10] @ load a[5]
LDRSH r7, [r0, #12] @ load a[6]
LDRSH r9, [r0, #14] @ load a[7]
LDRSH r11,[r0, #16] @ load a[8]
AND r6, r6, r14
AND r9, r9, r14
ORR r10, r6, r7, LSL #16 @ -a[6] -- -a[5]
ORR r12, r9, r11, LSL #16 @ -a[8] -- -a[7]
STR r10, [r13, #-12]
STR r12, [r13, #-16]
LDRSH r6, [r0, #18] @ load a[9]
LDRSH r7, [r0, #20] @ load a[10]
LDRSH r9, [r0, #22] @ load a[11]
LDRSH r11,[r0, #24] @ load a[12]
AND r6, r6, r14
AND r9, r9, r14
ORR r10, r6, r7, LSL #16 @ -a[10] -- -a[9]
ORR r12, r9, r11, LSL #16 @ -a[12] -- -a[11]
STR r10, [r13, #-20]
STR r12, [r13, #-24]
LDRSH r6, [r0, #26] @ load a[13]
LDRSH r7, [r0, #28] @ load a[14]
LDRSH r9, [r0, #30] @ load a[15]
LDRSH r11,[r0, #32] @ load a[16]
AND r6, r6, r14
AND r9, r9, r14
ORR r10, r6, r7, LSL #16 @ -a[14] -- -a[13]
ORR r12, r9, r11, LSL #16 @ -a[16] -- -a[15]
STR r10, [r13, #-28]
STR r12, [r13, #-32]
ADD r4, r13, #32
LOOP:
LDRSH r6, [r1], #2 @ load x[i]
ADD r10, r4, r8, LSL #1 @ temp_p = yy + i
MUL r0, r5, r6 @ L_tmp = x[i] * a0
@ for(j = 1@ j <= m, j+=8)
LDR r7, [r13, #-4] @ -a[2] -a[1]
LDRSH r9, [r10, #-2] @ *(temp_p - 1)
LDRSH r12, [r10, #-4] @ *(temp_p - 2)
SMULBB r14, r9, r7 @ -a[1] * (*(temp_p -1))
LDRSH r6, [r10, #-6] @ *(temp_p - 3)
SMLABT r14, r12, r7, r14 @ -a[2] * (*(temp_p - 2))
LDR r7, [r13, #-8] @ -a[4] -a[3]
LDRSH r11, [r10, #-8] @ *(temp_p - 4)
SMLABB r14, r6, r7, r14 @ -a[3] * (*(temp_p -3))
LDRSH r9, [r10, #-10] @ *(temp_p - 5)
SMLABT r14, r11, r7, r14 @ -a[4] * (*(temp_p -4))
LDR r7, [r13, #-12] @ -a[6] -a[5]
LDRSH r12, [r10, #-12] @ *(temp_p - 6)
SMLABB r14, r9, r7, r14 @ -a[5] * (*(temp_p -5))
LDRSH r6, [r10, #-14] @ *(temp_p - 7)
SMLABT r14, r12, r7, r14 @ -a[6] * (*(temp_p - 6))
LDR r7, [r13, #-16] @ -a[8] -a[7]
LDRSH r11, [r10, #-16] @ *(temp_p - 8)
SMLABB r14, r6, r7, r14 @ -a[7] * (*(temp_p -7))
LDRSH r9, [r10, #-18] @ *(temp_p - 9)
SMLABT r14, r11, r7, r14 @ -a[8] * (*(temp_p -8))
LDR r7, [r13, #-20] @ -a[10] -a[9]
LDRSH r12, [r10, #-20] @ *(temp_p - 10)
SMLABB r14, r9, r7, r14 @ -a[9] * (*(temp_p -9))
LDRSH r6, [r10, #-22] @ *(temp_p - 11)
SMLABT r14, r12, r7, r14 @ -a[10] * (*(temp_p - 10))
LDR r7, [r13, #-24] @ -a[12] -a[11]
LDRSH r11, [r10, #-24] @ *(temp_p - 12)
SMLABB r14, r6, r7, r14 @ -a[11] * (*(temp_p -11))
LDRSH r9, [r10, #-26] @ *(temp_p - 13)
SMLABT r14, r11, r7, r14 @ -a[12] * (*(temp_p -12))
LDR r7, [r13, #-28] @ -a[14] -a[13]
LDRSH r12, [r10, #-28] @ *(temp_p - 14)
SMLABB r14, r9, r7, r14 @ -a[13] * (*(temp_p -13))
LDRSH r6, [r10, #-30] @ *(temp_p - 15)
SMLABT r14, r12, r7, r14 @ -a[14] * (*(temp_p - 14))
LDR r7, [r13, #-32] @ -a[16] -a[15]
LDRSH r11, [r10, #-32] @ *(temp_p - 16)
SMLABB r14, r6, r7, r14 @ -a[15] * (*(temp_p -15))
SMLABT r14, r11, r7, r14 @ -a[16] * (*(temp_p -16))
RSB r14, r14, r0
MOV r7, r14, LSL #4 @ L_tmp <<=4
ADD r8, r8, #1
ADD r14, r7, #0x8000
MOV r7, r14, ASR #16 @ (L_tmp + 0x8000) >> 16
CMP r8, #80
STRH r7, [r10] @ yy[i]
STRH r7, [r2], #2 @ y[i]
BLT LOOP
@ update mem[]
ADD r5, r13, #160 @ yy[64] address
MOV r1, r3
MOV r0, r5
MOV r2, #16
BL voAWB_Copy
Syn_filt_asm_end:
ADD r13, r13, #700
LDMFD r13!, {r4 - r12, r15}
@ENDFUNC
.end