1 /*
2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include "webrtc/modules/audio_coding/codecs/isac/fix/source/codec.h"
12 #include "webrtc/modules/audio_coding/codecs/isac/fix/source/fft.h"
13 #include "webrtc/modules/audio_coding/codecs/isac/fix/source/settings.h"
14
15 // The tables are defined in transform_tables.c file.
16 extern const int16_t WebRtcIsacfix_kCosTab1[FRAMESAMPLES/2];
17 extern const int16_t WebRtcIsacfix_kSinTab1[FRAMESAMPLES/2];
18 extern const int16_t WebRtcIsacfix_kCosTab2[FRAMESAMPLES/4];
19 extern const int16_t WebRtcIsacfix_kSinTab2[FRAMESAMPLES/4];
20
21 // MIPS DSPr2 version of the WebRtcIsacfix_Time2Spec function
22 // is not bit-exact with the C version.
23 // The accuracy of the MIPS DSPr2 version is same or better.
WebRtcIsacfix_Time2SpecMIPS(int16_t * inre1Q9,int16_t * inre2Q9,int16_t * outreQ7,int16_t * outimQ7)24 void WebRtcIsacfix_Time2SpecMIPS(int16_t* inre1Q9,
25 int16_t* inre2Q9,
26 int16_t* outreQ7,
27 int16_t* outimQ7) {
28 int k = FRAMESAMPLES / 2;
29 int32_t tmpreQ16[FRAMESAMPLES / 2], tmpimQ16[FRAMESAMPLES / 2];
30 int32_t r0, r1, r2, r3, r4, r5, r6, r7, r8, r9;
31 int32_t inre1, inre2, tmpre, tmpim, factor, max, max1;
32 int16_t* cosptr;
33 int16_t* sinptr;
34
35 cosptr = (int16_t*)WebRtcIsacfix_kCosTab1;
36 sinptr = (int16_t*)WebRtcIsacfix_kSinTab1;
37
38 __asm __volatile (
39 ".set push \n\t"
40 ".set noreorder \n\t"
41 "addiu %[inre1], %[inre1Q9], 0 \n\t"
42 "addiu %[inre2], %[inre2Q9], 0 \n\t"
43 "addiu %[tmpre], %[tmpreQ16], 0 \n\t"
44 "addiu %[tmpim], %[tmpimQ16], 0 \n\t"
45 "addiu %[factor], $zero, 16921 \n\t"
46 "mul %[max], $zero, $zero \n\t"
47 // Multiply with complex exponentials and combine into one complex vector.
48 // Also, calculate the maximal absolute value in the same loop.
49 "1: \n\t"
50 #if defined(MIPS_DSP_R2_LE)
51 "lwl %[r0], 0(%[inre1]) \n\t"
52 "lwl %[r2], 0(%[cosptr]) \n\t"
53 "lwl %[r3], 0(%[sinptr]) \n\t"
54 "lwl %[r1], 0(%[inre2]) \n\t"
55 "lwr %[r0], 0(%[inre1]) \n\t"
56 "lwr %[r2], 0(%[cosptr]) \n\t"
57 "lwr %[r3], 0(%[sinptr]) \n\t"
58 "lwr %[r1], 0(%[inre2]) \n\t"
59 "muleq_s.w.phr %[r4], %[r2], %[r0] \n\t"
60 "muleq_s.w.phr %[r5], %[r3], %[r0] \n\t"
61 "muleq_s.w.phr %[r6], %[r3], %[r1] \n\t"
62 "muleq_s.w.phr %[r7], %[r2], %[r1] \n\t"
63 "muleq_s.w.phl %[r8], %[r2], %[r0] \n\t"
64 "muleq_s.w.phl %[r0], %[r3], %[r0] \n\t"
65 "muleq_s.w.phl %[r3], %[r3], %[r1] \n\t"
66 "muleq_s.w.phl %[r1], %[r2], %[r1] \n\t"
67 "addiu %[k], %[k], -2 \n\t"
68 "addu %[r4], %[r4], %[r6] \n\t"
69 "subu %[r5], %[r7], %[r5] \n\t"
70 "sra %[r4], %[r4], 8 \n\t"
71 "sra %[r5], %[r5], 8 \n\t"
72 "mult $ac0, %[factor], %[r4] \n\t"
73 "mult $ac1, %[factor], %[r5] \n\t"
74 "addu %[r3], %[r8], %[r3] \n\t"
75 "subu %[r0], %[r1], %[r0] \n\t"
76 "sra %[r3], %[r3], 8 \n\t"
77 "sra %[r0], %[r0], 8 \n\t"
78 "mult $ac2, %[factor], %[r3] \n\t"
79 "mult $ac3, %[factor], %[r0] \n\t"
80 "extr_r.w %[r4], $ac0, 16 \n\t"
81 "extr_r.w %[r5], $ac1, 16 \n\t"
82 "addiu %[inre1], %[inre1], 4 \n\t"
83 "addiu %[inre2], %[inre2], 4 \n\t"
84 "extr_r.w %[r6], $ac2, 16 \n\t"
85 "extr_r.w %[r7], $ac3, 16 \n\t"
86 "addiu %[cosptr], %[cosptr], 4 \n\t"
87 "addiu %[sinptr], %[sinptr], 4 \n\t"
88 "shra_r.w %[r4], %[r4], 3 \n\t"
89 "shra_r.w %[r5], %[r5], 3 \n\t"
90 "sw %[r4], 0(%[tmpre]) \n\t"
91 "absq_s.w %[r4], %[r4] \n\t"
92 "sw %[r5], 0(%[tmpim]) \n\t"
93 "absq_s.w %[r5], %[r5] \n\t"
94 "shra_r.w %[r6], %[r6], 3 \n\t"
95 "shra_r.w %[r7], %[r7], 3 \n\t"
96 "sw %[r6], 4(%[tmpre]) \n\t"
97 "absq_s.w %[r6], %[r6] \n\t"
98 "sw %[r7], 4(%[tmpim]) \n\t"
99 "absq_s.w %[r7], %[r7] \n\t"
100 "slt %[r0], %[r4], %[r5] \n\t"
101 "movn %[r4], %[r5], %[r0] \n\t"
102 "slt %[r1], %[r6], %[r7] \n\t"
103 "movn %[r6], %[r7], %[r1] \n\t"
104 "slt %[r0], %[max], %[r4] \n\t"
105 "movn %[max], %[r4], %[r0] \n\t"
106 "slt %[r1], %[max], %[r6] \n\t"
107 "movn %[max], %[r6], %[r1] \n\t"
108 "addiu %[tmpre], %[tmpre], 8 \n\t"
109 "bgtz %[k], 1b \n\t"
110 " addiu %[tmpim], %[tmpim], 8 \n\t"
111 #else // #if defined(MIPS_DSP_R2_LE)
112 "lh %[r0], 0(%[inre1]) \n\t"
113 "lh %[r1], 0(%[inre2]) \n\t"
114 "lh %[r2], 0(%[cosptr]) \n\t"
115 "lh %[r3], 0(%[sinptr]) \n\t"
116 "addiu %[k], %[k], -1 \n\t"
117 "mul %[r4], %[r0], %[r2] \n\t"
118 "mul %[r5], %[r1], %[r3] \n\t"
119 "mul %[r0], %[r0], %[r3] \n\t"
120 "mul %[r2], %[r1], %[r2] \n\t"
121 "addiu %[inre1], %[inre1], 2 \n\t"
122 "addiu %[inre2], %[inre2], 2 \n\t"
123 "addiu %[cosptr], %[cosptr], 2 \n\t"
124 "addiu %[sinptr], %[sinptr], 2 \n\t"
125 "addu %[r1], %[r4], %[r5] \n\t"
126 "sra %[r1], %[r1], 7 \n\t"
127 "sra %[r3], %[r1], 16 \n\t"
128 "andi %[r1], %[r1], 0xFFFF \n\t"
129 "sra %[r1], %[r1], 1 \n\t"
130 "mul %[r1], %[factor], %[r1] \n\t"
131 "mul %[r3], %[factor], %[r3] \n\t"
132 "subu %[r0], %[r2], %[r0] \n\t"
133 "sra %[r0], %[r0], 7 \n\t"
134 "sra %[r2], %[r0], 16 \n\t"
135 "andi %[r0], %[r0], 0xFFFF \n\t"
136 "sra %[r0], %[r0], 1 \n\t"
137 "mul %[r0], %[factor], %[r0] \n\t"
138 "mul %[r2], %[factor], %[r2] \n\t"
139 #if defined(MIPS_DSP_R1_LE)
140 "shra_r.w %[r1], %[r1], 15 \n\t"
141 #else // #if defined(MIPS_DSP_R1_LE)
142 "addiu %[r1], %[r1], 0x4000 \n\t"
143 "sra %[r1], %[r1], 15 \n\t"
144 #endif // #if defined(MIPS_DSP_R1_LE)
145 "addu %[r1], %[r3], %[r1] \n\t"
146 #if defined(MIPS_DSP_R1_LE)
147 "shra_r.w %[r1], %[r1], 3 \n\t"
148 #else // #if defined(MIPS_DSP_R1_LE)
149 "addiu %[r1], %[r1], 4 \n\t"
150 "sra %[r1], %[r1], 3 \n\t"
151 #endif // #if defined(MIPS_DSP_R1_LE)
152 "sw %[r1], 0(%[tmpre]) \n\t"
153 "addiu %[tmpre], %[tmpre], 4 \n\t"
154 #if defined(MIPS_DSP_R1_LE)
155 "absq_s.w %[r1], %[r1] \n\t"
156 "shra_r.w %[r0], %[r0], 15 \n\t"
157 #else // #if defined(MIPS_DSP_R1_LE)
158 "negu %[r4], %[r1] \n\t"
159 "slt %[r3], %[r1], $zero \n\t"
160 "movn %[r1], %[r4], %[r3] \n\t"
161 "addiu %[r0], %[r0], 0x4000 \n\t"
162 "sra %[r0], %[r0], 15 \n\t"
163 #endif // #if defined(MIPS_DSP_R1_LE)
164 "addu %[r0], %[r0], %[r2] \n\t"
165 #if defined(MIPS_DSP_R1_LE)
166 "shra_r.w %[r0], %[r0], 3 \n\t"
167 "sw %[r0], 0(%[tmpim]) \n\t"
168 "absq_s.w %[r0], %[r0] \n\t"
169 #else // #if defined(MIPS_DSP_R1_LE)
170 "addiu %[r0], %[r0], 4 \n\t"
171 "sra %[r0], %[r0], 3 \n\t"
172 "sw %[r0], 0(%[tmpim]) \n\t"
173 "negu %[r2], %[r0] \n\t"
174 "slt %[r3], %[r0], $zero \n\t"
175 "movn %[r0], %[r2], %[r3] \n\t"
176 #endif // #if defined(MIPS_DSP_R1_LE)
177 "slt %[r2], %[max], %[r1] \n\t"
178 "movn %[max], %[r1], %[r2] \n\t"
179 "slt %[r2], %[max], %[r0] \n\t"
180 "movn %[max], %[r0], %[r2] \n\t"
181 "bgtz %[k], 1b \n\t"
182 " addiu %[tmpim], %[tmpim], 4 \n\t"
183 #endif // #if defined(MIPS_DSP_R2_LE)
184 // Calculate WebRtcSpl_NormW32(max).
185 // If max gets value >=0, we should shift max steps to the left, and the
186 // domain will be Q(16+shift). If max gets value <0, we should shift -max
187 // steps to the right, and the domain will be Q(16+max)
188 "clz %[max], %[max] \n\t"
189 "addiu %[max], %[max], -25 \n\t"
190 ".set pop \n\t"
191 : [k] "+r" (k), [inre1] "=&r" (inre1), [inre2] "=&r" (inre2),
192 [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2),
193 [r3] "=&r" (r3), [r4] "=&r" (r4), [tmpre] "=&r" (tmpre),
194 [tmpim] "=&r" (tmpim), [max] "=&r" (max), [factor] "=&r" (factor),
195 #if defined(MIPS_DSP_R2_LE)
196 [r6] "=&r" (r6), [r7] "=&r" (r7), [r8] "=&r" (r8),
197 #endif // #if defined(MIPS_DSP_R2_LE)
198 [r5] "=&r" (r5)
199 : [inre1Q9] "r" (inre1Q9), [inre2Q9] "r" (inre2Q9),
200 [tmpreQ16] "r" (tmpreQ16), [tmpimQ16] "r" (tmpimQ16),
201 [cosptr] "r" (cosptr), [sinptr] "r" (sinptr)
202 : "hi", "lo", "memory"
203 #if defined(MIPS_DSP_R2_LE)
204 , "$ac1hi", "$ac1lo", "$ac2hi", "$ac2lo", "$ac3hi", "$ac3lo"
205 #endif // #if defined(MIPS_DSP_R2_LE)
206 );
207
208 // "Fastest" vectors
209 k = FRAMESAMPLES / 4;
210 __asm __volatile (
211 ".set push \n\t"
212 ".set noreorder \n\t"
213 "addiu %[tmpre], %[tmpreQ16], 0 \n\t"
214 "addiu %[tmpim], %[tmpimQ16], 0 \n\t"
215 "addiu %[inre1], %[inre1Q9], 0 \n\t"
216 "addiu %[inre2], %[inre2Q9], 0 \n\t"
217 "blez %[max], 2f \n\t"
218 " subu %[max1], $zero, %[max] \n\t"
219 "1: \n\t"
220 "lw %[r0], 0(%[tmpre]) \n\t"
221 "lw %[r1], 0(%[tmpim]) \n\t"
222 "lw %[r2], 4(%[tmpre]) \n\t"
223 "lw %[r3], 4(%[tmpim]) \n\t"
224 "addiu %[k], %[k], -1 \n\t"
225 "sllv %[r0], %[r0], %[max] \n\t"
226 "sllv %[r1], %[r1], %[max] \n\t"
227 "sllv %[r2], %[r2], %[max] \n\t"
228 "sllv %[r3], %[r3], %[max] \n\t"
229 "addiu %[tmpre], %[tmpre], 8 \n\t"
230 "addiu %[tmpim], %[tmpim], 8 \n\t"
231 "sh %[r0], 0(%[inre1]) \n\t"
232 "sh %[r1], 0(%[inre2]) \n\t"
233 "sh %[r2], 2(%[inre1]) \n\t"
234 "sh %[r3], 2(%[inre2]) \n\t"
235 "addiu %[inre1], %[inre1], 4 \n\t"
236 "bgtz %[k], 1b \n\t"
237 " addiu %[inre2], %[inre2], 4 \n\t"
238 "b 4f \n\t"
239 " nop \n\t"
240 "2: \n\t"
241 #if !defined(MIPS_DSP_R1_LE)
242 "addiu %[r4], %[max1], -1 \n\t"
243 "addiu %[r5], $zero, 1 \n\t"
244 "sllv %[r4], %[r5], %[r4] \n\t"
245 #endif // #if !defined(MIPS_DSP_R1_LE)
246 "3: \n\t"
247 "lw %[r0], 0(%[tmpre]) \n\t"
248 "lw %[r1], 0(%[tmpim]) \n\t"
249 "lw %[r2], 4(%[tmpre]) \n\t"
250 "lw %[r3], 4(%[tmpim]) \n\t"
251 "addiu %[k], %[k], -1 \n\t"
252 #if defined(MIPS_DSP_R1_LE)
253 "shrav_r.w %[r0], %[r0], %[max1] \n\t"
254 "shrav_r.w %[r1], %[r1], %[max1] \n\t"
255 "shrav_r.w %[r2], %[r2], %[max1] \n\t"
256 "shrav_r.w %[r3], %[r3], %[max1] \n\t"
257 #else // #if !defined(MIPS_DSP_R1_LE)
258 "addu %[r0], %[r0], %[r4] \n\t"
259 "addu %[r1], %[r1], %[r4] \n\t"
260 "addu %[r2], %[r2], %[r4] \n\t"
261 "addu %[r3], %[r3], %[r4] \n\t"
262 "srav %[r0], %[r0], %[max1] \n\t"
263 "srav %[r1], %[r1], %[max1] \n\t"
264 "srav %[r2], %[r2], %[max1] \n\t"
265 "srav %[r3], %[r3], %[max1] \n\t"
266 #endif // #if !defined(MIPS_DSP_R1_LE)
267 "addiu %[tmpre], %[tmpre], 8 \n\t"
268 "addiu %[tmpim], %[tmpim], 8 \n\t"
269 "sh %[r0], 0(%[inre1]) \n\t"
270 "sh %[r1], 0(%[inre2]) \n\t"
271 "sh %[r2], 2(%[inre1]) \n\t"
272 "sh %[r3], 2(%[inre2]) \n\t"
273 "addiu %[inre1], %[inre1], 4 \n\t"
274 "bgtz %[k], 3b \n\t"
275 " addiu %[inre2], %[inre2], 4 \n\t"
276 "4: \n\t"
277 ".set pop \n\t"
278 : [tmpre] "=&r" (tmpre), [tmpim] "=&r" (tmpim), [inre1] "=&r" (inre1),
279 [inre2] "=&r" (inre2), [k] "+r" (k), [max1] "=&r" (max1),
280 #if !defined(MIPS_DSP_R1_LE)
281 [r4] "=&r" (r4), [r5] "=&r" (r5),
282 #endif // #if !defined(MIPS_DSP_R1_LE)
283 [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2), [r3] "=&r" (r3)
284 : [tmpreQ16] "r" (tmpreQ16), [tmpimQ16] "r" (tmpimQ16),
285 [inre1Q9] "r" (inre1Q9), [inre2Q9] "r" (inre2Q9), [max] "r" (max)
286 : "memory"
287 );
288
289 // Get DFT
290 WebRtcIsacfix_FftRadix16Fastest(inre1Q9, inre2Q9, -1); // real call
291
292 // "Fastest" vectors and
293 // Use symmetry to separate into two complex vectors
294 // and center frames in time around zero
295 // merged into one loop
296 cosptr = (int16_t*)WebRtcIsacfix_kCosTab2;
297 sinptr = (int16_t*)WebRtcIsacfix_kSinTab2;
298 k = FRAMESAMPLES / 4;
299 factor = FRAMESAMPLES - 2; // offset for FRAMESAMPLES / 2 - 1 array member
300
301 __asm __volatile (
302 ".set push \n\t"
303 ".set noreorder \n\t"
304 "addiu %[inre1], %[inre1Q9], 0 \n\t"
305 "addiu %[inre2], %[inre2Q9], 0 \n\t"
306 "addiu %[tmpre], %[outreQ7], 0 \n\t"
307 "addiu %[tmpim], %[outimQ7], 0 \n\t"
308 "bltz %[max], 2f \n\t"
309 " subu %[max1], $zero, %[max] \n\t"
310 "1: \n\t"
311 #if !defined(MIPS_DSP_R1_LE)
312 "addu %[r4], %[inre1], %[offset] \n\t"
313 "addu %[r5], %[inre2], %[offset] \n\t"
314 #endif // #if !defined(MIPS_DSP_R1_LE)
315 "lh %[r0], 0(%[inre1]) \n\t"
316 "lh %[r1], 0(%[inre2]) \n\t"
317 #if defined(MIPS_DSP_R1_LE)
318 "lhx %[r2], %[offset](%[inre1]) \n\t"
319 "lhx %[r3], %[offset](%[inre2]) \n\t"
320 #else // #if defined(MIPS_DSP_R1_LE)
321 "lh %[r2], 0(%[r4]) \n\t"
322 "lh %[r3], 0(%[r5]) \n\t"
323 #endif // #if defined(MIPS_DSP_R1_LE)
324 "srav %[r0], %[r0], %[max] \n\t"
325 "srav %[r1], %[r1], %[max] \n\t"
326 "srav %[r2], %[r2], %[max] \n\t"
327 "srav %[r3], %[r3], %[max] \n\t"
328 "addu %[r4], %[r0], %[r2] \n\t"
329 "subu %[r0], %[r2], %[r0] \n\t"
330 "subu %[r2], %[r1], %[r3] \n\t"
331 "addu %[r1], %[r1], %[r3] \n\t"
332 "lh %[r3], 0(%[cosptr]) \n\t"
333 "lh %[r5], 0(%[sinptr]) \n\t"
334 "andi %[r6], %[r4], 0xFFFF \n\t"
335 "sra %[r4], %[r4], 16 \n\t"
336 "mul %[r7], %[r3], %[r6] \n\t"
337 "mul %[r8], %[r3], %[r4] \n\t"
338 "mul %[r6], %[r5], %[r6] \n\t"
339 "mul %[r4], %[r5], %[r4] \n\t"
340 "addiu %[k], %[k], -1 \n\t"
341 "addiu %[inre1], %[inre1], 2 \n\t"
342 "addiu %[inre2], %[inre2], 2 \n\t"
343 #if defined(MIPS_DSP_R1_LE)
344 "shra_r.w %[r7], %[r7], 14 \n\t"
345 #else // #if defined(MIPS_DSP_R1_LE)
346 "addiu %[r7], %[r7], 0x2000 \n\t"
347 "sra %[r7], %[r7], 14 \n\t"
348 #endif // #if defined(MIPS_DSP_R1_LE)
349 "sll %[r8], %[r8], 2 \n\t"
350 "addu %[r8], %[r8], %[r7] \n\t"
351 #if defined(MIPS_DSP_R1_LE)
352 "shra_r.w %[r6], %[r6], 14 \n\t"
353 #else // #if defined(MIPS_DSP_R1_LE)
354 "addiu %[r6], %[r6], 0x2000 \n\t"
355 "sra %[r6], %[r6], 14 \n\t"
356 #endif // #if defined(MIPS_DSP_R1_LE)
357 "sll %[r4], %[r4], 2 \n\t"
358 "addu %[r4], %[r4], %[r6] \n\t"
359 "andi %[r6], %[r2], 0xFFFF \n\t"
360 "sra %[r2], %[r2], 16 \n\t"
361 "mul %[r7], %[r5], %[r6] \n\t"
362 "mul %[r9], %[r5], %[r2] \n\t"
363 "mul %[r6], %[r3], %[r6] \n\t"
364 "mul %[r2], %[r3], %[r2] \n\t"
365 "addiu %[cosptr], %[cosptr], 2 \n\t"
366 "addiu %[sinptr], %[sinptr], 2 \n\t"
367 #if defined(MIPS_DSP_R1_LE)
368 "shra_r.w %[r7], %[r7], 14 \n\t"
369 #else // #if defined(MIPS_DSP_R1_LE)
370 "addiu %[r7], %[r7], 0x2000 \n\t"
371 "sra %[r7], %[r7], 14 \n\t"
372 #endif // #if defined(MIPS_DSP_R1_LE)
373 "sll %[r9], %[r9], 2 \n\t"
374 "addu %[r9], %[r7], %[r9] \n\t"
375 #if defined(MIPS_DSP_R1_LE)
376 "shra_r.w %[r6], %[r6], 14 \n\t"
377 #else // #if defined(MIPS_DSP_R1_LE)
378 "addiu %[r6], %[r6], 0x2000 \n\t"
379 "sra %[r6], %[r6], 14 \n\t"
380 #endif // #if defined(MIPS_DSP_R1_LE)
381 "sll %[r2], %[r2], 2 \n\t"
382 "addu %[r2], %[r6], %[r2] \n\t"
383 "subu %[r8], %[r8], %[r9] \n\t"
384 "sra %[r8], %[r8], 9 \n\t"
385 "addu %[r2], %[r4], %[r2] \n\t"
386 "sra %[r2], %[r2], 9 \n\t"
387 "sh %[r8], 0(%[tmpre]) \n\t"
388 "sh %[r2], 0(%[tmpim]) \n\t"
389
390 "andi %[r4], %[r1], 0xFFFF \n\t"
391 "sra %[r1], %[r1], 16 \n\t"
392 "andi %[r6], %[r0], 0xFFFF \n\t"
393 "sra %[r0], %[r0], 16 \n\t"
394 "mul %[r7], %[r5], %[r4] \n\t"
395 "mul %[r9], %[r5], %[r1] \n\t"
396 "mul %[r4], %[r3], %[r4] \n\t"
397 "mul %[r1], %[r3], %[r1] \n\t"
398 "mul %[r8], %[r3], %[r0] \n\t"
399 "mul %[r3], %[r3], %[r6] \n\t"
400 "mul %[r6], %[r5], %[r6] \n\t"
401 "mul %[r0], %[r5], %[r0] \n\t"
402 #if defined(MIPS_DSP_R1_LE)
403 "shra_r.w %[r7], %[r7], 14 \n\t"
404 #else // #if defined(MIPS_DSP_R1_LE)
405 "addiu %[r7], %[r7], 0x2000 \n\t"
406 "sra %[r7], %[r7], 14 \n\t"
407 #endif // #if defined(MIPS_DSP_R1_LE)
408 "sll %[r9], %[r9], 2 \n\t"
409 "addu %[r9], %[r9], %[r7] \n\t"
410 #if defined(MIPS_DSP_R1_LE)
411 "shra_r.w %[r4], %[r4], 14 \n\t"
412 #else // #if defined(MIPS_DSP_R1_LE)
413 "addiu %[r4], %[r4], 0x2000 \n\t"
414 "sra %[r4], %[r4], 14 \n\t"
415 #endif // #if defined(MIPS_DSP_R1_LE)
416 "sll %[r1], %[r1], 2 \n\t"
417 "addu %[r1], %[r1], %[r4] \n\t"
418 #if defined(MIPS_DSP_R1_LE)
419 "shra_r.w %[r3], %[r3], 14 \n\t"
420 #else // #if defined(MIPS_DSP_R1_LE)
421 "addiu %[r3], %[r3], 0x2000 \n\t"
422 "sra %[r3], %[r3], 14 \n\t"
423 #endif // #if defined(MIPS_DSP_R1_LE)
424 "sll %[r8], %[r8], 2 \n\t"
425 "addu %[r8], %[r8], %[r3] \n\t"
426 #if defined(MIPS_DSP_R1_LE)
427 "shra_r.w %[r6], %[r6], 14 \n\t"
428 #else // #if defined(MIPS_DSP_R1_LE)
429 "addiu %[r6], %[r6], 0x2000 \n\t"
430 "sra %[r6], %[r6], 14 \n\t"
431 #endif // #if defined(MIPS_DSP_R1_LE)
432 "sll %[r0], %[r0], 2 \n\t"
433 "addu %[r0], %[r0], %[r6] \n\t"
434 "addu %[r3], %[tmpre], %[offset] \n\t"
435 "addu %[r2], %[tmpim], %[offset] \n\t"
436 "addu %[r9], %[r9], %[r8] \n\t"
437 "negu %[r9], %[r9] \n\t"
438 "sra %[r9], %[r9], 9 \n\t"
439 "subu %[r0], %[r0], %[r1] \n\t"
440 "addiu %[offset], %[offset], -4 \n\t"
441 "sh %[r9], 0(%[r3]) \n\t"
442 "sh %[r0], 0(%[r2]) \n\t"
443 "addiu %[tmpre], %[tmpre], 2 \n\t"
444 "bgtz %[k], 1b \n\t"
445 " addiu %[tmpim], %[tmpim], 2 \n\t"
446 "b 3f \n\t"
447 " nop \n\t"
448 "2: \n\t"
449 #if !defined(MIPS_DSP_R1_LE)
450 "addu %[r4], %[inre1], %[offset] \n\t"
451 "addu %[r5], %[inre2], %[offset] \n\t"
452 #endif // #if !defined(MIPS_DSP_R1_LE)
453 "lh %[r0], 0(%[inre1]) \n\t"
454 "lh %[r1], 0(%[inre2]) \n\t"
455 #if defined(MIPS_DSP_R1_LE)
456 "lhx %[r2], %[offset](%[inre1]) \n\t"
457 "lhx %[r3], %[offset](%[inre2]) \n\t"
458 #else // #if defined(MIPS_DSP_R1_LE)
459 "lh %[r2], 0(%[r4]) \n\t"
460 "lh %[r3], 0(%[r5]) \n\t"
461 #endif // #if defined(MIPS_DSP_R1_LE)
462 "sllv %[r0], %[r0], %[max1] \n\t"
463 "sllv %[r1], %[r1], %[max1] \n\t"
464 "sllv %[r2], %[r2], %[max1] \n\t"
465 "sllv %[r3], %[r3], %[max1] \n\t"
466 "addu %[r4], %[r0], %[r2] \n\t"
467 "subu %[r0], %[r2], %[r0] \n\t"
468 "subu %[r2], %[r1], %[r3] \n\t"
469 "addu %[r1], %[r1], %[r3] \n\t"
470 "lh %[r3], 0(%[cosptr]) \n\t"
471 "lh %[r5], 0(%[sinptr]) \n\t"
472 "andi %[r6], %[r4], 0xFFFF \n\t"
473 "sra %[r4], %[r4], 16 \n\t"
474 "mul %[r7], %[r3], %[r6] \n\t"
475 "mul %[r8], %[r3], %[r4] \n\t"
476 "mul %[r6], %[r5], %[r6] \n\t"
477 "mul %[r4], %[r5], %[r4] \n\t"
478 "addiu %[k], %[k], -1 \n\t"
479 "addiu %[inre1], %[inre1], 2 \n\t"
480 "addiu %[inre2], %[inre2], 2 \n\t"
481 #if defined(MIPS_DSP_R1_LE)
482 "shra_r.w %[r7], %[r7], 14 \n\t"
483 #else // #if defined(MIPS_DSP_R1_LE)
484 "addiu %[r7], %[r7], 0x2000 \n\t"
485 "sra %[r7], %[r7], 14 \n\t"
486 #endif // #if defined(MIPS_DSP_R1_LE)
487 "sll %[r8], %[r8], 2 \n\t"
488 "addu %[r8], %[r8], %[r7] \n\t"
489 #if defined(MIPS_DSP_R1_LE)
490 "shra_r.w %[r6], %[r6], 14 \n\t"
491 #else // #if defined(MIPS_DSP_R1_LE)
492 "addiu %[r6], %[r6], 0x2000 \n\t"
493 "sra %[r6], %[r6], 14 \n\t"
494 #endif // #if defined(MIPS_DSP_R1_LE)
495 "sll %[r4], %[r4], 2 \n\t"
496 "addu %[r4], %[r4], %[r6] \n\t"
497 "andi %[r6], %[r2], 0xFFFF \n\t"
498 "sra %[r2], %[r2], 16 \n\t"
499 "mul %[r7], %[r5], %[r6] \n\t"
500 "mul %[r9], %[r5], %[r2] \n\t"
501 "mul %[r6], %[r3], %[r6] \n\t"
502 "mul %[r2], %[r3], %[r2] \n\t"
503 "addiu %[cosptr], %[cosptr], 2 \n\t"
504 "addiu %[sinptr], %[sinptr], 2 \n\t"
505 #if defined(MIPS_DSP_R1_LE)
506 "shra_r.w %[r7], %[r7], 14 \n\t"
507 #else // #if defined(MIPS_DSP_R1_LE)
508 "addiu %[r7], %[r7], 0x2000 \n\t"
509 "sra %[r7], %[r7], 14 \n\t"
510 #endif // #if defined(MIPS_DSP_R1_LE)
511 "sll %[r9], %[r9], 2 \n\t"
512 "addu %[r9], %[r7], %[r9] \n\t"
513 #if defined(MIPS_DSP_R1_LE)
514 "shra_r.w %[r6], %[r6], 14 \n\t"
515 #else // #if defined(MIPS_DSP_R1_LE)
516 "addiu %[r6], %[r6], 0x2000 \n\t"
517 "sra %[r6], %[r6], 14 \n\t"
518 #endif // #if defined(MIPS_DSP_R1_LE)
519 "sll %[r2], %[r2], 2 \n\t"
520 "addu %[r2], %[r6], %[r2] \n\t"
521 "subu %[r8], %[r8], %[r9] \n\t"
522 "sra %[r8], %[r8], 9 \n\t"
523 "addu %[r2], %[r4], %[r2] \n\t"
524 "sra %[r2], %[r2], 9 \n\t"
525 "sh %[r8], 0(%[tmpre]) \n\t"
526 "sh %[r2], 0(%[tmpim]) \n\t"
527 "andi %[r4], %[r1], 0xFFFF \n\t"
528 "sra %[r1], %[r1], 16 \n\t"
529 "andi %[r6], %[r0], 0xFFFF \n\t"
530 "sra %[r0], %[r0], 16 \n\t"
531 "mul %[r7], %[r5], %[r4] \n\t"
532 "mul %[r9], %[r5], %[r1] \n\t"
533 "mul %[r4], %[r3], %[r4] \n\t"
534 "mul %[r1], %[r3], %[r1] \n\t"
535 "mul %[r8], %[r3], %[r0] \n\t"
536 "mul %[r3], %[r3], %[r6] \n\t"
537 "mul %[r6], %[r5], %[r6] \n\t"
538 "mul %[r0], %[r5], %[r0] \n\t"
539 #if defined(MIPS_DSP_R1_LE)
540 "shra_r.w %[r7], %[r7], 14 \n\t"
541 #else // #if defined(MIPS_DSP_R1_LE)
542 "addiu %[r7], %[r7], 0x2000 \n\t"
543 "sra %[r7], %[r7], 14 \n\t"
544 #endif // #if defined(MIPS_DSP_R1_LE)
545 "sll %[r9], %[r9], 2 \n\t"
546 "addu %[r9], %[r9], %[r7] \n\t"
547 #if defined(MIPS_DSP_R1_LE)
548 "shra_r.w %[r4], %[r4], 14 \n\t"
549 #else // #if defined(MIPS_DSP_R1_LE)
550 "addiu %[r4], %[r4], 0x2000 \n\t"
551 "sra %[r4], %[r4], 14 \n\t"
552 #endif
553 "sll %[r1], %[r1], 2 \n\t"
554 "addu %[r1], %[r1], %[r4] \n\t"
555 #if defined(MIPS_DSP_R1_LE)
556 "shra_r.w %[r3], %[r3], 14 \n\t"
557 #else // #if defined(MIPS_DSP_R1_LE)
558 "addiu %[r3], %[r3], 0x2000 \n\t"
559 "sra %[r3], %[r3], 14 \n\t"
560 #endif // #if defined(MIPS_DSP_R1_LE)
561 "sll %[r8], %[r8], 2 \n\t"
562 "addu %[r8], %[r8], %[r3] \n\t"
563 #if defined(MIPS_DSP_R1_LE)
564 "shra_r.w %[r6], %[r6], 14 \n\t"
565 #else // #if defined(MIPS_DSP_R1_LE)
566 "addiu %[r6], %[r6], 0x2000 \n\t"
567 "sra %[r6], %[r6], 14 \n\t"
568 #endif // #if defined(MIPS_DSP_R1_LE)
569 "sll %[r0], %[r0], 2 \n\t"
570 "addu %[r0], %[r0], %[r6] \n\t"
571 "addu %[r3], %[tmpre], %[offset] \n\t"
572 "addu %[r2], %[tmpim], %[offset] \n\t"
573 "addu %[r9], %[r9], %[r8] \n\t"
574 "negu %[r9], %[r9] \n\t"
575 "sra %[r9], %[r9], 9 \n\t"
576 "subu %[r0], %[r0], %[r1] \n\t"
577 "sra %[r0], %[r0], 9 \n\t"
578 "addiu %[offset], %[offset], -4 \n\t"
579 "sh %[r9], 0(%[r3]) \n\t"
580 "sh %[r0], 0(%[r2]) \n\t"
581 "addiu %[tmpre], %[tmpre], 2 \n\t"
582 "bgtz %[k], 2b \n\t"
583 " addiu %[tmpim], %[tmpim], 2 \n\t"
584 "3: \n\t"
585 ".set pop \n\t"
586 : [inre1] "=&r" (inre1), [inre2] "=&r" (inre2), [tmpre] "=&r" (tmpre),
587 [tmpim] "=&r" (tmpim), [offset] "+r" (factor), [k] "+r" (k),
588 [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2), [r3] "=&r" (r3),
589 [r4] "=&r" (r4), [r5] "=&r" (r5), [r6] "=&r" (r6), [r7] "=&r" (r7),
590 [r8] "=&r" (r8), [r9] "=&r" (r9), [max1] "=&r" (max1)
591 : [inre1Q9] "r" (inre1Q9), [inre2Q9] "r" (inre2Q9),
592 [outreQ7] "r" (outreQ7), [outimQ7] "r" (outimQ7),
593 [max] "r" (max), [cosptr] "r" (cosptr), [sinptr] "r" (sinptr)
594 : "hi", "lo", "memory"
595 );
596 }
597
WebRtcIsacfix_Spec2TimeMIPS(int16_t * inreQ7,int16_t * inimQ7,int32_t * outre1Q16,int32_t * outre2Q16)598 void WebRtcIsacfix_Spec2TimeMIPS(int16_t *inreQ7,
599 int16_t *inimQ7,
600 int32_t *outre1Q16,
601 int32_t *outre2Q16) {
602 int k = FRAMESAMPLES / 4;
603 int16_t* inre;
604 int16_t* inim;
605 int32_t* outre1;
606 int32_t* outre2;
607 int16_t* cosptr = (int16_t*)WebRtcIsacfix_kCosTab2;
608 int16_t* sinptr = (int16_t*)WebRtcIsacfix_kSinTab2;
609 int32_t r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, max, max1;
610 #if defined(MIPS_DSP_R1_LE)
611 int32_t offset = FRAMESAMPLES - 4;
612 #else // #if defined(MIPS_DSP_R1_LE)
613 int32_t offset = FRAMESAMPLES - 2;
614 #endif // #if defined(MIPS_DSP_R1_LE)
615
616 __asm __volatile (
617 ".set push \n\t"
618 ".set noreorder \n\t"
619 "addiu %[inre], %[inreQ7], 0 \n\t"
620 "addiu %[inim] , %[inimQ7], 0 \n\t"
621 "addiu %[outre1], %[outre1Q16], 0 \n\t"
622 "addiu %[outre2], %[outre2Q16], 0 \n\t"
623 "mul %[max], $zero, $zero \n\t"
624 "1: \n\t"
625 #if defined(MIPS_DSP_R1_LE)
626 // Process two samples in one iteration avoiding left shift before
627 // multiplication. MaxAbsValueW32 function inlined into the loop.
628 "addu %[r8], %[inre], %[offset] \n\t"
629 "addu %[r9], %[inim], %[offset] \n\t"
630 "lwl %[r4], 0(%[r8]) \n\t"
631 "lwl %[r5], 0(%[r9]) \n\t"
632 "lwl %[r0], 0(%[inre]) \n\t"
633 "lwl %[r1], 0(%[inim]) \n\t"
634 "lwl %[r2], 0(%[cosptr]) \n\t"
635 "lwl %[r3], 0(%[sinptr]) \n\t"
636 "lwr %[r4], 0(%[r8]) \n\t"
637 "lwr %[r5], 0(%[r9]) \n\t"
638 "lwr %[r0], 0(%[inre]) \n\t"
639 "lwr %[r1], 0(%[inim]) \n\t"
640 "lwr %[r2], 0(%[cosptr]) \n\t"
641 "lwr %[r3], 0(%[sinptr]) \n\t"
642 "packrl.ph %[r4], %[r4], %[r4] \n\t"
643 "packrl.ph %[r5], %[r5], %[r5] \n\t"
644 "muleq_s.w.phr %[r6], %[r0], %[r2] \n\t"
645 "muleq_s.w.phr %[r7], %[r1], %[r3] \n\t"
646 "muleq_s.w.phr %[r8], %[r4], %[r2] \n\t"
647 "muleq_s.w.phr %[r9], %[r5], %[r3] \n\t"
648 "addiu %[k], %[k], -2 \n\t"
649 "addiu %[cosptr], %[cosptr], 4 \n\t"
650 "addiu %[sinptr], %[sinptr], 4 \n\t"
651 "addiu %[inre], %[inre], 4 \n\t"
652 "addiu %[inim], %[inim], 4 \n\t"
653 "shra_r.w %[r6], %[r6], 6 \n\t"
654 "shra_r.w %[r7], %[r7], 6 \n\t"
655 "shra_r.w %[r8], %[r8], 6 \n\t"
656 "shra_r.w %[r9], %[r9], 6 \n\t"
657 "addu %[r6], %[r6], %[r7] \n\t"
658 "subu %[r9], %[r9], %[r8] \n\t"
659 "subu %[r7], %[r6], %[r9] \n\t"
660 "addu %[r6], %[r6], %[r9] \n\t"
661 "sw %[r7], 0(%[outre1]) \n\t"
662 "absq_s.w %[r7], %[r7] \n\t"
663 "slt %[r8], %[max], %[r7] \n\t"
664 "movn %[max], %[r7], %[r8] \n\t"
665 "sll %[r7], %[offset], 1 \n\t"
666 "addu %[r7], %[outre1], %[r7] \n\t"
667 "sw %[r6], 4(%[r7]) \n\t"
668 "absq_s.w %[r6], %[r6] \n\t"
669 "slt %[r8], %[max], %[r6] \n\t"
670 "movn %[max], %[r6], %[r8] \n\t"
671 "muleq_s.w.phl %[r6], %[r0], %[r2] \n\t"
672 "muleq_s.w.phl %[r7], %[r1], %[r3] \n\t"
673 "muleq_s.w.phl %[r8], %[r4], %[r2] \n\t"
674 "muleq_s.w.phl %[r9], %[r5], %[r3] \n\t"
675 "shra_r.w %[r6], %[r6], 6 \n\t"
676 "shra_r.w %[r7], %[r7], 6 \n\t"
677 "shra_r.w %[r8], %[r8], 6 \n\t"
678 "shra_r.w %[r9], %[r9], 6 \n\t"
679 "addu %[r6], %[r6], %[r7] \n\t"
680 "subu %[r9], %[r9], %[r8] \n\t"
681 "subu %[r7], %[r6], %[r9] \n\t"
682 "addu %[r6], %[r6], %[r9] \n\t"
683 "sw %[r7], 4(%[outre1]) \n\t"
684 "absq_s.w %[r7], %[r7] \n\t"
685 "slt %[r8], %[max], %[r7] \n\t"
686 "movn %[max], %[r7], %[r8] \n\t"
687 "sll %[r7], %[offset], 1 \n\t"
688 "addu %[r7], %[outre1], %[r7] \n\t"
689 "sw %[r6], 0(%[r7]) \n\t"
690 "absq_s.w %[r6], %[r6] \n\t"
691 "slt %[r8], %[max], %[r6] \n\t"
692 "movn %[max], %[r6], %[r8] \n\t"
693 "muleq_s.w.phr %[r6], %[r1], %[r2] \n\t"
694 "muleq_s.w.phr %[r7], %[r0], %[r3] \n\t"
695 "muleq_s.w.phr %[r8], %[r5], %[r2] \n\t"
696 "muleq_s.w.phr %[r9], %[r4], %[r3] \n\t"
697 "addiu %[outre1], %[outre1], 8 \n\t"
698 "shra_r.w %[r6], %[r6], 6 \n\t"
699 "shra_r.w %[r7], %[r7], 6 \n\t"
700 "shra_r.w %[r8], %[r8], 6 \n\t"
701 "shra_r.w %[r9], %[r9], 6 \n\t"
702 "subu %[r6], %[r6], %[r7] \n\t"
703 "addu %[r9], %[r9], %[r8] \n\t"
704 "subu %[r7], %[r6], %[r9] \n\t"
705 "addu %[r6], %[r9], %[r6] \n\t"
706 "negu %[r6], %[r6] \n\t"
707 "sw %[r7], 0(%[outre2]) \n\t"
708 "absq_s.w %[r7], %[r7] \n\t"
709 "slt %[r8], %[max], %[r7] \n\t"
710 "movn %[max], %[r7], %[r8] \n\t"
711 "sll %[r7], %[offset], 1 \n\t"
712 "addu %[r7], %[outre2], %[r7] \n\t"
713 "sw %[r6], 4(%[r7]) \n\t"
714 "absq_s.w %[r6], %[r6] \n\t"
715 "slt %[r8], %[max], %[r6] \n\t"
716 "movn %[max], %[r6], %[r8] \n\t"
717 "muleq_s.w.phl %[r6], %[r1], %[r2] \n\t"
718 "muleq_s.w.phl %[r7], %[r0], %[r3] \n\t"
719 "muleq_s.w.phl %[r8], %[r5], %[r2] \n\t"
720 "muleq_s.w.phl %[r9], %[r4], %[r3] \n\t"
721 "addiu %[offset], %[offset], -8 \n\t"
722 "shra_r.w %[r6], %[r6], 6 \n\t"
723 "shra_r.w %[r7], %[r7], 6 \n\t"
724 "shra_r.w %[r8], %[r8], 6 \n\t"
725 "shra_r.w %[r9], %[r9], 6 \n\t"
726 "subu %[r6], %[r6], %[r7] \n\t"
727 "addu %[r9], %[r9], %[r8] \n\t"
728 "subu %[r7], %[r6], %[r9] \n\t"
729 "addu %[r6], %[r9], %[r6] \n\t"
730 "negu %[r6], %[r6] \n\t"
731 "sw %[r7], 4(%[outre2]) \n\t"
732 "absq_s.w %[r7], %[r7] \n\t"
733 "slt %[r8], %[max], %[r7] \n\t"
734 "movn %[max], %[r7], %[r8] \n\t"
735 "sll %[r7], %[offset], 1 \n\t"
736 "addu %[r7], %[outre2], %[r7] \n\t"
737 "sw %[r6], 0(%[r7]) \n\t"
738 "absq_s.w %[r6], %[r6] \n\t"
739 "slt %[r8], %[max], %[r6] \n\t"
740 "movn %[max], %[r6], %[r8] \n\t"
741 "bgtz %[k], 1b \n\t"
742 " addiu %[outre2], %[outre2], 8 \n\t"
743 #else // #if defined(MIPS_DSP_R1_LE)
744 "lh %[r0], 0(%[inre]) \n\t"
745 "lh %[r1], 0(%[inim]) \n\t"
746 "lh %[r4], 0(%[cosptr]) \n\t"
747 "lh %[r5], 0(%[sinptr]) \n\t"
748 "addiu %[k], %[k], -1 \n\t"
749 "mul %[r2], %[r0], %[r4] \n\t"
750 "mul %[r0], %[r0], %[r5] \n\t"
751 "mul %[r3], %[r1], %[r5] \n\t"
752 "mul %[r1], %[r1], %[r4] \n\t"
753 "addiu %[cosptr], %[cosptr], 2 \n\t"
754 "addiu %[sinptr], %[sinptr], 2 \n\t"
755 "addu %[r8], %[inre], %[offset] \n\t"
756 "addu %[r9], %[inim], %[offset] \n\t"
757 "addiu %[r2], %[r2], 16 \n\t"
758 "sra %[r2], %[r2], 5 \n\t"
759 "addiu %[r0], %[r0], 16 \n\t"
760 "sra %[r0], %[r0], 5 \n\t"
761 "addiu %[r3], %[r3], 16 \n\t"
762 "sra %[r3], %[r3], 5 \n\t"
763 "lh %[r6], 0(%[r8]) \n\t"
764 "lh %[r7], 0(%[r9]) \n\t"
765 "addiu %[r1], %[r1], 16 \n\t"
766 "sra %[r1], %[r1], 5 \n\t"
767 "mul %[r8], %[r7], %[r4] \n\t"
768 "mul %[r7], %[r7], %[r5] \n\t"
769 "mul %[r9], %[r6], %[r4] \n\t"
770 "mul %[r6], %[r6], %[r5] \n\t"
771 "addu %[r2], %[r2], %[r3] \n\t"
772 "subu %[r1], %[r1], %[r0] \n\t"
773 "sll %[r0], %[offset], 1 \n\t"
774 "addu %[r4], %[outre1], %[r0] \n\t"
775 "addu %[r5], %[outre2], %[r0] \n\t"
776 "addiu %[r8], %[r8], 16 \n\t"
777 "sra %[r8], %[r8], 5 \n\t"
778 "addiu %[r7], %[r7], 16 \n\t"
779 "sra %[r7], %[r7], 5 \n\t"
780 "addiu %[r6], %[r6], 16 \n\t"
781 "sra %[r6], %[r6], 5 \n\t"
782 "addiu %[r9], %[r9], 16 \n\t"
783 "sra %[r9], %[r9], 5 \n\t"
784 "addu %[r8], %[r8], %[r6] \n\t"
785 "negu %[r8], %[r8] \n\t"
786 "subu %[r7], %[r7], %[r9] \n\t"
787 "subu %[r6], %[r2], %[r7] \n\t"
788 "addu %[r0], %[r2], %[r7] \n\t"
789 "addu %[r3], %[r1], %[r8] \n\t"
790 "subu %[r1], %[r8], %[r1] \n\t"
791 "sw %[r6], 0(%[outre1]) \n\t"
792 "sw %[r0], 0(%[r4]) \n\t"
793 "sw %[r3], 0(%[outre2]) \n\t"
794 "sw %[r1], 0(%[r5]) \n\t"
795 "addiu %[outre1], %[outre1], 4 \n\t"
796 "addiu %[offset], %[offset], -4 \n\t"
797 "addiu %[inre], %[inre], 2 \n\t"
798 "addiu %[inim], %[inim], 2 \n\t"
799 // Inlined WebRtcSpl_MaxAbsValueW32
800 "negu %[r5], %[r6] \n\t"
801 "slt %[r2], %[r6], $zero \n\t"
802 "movn %[r6], %[r5], %[r2] \n\t"
803 "negu %[r5], %[r0] \n\t"
804 "slt %[r2], %[r0], $zero \n\t"
805 "movn %[r0], %[r5], %[r2] \n\t"
806 "negu %[r5], %[r3] \n\t"
807 "slt %[r2], %[r3], $zero \n\t"
808 "movn %[r3], %[r5], %[r2] \n\t"
809 "negu %[r5], %[r1] \n\t"
810 "slt %[r2], %[r1], $zero \n\t"
811 "movn %[r1], %[r5], %[r2] \n\t"
812 "slt %[r2], %[r6], %[r0] \n\t"
813 "slt %[r5], %[r3], %[r1] \n\t"
814 "movn %[r6], %[r0], %[r2] \n\t"
815 "movn %[r3], %[r1], %[r5] \n\t"
816 "slt %[r2], %[r6], %[r3] \n\t"
817 "movn %[r6], %[r3], %[r2] \n\t"
818 "slt %[r2], %[max], %[r6] \n\t"
819 "movn %[max], %[r6], %[r2] \n\t"
820 "bgtz %[k], 1b \n\t"
821 " addiu %[outre2], %[outre2], 4 \n\t"
822 #endif // #if defined(MIPS_DSP_R1_LE)
823 "clz %[max], %[max] \n\t"
824 "addiu %[max], %[max], -25 \n\t"
825 ".set pop \n\t"
826 : [inre] "=&r" (inre), [inim] "=&r" (inim),
827 [outre1] "=&r" (outre1), [outre2] "=&r" (outre2),
828 [offset] "+r" (offset), [k] "+r" (k), [r0] "=&r" (r0),
829 [r1] "=&r" (r1), [r2] "=&r" (r2), [r3] "=&r" (r3),
830 [r4] "=&r" (r4), [r5] "=&r" (r5), [r6] "=&r" (r6),
831 [r7] "=&r" (r7), [r8] "=&r" (r8), [r9] "=&r" (r9),
832 [max] "=&r" (max)
833 : [inreQ7] "r" (inreQ7), [inimQ7] "r" (inimQ7),
834 [cosptr] "r" (cosptr), [sinptr] "r" (sinptr),
835 [outre1Q16] "r" (outre1Q16), [outre2Q16] "r" (outre2Q16)
836 : "hi", "lo", "memory"
837 );
838
839 // "Fastest" vectors
840 k = FRAMESAMPLES / 4;
841 __asm __volatile (
842 ".set push \n\t"
843 ".set noreorder \n\t"
844 "addiu %[inre], %[inreQ7], 0 \n\t"
845 "addiu %[inim], %[inimQ7], 0 \n\t"
846 "addiu %[outre1], %[outre1Q16], 0 \n\t"
847 "addiu %[outre2], %[outre2Q16], 0 \n\t"
848 "bltz %[max], 2f \n\t"
849 " subu %[max1], $zero, %[max] \n\t"
850 "1: \n\t"
851 "lw %[r0], 0(%[outre1]) \n\t"
852 "lw %[r1], 0(%[outre2]) \n\t"
853 "lw %[r2], 4(%[outre1]) \n\t"
854 "lw %[r3], 4(%[outre2]) \n\t"
855 "sllv %[r0], %[r0], %[max] \n\t"
856 "sllv %[r1], %[r1], %[max] \n\t"
857 "sllv %[r2], %[r2], %[max] \n\t"
858 "sllv %[r3], %[r3], %[max] \n\t"
859 "addiu %[k], %[k], -1 \n\t"
860 "addiu %[outre1], %[outre1], 8 \n\t"
861 "addiu %[outre2], %[outre2], 8 \n\t"
862 "sh %[r0], 0(%[inre]) \n\t"
863 "sh %[r1], 0(%[inim]) \n\t"
864 "sh %[r2], 2(%[inre]) \n\t"
865 "sh %[r3], 2(%[inim]) \n\t"
866 "addiu %[inre], %[inre], 4 \n\t"
867 "bgtz %[k], 1b \n\t"
868 " addiu %[inim], %[inim], 4 \n\t"
869 "b 4f \n\t"
870 " nop \n\t"
871 "2: \n\t"
872 #if !defined(MIPS_DSP_R1_LE)
873 "addiu %[r4], $zero, 1 \n\t"
874 "addiu %[r5], %[max1], -1 \n\t"
875 "sllv %[r4], %[r4], %[r5] \n\t"
876 #endif // #if !defined(MIPS_DSP_R1_LE)
877 "3: \n\t"
878 "lw %[r0], 0(%[outre1]) \n\t"
879 "lw %[r1], 0(%[outre2]) \n\t"
880 "lw %[r2], 4(%[outre1]) \n\t"
881 "lw %[r3], 4(%[outre2]) \n\t"
882 #if defined(MIPS_DSP_R1_LE)
883 "shrav_r.w %[r0], %[r0], %[max1] \n\t"
884 "shrav_r.w %[r1], %[r1], %[max1] \n\t"
885 "shrav_r.w %[r2], %[r2], %[max1] \n\t"
886 "shrav_r.w %[r3], %[r3], %[max1] \n\t"
887 #else // #if defined(MIPS_DSP_R1_LE)
888 "addu %[r0], %[r0], %[r4] \n\t"
889 "addu %[r1], %[r1], %[r4] \n\t"
890 "addu %[r2], %[r2], %[r4] \n\t"
891 "addu %[r3], %[r3], %[r4] \n\t"
892 "srav %[r0], %[r0], %[max1] \n\t"
893 "srav %[r1], %[r1], %[max1] \n\t"
894 "srav %[r2], %[r2], %[max1] \n\t"
895 "srav %[r3], %[r3], %[max1] \n\t"
896 #endif // #if defined(MIPS_DSP_R1_LE)
897 "addiu %[outre1], %[outre1], 8 \n\t"
898 "addiu %[outre2], %[outre2], 8 \n\t"
899 "sh %[r0], 0(%[inre]) \n\t"
900 "sh %[r1], 0(%[inim]) \n\t"
901 "sh %[r2], 2(%[inre]) \n\t"
902 "sh %[r3], 2(%[inim]) \n\t"
903 "addiu %[k], %[k], -1 \n\t"
904 "addiu %[inre], %[inre], 4 \n\t"
905 "bgtz %[k], 3b \n\t"
906 " addiu %[inim], %[inim], 4 \n\t"
907 "4: \n\t"
908 ".set pop \n\t"
909 : [k] "+r" (k), [max1] "=&r" (max1), [r0] "=&r" (r0),
910 [inre] "=&r" (inre), [inim] "=&r" (inim),
911 [outre1] "=&r" (outre1), [outre2] "=&r" (outre2),
912 #if !defined(MIPS_DSP_R1_LE)
913 [r4] "=&r" (r4), [r5] "=&r" (r5),
914 #endif // #if !defined(MIPS_DSP_R1_LE)
915 [r1] "=&r" (r1), [r2] "=&r" (r2), [r3] "=&r" (r3)
916 : [max] "r" (max), [inreQ7] "r" (inreQ7),
917 [inimQ7] "r" (inimQ7), [outre1Q16] "r" (outre1Q16),
918 [outre2Q16] "r" (outre2Q16)
919 : "memory"
920 );
921
922 WebRtcIsacfix_FftRadix16Fastest(inreQ7, inimQ7, 1); // real call
923
924 // All the remaining processing is done inside a single loop to avoid
925 // unnecessary memory accesses. MIPS DSPr2 version processes two samples
926 // at a time.
927 cosptr = (int16_t*)WebRtcIsacfix_kCosTab1;
928 sinptr = (int16_t*)WebRtcIsacfix_kSinTab1;
929 k = FRAMESAMPLES / 2;
930 __asm __volatile (
931 ".set push \n\t"
932 ".set noreorder \n\t"
933 "addiu %[inre], %[inreQ7], 0 \n\t"
934 "addiu %[inim], %[inimQ7], 0 \n\t"
935 "addiu %[outre1], %[outre1Q16], 0 \n\t"
936 "addiu %[outre2], %[outre2Q16], 0 \n\t"
937 "addiu %[r4], $zero, 273 \n\t"
938 "addiu %[r5], $zero, 31727 \n\t"
939 #if defined(MIPS_DSP_R2_LE)
940 "addiu %[max], %[max], 16 \n\t"
941 "replv.ph %[r4], %[r4] \n\t"
942 #endif // #if defined(MIPS_DSP_R2_LE)
943 "bltz %[max], 2f \n\t"
944 " subu %[max1], $zero, %[max] \n\t"
945 #if defined(MIPS_DSP_R2_LE)
946 "addiu %[max], %[max], 1 \n\t"
947 #endif // #if defined(MIPS_DSP_R2_LE)
948 "1: \n\t"
949 #if defined(MIPS_DSP_R2_LE)
950 "lwl %[r0], 0(%[inre]) \n\t"
951 "lwl %[r1], 0(%[inim]) \n\t"
952 "lh %[r2], 0(%[cosptr]) \n\t"
953 "lwr %[r0], 0(%[inre]) \n\t"
954 "lwr %[r1], 0(%[inim]) \n\t"
955 "lh %[r3], 0(%[sinptr]) \n\t"
956 "muleq_s.w.phr %[r6], %[r0], %[r4] \n\t"
957 "muleq_s.w.phr %[r7], %[r1], %[r4] \n\t"
958 "muleq_s.w.phl %[r0], %[r0], %[r4] \n\t"
959 "muleq_s.w.phl %[r1], %[r1], %[r4] \n\t"
960 "addiu %[k], %[k], -2 \n\t"
961 "addiu %[inre], %[inre], 4 \n\t"
962 "addiu %[inim], %[inim], 4 \n\t"
963 "shrav_r.w %[r6], %[r6], %[max] \n\t"
964 "shrav_r.w %[r7], %[r7], %[max] \n\t"
965 "mult $ac0, %[r2], %[r6] \n\t"
966 "mult $ac1, %[r3], %[r7] \n\t"
967 "mult $ac2, %[r2], %[r7] \n\t"
968 "mult $ac3, %[r3], %[r6] \n\t"
969 "lh %[r2], 2(%[cosptr]) \n\t"
970 "lh %[r3], 2(%[sinptr]) \n\t"
971 "extr_r.w %[r6], $ac0, 14 \n\t"
972 "extr_r.w %[r7], $ac1, 14 \n\t"
973 "extr_r.w %[r8], $ac2, 14 \n\t"
974 "extr_r.w %[r9], $ac3, 14 \n\t"
975 "shrav_r.w %[r0], %[r0], %[max] \n\t"
976 "shrav_r.w %[r1], %[r1], %[max] \n\t"
977 "mult $ac0, %[r2], %[r0] \n\t"
978 "mult $ac1, %[r3], %[r1] \n\t"
979 "mult $ac2, %[r2], %[r1] \n\t"
980 "mult $ac3, %[r3], %[r0] \n\t"
981 "addiu %[cosptr], %[cosptr], 4 \n\t"
982 "extr_r.w %[r0], $ac0, 14 \n\t"
983 "extr_r.w %[r1], $ac1, 14 \n\t"
984 "extr_r.w %[r2], $ac2, 14 \n\t"
985 "extr_r.w %[r3], $ac3, 14 \n\t"
986 "subu %[r6], %[r6], %[r7] \n\t"
987 "addu %[r8], %[r8], %[r9] \n\t"
988 "mult $ac0, %[r5], %[r6] \n\t"
989 "mult $ac1, %[r5], %[r8] \n\t"
990 "addiu %[sinptr], %[sinptr], 4 \n\t"
991 "subu %[r0], %[r0], %[r1] \n\t"
992 "addu %[r2], %[r2], %[r3] \n\t"
993 "extr_r.w %[r1], $ac0, 11 \n\t"
994 "extr_r.w %[r3], $ac1, 11 \n\t"
995 "mult $ac2, %[r5], %[r0] \n\t"
996 "mult $ac3, %[r5], %[r2] \n\t"
997 "sw %[r1], 0(%[outre1]) \n\t"
998 "sw %[r3], 0(%[outre2]) \n\t"
999 "addiu %[outre1], %[outre1], 8 \n\t"
1000 "extr_r.w %[r0], $ac2, 11 \n\t"
1001 "extr_r.w %[r2], $ac3, 11 \n\t"
1002 "sw %[r0], -4(%[outre1]) \n\t"
1003 "sw %[r2], 4(%[outre2]) \n\t"
1004 "bgtz %[k], 1b \n\t"
1005 " addiu %[outre2], %[outre2], 8 \n\t"
1006 "b 3f \n\t"
1007 #else // #if defined(MIPS_DSP_R2_LE)
1008 "lh %[r0], 0(%[inre]) \n\t"
1009 "lh %[r1], 0(%[inim]) \n\t"
1010 "addiu %[k], %[k], -1 \n\t"
1011 "srav %[r0], %[r0], %[max] \n\t"
1012 "srav %[r1], %[r1], %[max] \n\t"
1013 "sra %[r2], %[r0], 16 \n\t"
1014 "andi %[r0], %[r0], 0xFFFF \n\t"
1015 "sra %[r0], %[r0], 1 \n\t"
1016 "sra %[r3], %[r1], 16 \n\t"
1017 "andi %[r1], %[r1], 0xFFFF \n\t"
1018 "sra %[r1], %[r1], 1 \n\t"
1019 "mul %[r2], %[r2], %[r4] \n\t"
1020 "mul %[r0], %[r0], %[r4] \n\t"
1021 "mul %[r3], %[r3], %[r4] \n\t"
1022 "mul %[r1], %[r1], %[r4] \n\t"
1023 "addiu %[inre], %[inre], 2 \n\t"
1024 "addiu %[inim], %[inim], 2 \n\t"
1025 "lh %[r6], 0(%[cosptr]) \n\t"
1026 "lh %[r7], 0(%[sinptr]) \n\t"
1027 #if defined(MIPS_DSP_R1_LE)
1028 "shra_r.w %[r0], %[r0], 15 \n\t"
1029 "shra_r.w %[r1], %[r1], 15 \n\t"
1030 #else // #if defined(MIPS_DSP_R1_LE)
1031 "addiu %[r0], %[r0], 0x4000 \n\t"
1032 "addiu %[r1], %[r1], 0x4000 \n\t"
1033 "sra %[r0], %[r0], 15 \n\t"
1034 "sra %[r1], %[r1], 15 \n\t"
1035 #endif // #if defined(MIPS_DSP_R1_LE)
1036 "addu %[r0], %[r2], %[r0] \n\t"
1037 "addu %[r1], %[r3], %[r1] \n\t"
1038 "sra %[r2], %[r0], 16 \n\t"
1039 "andi %[r0], %[r0], 0xFFFF \n\t"
1040 "mul %[r9], %[r2], %[r6] \n\t"
1041 "mul %[r2], %[r2], %[r7] \n\t"
1042 "mul %[r8], %[r0], %[r6] \n\t"
1043 "mul %[r0], %[r0], %[r7] \n\t"
1044 "sra %[r3], %[r3], 16 \n\t"
1045 "andi %[r1], %[r1], 0xFFFF \n\t"
1046 "sll %[r9], %[r9], 2 \n\t"
1047 "sll %[r2], %[r2], 2 \n\t"
1048 #if defined(MIPS_DSP_R1_LE)
1049 "shra_r.w %[r8], %[r8], 14 \n\t"
1050 "shra_r.w %[r0], %[r0], 14 \n\t"
1051 #else // #if defined(MIPS_DSP_R1_LE)
1052 "addiu %[r8], %[r8], 0x2000 \n\t"
1053 "addiu %[r0], %[r0], 0x2000 \n\t"
1054 "sra %[r8], %[r8], 14 \n\t"
1055 "sra %[r0], %[r0], 14 \n\t"
1056 #endif // #if defined(MIPS_DSP_R1_LE)
1057 "addu %[r9], %[r9], %[r8] \n\t"
1058 "addu %[r2], %[r2], %[r0] \n\t"
1059 "mul %[r0], %[r3], %[r6] \n\t"
1060 "mul %[r3], %[r3], %[r7] \n\t"
1061 "mul %[r8], %[r1], %[r6] \n\t"
1062 "mul %[r1], %[r1], %[r8] \n\t"
1063 "addiu %[cosptr], %[cosptr], 2 \n\t"
1064 "addiu %[sinptr], %[sinptr], 2 \n\t"
1065 "sll %[r0], %[r0], 2 \n\t"
1066 "sll %[r3], %[r3], 2 \n\t"
1067 #if defined(MIPS_DSP_R1_LE)
1068 "shra_r.w %[r8], %[r8], 14 \n\t"
1069 "shra_r.w %[r1], %[r1], 14 \n\t"
1070 #else // #if defined(MIPS_DSP_R1_LE)
1071 "addiu %[r8], %[r8], 0x2000 \n\t"
1072 "addiu %[r1], %[r1], 0x2000 \n\t"
1073 "sra %[r8], %[r8], 14 \n\t"
1074 "sra %[r1], %[r1], 14 \n\t"
1075 #endif // #if defined(MIPS_DSP_R1_LE)
1076 "addu %[r0], %[r0], %[r8] \n\t"
1077 "addu %[r3], %[r3], %[r1] \n\t"
1078 "subu %[r9], %[r9], %[r3] \n\t"
1079 "addu %[r0], %[r0], %[r2] \n\t"
1080 "sra %[r1], %[r9], 16 \n\t"
1081 "andi %[r9], %[r9], 0xFFFF \n\t"
1082 "mul %[r1], %[r1], %[r5] \n\t"
1083 "mul %[r9], %[r9], %[r5] \n\t"
1084 "sra %[r2], %[r0], 16 \n\t"
1085 "andi %[r0], %[r0], 0xFFFF \n\t"
1086 "mul %[r2], %[r2], %[r5] \n\t"
1087 "mul %[r0], %[r0], %[r5] \n\t"
1088 "sll %[r1], %[r1], 5 \n\t"
1089 #if defined(MIPS_DSP_R1_LE)
1090 "shra_r.w %[r9], %[r9], 11 \n\t"
1091 #else // #if defined(MIPS_DSP_R1_LE)
1092 "addiu %[r9], %[r9], 0x400 \n\t"
1093 "sra %[r9], %[r9], 11 \n\t"
1094 #endif // #if defined(MIPS_DSP_R1_LE)
1095 "addu %[r1], %[r1], %[r9] \n\t"
1096 "sll %[r2], %[r2], 5 \n\t"
1097 #if defined(MIPS_DSP_R1_LE)
1098 "shra_r.w %[r0], %[r0], 11 \n\t"
1099 #else // #if defined(MIPS_DSP_R1_LE)
1100 "addiu %[r0], %[r0], 0x400 \n\t"
1101 "sra %[r0], %[r0], 11 \n\t"
1102 #endif // #if defined(MIPS_DSP_R1_LE)
1103 "addu %[r0], %[r0], %[r2] \n\t"
1104 "sw %[r1], 0(%[outre1]) \n\t"
1105 "addiu %[outre1], %[outre1], 4 \n\t"
1106 "sw %[r0], 0(%[outre2]) \n\t"
1107 "bgtz %[k], 1b \n\t"
1108 " addiu %[outre2], %[outre2], 4 \n\t"
1109 "b 3f \n\t"
1110 " nop \n\t"
1111 #endif // #if defined(MIPS_DSP_R2_LE)
1112 "2: \n\t"
1113 #if defined(MIPS_DSP_R2_LE)
1114 "addiu %[max1], %[max1], -1 \n\t"
1115 "21: \n\t"
1116 "lwl %[r0], 0(%[inre]) \n\t"
1117 "lwl %[r1], 0(%[inim]) \n\t"
1118 "lh %[r2], 0(%[cosptr]) \n\t"
1119 "lwr %[r0], 0(%[inre]) \n\t"
1120 "lwr %[r1], 0(%[inim]) \n\t"
1121 "lh %[r3], 0(%[sinptr]) \n\t"
1122 "muleq_s.w.phr %[r6], %[r0], %[r4] \n\t"
1123 "muleq_s.w.phr %[r7], %[r1], %[r4] \n\t"
1124 "muleq_s.w.phl %[r0], %[r0], %[r4] \n\t"
1125 "muleq_s.w.phl %[r1], %[r1], %[r4] \n\t"
1126 "addiu %[k], %[k], -2 \n\t"
1127 "addiu %[inre], %[inre], 4 \n\t"
1128 "addiu %[inim], %[inim], 4 \n\t"
1129 "sllv %[r6], %[r6], %[max1] \n\t"
1130 "sllv %[r7], %[r7], %[max1] \n\t"
1131 "mult $ac0, %[r2], %[r6] \n\t"
1132 "mult $ac1, %[r3], %[r7] \n\t"
1133 "mult $ac2, %[r2], %[r7] \n\t"
1134 "mult $ac3, %[r3], %[r6] \n\t"
1135 "lh %[r2], 2(%[cosptr]) \n\t"
1136 "lh %[r3], 2(%[sinptr]) \n\t"
1137 "extr_r.w %[r6], $ac0, 14 \n\t"
1138 "extr_r.w %[r7], $ac1, 14 \n\t"
1139 "extr_r.w %[r8], $ac2, 14 \n\t"
1140 "extr_r.w %[r9], $ac3, 14 \n\t"
1141 "sllv %[r0], %[r0], %[max1] \n\t"
1142 "sllv %[r1], %[r1], %[max1] \n\t"
1143 "mult $ac0, %[r2], %[r0] \n\t"
1144 "mult $ac1, %[r3], %[r1] \n\t"
1145 "mult $ac2, %[r2], %[r1] \n\t"
1146 "mult $ac3, %[r3], %[r0] \n\t"
1147 "addiu %[cosptr], %[cosptr], 4 \n\t"
1148 "extr_r.w %[r0], $ac0, 14 \n\t"
1149 "extr_r.w %[r1], $ac1, 14 \n\t"
1150 "extr_r.w %[r2], $ac2, 14 \n\t"
1151 "extr_r.w %[r3], $ac3, 14 \n\t"
1152 "subu %[r6], %[r6], %[r7] \n\t"
1153 "addu %[r8], %[r8], %[r9] \n\t"
1154 "mult $ac0, %[r5], %[r6] \n\t"
1155 "mult $ac1, %[r5], %[r8] \n\t"
1156 "addiu %[sinptr], %[sinptr], 4 \n\t"
1157 "subu %[r0], %[r0], %[r1] \n\t"
1158 "addu %[r2], %[r2], %[r3] \n\t"
1159 "extr_r.w %[r1], $ac0, 11 \n\t"
1160 "extr_r.w %[r3], $ac1, 11 \n\t"
1161 "mult $ac2, %[r5], %[r0] \n\t"
1162 "mult $ac3, %[r5], %[r2] \n\t"
1163 "sw %[r1], 0(%[outre1]) \n\t"
1164 "sw %[r3], 0(%[outre2]) \n\t"
1165 "addiu %[outre1], %[outre1], 8 \n\t"
1166 "extr_r.w %[r0], $ac2, 11 \n\t"
1167 "extr_r.w %[r2], $ac3, 11 \n\t"
1168 "sw %[r0], -4(%[outre1]) \n\t"
1169 "sw %[r2], 4(%[outre2]) \n\t"
1170 "bgtz %[k], 21b \n\t"
1171 " addiu %[outre2], %[outre2], 8 \n\t"
1172 "b 3f \n\t"
1173 " nop \n\t"
1174 #else // #if defined(MIPS_DSP_R2_LE)
1175 "lh %[r0], 0(%[inre]) \n\t"
1176 "lh %[r1], 0(%[inim]) \n\t"
1177 "addiu %[k], %[k], -1 \n\t"
1178 "sllv %[r0], %[r0], %[max1] \n\t"
1179 "sllv %[r1], %[r1], %[max1] \n\t"
1180 "sra %[r2], %[r0], 16 \n\t"
1181 "andi %[r0], %[r0], 0xFFFF \n\t"
1182 "sra %[r0], %[r0], 1 \n\t"
1183 "sra %[r3], %[r1], 16 \n\t"
1184 "andi %[r1], %[r1], 0xFFFF \n\t"
1185 "sra %[r1], %[r1], 1 \n\t"
1186 "mul %[r2], %[r2], %[r4] \n\t"
1187 "mul %[r0], %[r0], %[r4] \n\t"
1188 "mul %[r3], %[r3], %[r4] \n\t"
1189 "mul %[r1], %[r1], %[r4] \n\t"
1190 "addiu %[inre], %[inre], 2 \n\t"
1191 "addiu %[inim], %[inim], 2 \n\t"
1192 "lh %[r6], 0(%[cosptr]) \n\t"
1193 "lh %[r7], 0(%[sinptr]) \n\t"
1194 #if defined(MIPS_DSP_R1_LE)
1195 "shra_r.w %[r0], %[r0], 15 \n\t"
1196 "shra_r.w %[r1], %[r1], 15 \n\t"
1197 #else // #if defined(MIPS_DSP_R1_LE)
1198 "addiu %[r0], %[r0], 0x4000 \n\t"
1199 "addiu %[r1], %[r1], 0x4000 \n\t"
1200 "sra %[r0], %[r0], 15 \n\t"
1201 "sra %[r1], %[r1], 15 \n\t"
1202 #endif // #if defined(MIPS_DSP_R1_LE)
1203 "addu %[r0], %[r2], %[r0] \n\t"
1204 "addu %[r1], %[r3], %[r1] \n\t"
1205 "sra %[r2], %[r0], 16 \n\t"
1206 "andi %[r0], %[r0], 0xFFFF \n\t"
1207 "mul %[r9], %[r2], %[r6] \n\t"
1208 "mul %[r2], %[r2], %[r7] \n\t"
1209 "mul %[r8], %[r0], %[r6] \n\t"
1210 "mul %[r0], %[r0], %[r7] \n\t"
1211 "sra %[r3], %[r1], 16 \n\t"
1212 "andi %[r1], %[r1], 0xFFFF \n\t"
1213 "sll %[r9], %[r9], 2 \n\t"
1214 "sll %[r2], %[r2], 2 \n\t"
1215 #if defined(MIPS_DSP_R1_LE)
1216 "shra_r.w %[r8], %[r8], 14 \n\t"
1217 "shra_r.w %[r0], %[r0], 14 \n\t"
1218 #else // #if defined(MIPS_DSP_R1_LE)
1219 "addiu %[r8], %[r8], 0x2000 \n\t"
1220 "addiu %[r0], %[r0], 0x2000 \n\t"
1221 "sra %[r8], %[r8], 14 \n\t"
1222 "sra %[r0], %[r0], 14 \n\t"
1223 #endif // #if defined(MIPS_DSP_R1_LE)
1224 "addu %[r9], %[r9], %[r8] \n\t"
1225 "addu %[r2], %[r2], %[r0] \n\t"
1226 "mul %[r0], %[r3], %[r6] \n\t"
1227 "mul %[r3], %[r3], %[r7] \n\t"
1228 "mul %[r8], %[r1], %[r6] \n\t"
1229 "mul %[r1], %[r1], %[r7] \n\t"
1230 "addiu %[cosptr], %[cosptr], 2 \n\t"
1231 "addiu %[sinptr], %[sinptr], 2 \n\t"
1232 "sll %[r0], %[r0], 2 \n\t"
1233 "sll %[r3], %[r3], 2 \n\t"
1234 #if defined(MIPS_DSP_R1_LE)
1235 "shra_r.w %[r8], %[r8], 14 \n\t"
1236 "shra_r.w %[r1], %[r1], 14 \n\t"
1237 #else // #if defined(MIPS_DSP_R1_LE)
1238 "addiu %[r8], %[r8], 0x2000 \n\t"
1239 "addiu %[r1], %[r1], 0x2000 \n\t"
1240 "sra %[r8], %[r8], 14 \n\t"
1241 "sra %[r1], %[r1], 14 \n\t"
1242 #endif // #if defined(MIPS_DSP_R1_LE)
1243 "addu %[r0], %[r0], %[r8] \n\t"
1244 "addu %[r3], %[r3], %[r1] \n\t"
1245 "subu %[r9], %[r9], %[r3] \n\t"
1246 "addu %[r0], %[r0], %[r2] \n\t"
1247 "sra %[r1], %[r9], 16 \n\t"
1248 "andi %[r9], %[r9], 0xFFFF \n\t"
1249 "mul %[r1], %[r1], %[r5] \n\t"
1250 "mul %[r9], %[r9], %[r5] \n\t"
1251 "sra %[r2], %[r0], 16 \n\t"
1252 "andi %[r0], %[r0], 0xFFFF \n\t"
1253 "mul %[r2], %[r2], %[r5] \n\t"
1254 "mul %[r0], %[r0], %[r5] \n\t"
1255 "sll %[r1], %[r1], 5 \n\t"
1256 #if defined(MIPS_DSP_R1_LE)
1257 "shra_r.w %[r9], %[r9], 11 \n\t"
1258 #else // #if defined(MIPS_DSP_R1_LE)
1259 "addiu %[r9], %[r9], 0x400 \n\t"
1260 "sra %[r9], %[r9], 11 \n\t"
1261 #endif // #if defined(MIPS_DSP_R1_LE)
1262 "addu %[r1], %[r1], %[r9] \n\t"
1263 "sll %[r2], %[r2], 5 \n\t"
1264 #if defined(MIPS_DSP_R1_LE)
1265 "shra_r.w %[r0], %[r0], 11 \n\t"
1266 #else // #if defined(MIPS_DSP_R1_LE)
1267 "addiu %[r0], %[r0], 0x400 \n\t"
1268 "sra %[r0], %[r0], 11 \n\t"
1269 #endif // #if defined(MIPS_DSP_R1_LE)
1270 "addu %[r0], %[r0], %[r2] \n\t"
1271 "sw %[r1], 0(%[outre1]) \n\t"
1272 "addiu %[outre1], %[outre1], 4 \n\t"
1273 "sw %[r0], 0(%[outre2]) \n\t"
1274 "bgtz %[k], 2b \n\t"
1275 " addiu %[outre2], %[outre2], 4 \n\t"
1276 #endif // #if defined(MIPS_DSP_R2_LE)
1277 "3: \n\t"
1278 ".set pop \n\t"
1279 : [k] "+r" (k), [r0] "=&r" (r0), [r1] "=&r" (r1),
1280 [r2] "=&r" (r2), [r3] "=&r" (r3), [r4] "=&r" (r4),
1281 [r5] "=&r" (r5), [r6] "=&r" (r6), [r7] "=&r" (r7),
1282 [r8] "=&r" (r8), [r9] "=&r" (r9), [max1] "=&r" (max1),
1283 [inre] "=&r" (inre), [inim] "=&r" (inim),
1284 [outre1] "=&r" (outre1), [outre2] "=&r" (outre2)
1285 : [max] "r" (max), [inreQ7] "r" (inreQ7),
1286 [inimQ7] "r" (inimQ7), [cosptr] "r" (cosptr),
1287 [sinptr] "r" (sinptr), [outre1Q16] "r" (outre1Q16),
1288 [outre2Q16] "r" (outre2Q16)
1289 : "hi", "lo", "memory"
1290 #if defined(MIPS_DSP_R2_LE)
1291 , "$ac1hi", "$ac1lo", "$ac2hi", "$ac2lo", "$ac3hi", "$ac3lo"
1292 #endif // #if defined(MIPS_DSP_R2_LE)
1293 );
1294 }
1295