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@**********************************************************************/
18@void Filt_6k_7k(
19@     Word16 signal[],                      /* input:  signal                  */
20@     Word16 lg,                            /* input:  length of input         */
21@     Word16 mem[]                          /* in/out: memory (size=30)        */
22@)
23@***********************************************************************
24@ r0    ---  signal[]
25@ r1    ---  lg
26@ r2    ---  mem[]
27
28          .section  .text
29          .global   Filt_6k_7k_asm
30          .extern   fir_6k_7k
31
32Filt_6k_7k_asm:
33
34          STMFD   		r13!, {r0 - r12, r14}
35          SUB    		r13, r13, #240              @ x[L_SUBFR16k + (L_FIR - 1)]
36          MOV     		r8, r0                      @ copy signal[] address
37          MOV     		r5, r2                      @ copy mem[] address
38
39          MOV     		r0, r2
40          MOV     		r1, r13
41
42	  VLD1.S16              {D0, D1, D2, D3}, [r0]!
43	  VLD1.S16              {D4, D5, D6, D7}, [r0]!
44
45	  VST1.S16              {D0, D1, D2, D3}, [r1]!
46	  VST1.S16              {D4, D5, D6}, [r1]!
47	  VST1.S16              D7[0], [r1]!
48	  VST1.S16              D7[1], [r1]!
49
50
51
52          ADR     		r3, Lable1                  @ get fir_7k address
53          LDR    		r10, [r3]
54          ADD    		r10, r3
55          MOV                   r3, r8                      @ change myMemCopy to Copy, due to Copy will change r3 content
56          ADD     	    	r6, r13, #60                @ get x[L_FIR - 1] address
57          MOV           	r7, r3                      @ get signal[i]
58          @for (i = lg - 1@ i >= 0@ i--)
59          @{
60          @     x[i + L_FIR - 1] = signal[i] >> 2@
61          @}
62	  VLD1.S16              {Q0, Q1}, [r7]!		    @ signal[0]  ~ signal[15]
63	  VLD1.S16              {Q2, Q3}, [r7]!             @ signal[16] ~ signal[31]
64          VLD1.S16              {Q4, Q5}, [r7]!             @ signal[32] ~ signal[47]
65	  VLD1.S16              {Q6, Q7}, [r7]!             @ signal[48] ~ signal[63]
66	  VLD1.S16              {Q8, Q9}, [r7]!             @ signal[64] ~ signal[79]
67	  VSHR.S16              Q10, Q0, #2
68          VSHR.S16              Q11, Q1, #2
69          VSHR.S16              Q12, Q2, #2
70	  VSHR.S16              Q13, Q3, #2
71	  VST1.S16              {Q10, Q11}, [r6]!
72	  VSHR.S16              Q0,  Q4, #2
73	  VSHR.S16              Q1,  Q5, #2
74	  VSHR.S16              Q10, Q6, #2
75	  VSHR.S16              Q11, Q7, #2
76	  VSHR.S16              Q2,  Q8, #2
77	  VSHR.S16              Q3,  Q9, #2
78	  VST1.S16              {Q12, Q13}, [r6]!
79	  VST1.S16              {Q0, Q1}, [r6]!
80	  VST1.S16              {Q10, Q11}, [r6]!
81	  VST1.S16              {Q2, Q3}, [r6]!
82
83	  MOV                   r12, r5
84          @STR     		r5, [sp, #-4]               @ PUSH  r5 to stack
85          @ not use registers: r4, r10, r12, r14, r5
86          MOV     		r4, r13
87          MOV     		r5, #0                      @ i = 0
88
89          @ r4 --- x[i], r10 ---- fir_6k_7k
90          VLD1.S16              {Q0, Q1}, [r10]!           @fir_6k_7k[0]  ~ fir_6k_7k[15]
91	  VLD1.S16              {Q2, Q3}, [r10]!           @fir_6k_7k[16] ~ fir_6k_7k[31]
92          VMOV.S16              D7[3], r5                        @set fir_6k_7K = 0
93
94	  VLD1.S16              {Q4, Q5}, [r4]!            @x[0]  ~ x[15]
95	  VLD1.S16              {Q6, Q7}, [r4]!            @x[16] ~ X[31]
96	  VLD1.S16              {Q8}, [r4]!
97          VMOV.S16              Q15, #0
98
99LOOP_6K7K:
100
101          VMULL.S16             Q9,D8,D0[0]
102          VMULL.S16             Q10,D9,D1[0]
103          VMULL.S16             Q11,D9,D0[0]
104          VMULL.S16             Q12,D10,D1[0]
105          VEXT.8                Q4,Q4,Q5,#2
106          VMLAL.S16             Q9,D10,D2[0]
107          VMLAL.S16             Q10,D11,D3[0]
108          VMLAL.S16             Q11,D11,D2[0]
109          VMLAL.S16             Q12,D12,D3[0]
110          VEXT.8                Q5,Q5,Q6,#2
111          VMLAL.S16             Q9,D12,D4[0]
112          VMLAL.S16             Q10,D13,D5[0]
113          VMLAL.S16             Q11,D13,D4[0]
114          VMLAL.S16             Q12,D14,D5[0]
115          VEXT.8                Q6,Q6,Q7,#2
116          VMLAL.S16             Q9,D14,D6[0]
117          VMLAL.S16             Q10,D15,D7[0]
118          VMLAL.S16             Q11,D15,D6[0]
119	  VMLAL.S16             Q12,D16,D7[0]
120	  VEXT.8  		Q7,Q7,Q8,#2
121
122	  VMLAL.S16 		Q9,D8,D0[1]
123	  VMLAL.S16     	Q10,D9,D1[1]
124	  VEXT.8 		Q8,Q8,Q15,#2
125	  VMLAL.S16 		Q11,D9,D0[1]
126	  VMLAL.S16 		Q12,D10,D1[1]
127	  VEXT.8  		Q4,Q4,Q5,#2
128	  VMLAL.S16 		Q9,D10,D2[1]
129	  VMLAL.S16 		Q10,D11,D3[1]
130	  VMLAL.S16 		Q11,D11,D2[1]
131	  VMLAL.S16 		Q12,D12,D3[1]
132	  VEXT.8  		Q5,Q5,Q6,#2
133	  VMLAL.S16 		Q9,D12,D4[1]
134	  VMLAL.S16 		Q10,D13,D5[1]
135	  VMLAL.S16 		Q11,D13,D4[1]
136	  VMLAL.S16 		Q12,D14,D5[1]
137	  VEXT.8  		Q6,Q6,Q7,#2
138	  VMLAL.S16 		Q9,D14,D6[1]
139	  VMLAL.S16 		Q10,D15,D7[1]
140	  VMLAL.S16 		Q11,D15,D6[1]
141	  VMLAL.S16 		Q12,D16,D7[1]
142	  VEXT.8  		Q7,Q7,Q8,#2
143
144	  VMLAL.S16 		Q9,D8,D0[2]
145	  VMLAL.S16 		Q10,D9,D1[2]
146	  VEXT.8 		Q8,Q8,Q15,#2
147	  VMLAL.S16 		Q11,D9,D0[2]
148	  VMLAL.S16 		Q12,D10,D1[2]
149	  VEXT.8  		Q4,Q4,Q5,#2
150	  VMLAL.S16 		Q9,D10,D2[2]
151	  VMLAL.S16 		Q10,D11,D3[2]
152	  VMLAL.S16 		Q11,D11,D2[2]
153	  VMLAL.S16 		Q12,D12,D3[2]
154	  VEXT.8  		Q5,Q5,Q6,#2
155	  VMLAL.S16 		Q9,D12,D4[2]
156	  VMLAL.S16 		Q10,D13,D5[2]
157	  VMLAL.S16 		Q11,D13,D4[2]
158	  VMLAL.S16 		Q12,D14,D5[2]
159	  VEXT.8  		Q6,Q6,Q7,#2
160	  VMLAL.S16 		Q9,D14,D6[2]
161	  VMLAL.S16 		Q10,D15,D7[2]
162	  VMLAL.S16 		Q11,D15,D6[2]
163	  VMLAL.S16 		Q12,D16,D7[2]
164	  VEXT.8  		Q7,Q7,Q8,#2
165
166	  VMLAL.S16 		Q9,D8,D0[3]
167	  VMLAL.S16 		Q10,D9,D1[3]
168	  VEXT.8 		Q8,Q8,Q15,#2
169	  VMLAL.S16 		Q11,D9,D0[3]
170	  VMLAL.S16 		Q12,D10,D1[3]
171	  VEXT.8  		Q4,Q4,Q5,#2
172	  VMLAL.S16 		Q9,D10,D2[3]
173	  VMLAL.S16 		Q10,D11,D3[3]
174	  VMLAL.S16 		Q11,D11,D2[3]
175	  VMLAL.S16 		Q12,D12,D3[3]
176	  VEXT.8  		Q5,Q5,Q6,#2
177	  VMLAL.S16 		Q9,D12,D4[3]
178	  VMLAL.S16 		Q10,D13,D5[3]
179	  VMLAL.S16 		Q11,D13,D4[3]
180	  VMLAL.S16 		Q12,D14,D5[3]
181	  VEXT.8  		Q6,Q6,Q7,#2
182	  VMLAL.S16 		Q9,D14,D6[3]
183	  VMLAL.S16 		Q10,D15,D7[3]
184	  VMLAL.S16 		Q11,D15,D6[3]
185	  VMLAL.S16 		Q12,D16,D7[3]
186	  VEXT.8 		Q7,Q7,Q8,#2
187
188	  VMOV.S16  		D8,D9
189	  VEXT.8 		Q8,Q8,Q15,#2
190	  VMOV.S16  		D9,D10
191	  VADD.S32  		Q9,Q9,Q10
192	  VMOV.S16  		D10,D11
193	  VMOV.S16  		D11,D12
194	  VADD.S32  		Q11,Q11,Q12
195	  VMOV.S16  		D12,D13
196	  VQRSHRN.S32 		D28,Q9,#15
197	  VMOV.S16  		D13,D14
198	  VMOV.S16  		D14,D15
199	  VQRSHRN.S32 		D29,Q11,#15
200	  VMOV.S16  		D15,D16
201
202	  VLD1.S16  		{Q8},[r4]!
203	  ADD                   r5, r5, #8
204	  CMP   		r5, #80
205	  VST1.S16  		{D28,D29},[r3]!
206	  BLT     		LOOP_6K7K
207
208          ADD     		r0, r13, #160               @x + lg
209	  MOV                   r1, r12
210	  @LDR     		r1, [sp, #-4]               @mem address
211
212	  VLD1.S16              {D0, D1, D2, D3}, [r0]!
213	  VLD1.S16              {D4, D5, D6, D7}, [r0]!
214
215	  VST1.S16              {D0, D1, D2, D3}, [r1]!
216	  VST1.S16              {D4, D5, D6}, [r1]!
217	  VST1.S16              D7[0], [r1]!
218	  VST1.S16              D7[1], [r1]!
219
220Filt_6k_7k_end:
221
222          ADD     		r13, r13, #240
223          LDMFD   		r13!, {r0 - r12, r15}
224
225Lable1:
226          .word   		fir_6k_7k-Lable1
227          @ENDFUNC
228          .END
229
230
231