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