1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@/*
2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** Copyright 2003-2010, VisualOn, Inc.
3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ **
4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** Licensed under the Apache License, Version 2.0 (the "License");
5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** you may not use this file except in compliance with the License.
6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** You may obtain a copy of the License at
7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ **
8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ **     http://www.apache.org/licenses/LICENSE-2.0
9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ **
10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** Unless required by applicable law or agreed to in writing, software
11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** distributed under the License is distributed on an "AS IS" BASIS,
12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** See the License for the specific language governing permissions and
14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ ** limitations under the License.
15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ */
16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@
17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@void Syn_filt(
18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@     Word16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients           */
19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@     Word16 x[],                           /* (i)     : input signal                             */
20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@     Word16 y[],                           /* (o)     : output signal                            */
21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@     Word16 mem[],                         /* (i/o)   : memory associated with this filtering.   */
22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@)
23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@***********************************************************************
24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ a[]    ---   r0
25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ x[]    ---   r1
26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ y[]    ---   r2
27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ mem[]  ---   r3
28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@ m ---  16  lg --- 80  update --- 1
29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
30b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard          .section  .text
31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          .global   Syn_filt_asm
32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
33e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardSyn_filt_asm:
34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
35b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard          STMFD   	r13!, {r4 - r12, r14}
36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          SUB           r13, r13, #700                   @ y_buf[L_FRAME16k + M16k]
37b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          MOV           r4, r3                           @ copy mem[] address
39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          MOV           r5, r13                          @ copy yy = y_buf address
40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          @ for(i = 0@ i < m@ i++)
42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          @{
43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          @    *yy++ = mem[i]@
44b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard          @}
45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VLD1.S16      {D0, D1, D2, D3}, [r4]!          @load 16 mems
46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	  VST1.S16      {D0, D1, D2, D3}, [r5]!          @store 16 mem[] to *yy
47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          LDRSH         r5, [r0], #2                     @ load a[0]
49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          MOV           r8, #0                           @ i = 0
50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          MOV           r5, r5, ASR #1                   @ a0 = a[0] >> 1
51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VMOV.S16      D8[0], r5
52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          @ load all a[]
53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VLD1.S16      {D0, D1, D2, D3}, [r0]!          @ load a[1] ~ a[16]
54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	  VREV64.16     D0, D0
55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	  VREV64.16     D1, D1
56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	  VREV64.16     D2, D2
57b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	  VREV64.16     D3, D3
58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	  MOV           r8, #0                           @ loop times
59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	  MOV           r10, r13                         @ temp = y_buf
60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	  ADD           r4, r13, #32                     @ yy[i] address
61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VLD1.S16      {D4, D5, D6, D7}, [r10]!         @ first 16 temp_p
63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
64e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardSYN_LOOP:
65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          LDRSH         r6, [r1], #2                     @ load x[i]
67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	  MUL           r12, r6, r5                      @ L_tmp = x[i] * a0
68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	  ADD           r10, r4, r8, LSL #1              @ y[i], yy[i] address
69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	  VDUP.S32      Q10, r12
71b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	  VMULL.S16     Q5, D3, D4
72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VMLAL.S16     Q5, D2, D5
73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VMLAL.S16     Q5, D1, D6
74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VMLAL.S16     Q5, D0, D7
75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VEXT.8        D4, D4, D5, #2
76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VEXT.8        D5, D5, D6, #2
77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VEXT.8        D6, D6, D7, #2
78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VPADD.S32     D12, D10, D11
79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          ADD           r8, r8, #1
80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VPADD.S32     D10, D12, D12
81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	  VDUP.S32      Q7, D10[0]
83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	  VSUB.S32      Q9, Q10, Q7
85b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard          VQRSHRN.S32   D20, Q9, #12
86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VMOV.S16      r9, D20[0]
87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          VEXT.8        D7, D7, D20, #2
88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          CMP           r8, #80
89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          STRH          r9, [r10]                        @ yy[i]
90b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard          STRH          r9, [r2], #2                     @ y[i]
91b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          BLT           SYN_LOOP
93b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          @ update mem[]
95e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          ADD           r5, r13, #160                    @ yy[64] address
96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	  VLD1.S16      {D0, D1, D2, D3}, [r5]!
97b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	  VST1.S16      {D0, D1, D2, D3}, [r3]!
98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
99e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardSyn_filt_asm_end:
100b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
101b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard          ADD           r13, r13, #700
102b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard          LDMFD   	r13!, {r4 - r12, r15}
103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          @ENDFUNC
104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          .END
105b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
107