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 "common_audio/third_party/ooura/fft_size_128/ooura_fft.h"
12 #include "common_audio/third_party/ooura/fft_size_128/ooura_fft_tables_common.h"
13 
14 namespace webrtc {
15 
16 #if defined(MIPS_FPU_LE)
bitrv2_128_mips(float * a)17 void bitrv2_128_mips(float* a) {
18   // n is 128
19   float xr, xi, yr, yi;
20 
21   xr = a[8];
22   xi = a[9];
23   yr = a[16];
24   yi = a[17];
25   a[8] = yr;
26   a[9] = yi;
27   a[16] = xr;
28   a[17] = xi;
29 
30   xr = a[64];
31   xi = a[65];
32   yr = a[2];
33   yi = a[3];
34   a[64] = yr;
35   a[65] = yi;
36   a[2] = xr;
37   a[3] = xi;
38 
39   xr = a[72];
40   xi = a[73];
41   yr = a[18];
42   yi = a[19];
43   a[72] = yr;
44   a[73] = yi;
45   a[18] = xr;
46   a[19] = xi;
47 
48   xr = a[80];
49   xi = a[81];
50   yr = a[10];
51   yi = a[11];
52   a[80] = yr;
53   a[81] = yi;
54   a[10] = xr;
55   a[11] = xi;
56 
57   xr = a[88];
58   xi = a[89];
59   yr = a[26];
60   yi = a[27];
61   a[88] = yr;
62   a[89] = yi;
63   a[26] = xr;
64   a[27] = xi;
65 
66   xr = a[74];
67   xi = a[75];
68   yr = a[82];
69   yi = a[83];
70   a[74] = yr;
71   a[75] = yi;
72   a[82] = xr;
73   a[83] = xi;
74 
75   xr = a[32];
76   xi = a[33];
77   yr = a[4];
78   yi = a[5];
79   a[32] = yr;
80   a[33] = yi;
81   a[4] = xr;
82   a[5] = xi;
83 
84   xr = a[40];
85   xi = a[41];
86   yr = a[20];
87   yi = a[21];
88   a[40] = yr;
89   a[41] = yi;
90   a[20] = xr;
91   a[21] = xi;
92 
93   xr = a[48];
94   xi = a[49];
95   yr = a[12];
96   yi = a[13];
97   a[48] = yr;
98   a[49] = yi;
99   a[12] = xr;
100   a[13] = xi;
101 
102   xr = a[56];
103   xi = a[57];
104   yr = a[28];
105   yi = a[29];
106   a[56] = yr;
107   a[57] = yi;
108   a[28] = xr;
109   a[29] = xi;
110 
111   xr = a[34];
112   xi = a[35];
113   yr = a[68];
114   yi = a[69];
115   a[34] = yr;
116   a[35] = yi;
117   a[68] = xr;
118   a[69] = xi;
119 
120   xr = a[42];
121   xi = a[43];
122   yr = a[84];
123   yi = a[85];
124   a[42] = yr;
125   a[43] = yi;
126   a[84] = xr;
127   a[85] = xi;
128 
129   xr = a[50];
130   xi = a[51];
131   yr = a[76];
132   yi = a[77];
133   a[50] = yr;
134   a[51] = yi;
135   a[76] = xr;
136   a[77] = xi;
137 
138   xr = a[58];
139   xi = a[59];
140   yr = a[92];
141   yi = a[93];
142   a[58] = yr;
143   a[59] = yi;
144   a[92] = xr;
145   a[93] = xi;
146 
147   xr = a[44];
148   xi = a[45];
149   yr = a[52];
150   yi = a[53];
151   a[44] = yr;
152   a[45] = yi;
153   a[52] = xr;
154   a[53] = xi;
155 
156   xr = a[96];
157   xi = a[97];
158   yr = a[6];
159   yi = a[7];
160   a[96] = yr;
161   a[97] = yi;
162   a[6] = xr;
163   a[7] = xi;
164 
165   xr = a[104];
166   xi = a[105];
167   yr = a[22];
168   yi = a[23];
169   a[104] = yr;
170   a[105] = yi;
171   a[22] = xr;
172   a[23] = xi;
173 
174   xr = a[112];
175   xi = a[113];
176   yr = a[14];
177   yi = a[15];
178   a[112] = yr;
179   a[113] = yi;
180   a[14] = xr;
181   a[15] = xi;
182 
183   xr = a[120];
184   xi = a[121];
185   yr = a[30];
186   yi = a[31];
187   a[120] = yr;
188   a[121] = yi;
189   a[30] = xr;
190   a[31] = xi;
191 
192   xr = a[98];
193   xi = a[99];
194   yr = a[70];
195   yi = a[71];
196   a[98] = yr;
197   a[99] = yi;
198   a[70] = xr;
199   a[71] = xi;
200 
201   xr = a[106];
202   xi = a[107];
203   yr = a[86];
204   yi = a[87];
205   a[106] = yr;
206   a[107] = yi;
207   a[86] = xr;
208   a[87] = xi;
209 
210   xr = a[114];
211   xi = a[115];
212   yr = a[78];
213   yi = a[79];
214   a[114] = yr;
215   a[115] = yi;
216   a[78] = xr;
217   a[79] = xi;
218 
219   xr = a[122];
220   xi = a[123];
221   yr = a[94];
222   yi = a[95];
223   a[122] = yr;
224   a[123] = yi;
225   a[94] = xr;
226   a[95] = xi;
227 
228   xr = a[100];
229   xi = a[101];
230   yr = a[38];
231   yi = a[39];
232   a[100] = yr;
233   a[101] = yi;
234   a[38] = xr;
235   a[39] = xi;
236 
237   xr = a[108];
238   xi = a[109];
239   yr = a[54];
240   yi = a[55];
241   a[108] = yr;
242   a[109] = yi;
243   a[54] = xr;
244   a[55] = xi;
245 
246   xr = a[116];
247   xi = a[117];
248   yr = a[46];
249   yi = a[47];
250   a[116] = yr;
251   a[117] = yi;
252   a[46] = xr;
253   a[47] = xi;
254 
255   xr = a[124];
256   xi = a[125];
257   yr = a[62];
258   yi = a[63];
259   a[124] = yr;
260   a[125] = yi;
261   a[62] = xr;
262   a[63] = xi;
263 
264   xr = a[110];
265   xi = a[111];
266   yr = a[118];
267   yi = a[119];
268   a[110] = yr;
269   a[111] = yi;
270   a[118] = xr;
271   a[119] = xi;
272 }
273 
cft1st_128_mips(float * a)274 void cft1st_128_mips(float* a) {
275   float f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14;
276   int a_ptr, p1_rdft, p2_rdft, count;
277   const float* first = rdft_wk3ri_first;
278   const float* second = rdft_wk3ri_second;
279 
280   __asm __volatile(
281       ".set       push                                                    \n\t"
282       ".set       noreorder                                               \n\t"
283       // first 8
284       "lwc1       %[f0],        0(%[a])                                   \n\t"
285       "lwc1       %[f1],        4(%[a])                                   \n\t"
286       "lwc1       %[f2],        8(%[a])                                   \n\t"
287       "lwc1       %[f3],        12(%[a])                                  \n\t"
288       "lwc1       %[f4],        16(%[a])                                  \n\t"
289       "lwc1       %[f5],        20(%[a])                                  \n\t"
290       "lwc1       %[f6],        24(%[a])                                  \n\t"
291       "lwc1       %[f7],        28(%[a])                                  \n\t"
292       "add.s      %[f8],        %[f0],        %[f2]                       \n\t"
293       "sub.s      %[f0],        %[f0],        %[f2]                       \n\t"
294       "add.s      %[f2],        %[f4],        %[f6]                       \n\t"
295       "sub.s      %[f4],        %[f4],        %[f6]                       \n\t"
296       "add.s      %[f6],        %[f1],        %[f3]                       \n\t"
297       "sub.s      %[f1],        %[f1],        %[f3]                       \n\t"
298       "add.s      %[f3],        %[f5],        %[f7]                       \n\t"
299       "sub.s      %[f5],        %[f5],        %[f7]                       \n\t"
300       "add.s      %[f7],        %[f8],        %[f2]                       \n\t"
301       "sub.s      %[f8],        %[f8],        %[f2]                       \n\t"
302       "sub.s      %[f2],        %[f1],        %[f4]                       \n\t"
303       "add.s      %[f1],        %[f1],        %[f4]                       \n\t"
304       "add.s      %[f4],        %[f6],        %[f3]                       \n\t"
305       "sub.s      %[f6],        %[f6],        %[f3]                       \n\t"
306       "sub.s      %[f3],        %[f0],        %[f5]                       \n\t"
307       "add.s      %[f0],        %[f0],        %[f5]                       \n\t"
308       "swc1       %[f7],        0(%[a])                                   \n\t"
309       "swc1       %[f8],        16(%[a])                                  \n\t"
310       "swc1       %[f2],        28(%[a])                                  \n\t"
311       "swc1       %[f1],        12(%[a])                                  \n\t"
312       "swc1       %[f4],        4(%[a])                                   \n\t"
313       "swc1       %[f6],        20(%[a])                                  \n\t"
314       "swc1       %[f3],        8(%[a])                                   \n\t"
315       "swc1       %[f0],        24(%[a])                                  \n\t"
316       // second 8
317       "lwc1       %[f0],        32(%[a])                                  \n\t"
318       "lwc1       %[f1],        36(%[a])                                  \n\t"
319       "lwc1       %[f2],        40(%[a])                                  \n\t"
320       "lwc1       %[f3],        44(%[a])                                  \n\t"
321       "lwc1       %[f4],        48(%[a])                                  \n\t"
322       "lwc1       %[f5],        52(%[a])                                  \n\t"
323       "lwc1       %[f6],        56(%[a])                                  \n\t"
324       "lwc1       %[f7],        60(%[a])                                  \n\t"
325       "add.s      %[f8],        %[f4],        %[f6]                       \n\t"
326       "sub.s      %[f4],        %[f4],        %[f6]                       \n\t"
327       "add.s      %[f6],        %[f1],        %[f3]                       \n\t"
328       "sub.s      %[f1],        %[f1],        %[f3]                       \n\t"
329       "add.s      %[f3],        %[f0],        %[f2]                       \n\t"
330       "sub.s      %[f0],        %[f0],        %[f2]                       \n\t"
331       "add.s      %[f2],        %[f5],        %[f7]                       \n\t"
332       "sub.s      %[f5],        %[f5],        %[f7]                       \n\t"
333       "add.s      %[f7],        %[f4],        %[f1]                       \n\t"
334       "sub.s      %[f4],        %[f4],        %[f1]                       \n\t"
335       "add.s      %[f1],        %[f3],        %[f8]                       \n\t"
336       "sub.s      %[f3],        %[f3],        %[f8]                       \n\t"
337       "sub.s      %[f8],        %[f0],        %[f5]                       \n\t"
338       "add.s      %[f0],        %[f0],        %[f5]                       \n\t"
339       "add.s      %[f5],        %[f6],        %[f2]                       \n\t"
340       "sub.s      %[f6],        %[f2],        %[f6]                       \n\t"
341       "lwc1       %[f9],        8(%[rdft_w])                              \n\t"
342       "sub.s      %[f2],        %[f8],        %[f7]                       \n\t"
343       "add.s      %[f8],        %[f8],        %[f7]                       \n\t"
344       "sub.s      %[f7],        %[f4],        %[f0]                       \n\t"
345       "add.s      %[f4],        %[f4],        %[f0]                       \n\t"
346       // prepare for loop
347       "addiu      %[a_ptr],     %[a],         64                          \n\t"
348       "addiu      %[p1_rdft],   %[rdft_w],    8                           \n\t"
349       "addiu      %[p2_rdft],   %[rdft_w],    16                          \n\t"
350       "addiu      %[count],     $zero,        7                           \n\t"
351       // finish second 8
352       "mul.s      %[f2],        %[f9],        %[f2]                       \n\t"
353       "mul.s      %[f8],        %[f9],        %[f8]                       \n\t"
354       "mul.s      %[f7],        %[f9],        %[f7]                       \n\t"
355       "mul.s      %[f4],        %[f9],        %[f4]                       \n\t"
356       "swc1       %[f1],        32(%[a])                                  \n\t"
357       "swc1       %[f3],        52(%[a])                                  \n\t"
358       "swc1       %[f5],        36(%[a])                                  \n\t"
359       "swc1       %[f6],        48(%[a])                                  \n\t"
360       "swc1       %[f2],        40(%[a])                                  \n\t"
361       "swc1       %[f8],        44(%[a])                                  \n\t"
362       "swc1       %[f7],        56(%[a])                                  \n\t"
363       "swc1       %[f4],        60(%[a])                                  \n\t"
364       // loop
365       "1:                                                                  \n\t"
366       "lwc1       %[f0],        0(%[a_ptr])                               \n\t"
367       "lwc1       %[f1],        4(%[a_ptr])                               \n\t"
368       "lwc1       %[f2],        8(%[a_ptr])                               \n\t"
369       "lwc1       %[f3],        12(%[a_ptr])                              \n\t"
370       "lwc1       %[f4],        16(%[a_ptr])                              \n\t"
371       "lwc1       %[f5],        20(%[a_ptr])                              \n\t"
372       "lwc1       %[f6],        24(%[a_ptr])                              \n\t"
373       "lwc1       %[f7],        28(%[a_ptr])                              \n\t"
374       "add.s      %[f8],        %[f0],        %[f2]                       \n\t"
375       "sub.s      %[f0],        %[f0],        %[f2]                       \n\t"
376       "add.s      %[f2],        %[f4],        %[f6]                       \n\t"
377       "sub.s      %[f4],        %[f4],        %[f6]                       \n\t"
378       "add.s      %[f6],        %[f1],        %[f3]                       \n\t"
379       "sub.s      %[f1],        %[f1],        %[f3]                       \n\t"
380       "add.s      %[f3],        %[f5],        %[f7]                       \n\t"
381       "sub.s      %[f5],        %[f5],        %[f7]                       \n\t"
382       "lwc1       %[f10],       4(%[p1_rdft])                             \n\t"
383       "lwc1       %[f11],       0(%[p2_rdft])                             \n\t"
384       "lwc1       %[f12],       4(%[p2_rdft])                             \n\t"
385       "lwc1       %[f13],       8(%[first])                               \n\t"
386       "lwc1       %[f14],       12(%[first])                              \n\t"
387       "add.s      %[f7],        %[f8],        %[f2]                       \n\t"
388       "sub.s      %[f8],        %[f8],        %[f2]                       \n\t"
389       "add.s      %[f2],        %[f6],        %[f3]                       \n\t"
390       "sub.s      %[f6],        %[f6],        %[f3]                       \n\t"
391       "add.s      %[f3],        %[f0],        %[f5]                       \n\t"
392       "sub.s      %[f0],        %[f0],        %[f5]                       \n\t"
393       "add.s      %[f5],        %[f1],        %[f4]                       \n\t"
394       "sub.s      %[f1],        %[f1],        %[f4]                       \n\t"
395       "swc1       %[f7],        0(%[a_ptr])                               \n\t"
396       "swc1       %[f2],        4(%[a_ptr])                               \n\t"
397       "mul.s      %[f4],        %[f9],        %[f8]                       \n\t"
398 #if defined(MIPS32_R2_LE)
399       "mul.s      %[f8],        %[f10],       %[f8]                       \n\t"
400       "mul.s      %[f7],        %[f11],       %[f0]                       \n\t"
401       "mul.s      %[f0],        %[f12],       %[f0]                       \n\t"
402       "mul.s      %[f2],        %[f13],       %[f3]                       \n\t"
403       "mul.s      %[f3],        %[f14],       %[f3]                       \n\t"
404       "nmsub.s    %[f4],        %[f4],        %[f10],       %[f6]         \n\t"
405       "madd.s     %[f8],        %[f8],        %[f9],        %[f6]         \n\t"
406       "nmsub.s    %[f7],        %[f7],        %[f12],       %[f5]         \n\t"
407       "madd.s     %[f0],        %[f0],        %[f11],       %[f5]         \n\t"
408       "nmsub.s    %[f2],        %[f2],        %[f14],       %[f1]         \n\t"
409       "madd.s     %[f3],        %[f3],        %[f13],       %[f1]         \n\t"
410 #else
411       "mul.s      %[f7],        %[f10],       %[f6]                       \n\t"
412       "mul.s      %[f6],        %[f9],        %[f6]                       \n\t"
413       "mul.s      %[f8],        %[f10],       %[f8]                       \n\t"
414       "mul.s      %[f2],        %[f11],       %[f0]                       \n\t"
415       "mul.s      %[f11],       %[f11],       %[f5]                       \n\t"
416       "mul.s      %[f5],        %[f12],       %[f5]                       \n\t"
417       "mul.s      %[f0],        %[f12],       %[f0]                       \n\t"
418       "mul.s      %[f12],       %[f13],       %[f3]                       \n\t"
419       "mul.s      %[f13],       %[f13],       %[f1]                       \n\t"
420       "mul.s      %[f1],        %[f14],       %[f1]                       \n\t"
421       "mul.s      %[f3],        %[f14],       %[f3]                       \n\t"
422       "sub.s      %[f4],        %[f4],        %[f7]                       \n\t"
423       "add.s      %[f8],        %[f6],        %[f8]                       \n\t"
424       "sub.s      %[f7],        %[f2],        %[f5]                       \n\t"
425       "add.s      %[f0],        %[f11],       %[f0]                       \n\t"
426       "sub.s      %[f2],        %[f12],       %[f1]                       \n\t"
427       "add.s      %[f3],        %[f13],       %[f3]                       \n\t"
428 #endif
429       "swc1       %[f4],        16(%[a_ptr])                              \n\t"
430       "swc1       %[f8],        20(%[a_ptr])                              \n\t"
431       "swc1       %[f7],        8(%[a_ptr])                               \n\t"
432       "swc1       %[f0],        12(%[a_ptr])                              \n\t"
433       "swc1       %[f2],        24(%[a_ptr])                              \n\t"
434       "swc1       %[f3],        28(%[a_ptr])                              \n\t"
435       "lwc1       %[f0],        32(%[a_ptr])                              \n\t"
436       "lwc1       %[f1],        36(%[a_ptr])                              \n\t"
437       "lwc1       %[f2],        40(%[a_ptr])                              \n\t"
438       "lwc1       %[f3],        44(%[a_ptr])                              \n\t"
439       "lwc1       %[f4],        48(%[a_ptr])                              \n\t"
440       "lwc1       %[f5],        52(%[a_ptr])                              \n\t"
441       "lwc1       %[f6],        56(%[a_ptr])                              \n\t"
442       "lwc1       %[f7],        60(%[a_ptr])                              \n\t"
443       "add.s      %[f8],        %[f0],        %[f2]                       \n\t"
444       "sub.s      %[f0],        %[f0],        %[f2]                       \n\t"
445       "add.s      %[f2],        %[f4],        %[f6]                       \n\t"
446       "sub.s      %[f4],        %[f4],        %[f6]                       \n\t"
447       "add.s      %[f6],        %[f1],        %[f3]                       \n\t"
448       "sub.s      %[f1],        %[f1],        %[f3]                       \n\t"
449       "add.s      %[f3],        %[f5],        %[f7]                       \n\t"
450       "sub.s      %[f5],        %[f5],        %[f7]                       \n\t"
451       "lwc1       %[f11],       8(%[p2_rdft])                             \n\t"
452       "lwc1       %[f12],       12(%[p2_rdft])                            \n\t"
453       "lwc1       %[f13],       8(%[second])                              \n\t"
454       "lwc1       %[f14],       12(%[second])                             \n\t"
455       "add.s      %[f7],        %[f8],        %[f2]                       \n\t"
456       "sub.s      %[f8],        %[f2],        %[f8]                       \n\t"
457       "add.s      %[f2],        %[f6],        %[f3]                       \n\t"
458       "sub.s      %[f6],        %[f3],        %[f6]                       \n\t"
459       "add.s      %[f3],        %[f0],        %[f5]                       \n\t"
460       "sub.s      %[f0],        %[f0],        %[f5]                       \n\t"
461       "add.s      %[f5],        %[f1],        %[f4]                       \n\t"
462       "sub.s      %[f1],        %[f1],        %[f4]                       \n\t"
463       "swc1       %[f7],        32(%[a_ptr])                              \n\t"
464       "swc1       %[f2],        36(%[a_ptr])                              \n\t"
465       "mul.s      %[f4],        %[f10],       %[f8]                       \n\t"
466 #if defined(MIPS32_R2_LE)
467       "mul.s      %[f10],       %[f10],       %[f6]                       \n\t"
468       "mul.s      %[f7],        %[f11],       %[f0]                       \n\t"
469       "mul.s      %[f11],       %[f11],       %[f5]                       \n\t"
470       "mul.s      %[f2],        %[f13],       %[f3]                       \n\t"
471       "mul.s      %[f13],       %[f13],       %[f1]                       \n\t"
472       "madd.s     %[f4],        %[f4],        %[f9],        %[f6]         \n\t"
473       "nmsub.s    %[f10],       %[f10],       %[f9],        %[f8]         \n\t"
474       "nmsub.s    %[f7],        %[f7],        %[f12],       %[f5]         \n\t"
475       "madd.s     %[f11],       %[f11],       %[f12],       %[f0]         \n\t"
476       "nmsub.s    %[f2],        %[f2],        %[f14],       %[f1]         \n\t"
477       "madd.s     %[f13],       %[f13],       %[f14],       %[f3]         \n\t"
478 #else
479       "mul.s      %[f2],        %[f9],        %[f6]                       \n\t"
480       "mul.s      %[f10],       %[f10],       %[f6]                       \n\t"
481       "mul.s      %[f9],        %[f9],        %[f8]                       \n\t"
482       "mul.s      %[f7],        %[f11],       %[f0]                       \n\t"
483       "mul.s      %[f8],        %[f12],       %[f5]                       \n\t"
484       "mul.s      %[f11],       %[f11],       %[f5]                       \n\t"
485       "mul.s      %[f12],       %[f12],       %[f0]                       \n\t"
486       "mul.s      %[f5],        %[f13],       %[f3]                       \n\t"
487       "mul.s      %[f0],        %[f14],       %[f1]                       \n\t"
488       "mul.s      %[f13],       %[f13],       %[f1]                       \n\t"
489       "mul.s      %[f14],       %[f14],       %[f3]                       \n\t"
490       "add.s      %[f4],        %[f4],        %[f2]                       \n\t"
491       "sub.s      %[f10],       %[f10],       %[f9]                       \n\t"
492       "sub.s      %[f7],        %[f7],        %[f8]                       \n\t"
493       "add.s      %[f11],       %[f11],       %[f12]                      \n\t"
494       "sub.s      %[f2],        %[f5],        %[f0]                       \n\t"
495       "add.s      %[f13],       %[f13],       %[f14]                      \n\t"
496 #endif
497       "swc1       %[f4],        48(%[a_ptr])                              \n\t"
498       "swc1       %[f10],       52(%[a_ptr])                              \n\t"
499       "swc1       %[f7],        40(%[a_ptr])                              \n\t"
500       "swc1       %[f11],       44(%[a_ptr])                              \n\t"
501       "swc1       %[f2],        56(%[a_ptr])                              \n\t"
502       "swc1       %[f13],       60(%[a_ptr])                              \n\t"
503       "addiu      %[count],     %[count],     -1                          \n\t"
504       "lwc1       %[f9],        8(%[p1_rdft])                             \n\t"
505       "addiu      %[a_ptr],     %[a_ptr],     64                          \n\t"
506       "addiu      %[p1_rdft],   %[p1_rdft],   8                           \n\t"
507       "addiu      %[p2_rdft],   %[p2_rdft],   16                          \n\t"
508       "addiu      %[first],     %[first],     8                           \n\t"
509       "bgtz       %[count],     1b                                        \n\t"
510       " addiu     %[second],    %[second],    8                           \n\t"
511       ".set       pop                                                     \n\t"
512       : [f0] "=&f"(f0), [f1] "=&f"(f1), [f2] "=&f"(f2), [f3] "=&f"(f3),
513         [f4] "=&f"(f4), [f5] "=&f"(f5), [f6] "=&f"(f6), [f7] "=&f"(f7),
514         [f8] "=&f"(f8), [f9] "=&f"(f9), [f10] "=&f"(f10), [f11] "=&f"(f11),
515         [f12] "=&f"(f12), [f13] "=&f"(f13), [f14] "=&f"(f14),
516         [a_ptr] "=&r"(a_ptr), [p1_rdft] "=&r"(p1_rdft), [first] "+r"(first),
517         [p2_rdft] "=&r"(p2_rdft), [count] "=&r"(count), [second] "+r"(second)
518       : [a] "r"(a), [rdft_w] "r"(rdft_w)
519       : "memory");
520 }
521 
cftmdl_128_mips(float * a)522 void cftmdl_128_mips(float* a) {
523   float f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14;
524   int tmp_a, count;
525   __asm __volatile(
526       ".set       push                                      \n\t"
527       ".set       noreorder                                 \n\t"
528       "addiu      %[tmp_a],   %[a],         0               \n\t"
529       "addiu      %[count],   $zero,        4               \n\t"
530       "1:                                                    \n\t"
531       "addiu      %[count],   %[count],     -1              \n\t"
532       "lwc1       %[f0],      0(%[tmp_a])                   \n\t"
533       "lwc1       %[f2],      32(%[tmp_a])                  \n\t"
534       "lwc1       %[f4],      64(%[tmp_a])                  \n\t"
535       "lwc1       %[f6],      96(%[tmp_a])                  \n\t"
536       "lwc1       %[f1],      4(%[tmp_a])                   \n\t"
537       "lwc1       %[f3],      36(%[tmp_a])                  \n\t"
538       "lwc1       %[f5],      68(%[tmp_a])                  \n\t"
539       "lwc1       %[f7],      100(%[tmp_a])                 \n\t"
540       "add.s      %[f8],      %[f0],        %[f2]           \n\t"
541       "sub.s      %[f0],      %[f0],        %[f2]           \n\t"
542       "add.s      %[f2],      %[f4],        %[f6]           \n\t"
543       "sub.s      %[f4],      %[f4],        %[f6]           \n\t"
544       "add.s      %[f6],      %[f1],        %[f3]           \n\t"
545       "sub.s      %[f1],      %[f1],        %[f3]           \n\t"
546       "add.s      %[f3],      %[f5],        %[f7]           \n\t"
547       "sub.s      %[f5],      %[f5],        %[f7]           \n\t"
548       "add.s      %[f7],      %[f8],        %[f2]           \n\t"
549       "sub.s      %[f8],      %[f8],        %[f2]           \n\t"
550       "add.s      %[f2],      %[f1],        %[f4]           \n\t"
551       "sub.s      %[f1],      %[f1],        %[f4]           \n\t"
552       "add.s      %[f4],      %[f6],        %[f3]           \n\t"
553       "sub.s      %[f6],      %[f6],        %[f3]           \n\t"
554       "sub.s      %[f3],      %[f0],        %[f5]           \n\t"
555       "add.s      %[f0],      %[f0],        %[f5]           \n\t"
556       "swc1       %[f7],      0(%[tmp_a])                   \n\t"
557       "swc1       %[f8],      64(%[tmp_a])                  \n\t"
558       "swc1       %[f2],      36(%[tmp_a])                  \n\t"
559       "swc1       %[f1],      100(%[tmp_a])                 \n\t"
560       "swc1       %[f4],      4(%[tmp_a])                   \n\t"
561       "swc1       %[f6],      68(%[tmp_a])                  \n\t"
562       "swc1       %[f3],      32(%[tmp_a])                  \n\t"
563       "swc1       %[f0],      96(%[tmp_a])                  \n\t"
564       "bgtz       %[count],   1b                            \n\t"
565       " addiu     %[tmp_a],   %[tmp_a],     8               \n\t"
566       ".set       pop                                       \n\t"
567       : [f0] "=&f"(f0), [f1] "=&f"(f1), [f2] "=&f"(f2), [f3] "=&f"(f3),
568         [f4] "=&f"(f4), [f5] "=&f"(f5), [f6] "=&f"(f6), [f7] "=&f"(f7),
569         [f8] "=&f"(f8), [tmp_a] "=&r"(tmp_a), [count] "=&r"(count)
570       : [a] "r"(a)
571       : "memory");
572   f9 = rdft_w[2];
573   __asm __volatile(
574       ".set       push                                      \n\t"
575       ".set       noreorder                                 \n\t"
576       "addiu      %[tmp_a],   %[a],         128             \n\t"
577       "addiu      %[count],   $zero,        4               \n\t"
578       "1:                                                    \n\t"
579       "addiu      %[count],   %[count],     -1              \n\t"
580       "lwc1       %[f0],      0(%[tmp_a])                   \n\t"
581       "lwc1       %[f2],      32(%[tmp_a])                  \n\t"
582       "lwc1       %[f5],      68(%[tmp_a])                  \n\t"
583       "lwc1       %[f7],      100(%[tmp_a])                 \n\t"
584       "lwc1       %[f1],      4(%[tmp_a])                   \n\t"
585       "lwc1       %[f3],      36(%[tmp_a])                  \n\t"
586       "lwc1       %[f4],      64(%[tmp_a])                  \n\t"
587       "lwc1       %[f6],      96(%[tmp_a])                  \n\t"
588       "sub.s      %[f8],      %[f0],        %[f2]           \n\t"
589       "add.s      %[f0],      %[f0],        %[f2]           \n\t"
590       "sub.s      %[f2],      %[f5],        %[f7]           \n\t"
591       "add.s      %[f5],      %[f5],        %[f7]           \n\t"
592       "sub.s      %[f7],      %[f1],        %[f3]           \n\t"
593       "add.s      %[f1],      %[f1],        %[f3]           \n\t"
594       "sub.s      %[f3],      %[f4],        %[f6]           \n\t"
595       "add.s      %[f4],      %[f4],        %[f6]           \n\t"
596       "sub.s      %[f6],      %[f8],        %[f2]           \n\t"
597       "add.s      %[f8],      %[f8],        %[f2]           \n\t"
598       "add.s      %[f2],      %[f5],        %[f1]           \n\t"
599       "sub.s      %[f5],      %[f5],        %[f1]           \n\t"
600       "add.s      %[f1],      %[f3],        %[f7]           \n\t"
601       "sub.s      %[f3],      %[f3],        %[f7]           \n\t"
602       "add.s      %[f7],      %[f0],        %[f4]           \n\t"
603       "sub.s      %[f0],      %[f0],        %[f4]           \n\t"
604       "sub.s      %[f4],      %[f6],        %[f1]           \n\t"
605       "add.s      %[f6],      %[f6],        %[f1]           \n\t"
606       "sub.s      %[f1],      %[f3],        %[f8]           \n\t"
607       "add.s      %[f3],      %[f3],        %[f8]           \n\t"
608       "mul.s      %[f4],      %[f4],        %[f9]           \n\t"
609       "mul.s      %[f6],      %[f6],        %[f9]           \n\t"
610       "mul.s      %[f1],      %[f1],        %[f9]           \n\t"
611       "mul.s      %[f3],      %[f3],        %[f9]           \n\t"
612       "swc1       %[f7],      0(%[tmp_a])                   \n\t"
613       "swc1       %[f2],      4(%[tmp_a])                   \n\t"
614       "swc1       %[f5],      64(%[tmp_a])                  \n\t"
615       "swc1       %[f0],      68(%[tmp_a])                  \n\t"
616       "swc1       %[f4],      32(%[tmp_a])                  \n\t"
617       "swc1       %[f6],      36(%[tmp_a])                  \n\t"
618       "swc1       %[f1],      96(%[tmp_a])                  \n\t"
619       "swc1       %[f3],      100(%[tmp_a])                 \n\t"
620       "bgtz       %[count],   1b                            \n\t"
621       " addiu     %[tmp_a],   %[tmp_a],     8               \n\t"
622       ".set       pop                                       \n\t"
623       : [f0] "=&f"(f0), [f1] "=&f"(f1), [f2] "=&f"(f2), [f3] "=&f"(f3),
624         [f4] "=&f"(f4), [f5] "=&f"(f5), [f6] "=&f"(f6), [f7] "=&f"(f7),
625         [f8] "=&f"(f8), [tmp_a] "=&r"(tmp_a), [count] "=&r"(count)
626       : [a] "r"(a), [f9] "f"(f9)
627       : "memory");
628   f10 = rdft_w[3];
629   f11 = rdft_w[4];
630   f12 = rdft_w[5];
631   f13 = rdft_wk3ri_first[2];
632   f14 = rdft_wk3ri_first[3];
633 
634   __asm __volatile(
635       ".set       push                                                    \n\t"
636       ".set       noreorder                                               \n\t"
637       "addiu      %[tmp_a],     %[a],         256                         \n\t"
638       "addiu      %[count],     $zero,        4                           \n\t"
639       "1:                                                                  \n\t"
640       "addiu      %[count],     %[count],     -1                          \n\t"
641       "lwc1       %[f0],        0(%[tmp_a])                               \n\t"
642       "lwc1       %[f2],        32(%[tmp_a])                              \n\t"
643       "lwc1       %[f4],        64(%[tmp_a])                              \n\t"
644       "lwc1       %[f6],        96(%[tmp_a])                              \n\t"
645       "lwc1       %[f1],        4(%[tmp_a])                               \n\t"
646       "lwc1       %[f3],        36(%[tmp_a])                              \n\t"
647       "lwc1       %[f5],        68(%[tmp_a])                              \n\t"
648       "lwc1       %[f7],        100(%[tmp_a])                             \n\t"
649       "add.s      %[f8],        %[f0],        %[f2]                       \n\t"
650       "sub.s      %[f0],        %[f0],        %[f2]                       \n\t"
651       "add.s      %[f2],        %[f4],        %[f6]                       \n\t"
652       "sub.s      %[f4],        %[f4],        %[f6]                       \n\t"
653       "add.s      %[f6],        %[f1],        %[f3]                       \n\t"
654       "sub.s      %[f1],        %[f1],        %[f3]                       \n\t"
655       "add.s      %[f3],        %[f5],        %[f7]                       \n\t"
656       "sub.s      %[f5],        %[f5],        %[f7]                       \n\t"
657       "sub.s      %[f7],        %[f8],        %[f2]                       \n\t"
658       "add.s      %[f8],        %[f8],        %[f2]                       \n\t"
659       "add.s      %[f2],        %[f1],        %[f4]                       \n\t"
660       "sub.s      %[f1],        %[f1],        %[f4]                       \n\t"
661       "sub.s      %[f4],        %[f6],        %[f3]                       \n\t"
662       "add.s      %[f6],        %[f6],        %[f3]                       \n\t"
663       "sub.s      %[f3],        %[f0],        %[f5]                       \n\t"
664       "add.s      %[f0],        %[f0],        %[f5]                       \n\t"
665       "swc1       %[f8],        0(%[tmp_a])                               \n\t"
666       "swc1       %[f6],        4(%[tmp_a])                               \n\t"
667       "mul.s      %[f5],        %[f9],        %[f7]                       \n\t"
668 #if defined(MIPS32_R2_LE)
669       "mul.s      %[f7],        %[f10],       %[f7]                       \n\t"
670       "mul.s      %[f8],        %[f11],       %[f3]                       \n\t"
671       "mul.s      %[f3],        %[f12],       %[f3]                       \n\t"
672       "mul.s      %[f6],        %[f13],       %[f0]                       \n\t"
673       "mul.s      %[f0],        %[f14],       %[f0]                       \n\t"
674       "nmsub.s    %[f5],        %[f5],        %[f10],       %[f4]         \n\t"
675       "madd.s     %[f7],        %[f7],        %[f9],        %[f4]         \n\t"
676       "nmsub.s    %[f8],        %[f8],        %[f12],       %[f2]         \n\t"
677       "madd.s     %[f3],        %[f3],        %[f11],       %[f2]         \n\t"
678       "nmsub.s    %[f6],        %[f6],        %[f14],       %[f1]         \n\t"
679       "madd.s     %[f0],        %[f0],        %[f13],       %[f1]         \n\t"
680       "swc1       %[f5],        64(%[tmp_a])                              \n\t"
681       "swc1       %[f7],        68(%[tmp_a])                              \n\t"
682 #else
683       "mul.s      %[f8],        %[f10],       %[f4]                       \n\t"
684       "mul.s      %[f4],        %[f9],        %[f4]                       \n\t"
685       "mul.s      %[f7],        %[f10],       %[f7]                       \n\t"
686       "mul.s      %[f6],        %[f11],       %[f3]                       \n\t"
687       "mul.s      %[f3],        %[f12],       %[f3]                       \n\t"
688       "sub.s      %[f5],        %[f5],        %[f8]                       \n\t"
689       "mul.s      %[f8],        %[f12],       %[f2]                       \n\t"
690       "mul.s      %[f2],        %[f11],       %[f2]                       \n\t"
691       "add.s      %[f7],        %[f4],        %[f7]                       \n\t"
692       "mul.s      %[f4],        %[f13],       %[f0]                       \n\t"
693       "mul.s      %[f0],        %[f14],       %[f0]                       \n\t"
694       "sub.s      %[f8],        %[f6],        %[f8]                       \n\t"
695       "mul.s      %[f6],        %[f14],       %[f1]                       \n\t"
696       "mul.s      %[f1],        %[f13],       %[f1]                       \n\t"
697       "add.s      %[f3],        %[f2],        %[f3]                       \n\t"
698       "swc1       %[f5],        64(%[tmp_a])                              \n\t"
699       "swc1       %[f7],        68(%[tmp_a])                              \n\t"
700       "sub.s      %[f6],        %[f4],        %[f6]                       \n\t"
701       "add.s      %[f0],        %[f1],        %[f0]                       \n\t"
702 #endif
703       "swc1       %[f8],        32(%[tmp_a])                              \n\t"
704       "swc1       %[f3],        36(%[tmp_a])                              \n\t"
705       "swc1       %[f6],        96(%[tmp_a])                              \n\t"
706       "swc1       %[f0],        100(%[tmp_a])                             \n\t"
707       "bgtz       %[count],     1b                                        \n\t"
708       " addiu     %[tmp_a],     %[tmp_a],     8                           \n\t"
709       ".set       pop                                                     \n\t"
710       : [f0] "=&f"(f0), [f1] "=&f"(f1), [f2] "=&f"(f2), [f3] "=&f"(f3),
711         [f4] "=&f"(f4), [f5] "=&f"(f5), [f6] "=&f"(f6), [f7] "=&f"(f7),
712         [f8] "=&f"(f8), [tmp_a] "=&r"(tmp_a), [count] "=&r"(count)
713       : [a] "r"(a), [f9] "f"(f9), [f10] "f"(f10), [f11] "f"(f11),
714         [f12] "f"(f12), [f13] "f"(f13), [f14] "f"(f14)
715       : "memory");
716   f11 = rdft_w[6];
717   f12 = rdft_w[7];
718   f13 = rdft_wk3ri_second[2];
719   f14 = rdft_wk3ri_second[3];
720   __asm __volatile(
721       ".set       push                                                       "
722       "\n\t"
723       ".set       noreorder                                                  "
724       "\n\t"
725       "addiu      %[tmp_a],       %[a],           384                        "
726       "\n\t"
727       "addiu      %[count],       $zero,          4                          "
728       "\n\t"
729       "1:                                                                     "
730       "\n\t"
731       "addiu      %[count],       %[count],       -1                         "
732       "\n\t"
733       "lwc1       %[f0],          0(%[tmp_a])                                "
734       "\n\t"
735       "lwc1       %[f1],          4(%[tmp_a])                                "
736       "\n\t"
737       "lwc1       %[f2],          32(%[tmp_a])                               "
738       "\n\t"
739       "lwc1       %[f3],          36(%[tmp_a])                               "
740       "\n\t"
741       "lwc1       %[f4],          64(%[tmp_a])                               "
742       "\n\t"
743       "lwc1       %[f5],          68(%[tmp_a])                               "
744       "\n\t"
745       "lwc1       %[f6],          96(%[tmp_a])                               "
746       "\n\t"
747       "lwc1       %[f7],          100(%[tmp_a])                              "
748       "\n\t"
749       "add.s      %[f8],          %[f0],          %[f2]                      "
750       "\n\t"
751       "sub.s      %[f0],          %[f0],          %[f2]                      "
752       "\n\t"
753       "add.s      %[f2],          %[f4],          %[f6]                      "
754       "\n\t"
755       "sub.s      %[f4],          %[f4],          %[f6]                      "
756       "\n\t"
757       "add.s      %[f6],          %[f1],          %[f3]                      "
758       "\n\t"
759       "sub.s      %[f1],          %[f1],          %[f3]                      "
760       "\n\t"
761       "add.s      %[f3],          %[f5],          %[f7]                      "
762       "\n\t"
763       "sub.s      %[f5],          %[f5],          %[f7]                      "
764       "\n\t"
765       "sub.s      %[f7],          %[f2],          %[f8]                      "
766       "\n\t"
767       "add.s      %[f2],          %[f2],          %[f8]                      "
768       "\n\t"
769       "add.s      %[f8],          %[f1],          %[f4]                      "
770       "\n\t"
771       "sub.s      %[f1],          %[f1],          %[f4]                      "
772       "\n\t"
773       "sub.s      %[f4],          %[f3],          %[f6]                      "
774       "\n\t"
775       "add.s      %[f3],          %[f3],          %[f6]                      "
776       "\n\t"
777       "sub.s      %[f6],          %[f0],          %[f5]                      "
778       "\n\t"
779       "add.s      %[f0],          %[f0],          %[f5]                      "
780       "\n\t"
781       "swc1       %[f2],          0(%[tmp_a])                                "
782       "\n\t"
783       "swc1       %[f3],          4(%[tmp_a])                                "
784       "\n\t"
785       "mul.s      %[f5],          %[f10],         %[f7]                      "
786       "\n\t"
787 #if defined(MIPS32_R2_LE)
788       "mul.s      %[f7],          %[f9],          %[f7]                      "
789       "\n\t"
790       "mul.s      %[f2],          %[f12],         %[f8]                      "
791       "\n\t"
792       "mul.s      %[f8],          %[f11],         %[f8]                      "
793       "\n\t"
794       "mul.s      %[f3],          %[f14],         %[f1]                      "
795       "\n\t"
796       "mul.s      %[f1],          %[f13],         %[f1]                      "
797       "\n\t"
798       "madd.s     %[f5],          %[f5],          %[f9],       %[f4]         "
799       "\n\t"
800       "msub.s     %[f7],          %[f7],          %[f10],      %[f4]         "
801       "\n\t"
802       "msub.s     %[f2],          %[f2],          %[f11],      %[f6]         "
803       "\n\t"
804       "madd.s     %[f8],          %[f8],          %[f12],      %[f6]         "
805       "\n\t"
806       "msub.s     %[f3],          %[f3],          %[f13],      %[f0]         "
807       "\n\t"
808       "madd.s     %[f1],          %[f1],          %[f14],      %[f0]         "
809       "\n\t"
810       "swc1       %[f5],          64(%[tmp_a])                               "
811       "\n\t"
812       "swc1       %[f7],          68(%[tmp_a])                               "
813       "\n\t"
814 #else
815       "mul.s      %[f2],          %[f9],          %[f4]                      "
816       "\n\t"
817       "mul.s      %[f4],          %[f10],         %[f4]                      "
818       "\n\t"
819       "mul.s      %[f7],          %[f9],          %[f7]                      "
820       "\n\t"
821       "mul.s      %[f3],          %[f11],         %[f6]                      "
822       "\n\t"
823       "mul.s      %[f6],          %[f12],         %[f6]                      "
824       "\n\t"
825       "add.s      %[f5],          %[f5],          %[f2]                      "
826       "\n\t"
827       "sub.s      %[f7],          %[f4],          %[f7]                      "
828       "\n\t"
829       "mul.s      %[f2],          %[f12],         %[f8]                      "
830       "\n\t"
831       "mul.s      %[f8],          %[f11],         %[f8]                      "
832       "\n\t"
833       "mul.s      %[f4],          %[f14],         %[f1]                      "
834       "\n\t"
835       "mul.s      %[f1],          %[f13],         %[f1]                      "
836       "\n\t"
837       "sub.s      %[f2],          %[f3],          %[f2]                      "
838       "\n\t"
839       "mul.s      %[f3],          %[f13],         %[f0]                      "
840       "\n\t"
841       "mul.s      %[f0],          %[f14],         %[f0]                      "
842       "\n\t"
843       "add.s      %[f8],          %[f8],          %[f6]                      "
844       "\n\t"
845       "swc1       %[f5],          64(%[tmp_a])                               "
846       "\n\t"
847       "swc1       %[f7],          68(%[tmp_a])                               "
848       "\n\t"
849       "sub.s      %[f3],          %[f3],          %[f4]                      "
850       "\n\t"
851       "add.s      %[f1],          %[f1],          %[f0]                      "
852       "\n\t"
853 #endif
854       "swc1       %[f2],          32(%[tmp_a])                               "
855       "\n\t"
856       "swc1       %[f8],          36(%[tmp_a])                               "
857       "\n\t"
858       "swc1       %[f3],          96(%[tmp_a])                               "
859       "\n\t"
860       "swc1       %[f1],          100(%[tmp_a])                              "
861       "\n\t"
862       "bgtz       %[count],       1b                                         "
863       "\n\t"
864       " addiu     %[tmp_a],       %[tmp_a],       8                          "
865       "\n\t"
866       ".set       pop                                                        "
867       "\n\t"
868       : [f0] "=&f"(f0), [f1] "=&f"(f1), [f2] "=&f"(f2), [f3] "=&f"(f3),
869         [f4] "=&f"(f4), [f5] "=&f"(f5), [f6] "=&f"(f6), [f7] "=&f"(f7),
870         [f8] "=&f"(f8), [tmp_a] "=&r"(tmp_a), [count] "=&r"(count)
871       : [a] "r"(a), [f9] "f"(f9), [f10] "f"(f10), [f11] "f"(f11),
872         [f12] "f"(f12), [f13] "f"(f13), [f14] "f"(f14)
873       : "memory");
874 }
875 
cftfsub_128_mips(float * a)876 void cftfsub_128_mips(float* a) {
877   float f0, f1, f2, f3, f4, f5, f6, f7, f8;
878   int tmp_a, count;
879 
880   cft1st_128_mips(a);
881   cftmdl_128_mips(a);
882 
883   __asm __volatile(
884       ".set       push                                      \n\t"
885       ".set       noreorder                                 \n\t"
886       "addiu      %[tmp_a],       %[a],         0           \n\t"
887       "addiu      %[count],       $zero,        16          \n\t"
888       "1:                                                    \n\t"
889       "addiu      %[count],       %[count],     -1          \n\t"
890       "lwc1       %[f0],          0(%[tmp_a])               \n\t"
891       "lwc1       %[f2],          128(%[tmp_a])             \n\t"
892       "lwc1       %[f4],          256(%[tmp_a])             \n\t"
893       "lwc1       %[f6],          384(%[tmp_a])             \n\t"
894       "lwc1       %[f1],          4(%[tmp_a])               \n\t"
895       "lwc1       %[f3],          132(%[tmp_a])             \n\t"
896       "lwc1       %[f5],          260(%[tmp_a])             \n\t"
897       "lwc1       %[f7],          388(%[tmp_a])             \n\t"
898       "add.s      %[f8],          %[f0],        %[f2]       \n\t"
899       "sub.s      %[f0],          %[f0],        %[f2]       \n\t"
900       "add.s      %[f2],          %[f4],        %[f6]       \n\t"
901       "sub.s      %[f4],          %[f4],        %[f6]       \n\t"
902       "add.s      %[f6],          %[f1],        %[f3]       \n\t"
903       "sub.s      %[f1],          %[f1],        %[f3]       \n\t"
904       "add.s      %[f3],          %[f5],        %[f7]       \n\t"
905       "sub.s      %[f5],          %[f5],        %[f7]       \n\t"
906       "add.s      %[f7],          %[f8],        %[f2]       \n\t"
907       "sub.s      %[f8],          %[f8],        %[f2]       \n\t"
908       "add.s      %[f2],          %[f1],        %[f4]       \n\t"
909       "sub.s      %[f1],          %[f1],        %[f4]       \n\t"
910       "add.s      %[f4],          %[f6],        %[f3]       \n\t"
911       "sub.s      %[f6],          %[f6],        %[f3]       \n\t"
912       "sub.s      %[f3],          %[f0],        %[f5]       \n\t"
913       "add.s      %[f0],          %[f0],        %[f5]       \n\t"
914       "swc1       %[f7],          0(%[tmp_a])               \n\t"
915       "swc1       %[f8],          256(%[tmp_a])             \n\t"
916       "swc1       %[f2],          132(%[tmp_a])             \n\t"
917       "swc1       %[f1],          388(%[tmp_a])             \n\t"
918       "swc1       %[f4],          4(%[tmp_a])               \n\t"
919       "swc1       %[f6],          260(%[tmp_a])             \n\t"
920       "swc1       %[f3],          128(%[tmp_a])             \n\t"
921       "swc1       %[f0],          384(%[tmp_a])             \n\t"
922       "bgtz       %[count],       1b                        \n\t"
923       " addiu     %[tmp_a],       %[tmp_a],   8             \n\t"
924       ".set       pop                                       \n\t"
925       : [f0] "=&f"(f0), [f1] "=&f"(f1), [f2] "=&f"(f2), [f3] "=&f"(f3),
926         [f4] "=&f"(f4), [f5] "=&f"(f5), [f6] "=&f"(f6), [f7] "=&f"(f7),
927         [f8] "=&f"(f8), [tmp_a] "=&r"(tmp_a), [count] "=&r"(count)
928       : [a] "r"(a)
929       : "memory");
930 }
931 
cftbsub_128_mips(float * a)932 void cftbsub_128_mips(float* a) {
933   float f0, f1, f2, f3, f4, f5, f6, f7, f8;
934   int tmp_a, count;
935 
936   cft1st_128_mips(a);
937   cftmdl_128_mips(a);
938 
939   __asm __volatile(
940       ".set       push                                        \n\t"
941       ".set       noreorder                                   \n\t"
942       "addiu      %[tmp_a],   %[a],           0               \n\t"
943       "addiu      %[count],   $zero,          16              \n\t"
944       "1:                                                      \n\t"
945       "addiu      %[count],   %[count],       -1              \n\t"
946       "lwc1       %[f0],      0(%[tmp_a])                     \n\t"
947       "lwc1       %[f2],      128(%[tmp_a])                   \n\t"
948       "lwc1       %[f4],      256(%[tmp_a])                   \n\t"
949       "lwc1       %[f6],      384(%[tmp_a])                   \n\t"
950       "lwc1       %[f1],      4(%[tmp_a])                     \n\t"
951       "lwc1       %[f3],      132(%[tmp_a])                   \n\t"
952       "lwc1       %[f5],      260(%[tmp_a])                   \n\t"
953       "lwc1       %[f7],      388(%[tmp_a])                   \n\t"
954       "add.s      %[f8],      %[f0],          %[f2]           \n\t"
955       "sub.s      %[f0],      %[f0],          %[f2]           \n\t"
956       "add.s      %[f2],      %[f4],          %[f6]           \n\t"
957       "sub.s      %[f4],      %[f4],          %[f6]           \n\t"
958       "add.s      %[f6],      %[f1],          %[f3]           \n\t"
959       "sub.s      %[f1],      %[f3],          %[f1]           \n\t"
960       "add.s      %[f3],      %[f5],          %[f7]           \n\t"
961       "sub.s      %[f5],      %[f5],          %[f7]           \n\t"
962       "add.s      %[f7],      %[f8],          %[f2]           \n\t"
963       "sub.s      %[f8],      %[f8],          %[f2]           \n\t"
964       "sub.s      %[f2],      %[f1],          %[f4]           \n\t"
965       "add.s      %[f1],      %[f1],          %[f4]           \n\t"
966       "add.s      %[f4],      %[f3],          %[f6]           \n\t"
967       "sub.s      %[f6],      %[f3],          %[f6]           \n\t"
968       "sub.s      %[f3],      %[f0],          %[f5]           \n\t"
969       "add.s      %[f0],      %[f0],          %[f5]           \n\t"
970       "neg.s      %[f4],      %[f4]                           \n\t"
971       "swc1       %[f7],      0(%[tmp_a])                     \n\t"
972       "swc1       %[f8],      256(%[tmp_a])                   \n\t"
973       "swc1       %[f2],      132(%[tmp_a])                   \n\t"
974       "swc1       %[f1],      388(%[tmp_a])                   \n\t"
975       "swc1       %[f6],      260(%[tmp_a])                   \n\t"
976       "swc1       %[f3],      128(%[tmp_a])                   \n\t"
977       "swc1       %[f0],      384(%[tmp_a])                   \n\t"
978       "swc1       %[f4],       4(%[tmp_a])                     \n\t"
979       "bgtz       %[count],   1b                              \n\t"
980       " addiu     %[tmp_a],   %[tmp_a],       8               \n\t"
981       ".set       pop                                         \n\t"
982       : [f0] "=&f"(f0), [f1] "=&f"(f1), [f2] "=&f"(f2), [f3] "=&f"(f3),
983         [f4] "=&f"(f4), [f5] "=&f"(f5), [f6] "=&f"(f6), [f7] "=&f"(f7),
984         [f8] "=&f"(f8), [tmp_a] "=&r"(tmp_a), [count] "=&r"(count)
985       : [a] "r"(a)
986       : "memory");
987 }
988 
rftfsub_128_mips(float * a)989 void rftfsub_128_mips(float* a) {
990   const float* c = rdft_w + 32;
991   const float f0 = 0.5f;
992   float* a1 = &a[2];
993   float* a2 = &a[126];
994   const float* c1 = &c[1];
995   const float* c2 = &c[31];
996   float f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15;
997   int count;
998 
999   __asm __volatile(
1000       ".set      push                                             \n\t"
1001       ".set      noreorder                                        \n\t"
1002       "lwc1      %[f6],       0(%[c2])                            \n\t"
1003       "lwc1      %[f1],       0(%[a1])                            \n\t"
1004       "lwc1      %[f2],       0(%[a2])                            \n\t"
1005       "lwc1      %[f3],       4(%[a1])                            \n\t"
1006       "lwc1      %[f4],       4(%[a2])                            \n\t"
1007       "lwc1      %[f5],       0(%[c1])                            \n\t"
1008       "sub.s     %[f6],       %[f0],        %[f6]                 \n\t"
1009       "sub.s     %[f7],       %[f1],        %[f2]                 \n\t"
1010       "add.s     %[f8],       %[f3],        %[f4]                 \n\t"
1011       "addiu     %[count],    $zero,        15                    \n\t"
1012       "mul.s     %[f9],       %[f6],        %[f7]                 \n\t"
1013       "mul.s     %[f6],       %[f6],        %[f8]                 \n\t"
1014 #if !defined(MIPS32_R2_LE)
1015       "mul.s     %[f8],       %[f5],        %[f8]                 \n\t"
1016       "mul.s     %[f5],       %[f5],        %[f7]                 \n\t"
1017       "sub.s     %[f9],       %[f9],        %[f8]                 \n\t"
1018       "add.s     %[f6],       %[f6],        %[f5]                 \n\t"
1019 #else
1020       "nmsub.s   %[f9],       %[f9],        %[f5],      %[f8]     \n\t"
1021       "madd.s    %[f6],       %[f6],        %[f5],      %[f7]     \n\t"
1022 #endif
1023       "sub.s     %[f1],       %[f1],        %[f9]                 \n\t"
1024       "add.s     %[f2],       %[f2],        %[f9]                 \n\t"
1025       "sub.s     %[f3],       %[f3],        %[f6]                 \n\t"
1026       "sub.s     %[f4],       %[f4],        %[f6]                 \n\t"
1027       "swc1      %[f1],       0(%[a1])                            \n\t"
1028       "swc1      %[f2],       0(%[a2])                            \n\t"
1029       "swc1      %[f3],       4(%[a1])                            \n\t"
1030       "swc1      %[f4],       4(%[a2])                            \n\t"
1031       "addiu     %[a1],       %[a1],        8                     \n\t"
1032       "addiu     %[a2],       %[a2],        -8                    \n\t"
1033       "addiu     %[c1],       %[c1],        4                     \n\t"
1034       "addiu     %[c2],       %[c2],        -4                    \n\t"
1035       "1:                                                          \n\t"
1036       "lwc1      %[f6],       0(%[c2])                            \n\t"
1037       "lwc1      %[f1],       0(%[a1])                            \n\t"
1038       "lwc1      %[f2],       0(%[a2])                            \n\t"
1039       "lwc1      %[f3],       4(%[a1])                            \n\t"
1040       "lwc1      %[f4],       4(%[a2])                            \n\t"
1041       "lwc1      %[f5],       0(%[c1])                            \n\t"
1042       "sub.s     %[f6],       %[f0],        %[f6]                 \n\t"
1043       "sub.s     %[f7],       %[f1],        %[f2]                 \n\t"
1044       "add.s     %[f8],       %[f3],        %[f4]                 \n\t"
1045       "lwc1      %[f10],      -4(%[c2])                           \n\t"
1046       "lwc1      %[f11],      8(%[a1])                            \n\t"
1047       "lwc1      %[f12],      -8(%[a2])                           \n\t"
1048       "mul.s     %[f9],       %[f6],        %[f7]                 \n\t"
1049       "mul.s     %[f6],       %[f6],        %[f8]                 \n\t"
1050 #if !defined(MIPS32_R2_LE)
1051       "mul.s     %[f8],       %[f5],        %[f8]                 \n\t"
1052       "mul.s     %[f5],       %[f5],        %[f7]                 \n\t"
1053       "lwc1      %[f13],      12(%[a1])                           \n\t"
1054       "lwc1      %[f14],      -4(%[a2])                           \n\t"
1055       "lwc1      %[f15],      4(%[c1])                            \n\t"
1056       "sub.s     %[f9],       %[f9],        %[f8]                 \n\t"
1057       "add.s     %[f6],       %[f6],        %[f5]                 \n\t"
1058 #else
1059       "lwc1      %[f13],      12(%[a1])                           \n\t"
1060       "lwc1      %[f14],      -4(%[a2])                           \n\t"
1061       "lwc1      %[f15],      4(%[c1])                            \n\t"
1062       "nmsub.s   %[f9],       %[f9],        %[f5],      %[f8]     \n\t"
1063       "madd.s    %[f6],       %[f6],        %[f5],      %[f7]     \n\t"
1064 #endif
1065       "sub.s     %[f10],      %[f0],        %[f10]                \n\t"
1066       "sub.s     %[f5],       %[f11],       %[f12]                \n\t"
1067       "add.s     %[f7],       %[f13],       %[f14]                \n\t"
1068       "sub.s     %[f1],       %[f1],        %[f9]                 \n\t"
1069       "add.s     %[f2],       %[f2],        %[f9]                 \n\t"
1070       "sub.s     %[f3],       %[f3],        %[f6]                 \n\t"
1071       "mul.s     %[f8],       %[f10],       %[f5]                 \n\t"
1072       "mul.s     %[f10],      %[f10],       %[f7]                 \n\t"
1073 #if !defined(MIPS32_R2_LE)
1074       "mul.s     %[f9],       %[f15],       %[f7]                 \n\t"
1075       "mul.s     %[f15],      %[f15],       %[f5]                 \n\t"
1076       "sub.s     %[f4],       %[f4],        %[f6]                 \n\t"
1077       "swc1      %[f1],       0(%[a1])                            \n\t"
1078       "swc1      %[f2],       0(%[a2])                            \n\t"
1079       "sub.s     %[f8],       %[f8],        %[f9]                 \n\t"
1080       "add.s     %[f10],      %[f10],       %[f15]                \n\t"
1081 #else
1082       "swc1      %[f1],       0(%[a1])                            \n\t"
1083       "swc1      %[f2],       0(%[a2])                            \n\t"
1084       "sub.s     %[f4],       %[f4],        %[f6]                 \n\t"
1085       "nmsub.s   %[f8],       %[f8],        %[f15],     %[f7]     \n\t"
1086       "madd.s    %[f10],      %[f10],       %[f15],     %[f5]     \n\t"
1087 #endif
1088       "swc1      %[f3],       4(%[a1])                            \n\t"
1089       "swc1      %[f4],       4(%[a2])                            \n\t"
1090       "sub.s     %[f11],      %[f11],       %[f8]                 \n\t"
1091       "add.s     %[f12],      %[f12],       %[f8]                 \n\t"
1092       "sub.s     %[f13],      %[f13],       %[f10]                \n\t"
1093       "sub.s     %[f14],      %[f14],       %[f10]                \n\t"
1094       "addiu     %[c2],       %[c2],        -8                    \n\t"
1095       "addiu     %[c1],       %[c1],        8                     \n\t"
1096       "swc1      %[f11],      8(%[a1])                            \n\t"
1097       "swc1      %[f12],      -8(%[a2])                           \n\t"
1098       "swc1      %[f13],      12(%[a1])                           \n\t"
1099       "swc1      %[f14],      -4(%[a2])                           \n\t"
1100       "addiu     %[a1],       %[a1],        16                    \n\t"
1101       "addiu     %[count],    %[count],     -1                    \n\t"
1102       "bgtz      %[count],    1b                                  \n\t"
1103       " addiu    %[a2],       %[a2],        -16                   \n\t"
1104       ".set      pop                                              \n\t"
1105       : [a1] "+r"(a1), [a2] "+r"(a2), [c1] "+r"(c1), [c2] "+r"(c2),
1106         [f1] "=&f"(f1), [f2] "=&f"(f2), [f3] "=&f"(f3), [f4] "=&f"(f4),
1107         [f5] "=&f"(f5), [f6] "=&f"(f6), [f7] "=&f"(f7), [f8] "=&f"(f8),
1108         [f9] "=&f"(f9), [f10] "=&f"(f10), [f11] "=&f"(f11), [f12] "=&f"(f12),
1109         [f13] "=&f"(f13), [f14] "=&f"(f14), [f15] "=&f"(f15),
1110         [count] "=&r"(count)
1111       : [f0] "f"(f0)
1112       : "memory");
1113 }
1114 
rftbsub_128_mips(float * a)1115 void rftbsub_128_mips(float* a) {
1116   const float* c = rdft_w + 32;
1117   const float f0 = 0.5f;
1118   float* a1 = &a[2];
1119   float* a2 = &a[126];
1120   const float* c1 = &c[1];
1121   const float* c2 = &c[31];
1122   float f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15;
1123   int count;
1124 
1125   a[1] = -a[1];
1126   a[65] = -a[65];
1127 
1128   __asm __volatile(
1129       ".set      push                                             \n\t"
1130       ".set      noreorder                                        \n\t"
1131       "lwc1      %[f6],       0(%[c2])                            \n\t"
1132       "lwc1      %[f1],       0(%[a1])                            \n\t"
1133       "lwc1      %[f2],       0(%[a2])                            \n\t"
1134       "lwc1      %[f3],       4(%[a1])                            \n\t"
1135       "lwc1      %[f4],       4(%[a2])                            \n\t"
1136       "lwc1      %[f5],       0(%[c1])                            \n\t"
1137       "sub.s     %[f6],       %[f0],        %[f6]                 \n\t"
1138       "sub.s     %[f7],       %[f1],        %[f2]                 \n\t"
1139       "add.s     %[f8],       %[f3],        %[f4]                 \n\t"
1140       "addiu     %[count],    $zero,        15                    \n\t"
1141       "mul.s     %[f9],       %[f6],        %[f7]                 \n\t"
1142       "mul.s     %[f6],       %[f6],        %[f8]                 \n\t"
1143 #if !defined(MIPS32_R2_LE)
1144       "mul.s     %[f8],       %[f5],        %[f8]                 \n\t"
1145       "mul.s     %[f5],       %[f5],        %[f7]                 \n\t"
1146       "add.s     %[f9],       %[f9],        %[f8]                 \n\t"
1147       "sub.s     %[f6],       %[f6],        %[f5]                 \n\t"
1148 #else
1149       "madd.s    %[f9],       %[f9],        %[f5],      %[f8]     \n\t"
1150       "nmsub.s   %[f6],       %[f6],        %[f5],      %[f7]     \n\t"
1151 #endif
1152       "sub.s     %[f1],       %[f1],        %[f9]                 \n\t"
1153       "add.s     %[f2],       %[f2],        %[f9]                 \n\t"
1154       "sub.s     %[f3],       %[f6],        %[f3]                 \n\t"
1155       "sub.s     %[f4],       %[f6],        %[f4]                 \n\t"
1156       "swc1      %[f1],       0(%[a1])                            \n\t"
1157       "swc1      %[f2],       0(%[a2])                            \n\t"
1158       "swc1      %[f3],       4(%[a1])                            \n\t"
1159       "swc1      %[f4],       4(%[a2])                            \n\t"
1160       "addiu     %[a1],       %[a1],        8                     \n\t"
1161       "addiu     %[a2],       %[a2],        -8                    \n\t"
1162       "addiu     %[c1],       %[c1],        4                     \n\t"
1163       "addiu     %[c2],       %[c2],        -4                    \n\t"
1164       "1:                                                          \n\t"
1165       "lwc1      %[f6],       0(%[c2])                            \n\t"
1166       "lwc1      %[f1],       0(%[a1])                            \n\t"
1167       "lwc1      %[f2],       0(%[a2])                            \n\t"
1168       "lwc1      %[f3],       4(%[a1])                            \n\t"
1169       "lwc1      %[f4],       4(%[a2])                            \n\t"
1170       "lwc1      %[f5],       0(%[c1])                            \n\t"
1171       "sub.s     %[f6],       %[f0],        %[f6]                 \n\t"
1172       "sub.s     %[f7],       %[f1],        %[f2]                 \n\t"
1173       "add.s     %[f8],       %[f3],        %[f4]                 \n\t"
1174       "lwc1      %[f10],      -4(%[c2])                           \n\t"
1175       "lwc1      %[f11],      8(%[a1])                            \n\t"
1176       "lwc1      %[f12],      -8(%[a2])                           \n\t"
1177       "mul.s     %[f9],       %[f6],        %[f7]                 \n\t"
1178       "mul.s     %[f6],       %[f6],        %[f8]                 \n\t"
1179 #if !defined(MIPS32_R2_LE)
1180       "mul.s     %[f8],       %[f5],        %[f8]                 \n\t"
1181       "mul.s     %[f5],       %[f5],        %[f7]                 \n\t"
1182       "lwc1      %[f13],      12(%[a1])                           \n\t"
1183       "lwc1      %[f14],      -4(%[a2])                           \n\t"
1184       "lwc1      %[f15],      4(%[c1])                            \n\t"
1185       "add.s     %[f9],       %[f9],        %[f8]                 \n\t"
1186       "sub.s     %[f6],       %[f6],        %[f5]                 \n\t"
1187 #else
1188       "lwc1      %[f13],      12(%[a1])                           \n\t"
1189       "lwc1      %[f14],      -4(%[a2])                           \n\t"
1190       "lwc1      %[f15],      4(%[c1])                            \n\t"
1191       "madd.s    %[f9],       %[f9],        %[f5],      %[f8]     \n\t"
1192       "nmsub.s   %[f6],       %[f6],        %[f5],      %[f7]     \n\t"
1193 #endif
1194       "sub.s     %[f10],      %[f0],        %[f10]                \n\t"
1195       "sub.s     %[f5],       %[f11],       %[f12]                \n\t"
1196       "add.s     %[f7],       %[f13],       %[f14]                \n\t"
1197       "sub.s     %[f1],       %[f1],        %[f9]                 \n\t"
1198       "add.s     %[f2],       %[f2],        %[f9]                 \n\t"
1199       "sub.s     %[f3],       %[f6],        %[f3]                 \n\t"
1200       "mul.s     %[f8],       %[f10],       %[f5]                 \n\t"
1201       "mul.s     %[f10],      %[f10],       %[f7]                 \n\t"
1202 #if !defined(MIPS32_R2_LE)
1203       "mul.s     %[f9],       %[f15],       %[f7]                 \n\t"
1204       "mul.s     %[f15],      %[f15],       %[f5]                 \n\t"
1205       "sub.s     %[f4],       %[f6],        %[f4]                 \n\t"
1206       "swc1      %[f1],       0(%[a1])                            \n\t"
1207       "swc1      %[f2],       0(%[a2])                            \n\t"
1208       "add.s     %[f8],       %[f8],        %[f9]                 \n\t"
1209       "sub.s     %[f10],      %[f10],       %[f15]                \n\t"
1210 #else
1211       "swc1      %[f1],       0(%[a1])                            \n\t"
1212       "swc1      %[f2],       0(%[a2])                            \n\t"
1213       "sub.s     %[f4],       %[f6],        %[f4]                 \n\t"
1214       "madd.s    %[f8],       %[f8],        %[f15],     %[f7]     \n\t"
1215       "nmsub.s   %[f10],      %[f10],       %[f15],     %[f5]     \n\t"
1216 #endif
1217       "swc1      %[f3],       4(%[a1])                            \n\t"
1218       "swc1      %[f4],       4(%[a2])                            \n\t"
1219       "sub.s     %[f11],      %[f11],       %[f8]                 \n\t"
1220       "add.s     %[f12],      %[f12],       %[f8]                 \n\t"
1221       "sub.s     %[f13],      %[f10],       %[f13]                \n\t"
1222       "sub.s     %[f14],      %[f10],       %[f14]                \n\t"
1223       "addiu     %[c2],       %[c2],        -8                    \n\t"
1224       "addiu     %[c1],       %[c1],        8                     \n\t"
1225       "swc1      %[f11],      8(%[a1])                            \n\t"
1226       "swc1      %[f12],      -8(%[a2])                           \n\t"
1227       "swc1      %[f13],      12(%[a1])                           \n\t"
1228       "swc1      %[f14],      -4(%[a2])                           \n\t"
1229       "addiu     %[a1],       %[a1],        16                    \n\t"
1230       "addiu     %[count],    %[count],     -1                    \n\t"
1231       "bgtz      %[count],    1b                                  \n\t"
1232       " addiu    %[a2],       %[a2],        -16                   \n\t"
1233       ".set      pop                                              \n\t"
1234       : [a1] "+r"(a1), [a2] "+r"(a2), [c1] "+r"(c1), [c2] "+r"(c2),
1235         [f1] "=&f"(f1), [f2] "=&f"(f2), [f3] "=&f"(f3), [f4] "=&f"(f4),
1236         [f5] "=&f"(f5), [f6] "=&f"(f6), [f7] "=&f"(f7), [f8] "=&f"(f8),
1237         [f9] "=&f"(f9), [f10] "=&f"(f10), [f11] "=&f"(f11), [f12] "=&f"(f12),
1238         [f13] "=&f"(f13), [f14] "=&f"(f14), [f15] "=&f"(f15),
1239         [count] "=&r"(count)
1240       : [f0] "f"(f0)
1241       : "memory");
1242 }
1243 #endif
1244 
1245 }  // namespace webrtc
1246