syn_filt_opt.s revision 41050cdb033641ddf26831d9272c0930f7b40a2d
1@/*
2@ ** Copyright 2003-2010, VisualOn, Inc.
3@ **
4@ ** Licensed under the Apache License, Version 2.0 (the "License");
5@ ** you may not use this file except in compliance with the License.
6@ ** You may obtain a copy of the License at
7@ **
8@ **     http://www.apache.org/licenses/LICENSE-2.0
9@ **
10@ ** Unless required by applicable law or agreed to in writing, software
11@ ** distributed under the License is distributed on an "AS IS" BASIS,
12@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13@ ** See the License for the specific language governing permissions and
14@ ** limitations under the License.
15@ */
16@**********************************************************************/
17@void Syn_filt(
18@     Word16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients           */
19@     Word16 x[],                           /* (i)     : input signal                             */
20@     Word16 y[],                           /* (o)     : output signal                            */
21@     Word16 mem[],                         /* (i/o)   : memory associated with this filtering.   */
22@)
23@***********************************************************************
24@ a[]    ---   r0
25@ x[]    ---   r1
26@ y[]    ---   r2
27@ mem[]  ---   r3
28@ m ---  16  lg --- 80  update --- 1
29
30          .section  .text
31	  .global   Syn_filt_asm
32          .extern   voAWB_Copy
33
34Syn_filt_asm:
35
36          STMFD   	r13!, {r4 - r12, r14}
37          SUB           r13, r13, #700                   @ y_buf[L_FRAME16k + M16k]
38
39          MOV           r4, r3                           @ copy mem[] address
40          MOV           r5, r13                          @ copy yy = y_buf address
41
42          @ for(i = 0@ i < m@ i++)
43          @{
44          @    *yy++ = mem[i]@
45          @}
46
47          LDRH          r6,  [r4], #2
48          LDRH          r7,  [r4], #2
49          LDRH          r8,  [r4], #2
50          LDRH          r9,  [r4], #2
51          LDRH          r10, [r4], #2
52          LDRH          r11, [r4], #2
53          LDRH          r12, [r4], #2
54          LDRH          r14, [r4], #2
55
56          STRH          r6,  [r5], #2
57          STRH          r7,  [r5], #2
58          STRH          r8,  [r5], #2
59          STRH          r9,  [r5], #2
60          STRH          r10, [r5], #2
61          STRH          r11, [r5], #2
62          STRH          r12, [r5], #2
63          STRH          r14, [r5], #2
64
65          LDRH          r6,  [r4], #2
66          LDRH          r7,  [r4], #2
67          LDRH          r8,  [r4], #2
68          LDRH          r9,  [r4], #2
69          LDRH          r10, [r4], #2
70          LDRH          r11, [r4], #2
71          LDRH          r12, [r4], #2
72          LDRH          r14, [r4], #2
73
74          STRH          r6,  [r5], #2
75          STRH          r7,  [r5], #2
76          STRH          r8,  [r5], #2
77          STRH          r9,  [r5], #2
78          STRH          r10, [r5], #2
79          STRH          r11, [r5], #2
80          STRH          r12, [r5], #2
81          STRH          r14, [r5], #2
82
83          LDRSH         r5, [r0]                         @ load a[0]
84          MOV           r8, #0                           @ i = 0
85          MOV           r5, r5, ASR #1                   @ a0 = a[0] >> 1
86          @MOV           r4, r13
87          @ load all a[]
88
89          LDR           r14, =0xffff
90          LDRSH         r6, [r0, #2]                     @ load a[1]
91          LDRSH         r7, [r0, #4]                     @ load a[2]
92          LDRSH         r9, [r0, #6]                     @ load a[3]
93          LDRSH         r11,[r0, #8]                     @ load a[4]
94          AND           r6, r6, r14
95          AND           r9, r9, r14
96          ORR           r10, r6, r7, LSL #16             @ -a[2] -- -a[1]
97          ORR           r12, r9, r11, LSL #16            @ -a[4] -- -a[3]
98          STR           r10, [r13, #-4]
99          STR           r12, [r13, #-8]
100
101          LDRSH         r6, [r0, #10]                    @ load a[5]
102          LDRSH         r7, [r0, #12]                    @ load a[6]
103          LDRSH         r9, [r0, #14]                    @ load a[7]
104          LDRSH         r11,[r0, #16]                    @ load a[8]
105          AND           r6, r6, r14
106          AND           r9, r9, r14
107          ORR           r10, r6, r7, LSL #16             @ -a[6] -- -a[5]
108          ORR           r12, r9, r11, LSL #16            @ -a[8] -- -a[7]
109          STR           r10, [r13, #-12]
110          STR           r12, [r13, #-16]
111
112          LDRSH         r6, [r0, #18]                    @ load a[9]
113          LDRSH         r7, [r0, #20]                    @ load a[10]
114          LDRSH         r9, [r0, #22]                    @ load a[11]
115          LDRSH         r11,[r0, #24]                    @ load a[12]
116          AND           r6, r6, r14
117          AND           r9, r9, r14
118          ORR           r10, r6, r7, LSL #16             @ -a[10] -- -a[9]
119          ORR           r12, r9, r11, LSL #16            @ -a[12] -- -a[11]
120          STR           r10, [r13, #-20]
121          STR           r12, [r13, #-24]
122
123          LDRSH         r6, [r0, #26]                    @ load a[13]
124          LDRSH         r7, [r0, #28]                    @ load a[14]
125          LDRSH         r9, [r0, #30]                    @ load a[15]
126          LDRSH         r11,[r0, #32]                    @ load a[16]
127          AND           r6, r6, r14
128          AND           r9, r9, r14
129          ORR           r10, r6, r7, LSL #16             @ -a[14] -- -a[13]
130          ORR           r12, r9, r11, LSL #16            @ -a[16] -- -a[15]
131          STR           r10, [r13, #-28]
132          STR           r12, [r13, #-32]
133
134          ADD           r4, r13, #32
135LOOP:
136          LDRSH         r6,  [r1], #2                    @ load x[i]
137          ADD           r10, r4, r8, LSL #1              @ temp_p = yy + i
138
139          MUL           r0, r5, r6                      @ L_tmp = x[i] * a0
140          @ for(j = 1@ j <= m, j+=8)
141          LDR           r7,  [r13, #-4]                  @ -a[2]  -a[1]
142          LDRSH         r9,  [r10, #-2]                  @ *(temp_p - 1)
143          LDRSH         r12, [r10, #-4]                  @ *(temp_p - 2)
144
145
146          SMULBB        r14, r9, r7                      @ -a[1] * (*(temp_p -1))
147
148          LDRSH         r6,  [r10, #-6]                  @ *(temp_p - 3)
149
150          SMLABT        r14, r12, r7, r14                @ -a[2] * (*(temp_p - 2))
151
152          LDR           r7,  [r13, #-8]                  @ -a[4] -a[3]
153          LDRSH         r11, [r10, #-8]                  @ *(temp_p - 4)
154
155          SMLABB        r14, r6, r7, r14                 @ -a[3] * (*(temp_p -3))
156
157          LDRSH         r9,  [r10, #-10]                 @ *(temp_p - 5)
158
159          SMLABT        r14, r11, r7, r14                @ -a[4] * (*(temp_p -4))
160
161          LDR           r7,  [r13, #-12]                 @ -a[6]  -a[5]
162          LDRSH         r12, [r10, #-12]                 @ *(temp_p - 6)
163
164          SMLABB        r14, r9, r7, r14                 @ -a[5] * (*(temp_p -5))
165
166          LDRSH         r6,  [r10, #-14]                 @ *(temp_p - 7)
167
168          SMLABT        r14, r12, r7, r14                @ -a[6] * (*(temp_p - 6))
169
170          LDR           r7,  [r13, #-16]                 @ -a[8] -a[7]
171          LDRSH         r11, [r10, #-16]                 @ *(temp_p - 8)
172
173          SMLABB        r14, r6, r7, r14                 @ -a[7] * (*(temp_p -7))
174
175          LDRSH         r9,  [r10, #-18]                 @ *(temp_p - 9)
176
177          SMLABT        r14, r11, r7, r14                @ -a[8] * (*(temp_p -8))
178
179          LDR           r7,  [r13, #-20]                 @ -a[10]  -a[9]
180          LDRSH         r12, [r10, #-20]                 @ *(temp_p - 10)
181
182          SMLABB        r14, r9, r7, r14                 @ -a[9] * (*(temp_p -9))
183
184          LDRSH         r6,  [r10, #-22]                 @ *(temp_p - 11)
185
186          SMLABT        r14, r12, r7, r14                @ -a[10] * (*(temp_p - 10))
187
188          LDR           r7,  [r13, #-24]                 @ -a[12] -a[11]
189          LDRSH         r11, [r10, #-24]                 @ *(temp_p - 12)
190
191          SMLABB        r14, r6, r7, r14                 @ -a[11] * (*(temp_p -11))
192
193          LDRSH         r9,  [r10, #-26]                 @ *(temp_p - 13)
194
195          SMLABT        r14, r11, r7, r14                @ -a[12] * (*(temp_p -12))
196
197          LDR           r7,  [r13, #-28]                 @ -a[14] -a[13]
198          LDRSH         r12, [r10, #-28]                 @ *(temp_p - 14)
199
200          SMLABB        r14, r9, r7, r14                 @ -a[13] * (*(temp_p -13))
201
202          LDRSH         r6,  [r10, #-30]                 @ *(temp_p - 15)
203
204          SMLABT        r14, r12, r7, r14                @ -a[14] * (*(temp_p - 14))
205
206          LDR           r7,  [r13, #-32]                 @ -a[16] -a[15]
207          LDRSH         r11, [r10, #-32]                 @ *(temp_p - 16)
208
209          SMLABB        r14, r6, r7, r14                 @ -a[15] * (*(temp_p -15))
210
211          SMLABT        r14, r11, r7, r14                @ -a[16] * (*(temp_p -16))
212
213          RSB           r14, r14, r0
214
215          MOV           r7, r14, LSL #4                  @ L_tmp <<=4
216          ADD           r8, r8, #1
217          ADD           r14, r7, #0x8000
218          MOV           r7, r14, ASR #16                 @ (L_tmp + 0x8000) >> 16
219          CMP           r8, #80
220          STRH          r7, [r10]                        @ yy[i]
221          STRH          r7, [r2], #2                     @ y[i]
222          BLT           LOOP
223
224          @ update mem[]
225          ADD           r5, r13, #160                    @ yy[64] address
226          MOV           r1, r3
227          MOV           r0, r5
228          MOV           r2, #16
229          BL            voAWB_Copy
230
231Syn_filt_asm_end:
232
233          ADD           r13, r13, #700
234          LDMFD   	r13!, {r4 - r12, r15}
235          @ENDFUNC
236          .END
237
238
239