@/* @ ** 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