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


