Coverage Report

Created: 2026-10-14 07:16

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libxaac/decoder/ixheaacd_fft.c
Line
Count
Source
1
/******************************************************************************
2
 *                                                                            *
3
 * Copyright (C) 2018 The Android Open Source Project
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at:
8
 *
9
 * http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 *
17
 *****************************************************************************
18
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19
*/
20
#include <stdlib.h>
21
#include <stdio.h>
22
23
#include "ixheaac_type_def.h"
24
#include "ixheaacd_interface.h"
25
#include "ixheaac_constants.h"
26
#include "ixheaac_basic_ops32.h"
27
#include "ixheaac_basic_ops40.h"
28
#include "ixheaacd_function_selector.h"
29
30
extern const WORD32 ixheaacd_twiddle_table_fft_32x32[514];
31
extern const FLOAT32 ixheaacd_twiddle_table_fft[514];
32
extern const FLOAT32 ixheaacd_twiddle_table_fft_flt[16];
33
extern const WORD32 ixheaacd_twiddle_table_3pr[1155];
34
extern const WORD32 ixheaacd_twiddle_table_3pi[1155];
35
extern const WORD8 ixheaacd_mps_dig_rev[8];
36
37
#define PLATFORM_INLINE __inline
38
39
#define DIG_REV(i, m, j)                                    \
40
77.9M
  do {                                                      \
41
77.9M
    unsigned _ = (i);                                       \
42
77.9M
    _ = ((_ & 0x33333333) << 2) | ((_ & ~0x33333333) >> 2); \
43
77.9M
    _ = ((_ & 0x0F0F0F0F) << 4) | ((_ & ~0x0F0F0F0F) >> 4); \
44
77.9M
    _ = ((_ & 0x00FF00FF) << 8) | ((_ & ~0x00FF00FF) >> 8); \
45
77.9M
    (j) = _ >> (m);                                         \
46
77.9M
  } while (0)
47
48
2.07G
static PLATFORM_INLINE WORD32 ixheaacd_mult32_sat(WORD32 a, WORD32 b) {
49
2.07G
  WORD32 result;
50
2.07G
  WORD64 temp_result;
51
52
2.07G
  temp_result = (WORD64)a * (WORD64)b;
53
2.07G
  result = ixheaac_sat64_32(temp_result >> 31);
54
55
2.07G
  return (result);
56
2.07G
}
57
58
338M
static PLATFORM_INLINE WORD32 ixheaacd_mac32_sat(WORD32 a, WORD32 b, WORD32 c) {
59
338M
  WORD32 result;
60
61
338M
  result = ixheaac_add32_sat(a, ixheaacd_mult32_sat(b, c));
62
63
338M
  return (result);
64
338M
}
65
66
1.93G
static PLATFORM_INLINE FLOAT32 ixheaacd_mult32X32float(FLOAT32 a, FLOAT32 b) {
67
1.93G
  FLOAT32 result;
68
69
1.93G
  result = a * b;
70
71
1.93G
  return result;
72
1.93G
}
73
74
358M
static PLATFORM_INLINE FLOAT32 ixheaacd_mac32X32float(FLOAT32 a, FLOAT32 b, FLOAT32 c) {
75
358M
  FLOAT32 result;
76
77
358M
  result = a + b * c;
78
79
358M
  return result;
80
358M
}
81
82
VOID ixheaacd_mps_synth_calc_fft(FLOAT32 *ptr_xr, FLOAT32 *ptr_xi,
83
8.92M
                                 WORD32 npoints) {
84
8.92M
  WORD32 i, j, k;
85
8.92M
  FLOAT32 y[64], z[64];
86
8.92M
  FLOAT32 *ptr_y = y, *ptr_z = z;
87
8.92M
  const FLOAT32 *ptr_w = ixheaacd_twiddle_table_fft_flt;
88
89
80.3M
  for (i = 0; i < npoints; i += 4) {
90
71.4M
    FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
91
71.4M
    FLOAT32 *inp = ptr_xr;
92
71.4M
    FLOAT32 tmk;
93
94
71.4M
    WORD32 h2 = ixheaacd_mps_dig_rev[i >> 2];
95
96
71.4M
    inp += (h2);
97
98
71.4M
    x0r = *inp;
99
71.4M
    x0i = *(inp + 1);
100
71.4M
    inp += 16;
101
102
71.4M
    x1r = *inp;
103
71.4M
    x1i = *(inp + 1);
104
71.4M
    inp += 16;
105
106
71.4M
    x2r = *inp;
107
71.4M
    x2i = *(inp + 1);
108
71.4M
    inp += 16;
109
110
71.4M
    x3r = *inp;
111
71.4M
    x3i = *(inp + 1);
112
113
71.4M
    x0r = x0r + x2r;
114
71.4M
    x0i = x0i + x2i;
115
116
71.4M
    tmk = x0r - x2r;
117
71.4M
    x2r = tmk - x2r;
118
71.4M
    tmk = x0i - x2i;
119
71.4M
    x2i = tmk - x2i;
120
121
71.4M
    x1r = x1r + x3r;
122
71.4M
    x1i = x1i + x3i;
123
124
71.4M
    tmk = x1r - x3r;
125
71.4M
    x3r = tmk - x3r;
126
71.4M
    tmk = x1i - x3i;
127
71.4M
    x3i = tmk - x3i;
128
129
71.4M
    x0r = x0r + x1r;
130
71.4M
    x0i = x0i + x1i;
131
132
71.4M
    tmk = x0r - x1r;
133
71.4M
    x1r = tmk - x1r;
134
71.4M
    tmk = x0i - x1i;
135
71.4M
    x1i = tmk - x1i;
136
137
71.4M
    x2r = x2r + x3i;
138
71.4M
    x2i = x2i - x3r;
139
140
71.4M
    tmk = x2r - x3i;
141
71.4M
    x3i = tmk - x3i;
142
71.4M
    tmk = x2i + x3r;
143
71.4M
    x3r = tmk + x3r;
144
145
71.4M
    *ptr_y++ = x0r;
146
71.4M
    *ptr_y++ = x0i;
147
71.4M
    *ptr_y++ = x2r;
148
71.4M
    *ptr_y++ = x2i;
149
71.4M
    *ptr_y++ = x1r;
150
71.4M
    *ptr_y++ = x1i;
151
71.4M
    *ptr_y++ = x3i;
152
71.4M
    *ptr_y++ = x3r;
153
154
71.4M
    inp = ptr_xi;
155
156
71.4M
    inp += (h2);
157
158
71.4M
    x0r = *inp;
159
71.4M
    x0i = *(inp + 1);
160
71.4M
    inp += 16;
161
162
71.4M
    x1r = *inp;
163
71.4M
    x1i = *(inp + 1);
164
71.4M
    inp += 16;
165
166
71.4M
    x2r = *inp;
167
71.4M
    x2i = *(inp + 1);
168
71.4M
    inp += 16;
169
170
71.4M
    x3r = *inp;
171
71.4M
    x3i = *(inp + 1);
172
173
71.4M
    x0r = x0r + x2r;
174
71.4M
    x0i = x0i + x2i;
175
176
71.4M
    tmk = x0r - x2r;
177
71.4M
    x2r = tmk - x2r;
178
71.4M
    tmk = x0i - x2i;
179
71.4M
    x2i = tmk - x2i;
180
181
71.4M
    x1r = x1r + x3r;
182
71.4M
    x1i = x1i + x3i;
183
184
71.4M
    tmk = x1r - x3r;
185
71.4M
    x3r = tmk - x3r;
186
71.4M
    tmk = x1i - x3i;
187
71.4M
    x3i = tmk - x3i;
188
189
71.4M
    x0r = x0r + x1r;
190
71.4M
    x0i = x0i + x1i;
191
192
71.4M
    tmk = x0r - x1r;
193
71.4M
    x1r = tmk - x1r;
194
71.4M
    tmk = x0i - x1i;
195
71.4M
    x1i = tmk - x1i;
196
197
71.4M
    x2r = x2r + x3i;
198
71.4M
    x2i = x2i - x3r;
199
200
71.4M
    tmk = x2r - x3i;
201
71.4M
    x3i = tmk - x3i;
202
71.4M
    tmk = x2i + x3r;
203
71.4M
    x3r = tmk + x3r;
204
205
71.4M
    *ptr_z++ = x0r;
206
71.4M
    *ptr_z++ = x0i;
207
71.4M
    *ptr_z++ = x2r;
208
71.4M
    *ptr_z++ = x2i;
209
71.4M
    *ptr_z++ = x1r;
210
71.4M
    *ptr_z++ = x1i;
211
71.4M
    *ptr_z++ = x3i;
212
71.4M
    *ptr_z++ = x3r;
213
71.4M
  }
214
8.92M
  ptr_y -= 64;
215
8.92M
  ptr_z -= 64;
216
8.92M
  {
217
8.92M
    FLOAT32 *data_r = ptr_y;
218
8.92M
    FLOAT32 *data_i = ptr_z;
219
26.7M
    for (k = 2; k != 0; k--) {
220
17.8M
      FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
221
222
17.8M
      x0r = (*data_r);
223
17.8M
      x0i = (*(data_r + 1));
224
17.8M
      data_r += 8;
225
226
17.8M
      x1r = (*data_r);
227
17.8M
      x1i = (*(data_r + 1));
228
17.8M
      data_r += 8;
229
230
17.8M
      x2r = (*data_r);
231
17.8M
      x2i = (*(data_r + 1));
232
17.8M
      data_r += 8;
233
234
17.8M
      x3r = (*data_r);
235
17.8M
      x3i = (*(data_r + 1));
236
17.8M
      data_r -= 24;
237
238
17.8M
      x0r = x0r + x2r;
239
17.8M
      x0i = x0i + x2i;
240
17.8M
      x2r = x0r - (x2r * 2);
241
17.8M
      x2i = x0i - (x2i * 2);
242
17.8M
      x1r = x1r + x3r;
243
17.8M
      x1i = x1i + x3i;
244
17.8M
      x3r = x1r - (x3r * 2);
245
17.8M
      x3i = x1i - (x3i * 2);
246
247
17.8M
      x0r = x0r + x1r;
248
17.8M
      x0i = x0i + x1i;
249
17.8M
      x1r = x0r - (x1r * 2);
250
17.8M
      x1i = x0i - (x1i * 2);
251
17.8M
      x2r = x2r + x3i;
252
17.8M
      x2i = x2i - x3r;
253
17.8M
      x3i = x2r - (x3i * 2);
254
17.8M
      x3r = x2i + (x3r * 2);
255
256
17.8M
      *data_r = x0r;
257
17.8M
      *(data_r + 1) = x0i;
258
17.8M
      data_r += 8;
259
260
17.8M
      *data_r = x2r;
261
17.8M
      *(data_r + 1) = x2i;
262
17.8M
      data_r += 8;
263
264
17.8M
      *data_r = x1r;
265
17.8M
      *(data_r + 1) = x1i;
266
17.8M
      data_r += 8;
267
268
17.8M
      *data_r = x3i;
269
17.8M
      *(data_r + 1) = x3r;
270
17.8M
      data_r += 8;
271
272
17.8M
      x0r = (*data_i);
273
17.8M
      x0i = (*(data_i + 1));
274
17.8M
      data_i += 8;
275
276
17.8M
      x1r = (*data_i);
277
17.8M
      x1i = (*(data_i + 1));
278
17.8M
      data_i += 8;
279
280
17.8M
      x2r = (*data_i);
281
17.8M
      x2i = (*(data_i + 1));
282
17.8M
      data_i += 8;
283
284
17.8M
      x3r = (*data_i);
285
17.8M
      x3i = (*(data_i + 1));
286
17.8M
      data_i -= 24;
287
288
17.8M
      x0r = x0r + x2r;
289
17.8M
      x0i = x0i + x2i;
290
17.8M
      x2r = x0r - (x2r * 2);
291
17.8M
      x2i = x0i - (x2i * 2);
292
17.8M
      x1r = x1r + x3r;
293
17.8M
      x1i = x1i + x3i;
294
17.8M
      x3r = x1r - (x3r * 2);
295
17.8M
      x3i = x1i - (x3i * 2);
296
297
17.8M
      x0r = x0r + x1r;
298
17.8M
      x0i = x0i + x1i;
299
17.8M
      x1r = x0r - (x1r * 2);
300
17.8M
      x1i = x0i - (x1i * 2);
301
17.8M
      x2r = x2r + x3i;
302
17.8M
      x2i = x2i - x3r;
303
17.8M
      x3i = x2r - (x3i * 2);
304
17.8M
      x3r = x2i + (x3r * 2);
305
306
17.8M
      *data_i = x0r;
307
17.8M
      *(data_i + 1) = x0i;
308
17.8M
      data_i += 8;
309
310
17.8M
      *data_i = x2r;
311
17.8M
      *(data_i + 1) = x2i;
312
17.8M
      data_i += 8;
313
314
17.8M
      *data_i = x1r;
315
17.8M
      *(data_i + 1) = x1i;
316
17.8M
      data_i += 8;
317
318
17.8M
      *data_i = x3i;
319
17.8M
      *(data_i + 1) = x3r;
320
17.8M
      data_i += 8;
321
17.8M
    }
322
8.92M
    data_r = ptr_y + 2;
323
8.92M
    data_i = ptr_z + 2;
324
325
26.7M
    for (k = 2; k != 0; k--) {
326
17.8M
      FLOAT32 tmp;
327
17.8M
      FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
328
329
17.8M
      data_r += 8;
330
331
17.8M
      x1r = *data_r;
332
17.8M
      x1i = *(data_r + 1);
333
17.8M
      data_r += 8;
334
335
17.8M
      x2r = *data_r;
336
17.8M
      x2i = *(data_r + 1);
337
17.8M
      data_r += 8;
338
339
17.8M
      x3r = *data_r;
340
17.8M
      x3i = *(data_r + 1);
341
17.8M
      data_r -= 24;
342
343
17.8M
      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x1r, 0.923880f) -
344
17.8M
                      ixheaacd_mult32X32float((FLOAT32)x1i, -0.382683f));
345
17.8M
      x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x1r, -0.382683f),
346
17.8M
                                   (FLOAT32)x1i, 0.923880f);
347
17.8M
      x1r = tmp;
348
349
17.8M
      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x2r, 0.707107f) -
350
17.8M
                      ixheaacd_mult32X32float((FLOAT32)x2i, -0.707107f));
351
17.8M
      x2i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x2r, -0.707107f),
352
17.8M
                                   (FLOAT32)x2i, 0.707107f);
353
17.8M
      x2r = tmp;
354
355
17.8M
      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x3r, 0.382683f) -
356
17.8M
                      ixheaacd_mult32X32float((FLOAT32)x3i, -0.923880f));
357
17.8M
      x3i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x3r, -0.923880f),
358
17.8M
                                   (FLOAT32)x3i, 0.382683f);
359
17.8M
      x3r = tmp;
360
361
17.8M
      x0r = (*data_r);
362
17.8M
      x0i = (*(data_r + 1));
363
364
17.8M
      x0r = x0r + (x2r);
365
17.8M
      x0i = x0i + (x2i);
366
17.8M
      x2r = x0r - (x2r * 2);
367
17.8M
      x2i = x0i - (x2i * 2);
368
17.8M
      x1r = x1r + x3r;
369
17.8M
      x1i = x1i + x3i;
370
17.8M
      x3r = x1r - (x3r * 2);
371
17.8M
      x3i = x1i - (x3i * 2);
372
373
17.8M
      x0r = x0r + (x1r);
374
17.8M
      x0i = x0i + (x1i);
375
17.8M
      x1r = x0r - (x1r * 2);
376
17.8M
      x1i = x0i - (x1i * 2);
377
17.8M
      x2r = x2r + (x3i);
378
17.8M
      x2i = x2i - (x3r);
379
17.8M
      x3i = x2r - (x3i * 2);
380
17.8M
      x3r = x2i + (x3r * 2);
381
382
17.8M
      *data_r = x0r;
383
17.8M
      *(data_r + 1) = x0i;
384
17.8M
      data_r += 8;
385
386
17.8M
      *data_r = x2r;
387
17.8M
      *(data_r + 1) = x2i;
388
17.8M
      data_r += 8;
389
390
17.8M
      *data_r = x1r;
391
17.8M
      *(data_r + 1) = x1i;
392
17.8M
      data_r += 8;
393
394
17.8M
      *data_r = x3i;
395
17.8M
      *(data_r + 1) = x3r;
396
17.8M
      data_r += 8;
397
17.8M
      data_i += 8;
398
399
17.8M
      x1r = *data_i;
400
17.8M
      x1i = *(data_i + 1);
401
17.8M
      data_i += 8;
402
403
17.8M
      x2r = *data_i;
404
17.8M
      x2i = *(data_i + 1);
405
17.8M
      data_i += 8;
406
407
17.8M
      x3r = *data_i;
408
17.8M
      x3i = *(data_i + 1);
409
17.8M
      data_i -= 24;
410
411
17.8M
      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x1r, 0.923880f) -
412
17.8M
                      ixheaacd_mult32X32float((FLOAT32)x1i, -0.382683f));
413
17.8M
      x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x1r, -0.382683f),
414
17.8M
                                   (FLOAT32)x1i, 0.923880f);
415
17.8M
      x1r = tmp;
416
417
17.8M
      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x2r, 0.707107f) -
418
17.8M
                      ixheaacd_mult32X32float((FLOAT32)x2i, -0.707107f));
419
17.8M
      x2i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x2r, -0.707107f),
420
17.8M
                                   (FLOAT32)x2i, 0.707107f);
421
17.8M
      x2r = tmp;
422
423
17.8M
      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x3r, 0.382683f) -
424
17.8M
                      ixheaacd_mult32X32float((FLOAT32)x3i, -0.923880f));
425
17.8M
      x3i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x3r, -0.923880f),
426
17.8M
                                   (FLOAT32)x3i, 0.382683f);
427
17.8M
      x3r = tmp;
428
429
17.8M
      x0r = (*data_i);
430
17.8M
      x0i = (*(data_i + 1));
431
432
17.8M
      x0r = x0r + (x2r);
433
17.8M
      x0i = x0i + (x2i);
434
17.8M
      x2r = x0r - (x2r * 2);
435
17.8M
      x2i = x0i - (x2i * 2);
436
17.8M
      x1r = x1r + x3r;
437
17.8M
      x1i = x1i + x3i;
438
17.8M
      x3r = x1r - (x3r * 2);
439
17.8M
      x3i = x1i - (x3i * 2);
440
441
17.8M
      x0r = x0r + (x1r);
442
17.8M
      x0i = x0i + (x1i);
443
17.8M
      x1r = x0r - (x1r * 2);
444
17.8M
      x1i = x0i - (x1i * 2);
445
17.8M
      x2r = x2r + (x3i);
446
17.8M
      x2i = x2i - (x3r);
447
17.8M
      x3i = x2r - (x3i * 2);
448
17.8M
      x3r = x2i + (x3r * 2);
449
450
17.8M
      *data_i = x0r;
451
17.8M
      *(data_i + 1) = x0i;
452
17.8M
      data_i += 8;
453
454
17.8M
      *data_i = x2r;
455
17.8M
      *(data_i + 1) = x2i;
456
17.8M
      data_i += 8;
457
458
17.8M
      *data_i = x1r;
459
17.8M
      *(data_i + 1) = x1i;
460
17.8M
      data_i += 8;
461
462
17.8M
      *data_i = x3i;
463
17.8M
      *(data_i + 1) = x3r;
464
17.8M
      data_i += 8;
465
17.8M
    }
466
8.92M
    data_r -= 62;
467
8.92M
    data_i -= 62;
468
26.7M
    for (k = 2; k != 0; k--) {
469
17.8M
      FLOAT32 tmp;
470
17.8M
      FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
471
472
17.8M
      data_r += 8;
473
474
17.8M
      x1r = *data_r;
475
17.8M
      x1i = *(data_r + 1);
476
17.8M
      data_r += 8;
477
478
17.8M
      x2r = *data_r;
479
17.8M
      x2i = *(data_r + 1);
480
17.8M
      data_r += 8;
481
482
17.8M
      x3r = *data_r;
483
17.8M
      x3i = *(data_r + 1);
484
17.8M
      data_r -= 24;
485
486
17.8M
      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x1r, 0.707107f) -
487
17.8M
                      ixheaacd_mult32X32float((FLOAT32)x1i, -0.707107f));
488
17.8M
      x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x1r, -0.707107f),
489
17.8M
                                   (FLOAT32)x1i, 0.707107f);
490
17.8M
      x1r = tmp;
491
492
17.8M
      tmp = x2i;
493
17.8M
      x2i = -x2r;
494
17.8M
      x2r = tmp;
495
496
17.8M
      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x3r, -0.707107f) +
497
17.8M
                      ixheaacd_mult32X32float((FLOAT32)x3i, 0.707107f));
498
17.8M
      x3i = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT32)x3r, 0.707107f) +
499
17.8M
                      ixheaacd_mult32X32float((FLOAT32)x3i, -0.707107f));
500
17.8M
      x3r = tmp;
501
502
17.8M
      x0r = (*data_r);
503
17.8M
      x0i = (*(data_r + 1));
504
505
17.8M
      x0r = x0r + (x2r);
506
17.8M
      x0i = x0i + (x2i);
507
17.8M
      x2r = x0r - (x2r * 2);
508
17.8M
      x2i = x0i - (x2i * 2);
509
17.8M
      x1r = x1r + x3r;
510
17.8M
      x1i = x1i + x3i;
511
17.8M
      x3r = x1r - (x3r * 2);
512
17.8M
      x3i = x1i - (x3i * 2);
513
514
17.8M
      x0r = x0r + (x1r);
515
17.8M
      x0i = x0i + (x1i);
516
17.8M
      x1r = x0r - (x1r * 2);
517
17.8M
      x1i = x0i - (x1i * 2);
518
17.8M
      x2r = x2r + (x3i);
519
17.8M
      x2i = x2i - (x3r);
520
17.8M
      x3i = x2r - (x3i * 2);
521
17.8M
      x3r = x2i + (x3r * 2);
522
523
17.8M
      *data_r = x0r;
524
17.8M
      *(data_r + 1) = x0i;
525
17.8M
      data_r += 8;
526
527
17.8M
      *data_r = x2r;
528
17.8M
      *(data_r + 1) = x2i;
529
17.8M
      data_r += 8;
530
531
17.8M
      *data_r = x1r;
532
17.8M
      *(data_r + 1) = x1i;
533
17.8M
      data_r += 8;
534
535
17.8M
      *data_r = x3i;
536
17.8M
      *(data_r + 1) = x3r;
537
17.8M
      data_r += 8;
538
17.8M
      data_i += 8;
539
540
17.8M
      x1r = *data_i;
541
17.8M
      x1i = *(data_i + 1);
542
17.8M
      data_i += 8;
543
544
17.8M
      x2r = *data_i;
545
17.8M
      x2i = *(data_i + 1);
546
17.8M
      data_i += 8;
547
548
17.8M
      x3r = *data_i;
549
17.8M
      x3i = *(data_i + 1);
550
17.8M
      data_i -= 24;
551
552
17.8M
      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x1r, 0.707107f) -
553
17.8M
                      ixheaacd_mult32X32float((FLOAT32)x1i, -0.707107f));
554
17.8M
      x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x1r, -0.707107f),
555
17.8M
                                   (FLOAT32)x1i, 0.707107f);
556
17.8M
      x1r = tmp;
557
558
17.8M
      tmp = x2i;
559
17.8M
      x2i = -x2r;
560
17.8M
      x2r = tmp;
561
562
17.8M
      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x3r, -0.707107f) +
563
17.8M
                      ixheaacd_mult32X32float((FLOAT32)x3i, 0.707107f));
564
17.8M
      x3i = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT32)x3r, 0.707107f) +
565
17.8M
                      ixheaacd_mult32X32float((FLOAT32)x3i, -0.707107f));
566
17.8M
      x3r = tmp;
567
568
17.8M
      x0r = (*data_i);
569
17.8M
      x0i = (*(data_i + 1));
570
571
17.8M
      x0r = x0r + (x2r);
572
17.8M
      x0i = x0i + (x2i);
573
17.8M
      x2r = x0r - (x2r * 2);
574
17.8M
      x2i = x0i - (x2i * 2);
575
17.8M
      x1r = x1r + x3r;
576
17.8M
      x1i = x1i + x3i;
577
17.8M
      x3r = x1r - (x3r * 2);
578
17.8M
      x3i = x1i - (x3i * 2);
579
580
17.8M
      x0r = x0r + (x1r);
581
17.8M
      x0i = x0i + (x1i);
582
17.8M
      x1r = x0r - (x1r * 2);
583
17.8M
      x1i = x0i - (x1i * 2);
584
17.8M
      x2r = x2r + (x3i);
585
17.8M
      x2i = x2i - (x3r);
586
17.8M
      x3i = x2r - (x3i * 2);
587
17.8M
      x3r = x2i + (x3r * 2);
588
589
17.8M
      *data_i = x0r;
590
17.8M
      *(data_i + 1) = x0i;
591
17.8M
      data_i += 8;
592
593
17.8M
      *data_i = x2r;
594
17.8M
      *(data_i + 1) = x2i;
595
17.8M
      data_i += 8;
596
597
17.8M
      *data_i = x1r;
598
17.8M
      *(data_i + 1) = x1i;
599
17.8M
      data_i += 8;
600
601
17.8M
      *data_i = x3i;
602
17.8M
      *(data_i + 1) = x3r;
603
17.8M
      data_i += 8;
604
17.8M
    }
605
8.92M
    data_r -= 62;
606
8.92M
    data_i -= 62;
607
26.7M
    for (k = 2; k != 0; k--) {
608
17.8M
      FLOAT32 tmp;
609
17.8M
      FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
610
611
17.8M
      data_r += 8;
612
613
17.8M
      x1r = *data_r;
614
17.8M
      x1i = *(data_r + 1);
615
17.8M
      data_r += 8;
616
617
17.8M
      x2r = *data_r;
618
17.8M
      x2i = *(data_r + 1);
619
17.8M
      data_r += 8;
620
621
17.8M
      x3r = *data_r;
622
17.8M
      x3i = *(data_r + 1);
623
17.8M
      data_r -= 24;
624
625
17.8M
      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x1r, 0.382683f) -
626
17.8M
                      ixheaacd_mult32X32float((FLOAT32)x1i, -0.923880f));
627
17.8M
      x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x1r, -0.923880f),
628
17.8M
                                   (FLOAT32)x1i, 0.382683f);
629
17.8M
      x1r = tmp;
630
631
17.8M
      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x2r, -0.707107f) +
632
17.8M
                      ixheaacd_mult32X32float((FLOAT32)x2i, 0.707107f));
633
17.8M
      x2i = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT32)x2r, 0.707107f) +
634
17.8M
                      ixheaacd_mult32X32float((FLOAT32)x2i, -0.707107f));
635
17.8M
      x2r = tmp;
636
637
17.8M
      tmp = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT32)x3r, 0.923880f) +
638
17.8M
                      ixheaacd_mult32X32float((FLOAT32)x3i, -0.382683f));
639
17.8M
      x3i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x3r, -0.382683f),
640
17.8M
                                   (FLOAT32)x3i, 0.923880f);
641
17.8M
      x3r = tmp;
642
643
17.8M
      x0r = (*data_r);
644
17.8M
      x0i = (*(data_r + 1));
645
646
17.8M
      x0r = x0r + (x2r);
647
17.8M
      x0i = x0i + (x2i);
648
17.8M
      x2r = x0r - (x2r * 2);
649
17.8M
      x2i = x0i - (x2i * 2);
650
17.8M
      x1r = x1r + x3r;
651
17.8M
      x1i = x1i - x3i;
652
17.8M
      x3r = x1r - (x3r * 2);
653
17.8M
      x3i = x1i + (x3i * 2);
654
655
17.8M
      x0r = x0r + (x1r);
656
17.8M
      x0i = x0i + (x1i);
657
17.8M
      x1r = x0r - (x1r * 2);
658
17.8M
      x1i = x0i - (x1i * 2);
659
17.8M
      x2r = x2r + (x3i);
660
17.8M
      x2i = x2i - (x3r);
661
17.8M
      x3i = x2r - (x3i * 2);
662
17.8M
      x3r = x2i + (x3r * 2);
663
664
17.8M
      *data_r = x0r;
665
17.8M
      *(data_r + 1) = x0i;
666
17.8M
      data_r += 8;
667
668
17.8M
      *data_r = x2r;
669
17.8M
      *(data_r + 1) = x2i;
670
17.8M
      data_r += 8;
671
672
17.8M
      *data_r = x1r;
673
17.8M
      *(data_r + 1) = x1i;
674
17.8M
      data_r += 8;
675
676
17.8M
      *data_r = x3i;
677
17.8M
      *(data_r + 1) = x3r;
678
17.8M
      data_r += 8;
679
17.8M
      data_i += 8;
680
681
17.8M
      x1r = *data_i;
682
17.8M
      x1i = *(data_i + 1);
683
17.8M
      data_i += 8;
684
685
17.8M
      x2r = *data_i;
686
17.8M
      x2i = *(data_i + 1);
687
17.8M
      data_i += 8;
688
689
17.8M
      x3r = *data_i;
690
17.8M
      x3i = *(data_i + 1);
691
17.8M
      data_i -= 24;
692
693
17.8M
      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x1r, 0.382683f) -
694
17.8M
                      ixheaacd_mult32X32float((FLOAT32)x1i, -0.923880f));
695
17.8M
      x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x1r, -0.923880f),
696
17.8M
                                   (FLOAT32)x1i, 0.382683f);
697
17.8M
      x1r = tmp;
698
699
17.8M
      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x2r, -0.707107f) +
700
17.8M
                      ixheaacd_mult32X32float((FLOAT32)x2i, 0.707107f));
701
17.8M
      x2i = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT32)x2r, 0.707107f) +
702
17.8M
                      ixheaacd_mult32X32float((FLOAT32)x2i, -0.707107f));
703
17.8M
      x2r = tmp;
704
705
17.8M
      tmp = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT32)x3r, 0.923880f) +
706
17.8M
                      ixheaacd_mult32X32float((FLOAT32)x3i, -0.382683f));
707
17.8M
      x3i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x3r, -0.382683f),
708
17.8M
                                   (FLOAT32)x3i, 0.923880f);
709
17.8M
      x3r = tmp;
710
711
17.8M
      x0r = (*data_i);
712
17.8M
      x0i = (*(data_i + 1));
713
714
17.8M
      x0r = x0r + (x2r);
715
17.8M
      x0i = x0i + (x2i);
716
17.8M
      x2r = x0r - (x2r * 2);
717
17.8M
      x2i = x0i - (x2i * 2);
718
17.8M
      x1r = x1r + x3r;
719
17.8M
      x1i = x1i - x3i;
720
17.8M
      x3r = x1r - (x3r * 2);
721
17.8M
      x3i = x1i + (x3i * 2);
722
723
17.8M
      x0r = x0r + (x1r);
724
17.8M
      x0i = x0i + (x1i);
725
17.8M
      x1r = x0r - (x1r * 2);
726
17.8M
      x1i = x0i - (x1i * 2);
727
17.8M
      x2r = x2r + (x3i);
728
17.8M
      x2i = x2i - (x3r);
729
17.8M
      x3i = x2r - (x3i * 2);
730
17.8M
      x3r = x2i + (x3r * 2);
731
732
17.8M
      *data_i = x0r;
733
17.8M
      *(data_i + 1) = x0i;
734
17.8M
      data_i += 8;
735
736
17.8M
      *data_i = x2r;
737
17.8M
      *(data_i + 1) = x2i;
738
17.8M
      data_i += 8;
739
740
17.8M
      *data_i = x1r;
741
17.8M
      *(data_i + 1) = x1i;
742
17.8M
      data_i += 8;
743
744
17.8M
      *data_i = x3i;
745
17.8M
      *(data_i + 1) = x3r;
746
17.8M
      data_i += 8;
747
17.8M
    }
748
8.92M
    data_r -= 62;
749
8.92M
    data_i -= 62;
750
8.92M
  }
751
8.92M
  {
752
8.92M
    const FLOAT32 *twiddles = ptr_w;
753
8.92M
    FLOAT32 x0r, x0i, x1r, x1i;
754
80.3M
    for (j = 8; j != 0; j--) {
755
71.4M
      FLOAT32 W1 = *twiddles;
756
71.4M
      twiddles++;
757
71.4M
      FLOAT32 W4 = *twiddles;
758
71.4M
      twiddles++;
759
71.4M
      FLOAT32 tmp;
760
761
71.4M
      x0r = *ptr_y;
762
71.4M
      x0i = *(ptr_y + 1);
763
71.4M
      ptr_y += 32;
764
71.4M
      ptr_xr += 32;
765
766
71.4M
      x1r = *ptr_y;
767
71.4M
      x1i = *(ptr_y + 1);
768
769
71.4M
      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x1r, W1) -
770
71.4M
                      ixheaacd_mult32X32float((FLOAT32)x1i, W4));
771
71.4M
      x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x1r, W4),
772
71.4M
                                   (FLOAT32)x1i, W1);
773
71.4M
      x1r = tmp;
774
775
71.4M
      *ptr_xr = (x0r) - (x1r);
776
71.4M
      *(ptr_xr + 1) = (x0i) - (x1i);
777
71.4M
      ptr_y -= 32;
778
71.4M
      ptr_xr -= 32;
779
780
71.4M
      *ptr_xr = (x0r) + (x1r);
781
71.4M
      *(ptr_xr + 1) = (x0i) + (x1i);
782
71.4M
      ptr_y += 2;
783
71.4M
      ptr_xr += 2;
784
785
71.4M
      x0r = *ptr_z;
786
71.4M
      x0i = *(ptr_z + 1);
787
71.4M
      ptr_z += 32;
788
71.4M
      ptr_xi += 32;
789
790
71.4M
      x1r = *ptr_z;
791
71.4M
      x1i = *(ptr_z + 1);
792
793
71.4M
      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x1r, W1) -
794
71.4M
                      ixheaacd_mult32X32float((FLOAT32)x1i, W4));
795
71.4M
      x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x1r, W4),
796
71.4M
                                   (FLOAT32)x1i, W1);
797
71.4M
      x1r = tmp;
798
799
71.4M
      *ptr_xi = (x0r) - (x1r);
800
71.4M
      *(ptr_xi + 1) = (x0i) - (x1i);
801
71.4M
      ptr_z -= 32;
802
71.4M
      ptr_xi -= 32;
803
804
71.4M
      *ptr_xi = (x0r) + (x1r);
805
71.4M
      *(ptr_xi + 1) = (x0i) + (x1i);
806
71.4M
      ptr_z += 2;
807
71.4M
      ptr_xi += 2;
808
71.4M
    }
809
8.92M
    twiddles = ptr_w;
810
80.3M
    for (j = 8; j != 0; j--) {
811
71.4M
      FLOAT32 W1 = *twiddles;
812
71.4M
      twiddles++;
813
71.4M
      FLOAT32 W4 = *twiddles;
814
71.4M
      twiddles++;
815
71.4M
      FLOAT32 tmp;
816
817
71.4M
      x0r = *ptr_y;
818
71.4M
      x0i = *(ptr_y + 1);
819
71.4M
      ptr_y += 32;
820
71.4M
      ptr_xr += 32;
821
822
71.4M
      x1r = *ptr_y;
823
71.4M
      x1i = *(ptr_y + 1);
824
825
71.4M
      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x1r, W4) +
826
71.4M
                      ixheaacd_mult32X32float((FLOAT32)x1i, W1));
827
71.4M
      x1i = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT32)x1r, W1) +
828
71.4M
                      ixheaacd_mult32X32float((FLOAT32)x1i, W4));
829
71.4M
      x1r = tmp;
830
831
71.4M
      *ptr_xr = (x0r) - (x1r);
832
71.4M
      *(ptr_xr + 1) = (x0i) - (x1i);
833
71.4M
      ptr_y -= 32;
834
71.4M
      ptr_xr -= 32;
835
836
71.4M
      *ptr_xr = (x0r) + (x1r);
837
71.4M
      *(ptr_xr + 1) = (x0i) + (x1i);
838
71.4M
      ptr_y += 2;
839
71.4M
      ptr_xr += 2;
840
841
71.4M
      x0r = *ptr_z;
842
71.4M
      x0i = *(ptr_z + 1);
843
71.4M
      ptr_z += 32;
844
71.4M
      ptr_xi += 32;
845
846
71.4M
      x1r = *ptr_z;
847
71.4M
      x1i = *(ptr_z + 1);
848
849
71.4M
      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x1r, W4) +
850
71.4M
                      ixheaacd_mult32X32float((FLOAT32)x1i, W1));
851
71.4M
      x1i = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT32)x1r, W1) +
852
71.4M
                      ixheaacd_mult32X32float((FLOAT32)x1i, W4));
853
71.4M
      x1r = tmp;
854
855
71.4M
      *ptr_xi = (x0r) - (x1r);
856
71.4M
      *(ptr_xi + 1) = (x0i) - (x1i);
857
71.4M
      ptr_z -= 32;
858
71.4M
      ptr_xi -= 32;
859
860
71.4M
      *ptr_xi = (x0r) + (x1r);
861
71.4M
      *(ptr_xi + 1) = (x0i) + (x1i);
862
71.4M
      ptr_z += 2;
863
71.4M
      ptr_xi += 2;
864
71.4M
    }
865
8.92M
  }
866
8.92M
}
867
868
29.7k
VOID ixheaacd_mps_complex_fft(FLOAT32 *xr, FLOAT32 *xi, WORD32 nlength) {
869
29.7k
  WORD32 i, j, k, n_stages, h2;
870
29.7k
  FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
871
29.7k
  WORD32 del, nodespacing, in_loop_cnt;
872
29.7k
  WORD32 dig_rev_shift;
873
29.7k
  WORD32 not_power_4;
874
29.7k
  FLOAT32 ptr_x[256];
875
29.7k
  FLOAT32 y[256];
876
29.7k
  WORD32 npoints = nlength;
877
29.7k
  FLOAT32 *ptr_y = y;
878
29.7k
  const FLOAT32 *ptr_w;
879
29.7k
  dig_rev_shift = ixheaac_norm32(npoints) + 1 - 16;
880
29.7k
  n_stages = 30 - ixheaac_norm32(npoints);
881
29.7k
  not_power_4 = n_stages & 1;
882
883
29.7k
  n_stages = n_stages >> 1;
884
885
886
1.93M
  for (i = 0; i<nlength; i++)
887
1.90M
  {
888
1.90M
    ptr_x[2 * i] = xr[i];
889
1.90M
    ptr_x[2 * i + 1] = xi[i];
890
1.90M
  }
891
892
29.7k
  ptr_w = ixheaacd_twiddle_table_fft;
893
894
505k
  for (i = 0; i<npoints; i += 4)
895
476k
  {
896
476k
    FLOAT32 *inp = ptr_x;
897
898
476k
    DIG_REV(i, dig_rev_shift, h2);
899
476k
    if (not_power_4)
900
0
    {
901
0
      h2 += 1;
902
0
      h2 &= ~1;
903
0
    }
904
476k
    inp += (h2);
905
906
476k
    x0r = *inp;
907
476k
    x0i = *(inp + 1);
908
476k
    inp += (npoints >> 1);
909
910
476k
    x1r = *inp;
911
476k
    x1i = *(inp + 1);
912
476k
    inp += (npoints >> 1);
913
914
476k
    x2r = *inp;
915
476k
    x2i = *(inp + 1);
916
476k
    inp += (npoints >> 1);
917
918
476k
    x3r = *inp;
919
476k
    x3i = *(inp + 1);
920
921
476k
    x0r = x0r + x2r;
922
476k
    x0i = x0i + x2i;
923
476k
    x2r = x0r - (x2r * 2);
924
476k
    x2i = x0i - (x2i * 2);
925
476k
    x1r = x1r + x3r;
926
476k
    x1i = x1i + x3i;
927
476k
    x3r = x1r - (x3r * 2);
928
476k
    x3i = x1i - (x3i * 2);
929
930
476k
    x0r = x0r + x1r;
931
476k
    x0i = x0i + x1i;
932
476k
    x1r = x0r - (x1r * 2);
933
476k
    x1i = x0i - (x1i * 2);
934
476k
    x2r = x2r + x3i;
935
476k
    x2i = x2i - x3r;
936
476k
    x3i = x2r - (x3i * 2);
937
476k
    x3r = x2i + (x3r * 2);
938
939
476k
    *ptr_y++ = x0r;
940
476k
    *ptr_y++ = x0i;
941
476k
    *ptr_y++ = x2r;
942
476k
    *ptr_y++ = x2i;
943
476k
    *ptr_y++ = x1r;
944
476k
    *ptr_y++ = x1i;
945
476k
    *ptr_y++ = x3i;
946
476k
    *ptr_y++ = x3r;
947
476k
  }
948
29.7k
  ptr_y -= 2 * npoints;
949
29.7k
  del = 4;
950
29.7k
  nodespacing = 64;
951
29.7k
  in_loop_cnt = npoints >> 4;
952
89.2k
  for (i = n_stages - 1; i>0; i--)
953
59.5k
  {
954
59.5k
    const FLOAT32 *twiddles = ptr_w;
955
59.5k
    FLOAT32 *data = ptr_y;
956
59.5k
    FLOAT32 w1h, w2h, w3h, w1l, w2l, w3l;
957
59.5k
    WORD32 sec_loop_cnt;
958
959
208k
    for (k = in_loop_cnt; k != 0; k--)
960
148k
    {
961
148k
      x0r = (*data);
962
148k
      x0i = (*(data + 1));
963
148k
      data += (del << 1);
964
965
148k
      x1r = (*data);
966
148k
      x1i = (*(data + 1));
967
148k
      data += (del << 1);
968
969
148k
      x2r = (*data);
970
148k
      x2i = (*(data + 1));
971
148k
      data += (del << 1);
972
973
148k
      x3r = (*data);
974
148k
      x3i = (*(data + 1));
975
148k
      data -= 3 * (del << 1);
976
977
148k
      x0r = x0r + x2r;
978
148k
      x0i = x0i + x2i;
979
148k
      x2r = x0r - (x2r * 2);
980
148k
      x2i = x0i - (x2i * 2);
981
148k
      x1r = x1r + x3r;
982
148k
      x1i = x1i + x3i;
983
148k
      x3r = x1r - (x3r * 2);
984
148k
      x3i = x1i - (x3i * 2);
985
986
148k
      x0r = x0r + x1r;
987
148k
      x0i = x0i + x1i;
988
148k
      x1r = x0r - (x1r * 2);
989
148k
      x1i = x0i - (x1i * 2);
990
148k
      x2r = x2r + x3i;
991
148k
      x2i = x2i - x3r;
992
148k
      x3i = x2r - (x3i * 2);
993
148k
      x3r = x2i + (x3r * 2);
994
995
148k
      *data = x0r;
996
148k
      *(data + 1) = x0i;
997
148k
      data += (del << 1);
998
999
148k
      *data = x2r;
1000
148k
      *(data + 1) = x2i;
1001
148k
      data += (del << 1);
1002
1003
148k
      *data = x1r;
1004
148k
      *(data + 1) = x1i;
1005
148k
      data += (del << 1);
1006
1007
148k
      *data = x3i;
1008
148k
      *(data + 1) = x3r;
1009
148k
      data += (del << 1);
1010
148k
    }
1011
59.5k
    data = ptr_y + 2;
1012
1013
59.5k
    sec_loop_cnt = (nodespacing * del);
1014
59.5k
    sec_loop_cnt = (sec_loop_cnt / 4) + (sec_loop_cnt / 8) - (sec_loop_cnt / 16) \
1015
59.5k
            + (sec_loop_cnt / 32) - (sec_loop_cnt / 64) + (sec_loop_cnt / 128) \
1016
59.5k
            - (sec_loop_cnt / 256);
1017
59.5k
    j = nodespacing;
1018
1019
238k
    for (j = nodespacing; j <= sec_loop_cnt; j += nodespacing)
1020
178k
    {
1021
178k
      w1h = *(twiddles + 2 * j);
1022
178k
      w1l = *(twiddles + 2 * j + 1);
1023
178k
      w2h = *(twiddles + 2 * (j << 1));
1024
178k
      w2l = *(twiddles + 2 * (j << 1) + 1);
1025
178k
      w3h = *(twiddles + 2 * j + 2 * (j << 1));
1026
178k
      w3l = *(twiddles + 2 * j + 2 * (j << 1) + 1);
1027
1028
446k
      for (k = in_loop_cnt; k != 0; k--)
1029
267k
      {
1030
267k
        FLOAT32 tmp;
1031
267k
        FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
1032
1033
267k
        data += (del << 1);
1034
1035
267k
        x1r = *data;
1036
267k
        x1i = *(data + 1);
1037
267k
        data += (del << 1);
1038
1039
267k
        x2r = *data;
1040
267k
        x2i = *(data + 1);
1041
267k
        data += (del << 1);
1042
1043
267k
        x3r = *data;
1044
267k
        x3i = *(data + 1);
1045
267k
        data -= 3 * (del << 1);
1046
1047
267k
        tmp = (ixheaacd_mult32X32float(x1r, w1l) - ixheaacd_mult32X32float(x1i, w1h));
1048
267k
        x1i = ixheaacd_mac32X32float(ixheaacd_mult32X32float(x1r, w1h), x1i, w1l);
1049
267k
        x1r = tmp;
1050
1051
267k
        tmp = (ixheaacd_mult32X32float(x2r, w2l) - ixheaacd_mult32X32float(x2i, w2h));
1052
267k
        x2i = ixheaacd_mac32X32float(ixheaacd_mult32X32float(x2r, w2h), x2i, w2l);
1053
267k
        x2r = tmp;
1054
1055
267k
        tmp = (ixheaacd_mult32X32float(x3r, w3l) - ixheaacd_mult32X32float(x3i, w3h));
1056
267k
        x3i = ixheaacd_mac32X32float(ixheaacd_mult32X32float(x3r, w3h), x3i, w3l);
1057
267k
        x3r = tmp;
1058
1059
267k
        x0r = (*data);
1060
267k
        x0i = (*(data + 1));
1061
1062
267k
        x0r = x0r + (x2r);
1063
267k
        x0i = x0i + (x2i);
1064
267k
        x2r = x0r - (x2r * 2);
1065
267k
        x2i = x0i - (x2i * 2);
1066
267k
        x1r = x1r + x3r;
1067
267k
        x1i = x1i + x3i;
1068
267k
        x3r = x1r - (x3r * 2);
1069
267k
        x3i = x1i - (x3i * 2);
1070
1071
267k
        x0r = x0r + (x1r);
1072
267k
        x0i = x0i + (x1i);
1073
267k
        x1r = x0r - (x1r * 2);
1074
267k
        x1i = x0i - (x1i * 2);
1075
267k
        x2r = x2r + (x3i);
1076
267k
        x2i = x2i - (x3r);
1077
267k
        x3i = x2r - (x3i * 2);
1078
267k
        x3r = x2i + (x3r * 2);
1079
1080
267k
        *data = x0r;
1081
267k
        *(data + 1) = x0i;
1082
267k
        data += (del << 1);
1083
1084
267k
        *data = x2r;
1085
267k
        *(data + 1) = x2i;
1086
267k
        data += (del << 1);
1087
1088
267k
        *data = x1r;
1089
267k
        *(data + 1) = x1i;
1090
267k
        data += (del << 1);
1091
1092
267k
        *data = x3i;
1093
267k
        *(data + 1) = x3r;
1094
267k
        data += (del << 1);
1095
267k
      }
1096
178k
      data -= 2 * npoints;
1097
178k
      data += 2;
1098
178k
    }
1099
178k
    for (; j <= (nodespacing * del) >> 1; j += nodespacing)
1100
119k
    {
1101
119k
      w1h = *(twiddles + 2 * j);
1102
119k
      w2h = *(twiddles + 2 * (j << 1));
1103
119k
      w3h = *(twiddles + 2 * j + 2 * (j << 1) - 512);
1104
119k
      w1l = *(twiddles + 2 * j + 1);
1105
119k
      w2l = *(twiddles + 2 * (j << 1) + 1);
1106
119k
      w3l = *(twiddles + 2 * j + 2 * (j << 1) - 511);
1107
1108
327k
      for (k = in_loop_cnt; k != 0; k--)
1109
208k
      {
1110
208k
        FLOAT32 tmp;
1111
208k
        FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
1112
1113
208k
        data += (del << 1);
1114
1115
208k
        x1r = *data;
1116
208k
        x1i = *(data + 1);
1117
208k
        data += (del << 1);
1118
1119
208k
        x2r = *data;
1120
208k
        x2i = *(data + 1);
1121
208k
        data += (del << 1);
1122
1123
208k
        x3r = *data;
1124
208k
        x3i = *(data + 1);
1125
208k
        data -= 3 * (del << 1);
1126
1127
208k
        tmp = (ixheaacd_mult32X32float(x1r, w1l) - ixheaacd_mult32X32float(x1i, w1h));
1128
208k
        x1i = ixheaacd_mac32X32float(ixheaacd_mult32X32float(x1r, w1h), x1i, w1l);
1129
208k
        x1r = tmp;
1130
1131
208k
        tmp = (ixheaacd_mult32X32float(x2r, w2l) - ixheaacd_mult32X32float(x2i, w2h));
1132
208k
        x2i = ixheaacd_mac32X32float(ixheaacd_mult32X32float(x2r, w2h), x2i, w2l);
1133
208k
        x2r = tmp;
1134
1135
208k
        tmp = (ixheaacd_mult32X32float(x3r, w3h) + ixheaacd_mult32X32float(x3i, w3l));
1136
208k
        x3i = -ixheaacd_mult32X32float(x3r, w3l) + ixheaacd_mult32X32float(x3i, w3h);
1137
208k
        x3r = tmp;
1138
1139
208k
        x0r = (*data);
1140
208k
        x0i = (*(data + 1));
1141
1142
208k
        x0r = x0r + (x2r);
1143
208k
        x0i = x0i + (x2i);
1144
208k
        x2r = x0r - (x2r * 2);
1145
208k
        x2i = x0i - (x2i * 2);
1146
208k
        x1r = x1r + x3r;
1147
208k
        x1i = x1i + x3i;
1148
208k
        x3r = x1r - (x3r * 2);
1149
208k
        x3i = x1i - (x3i * 2);
1150
1151
208k
        x0r = x0r + (x1r);
1152
208k
        x0i = x0i + (x1i);
1153
208k
        x1r = x0r - (x1r * 2);
1154
208k
        x1i = x0i - (x1i * 2);
1155
208k
        x2r = x2r + (x3i);
1156
208k
        x2i = x2i - (x3r);
1157
208k
        x3i = x2r - (x3i * 2);
1158
208k
        x3r = x2i + (x3r * 2);
1159
1160
208k
        *data = x0r;
1161
208k
        *(data + 1) = x0i;
1162
208k
        data += (del << 1);
1163
1164
208k
        *data = x2r;
1165
208k
        *(data + 1) = x2i;
1166
208k
        data += (del << 1);
1167
1168
208k
        *data = x1r;
1169
208k
        *(data + 1) = x1i;
1170
208k
        data += (del << 1);
1171
1172
208k
        *data = x3i;
1173
208k
        *(data + 1) = x3r;
1174
208k
        data += (del << 1);
1175
208k
      }
1176
119k
      data -= 2 * npoints;
1177
119k
      data += 2;
1178
119k
    }
1179
119k
    for (; j <= sec_loop_cnt * 2; j += nodespacing)
1180
59.5k
    {
1181
59.5k
      w1h = *(twiddles + 2 * j);
1182
59.5k
      w2h = *(twiddles + 2 * (j << 1) - 512);
1183
59.5k
      w3h = *(twiddles + 2 * j + 2 * (j << 1) - 512);
1184
59.5k
      w1l = *(twiddles + 2 * j + 1);
1185
59.5k
      w2l = *(twiddles + 2 * (j << 1) - 511);
1186
59.5k
      w3l = *(twiddles + 2 * j + 2 * (j << 1) - 511);
1187
1188
119k
      for (k = in_loop_cnt; k != 0; k--)
1189
59.5k
      {
1190
59.5k
        FLOAT32 tmp;
1191
59.5k
        FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
1192
1193
59.5k
        data += (del << 1);
1194
1195
59.5k
        x1r = *data;
1196
59.5k
        x1i = *(data + 1);
1197
59.5k
        data += (del << 1);
1198
1199
59.5k
        x2r = *data;
1200
59.5k
        x2i = *(data + 1);
1201
59.5k
        data += (del << 1);
1202
1203
59.5k
        x3r = *data;
1204
59.5k
        x3i = *(data + 1);
1205
59.5k
        data -= 3 * (del << 1);
1206
1207
59.5k
        tmp = (ixheaacd_mult32X32float(x1r, w1l) - ixheaacd_mult32X32float(x1i, w1h));
1208
59.5k
        x1i = ixheaacd_mac32X32float(ixheaacd_mult32X32float(x1r, w1h), x1i, w1l);
1209
59.5k
        x1r = tmp;
1210
1211
59.5k
        tmp = (ixheaacd_mult32X32float(x2r, w2h) + ixheaacd_mult32X32float(x2i, w2l));
1212
59.5k
        x2i = -ixheaacd_mult32X32float(x2r, w2l) + ixheaacd_mult32X32float(x2i, w2h);
1213
59.5k
        x2r = tmp;
1214
1215
59.5k
        tmp = (ixheaacd_mult32X32float(x3r, w3h) + ixheaacd_mult32X32float(x3i, w3l));
1216
59.5k
        x3i = -ixheaacd_mult32X32float(x3r, w3l) + ixheaacd_mult32X32float(x3i, w3h);
1217
59.5k
        x3r = tmp;
1218
1219
59.5k
        x0r = (*data);
1220
59.5k
        x0i = (*(data + 1));
1221
1222
59.5k
        x0r = x0r + (x2r);
1223
59.5k
        x0i = x0i + (x2i);
1224
59.5k
        x2r = x0r - (x2r * 2);
1225
59.5k
        x2i = x0i - (x2i * 2);
1226
59.5k
        x1r = x1r + x3r;
1227
59.5k
        x1i = x1i + x3i;
1228
59.5k
        x3r = x1r - (x3r * 2);
1229
59.5k
        x3i = x1i - (x3i * 2);
1230
1231
59.5k
        x0r = x0r + (x1r);
1232
59.5k
        x0i = x0i + (x1i);
1233
59.5k
        x1r = x0r - (x1r * 2);
1234
59.5k
        x1i = x0i - (x1i * 2);
1235
59.5k
        x2r = x2r + (x3i);
1236
59.5k
        x2i = x2i - (x3r);
1237
59.5k
        x3i = x2r - (x3i * 2);
1238
59.5k
        x3r = x2i + (x3r * 2);
1239
1240
59.5k
        *data = x0r;
1241
59.5k
        *(data + 1) = x0i;
1242
59.5k
        data += (del << 1);
1243
1244
59.5k
        *data = x2r;
1245
59.5k
        *(data + 1) = x2i;
1246
59.5k
        data += (del << 1);
1247
1248
59.5k
        *data = x1r;
1249
59.5k
        *(data + 1) = x1i;
1250
59.5k
        data += (del << 1);
1251
1252
59.5k
        *data = x3i;
1253
59.5k
        *(data + 1) = x3r;
1254
59.5k
        data += (del << 1);
1255
59.5k
      }
1256
59.5k
      data -= 2 * npoints;
1257
59.5k
      data += 2;
1258
59.5k
    }
1259
238k
    for (; j<nodespacing * del; j += nodespacing)
1260
178k
    {
1261
178k
      w1h = *(twiddles + 2 * j);
1262
178k
      w2h = *(twiddles + 2 * (j << 1) - 512);
1263
178k
      w3h = *(twiddles + 2 * j + 2 * (j << 1) - 1024);
1264
178k
      w1l = *(twiddles + 2 * j + 1);
1265
178k
      w2l = *(twiddles + 2 * (j << 1) - 511);
1266
178k
      w3l = *(twiddles + 2 * j + 2 * (j << 1) - 1023);
1267
1268
446k
      for (k = in_loop_cnt; k != 0; k--)
1269
267k
      {
1270
267k
        FLOAT32 tmp;
1271
267k
        FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
1272
1273
267k
        data += (del << 1);
1274
1275
267k
        x1r = *data;
1276
267k
        x1i = *(data + 1);
1277
267k
        data += (del << 1);
1278
1279
267k
        x2r = *data;
1280
267k
        x2i = *(data + 1);
1281
267k
        data += (del << 1);
1282
1283
267k
        x3r = *data;
1284
267k
        x3i = *(data + 1);
1285
267k
        data -= 3 * (del << 1);
1286
1287
267k
        tmp = (ixheaacd_mult32X32float(x1r, w1l) - ixheaacd_mult32X32float(x1i, w1h));
1288
267k
        x1i = ixheaacd_mac32X32float(ixheaacd_mult32X32float(x1r, w1h), x1i, w1l);
1289
267k
        x1r = tmp;
1290
1291
267k
        tmp = (ixheaacd_mult32X32float(x2r, w2h) + ixheaacd_mult32X32float(x2i, w2l));
1292
267k
        x2i = -ixheaacd_mult32X32float(x2r, w2l) + ixheaacd_mult32X32float(x2i, w2h);
1293
267k
        x2r = tmp;
1294
1295
267k
        tmp = (-ixheaacd_mult32X32float(x3r, w3l) + ixheaacd_mult32X32float(x3i, w3h));
1296
267k
        x3i = ixheaacd_mac32X32float(ixheaacd_mult32X32float(x3r, w3h), x3i, w3l);
1297
267k
        x3r = tmp;
1298
1299
267k
        x0r = (*data);
1300
267k
        x0i = (*(data + 1));
1301
1302
267k
        x0r = x0r + (x2r);
1303
267k
        x0i = x0i + (x2i);
1304
267k
        x2r = x0r - (x2r * 2);
1305
267k
        x2i = x0i - (x2i * 2);
1306
267k
        x1r = x1r + x3r;
1307
267k
        x1i = x1i - x3i;
1308
267k
        x3r = x1r - (x3r * 2);
1309
267k
        x3i = x1i + (x3i * 2);
1310
1311
267k
        x0r = x0r + (x1r);
1312
267k
        x0i = x0i + (x1i);
1313
267k
        x1r = x0r - (x1r * 2);
1314
267k
        x1i = x0i - (x1i * 2);
1315
267k
        x2r = x2r + (x3i);
1316
267k
        x2i = x2i - (x3r);
1317
267k
        x3i = x2r - (x3i * 2);
1318
267k
        x3r = x2i + (x3r * 2);
1319
1320
267k
        *data = x0r;
1321
267k
        *(data + 1) = x0i;
1322
267k
        data += (del << 1);
1323
1324
267k
        *data = x2r;
1325
267k
        *(data + 1) = x2i;
1326
267k
        data += (del << 1);
1327
1328
267k
        *data = x1r;
1329
267k
        *(data + 1) = x1i;
1330
267k
        data += (del << 1);
1331
1332
267k
        *data = x3i;
1333
267k
        *(data + 1) = x3r;
1334
267k
        data += (del << 1);
1335
267k
      }
1336
178k
      data -= 2 * npoints;
1337
178k
      data += 2;
1338
178k
    }
1339
59.5k
    nodespacing >>= 2;
1340
59.5k
    del <<= 2;
1341
59.5k
    in_loop_cnt >>= 2;
1342
59.5k
  }
1343
29.7k
  if (not_power_4)
1344
0
  {
1345
0
    const FLOAT32 *twiddles = ptr_w;
1346
0
    nodespacing <<= 1;
1347
1348
0
    for (j = del / 2; j != 0; j--)
1349
0
    {
1350
0
      FLOAT32 w1h = *twiddles;
1351
0
      FLOAT32 w1l = *(twiddles + 1);
1352
0
      FLOAT32 tmp;
1353
0
      twiddles += nodespacing * 2;
1354
1355
0
      x0r = *ptr_y;
1356
0
      x0i = *(ptr_y + 1);
1357
0
      ptr_y += (del << 1);
1358
1359
0
      x1r = *ptr_y;
1360
0
      x1i = *(ptr_y + 1);
1361
1362
0
      tmp = (ixheaacd_mult32X32float(x1r, w1l) - ixheaacd_mult32X32float(x1i, w1h));
1363
0
      x1i = ixheaacd_mac32X32float(ixheaacd_mult32X32float(x1r, w1h), x1i, w1l);
1364
0
      x1r = tmp;
1365
1366
0
      *ptr_y = (x0r) - (x1r);
1367
0
      *(ptr_y + 1) = (x0i) - (x1i);
1368
0
      ptr_y -= (del << 1);
1369
1370
0
      *ptr_y = (x0r) + (x1r);
1371
0
      *(ptr_y + 1) = (x0i) + (x1i);
1372
0
      ptr_y += 2;
1373
0
    }
1374
0
    twiddles = ptr_w;
1375
0
    for (j = del / 2; j != 0; j--)
1376
0
    {
1377
0
      FLOAT32 w1h = *twiddles;
1378
0
      FLOAT32 w1l = *(twiddles + 1);
1379
0
      FLOAT32 tmp;
1380
0
      twiddles += nodespacing * 2;
1381
1382
0
      x0r = *ptr_y;
1383
0
      x0i = *(ptr_y + 1);
1384
0
      ptr_y += (del << 1);
1385
1386
0
      x1r = *ptr_y;
1387
0
      x1i = *(ptr_y + 1);
1388
1389
0
      tmp = (ixheaacd_mult32X32float(x1r, w1h) + ixheaacd_mult32X32float(x1i, w1l));
1390
0
      x1i = -ixheaacd_mult32X32float(x1r, w1l) + ixheaacd_mult32X32float(x1i, w1h);
1391
0
      x1r = tmp;
1392
1393
0
      *ptr_y = (x0r) - (x1r);
1394
0
      *(ptr_y + 1) = (x0i) - (x1i);
1395
0
      ptr_y -= (del << 1);
1396
1397
0
      *ptr_y = (x0r) + (x1r);
1398
0
      *(ptr_y + 1) = (x0i) + (x1i);
1399
0
      ptr_y += 2;
1400
0
    }
1401
0
  }
1402
1403
1.93M
  for (i = 0; i<nlength; i++)
1404
1.90M
  {
1405
1.90M
    xr[i] = y[2 * i];
1406
1.90M
    xi[i] = y[2 * i + 1];
1407
1.90M
  }
1408
1409
29.7k
  return;
1410
29.7k
}
1411
1412
VOID ixheaacd_complex_fft_p2_dec(WORD32 *xr, WORD32 *xi, WORD32 nlength,
1413
13.9M
                                 WORD32 fft_mode, WORD32 *preshift) {
1414
13.9M
  WORD32 i, j, k, n_stages;
1415
13.9M
  WORD32 h2, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
1416
13.9M
  WORD32 del, nodespacing, in_loop_cnt;
1417
13.9M
  WORD32 not_power_4;
1418
13.9M
  WORD32 npts, shift;
1419
13.9M
  WORD32 dig_rev_shift;
1420
13.9M
  WORD32 ptr_x[1024];
1421
13.9M
  WORD32 y[1024];
1422
13.9M
  WORD32 npoints = nlength;
1423
13.9M
  WORD32 n = 0;
1424
13.9M
  WORD32 *ptr_y = y;
1425
13.9M
  const WORD32 *ptr_w;
1426
13.9M
  dig_rev_shift = ixheaac_norm32(npoints) + 1 - 16;
1427
13.9M
  n_stages = 30 - ixheaac_norm32(npoints);
1428
13.9M
  not_power_4 = n_stages & 1;
1429
1430
13.9M
  n_stages = n_stages >> 1;
1431
1432
13.9M
  npts = npoints;
1433
56.6M
  while (npts >> 1) {
1434
42.7M
    n++;
1435
42.7M
    npts = npts >> 1;
1436
42.7M
  }
1437
1438
13.9M
  if (n % 2 == 0)
1439
6.61M
    shift = ((n + 4)) / 2;
1440
7.28M
  else
1441
7.28M
    shift = ((n + 3) / 2);
1442
1443
323M
  for (i = 0; i < nlength; i++) {
1444
309M
    ptr_x[2 * i] = (xr[i] / (1 << (shift)));
1445
309M
    ptr_x[2 * i + 1] = (xi[i] / (1 << (shift)));
1446
309M
  }
1447
1448
13.9M
  if (fft_mode == -1) {
1449
12.8M
    ptr_w = ixheaacd_twiddle_table_fft_32x32;
1450
1451
47.2M
    for (i = 0; i < npoints; i += 4) {
1452
34.4M
      WORD32 *inp = ptr_x;
1453
1454
34.4M
      DIG_REV(i, dig_rev_shift, h2);
1455
34.4M
      if (not_power_4) {
1456
23.1M
        h2 += 1;
1457
23.1M
        h2 &= ~1;
1458
23.1M
      }
1459
34.4M
      inp += (h2);
1460
1461
34.4M
      x0r = *inp;
1462
34.4M
      x0i = *(inp + 1);
1463
34.4M
      inp += (npoints >> 1);
1464
1465
34.4M
      x1r = *inp;
1466
34.4M
      x1i = *(inp + 1);
1467
34.4M
      inp += (npoints >> 1);
1468
1469
34.4M
      x2r = *inp;
1470
34.4M
      x2i = *(inp + 1);
1471
34.4M
      inp += (npoints >> 1);
1472
1473
34.4M
      x3r = *inp;
1474
34.4M
      x3i = *(inp + 1);
1475
1476
34.4M
      x0r = ixheaac_add32_sat(x0r, x2r);
1477
34.4M
      x0i = ixheaac_add32_sat(x0i, x2i);
1478
34.4M
      x2r = ixheaac_sub32_sat(x0r, ixheaac_shl32_sat(x2r, 1));
1479
34.4M
      x2i = ixheaac_sub32_sat(x0i, ixheaac_shl32_sat(x2i, 1));
1480
34.4M
      x1r = ixheaac_add32_sat(x1r, x3r);
1481
34.4M
      x1i = ixheaac_add32_sat(x1i, x3i);
1482
34.4M
      x3r = ixheaac_sub32_sat(x1r, ixheaac_shl32_sat(x3r, 1));
1483
34.4M
      x3i = ixheaac_sub32_sat(x1i, ixheaac_shl32_sat(x3i, 1));
1484
1485
34.4M
      x0r = ixheaac_add32_sat(x0r, x1r);
1486
34.4M
      x0i = ixheaac_add32_sat(x0i, x1i);
1487
34.4M
      x1r = ixheaac_sub32_sat(x0r, ixheaac_shl32_sat(x1r, 1));
1488
34.4M
      x1i = ixheaac_sub32_sat(x0i, ixheaac_shl32_sat(x1i, 1));
1489
34.4M
      x2r = ixheaac_add32_sat(x2r, x3i);
1490
34.4M
      x2i = ixheaac_sub32_sat(x2i, x3r);
1491
34.4M
      x3i = ixheaac_sub32_sat(x2r, ixheaac_shl32_sat(x3i, 1));
1492
34.4M
      x3r = ixheaac_add32_sat(x2i, ixheaac_shl32_sat(x3r, 1));
1493
1494
34.4M
      *ptr_y++ = x0r;
1495
34.4M
      *ptr_y++ = x0i;
1496
34.4M
      *ptr_y++ = x2r;
1497
34.4M
      *ptr_y++ = x2i;
1498
34.4M
      *ptr_y++ = x1r;
1499
34.4M
      *ptr_y++ = x1i;
1500
34.4M
      *ptr_y++ = x3i;
1501
34.4M
      *ptr_y++ = x3r;
1502
34.4M
    }
1503
12.8M
    ptr_y -= 2 * npoints;
1504
12.8M
    del = 4;
1505
12.8M
    nodespacing = 64;
1506
12.8M
    in_loop_cnt = npoints >> 4;
1507
14.3M
    for (i = n_stages - 1; i > 0; i--) {
1508
1.52M
      const WORD32 *twiddles = ptr_w;
1509
1.52M
      WORD32 *data = ptr_y;
1510
1.52M
      WORD32 w1h, w2h, w3h, w1l, w2l, w3l;
1511
1.52M
      WORD32 sec_loop_cnt;
1512
1513
6.41M
      for (k = in_loop_cnt; k != 0; k--) {
1514
4.88M
        x0r = (*data);
1515
4.88M
        x0i = (*(data + 1));
1516
4.88M
        data += (del << 1);
1517
1518
4.88M
        x1r = (*data);
1519
4.88M
        x1i = (*(data + 1));
1520
4.88M
        data += (del << 1);
1521
1522
4.88M
        x2r = (*data);
1523
4.88M
        x2i = (*(data + 1));
1524
4.88M
        data += (del << 1);
1525
1526
4.88M
        x3r = (*data);
1527
4.88M
        x3i = (*(data + 1));
1528
4.88M
        data -= 3 * (del << 1);
1529
1530
4.88M
        x0r = ixheaac_add32_sat(x0r, x2r);
1531
4.88M
        x0i = ixheaac_add32_sat(x0i, x2i);
1532
4.88M
        x2r = ixheaac_sub32_sat(x0r, ixheaac_shl32_sat(x2r, 1));
1533
4.88M
        x2i = ixheaac_sub32_sat(x0i, ixheaac_shl32_sat(x2i, 1));
1534
4.88M
        x1r = ixheaac_add32_sat(x1r, x3r);
1535
4.88M
        x1i = ixheaac_add32_sat(x1i, x3i);
1536
4.88M
        x3r = ixheaac_sub32_sat(x1r, ixheaac_shl32_sat(x3r, 1));
1537
4.88M
        x3i = ixheaac_sub32_sat(x1i, ixheaac_shl32_sat(x3i, 1));
1538
1539
4.88M
        x0r = ixheaac_add32_sat(x0r, x1r);
1540
4.88M
        x0i = ixheaac_add32_sat(x0i, x1i);
1541
4.88M
        x1r = ixheaac_sub32_sat(x0r, ixheaac_shl32_sat(x1r, 1));
1542
4.88M
        x1i = ixheaac_sub32_sat(x0i, ixheaac_shl32_sat(x1i, 1));
1543
4.88M
        x2r = ixheaac_add32_sat(x2r, x3i);
1544
4.88M
        x2i = ixheaac_sub32_sat(x2i, x3r);
1545
4.88M
        x3i = ixheaac_sub32_sat(x2r, ixheaac_shl32_sat(x3i, 1));
1546
4.88M
        x3r = ixheaac_add32_sat(x2i, ixheaac_shl32_sat(x3r, 1));
1547
1548
4.88M
        *data = x0r;
1549
4.88M
        *(data + 1) = x0i;
1550
4.88M
        data += (del << 1);
1551
1552
4.88M
        *data = x2r;
1553
4.88M
        *(data + 1) = x2i;
1554
4.88M
        data += (del << 1);
1555
1556
4.88M
        *data = x1r;
1557
4.88M
        *(data + 1) = x1i;
1558
4.88M
        data += (del << 1);
1559
1560
4.88M
        *data = x3i;
1561
4.88M
        *(data + 1) = x3r;
1562
4.88M
        data += (del << 1);
1563
4.88M
      }
1564
1.52M
      data = ptr_y + 2;
1565
1566
1.52M
      sec_loop_cnt = (nodespacing * del);
1567
1.52M
      sec_loop_cnt = (sec_loop_cnt / 4) + (sec_loop_cnt / 8) -
1568
1.52M
                     (sec_loop_cnt / 16) + (sec_loop_cnt / 32) -
1569
1.52M
                     (sec_loop_cnt / 64) + (sec_loop_cnt / 128) -
1570
1.52M
                     (sec_loop_cnt / 256);
1571
1.52M
      j = nodespacing;
1572
1573
5.48M
      for (j = nodespacing; j <= sec_loop_cnt; j += nodespacing) {
1574
3.95M
        w1h = *(twiddles + 2 * j);
1575
3.95M
        w1l = *(twiddles + 2 * j + 1);
1576
3.95M
        w2h = *(twiddles + 2 * (j << 1));
1577
3.95M
        w2l = *(twiddles + 2 * (j << 1) + 1);
1578
3.95M
        w3h = *(twiddles + 2 * j + 2 * (j << 1));
1579
3.95M
        w3l = *(twiddles + 2 * j + 2 * (j << 1) + 1);
1580
1581
12.4M
        for (k = in_loop_cnt; k != 0; k--) {
1582
8.50M
          WORD32 tmp;
1583
8.50M
          WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
1584
1585
8.50M
          data += (del << 1);
1586
1587
8.50M
          x1r = *data;
1588
8.50M
          x1i = *(data + 1);
1589
8.50M
          data += (del << 1);
1590
1591
8.50M
          x2r = *data;
1592
8.50M
          x2i = *(data + 1);
1593
8.50M
          data += (del << 1);
1594
1595
8.50M
          x3r = *data;
1596
8.50M
          x3i = *(data + 1);
1597
8.50M
          data -= 3 * (del << 1);
1598
1599
8.50M
          tmp = ixheaac_sub32_sat(ixheaacd_mult32_sat(x1r, w1l),
1600
8.50M
                                   ixheaacd_mult32_sat(x1i, w1h));
1601
8.50M
          x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
1602
8.50M
          x1r = tmp;
1603
1604
8.50M
          tmp = ixheaac_sub32_sat(ixheaacd_mult32_sat(x2r, w2l),
1605
8.50M
                                   ixheaacd_mult32_sat(x2i, w2h));
1606
8.50M
          x2i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x2r, w2h), x2i, w2l);
1607
8.50M
          x2r = tmp;
1608
1609
8.50M
          tmp = ixheaac_sub32_sat(ixheaacd_mult32_sat(x3r, w3l),
1610
8.50M
                                   ixheaacd_mult32_sat(x3i, w3h));
1611
8.50M
          x3i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x3r, w3h), x3i, w3l);
1612
8.50M
          x3r = tmp;
1613
1614
8.50M
          x0r = (*data);
1615
8.50M
          x0i = (*(data + 1));
1616
1617
8.50M
          x0r = ixheaac_add32_sat(x0r, x2r);
1618
8.50M
          x0i = ixheaac_add32_sat(x0i, x2i);
1619
8.50M
          x2r = ixheaac_sub32_sat(x0r, ixheaac_shl32_sat(x2r, 1));
1620
8.50M
          x2i = ixheaac_sub32_sat(x0i, ixheaac_shl32_sat(x2i, 1));
1621
8.50M
          x1r = ixheaac_add32_sat(x1r, x3r);
1622
8.50M
          x1i = ixheaac_add32_sat(x1i, x3i);
1623
8.50M
          x3r = ixheaac_sub32_sat(x1r, ixheaac_shl32_sat(x3r, 1));
1624
8.50M
          x3i = ixheaac_sub32_sat(x1i, ixheaac_shl32_sat(x3i, 1));
1625
1626
8.50M
          x0r = ixheaac_add32_sat(x0r, x1r);
1627
8.50M
          x0i = ixheaac_add32_sat(x0i, x1i);
1628
8.50M
          x1r = ixheaac_sub32_sat(x0r, ixheaac_shl32_sat(x1r, 1));
1629
8.50M
          x1i = ixheaac_sub32_sat(x0i, ixheaac_shl32_sat(x1i, 1));
1630
8.50M
          x2r = ixheaac_add32_sat(x2r, x3i);
1631
8.50M
          x2i = ixheaac_sub32_sat(x2i, x3r);
1632
8.50M
          x3i = ixheaac_sub32_sat(x2r, ixheaac_shl32_sat(x3i, 1));
1633
8.50M
          x3r = ixheaac_add32_sat(x2i, ixheaac_shl32_sat(x3r, 1));
1634
1635
8.50M
          *data = x0r;
1636
8.50M
          *(data + 1) = x0i;
1637
8.50M
          data += (del << 1);
1638
1639
8.50M
          *data = x2r;
1640
8.50M
          *(data + 1) = x2i;
1641
8.50M
          data += (del << 1);
1642
1643
8.50M
          *data = x1r;
1644
8.50M
          *(data + 1) = x1i;
1645
8.50M
          data += (del << 1);
1646
1647
8.50M
          *data = x3i;
1648
8.50M
          *(data + 1) = x3r;
1649
8.50M
          data += (del << 1);
1650
8.50M
        }
1651
3.95M
        data -= 2 * npoints;
1652
3.95M
        data += 2;
1653
3.95M
      }
1654
4.26M
      for (; j <= (nodespacing * del) >> 1; j += nodespacing) {
1655
2.74M
        w1h = *(twiddles + 2 * j);
1656
2.74M
        w2h = *(twiddles + 2 * (j << 1));
1657
2.74M
        w3h = *(twiddles + 2 * j + 2 * (j << 1) - 512);
1658
2.74M
        w1l = *(twiddles + 2 * j + 1);
1659
2.74M
        w2l = *(twiddles + 2 * (j << 1) + 1);
1660
2.74M
        w3l = *(twiddles + 2 * j + 2 * (j << 1) - 511);
1661
1662
9.43M
        for (k = in_loop_cnt; k != 0; k--) {
1663
6.69M
          WORD32 tmp;
1664
6.69M
          WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
1665
6.69M
          data += (del << 1);
1666
1667
6.69M
          x1r = *data;
1668
6.69M
          x1i = *(data + 1);
1669
6.69M
          data += (del << 1);
1670
1671
6.69M
          x2r = *data;
1672
6.69M
          x2i = *(data + 1);
1673
6.69M
          data += (del << 1);
1674
1675
6.69M
          x3r = *data;
1676
6.69M
          x3i = *(data + 1);
1677
6.69M
          data -= 3 * (del << 1);
1678
1679
6.69M
          tmp = ixheaac_sub32_sat(ixheaacd_mult32_sat(x1r, w1l),
1680
6.69M
                                   ixheaacd_mult32_sat(x1i, w1h));
1681
6.69M
          x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
1682
6.69M
          x1r = tmp;
1683
1684
6.69M
          tmp = ixheaac_sub32_sat(ixheaacd_mult32_sat(x2r, w2l),
1685
6.69M
                                   ixheaacd_mult32_sat(x2i, w2h));
1686
6.69M
          x2i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x2r, w2h), x2i, w2l);
1687
6.69M
          x2r = tmp;
1688
1689
6.69M
          tmp = ixheaac_add32_sat(ixheaacd_mult32_sat(x3r, w3h),
1690
6.69M
                                   ixheaacd_mult32_sat(x3i, w3l));
1691
6.69M
          x3i = ixheaac_sub32_sat(ixheaacd_mult32_sat(x3i, w3h),
1692
6.69M
                                   ixheaacd_mult32_sat(x3r, w3l));
1693
6.69M
          x3r = tmp;
1694
1695
6.69M
          x0r = (*data);
1696
6.69M
          x0i = (*(data + 1));
1697
1698
6.69M
          x0r = ixheaac_add32_sat(x0r, x2r);
1699
6.69M
          x0i = ixheaac_add32_sat(x0i, x2i);
1700
6.69M
          x2r = ixheaac_sub32_sat(x0r, ixheaac_shl32_sat(x2r, 1));
1701
6.69M
          x2i = ixheaac_sub32_sat(x0i, ixheaac_shl32_sat(x2i, 1));
1702
6.69M
          x1r = ixheaac_add32_sat(x1r, x3r);
1703
6.69M
          x1i = ixheaac_add32_sat(x1i, x3i);
1704
6.69M
          x3r = ixheaac_sub32_sat(x1r, ixheaac_shl32_sat(x3r, 1));
1705
6.69M
          x3i = ixheaac_sub32_sat(x1i, ixheaac_shl32_sat(x3i, 1));
1706
1707
6.69M
          x0r = ixheaac_add32_sat(x0r, x1r);
1708
6.69M
          x0i = ixheaac_add32_sat(x0i, x1i);
1709
6.69M
          x1r = ixheaac_sub32_sat(x0r, ixheaac_shl32_sat(x1r, 1));
1710
6.69M
          x1i = ixheaac_sub32_sat(x0i, ixheaac_shl32_sat(x1i, 1));
1711
6.69M
          x2r = ixheaac_add32_sat(x2r, x3i);
1712
6.69M
          x2i = ixheaac_sub32_sat(x2i, x3r);
1713
6.69M
          x3i = ixheaac_sub32_sat(x2r, ixheaac_shl32_sat(x3i, 1));
1714
6.69M
          x3r = ixheaac_add32_sat(x2i, ixheaac_shl32_sat(x3r, 1));
1715
1716
6.69M
          *data = x0r;
1717
6.69M
          *(data + 1) = x0i;
1718
6.69M
          data += (del << 1);
1719
1720
6.69M
          *data = x2r;
1721
6.69M
          *(data + 1) = x2i;
1722
6.69M
          data += (del << 1);
1723
1724
6.69M
          *data = x1r;
1725
6.69M
          *(data + 1) = x1i;
1726
6.69M
          data += (del << 1);
1727
1728
6.69M
          *data = x3i;
1729
6.69M
          *(data + 1) = x3r;
1730
6.69M
          data += (del << 1);
1731
6.69M
        }
1732
2.74M
        data -= 2 * npoints;
1733
2.74M
        data += 2;
1734
2.74M
      }
1735
2.74M
      for (; j <= sec_loop_cnt * 2; j += nodespacing) {
1736
1.21M
        w1h = *(twiddles + 2 * j);
1737
1.21M
        w2h = *(twiddles + 2 * (j << 1) - 512);
1738
1.21M
        w3h = *(twiddles + 2 * j + 2 * (j << 1) - 512);
1739
1.21M
        w1l = *(twiddles + 2 * j + 1);
1740
1.21M
        w2l = *(twiddles + 2 * (j << 1) - 511);
1741
1.21M
        w3l = *(twiddles + 2 * j + 2 * (j << 1) - 511);
1742
1743
3.02M
        for (k = in_loop_cnt; k != 0; k--) {
1744
1.80M
          WORD32 tmp;
1745
1.80M
          WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
1746
1747
1.80M
          data += (del << 1);
1748
1749
1.80M
          x1r = *data;
1750
1.80M
          x1i = *(data + 1);
1751
1.80M
          data += (del << 1);
1752
1753
1.80M
          x2r = *data;
1754
1.80M
          x2i = *(data + 1);
1755
1.80M
          data += (del << 1);
1756
1757
1.80M
          x3r = *data;
1758
1.80M
          x3i = *(data + 1);
1759
1.80M
          data -= 3 * (del << 1);
1760
1761
1.80M
          tmp = ixheaac_sub32_sat(ixheaacd_mult32_sat(x1r, w1l),
1762
1.80M
                                   ixheaacd_mult32_sat(x1i, w1h));
1763
1.80M
          x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
1764
1.80M
          x1r = tmp;
1765
1766
1.80M
          tmp = ixheaac_add32_sat(ixheaacd_mult32_sat(x2r, w2h),
1767
1.80M
                                   ixheaacd_mult32_sat(x2i, w2l));
1768
1.80M
          x2i = ixheaac_sub32_sat(ixheaacd_mult32_sat(x2i, w2h),
1769
1.80M
                                   ixheaacd_mult32_sat(x2r, w2l));
1770
1.80M
          x2r = tmp;
1771
1772
1.80M
          tmp = ixheaac_add32_sat(ixheaacd_mult32_sat(x3r, w3h),
1773
1.80M
                                   ixheaacd_mult32_sat(x3i, w3l));
1774
1.80M
          x3i = ixheaac_sub32_sat(ixheaacd_mult32_sat(x3i, w3h),
1775
1.80M
                                   ixheaacd_mult32_sat(x3r, w3l));
1776
1.80M
          x3r = tmp;
1777
1778
1.80M
          x0r = (*data);
1779
1.80M
          x0i = (*(data + 1));
1780
1781
1.80M
          x0r = ixheaac_add32_sat(x0r, x2r);
1782
1.80M
          x0i = ixheaac_add32_sat(x0i, x2i);
1783
1.80M
          x2r = ixheaac_sub32_sat(x0r, ixheaac_shl32_sat(x2r, 1));
1784
1.80M
          x2i = ixheaac_sub32_sat(x0i, ixheaac_shl32_sat(x2i, 1));
1785
1.80M
          x1r = ixheaac_add32_sat(x1r, x3r);
1786
1.80M
          x1i = ixheaac_add32_sat(x1i, x3i);
1787
1.80M
          x3r = ixheaac_sub32_sat(x1r, ixheaac_shl32_sat(x3r, 1));
1788
1.80M
          x3i = ixheaac_sub32_sat(x1i, ixheaac_shl32_sat(x3i, 1));
1789
1790
1.80M
          x0r = ixheaac_add32_sat(x0r, x1r);
1791
1.80M
          x0i = ixheaac_add32_sat(x0i, x1i);
1792
1.80M
          x1r = ixheaac_sub32_sat(x0r, ixheaac_shl32_sat(x1r, 1));
1793
1.80M
          x1i = ixheaac_sub32_sat(x0i, ixheaac_shl32_sat(x1i, 1));
1794
1.80M
          x2r = ixheaac_add32_sat(x2r, x3i);
1795
1.80M
          x2i = ixheaac_sub32_sat(x2i, x3r);
1796
1.80M
          x3i = ixheaac_sub32_sat(x2r, ixheaac_shl32_sat(x3i, 1));
1797
1.80M
          x3r = ixheaac_add32_sat(x2i, ixheaac_shl32_sat(x3r, 1));
1798
1799
1.80M
          *data = x0r;
1800
1.80M
          *(data + 1) = x0i;
1801
1.80M
          data += (del << 1);
1802
1803
1.80M
          *data = x2r;
1804
1.80M
          *(data + 1) = x2i;
1805
1.80M
          data += (del << 1);
1806
1807
1.80M
          *data = x1r;
1808
1.80M
          *(data + 1) = x1i;
1809
1.80M
          data += (del << 1);
1810
1811
1.80M
          *data = x3i;
1812
1.80M
          *(data + 1) = x3r;
1813
1.80M
          data += (del << 1);
1814
1.80M
        }
1815
1.21M
        data -= 2 * npoints;
1816
1.21M
        data += 2;
1817
1.21M
      }
1818
5.48M
      for (; j < nodespacing * del; j += nodespacing) {
1819
3.95M
        w1h = *(twiddles + 2 * j);
1820
3.95M
        w2h = *(twiddles + 2 * (j << 1) - 512);
1821
3.95M
        w3h = *(twiddles + 2 * j + 2 * (j << 1) - 1024);
1822
3.95M
        w1l = *(twiddles + 2 * j + 1);
1823
3.95M
        w2l = *(twiddles + 2 * (j << 1) - 511);
1824
3.95M
        w3l = *(twiddles + 2 * j + 2 * (j << 1) - 1023);
1825
1826
12.4M
        for (k = in_loop_cnt; k != 0; k--) {
1827
8.50M
          WORD32 tmp;
1828
8.50M
          WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
1829
1830
8.50M
          data += (del << 1);
1831
1832
8.50M
          x1r = *data;
1833
8.50M
          x1i = *(data + 1);
1834
8.50M
          data += (del << 1);
1835
1836
8.50M
          x2r = *data;
1837
8.50M
          x2i = *(data + 1);
1838
8.50M
          data += (del << 1);
1839
1840
8.50M
          x3r = *data;
1841
8.50M
          x3i = *(data + 1);
1842
8.50M
          data -= 3 * (del << 1);
1843
1844
8.50M
          tmp = ixheaac_sub32_sat(ixheaacd_mult32_sat(x1r, w1l),
1845
8.50M
                                   ixheaacd_mult32_sat(x1i, w1h));
1846
8.50M
          x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
1847
8.50M
          x1r = tmp;
1848
1849
8.50M
          tmp = ixheaac_add32_sat(ixheaacd_mult32_sat(x2r, w2h),
1850
8.50M
                                   ixheaacd_mult32_sat(x2i, w2l));
1851
8.50M
          x2i = ixheaac_sub32_sat(ixheaacd_mult32_sat(x2i, w2h),
1852
8.50M
                                   ixheaacd_mult32_sat(x2r, w2l));
1853
8.50M
          x2r = tmp;
1854
1855
8.50M
          tmp = ixheaac_sub32_sat(ixheaacd_mult32_sat(x3i, w3h),
1856
8.50M
                                   ixheaacd_mult32_sat(x3r, w3l));
1857
8.50M
          x3i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x3r, w3h), x3i, w3l);
1858
8.50M
          x3r = tmp;
1859
1860
8.50M
          x0r = (*data);
1861
8.50M
          x0i = (*(data + 1));
1862
1863
8.50M
          x0r = ixheaac_add32_sat(x0r, x2r);
1864
8.50M
          x0i = ixheaac_add32_sat(x0i, x2i);
1865
8.50M
          x2r = ixheaac_sub32_sat(x0r, ixheaac_shl32_sat(x2r, 1));
1866
8.50M
          x2i = ixheaac_sub32_sat(x0i, ixheaac_shl32_sat(x2i, 1));
1867
8.50M
          x1r = ixheaac_add32_sat(x1r, x3r);
1868
8.50M
          x1i = ixheaac_sub32_sat(x1i, x3i);
1869
8.50M
          x3r = ixheaac_sub32_sat(x1r, ixheaac_shl32_sat(x3r, 1));
1870
8.50M
          x3i = ixheaac_add32_sat(x1i, ixheaac_shl32_sat(x3i, 1));
1871
1872
8.50M
          x0r = ixheaac_add32_sat(x0r, x1r);
1873
8.50M
          x0i = ixheaac_add32_sat(x0i, x1i);
1874
8.50M
          x1r = ixheaac_sub32_sat(x0r, ixheaac_shl32_sat(x1r, 1));
1875
8.50M
          x1i = ixheaac_sub32_sat(x0i, ixheaac_shl32_sat(x1i, 1));
1876
8.50M
          x2r = ixheaac_add32_sat(x2r, x3i);
1877
8.50M
          x2i = ixheaac_sub32_sat(x2i, x3r);
1878
8.50M
          x3i = ixheaac_sub32_sat(x2r, ixheaac_shl32_sat(x3i, 1));
1879
8.50M
          x3r = ixheaac_add32_sat(x2i, ixheaac_shl32_sat(x3r, 1));
1880
1881
8.50M
          *data = x0r;
1882
8.50M
          *(data + 1) = x0i;
1883
8.50M
          data += (del << 1);
1884
1885
8.50M
          *data = x2r;
1886
8.50M
          *(data + 1) = x2i;
1887
8.50M
          data += (del << 1);
1888
1889
8.50M
          *data = x1r;
1890
8.50M
          *(data + 1) = x1i;
1891
8.50M
          data += (del << 1);
1892
1893
8.50M
          *data = x3i;
1894
8.50M
          *(data + 1) = x3r;
1895
8.50M
          data += (del << 1);
1896
8.50M
        }
1897
3.95M
        data -= 2 * npoints;
1898
3.95M
        data += 2;
1899
3.95M
      }
1900
1.52M
      nodespacing >>= 2;
1901
1.52M
      del <<= 2;
1902
1.52M
      in_loop_cnt >>= 2;
1903
1.52M
    }
1904
12.8M
    if (not_power_4) {
1905
6.98M
      const WORD32 *twiddles = ptr_w;
1906
6.98M
      nodespacing <<= 1;
1907
6.98M
      shift += 1;
1908
1909
30.1M
      for (j = del / 2; j != 0; j--) {
1910
23.1M
        WORD32 w1h = *twiddles;
1911
23.1M
        WORD32 w1l = *(twiddles + 1);
1912
23.1M
        WORD32 tmp;
1913
23.1M
        twiddles += nodespacing * 2;
1914
1915
23.1M
        x0r = *ptr_y;
1916
23.1M
        x0i = *(ptr_y + 1);
1917
23.1M
        ptr_y += (del << 1);
1918
1919
23.1M
        x1r = *ptr_y;
1920
23.1M
        x1i = *(ptr_y + 1);
1921
1922
23.1M
        tmp = ixheaac_sub32_sat(ixheaacd_mult32_sat(x1r, w1l),
1923
23.1M
                                 ixheaacd_mult32_sat(x1i, w1h));
1924
23.1M
        x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
1925
23.1M
        x1r = tmp;
1926
1927
23.1M
        *ptr_y = (x0r) / 2 - (x1r) / 2;
1928
23.1M
        *(ptr_y + 1) = (x0i) / 2 - (x1i) / 2;
1929
23.1M
        ptr_y -= (del << 1);
1930
1931
23.1M
        *ptr_y = (x0r) / 2 + (x1r) / 2;
1932
23.1M
        *(ptr_y + 1) = (x0i) / 2 + (x1i) / 2;
1933
23.1M
        ptr_y += 2;
1934
23.1M
      }
1935
6.98M
      twiddles = ptr_w;
1936
30.1M
      for (j = del / 2; j != 0; j--) {
1937
23.1M
        WORD32 w1h = *twiddles;
1938
23.1M
        WORD32 w1l = *(twiddles + 1);
1939
23.1M
        WORD32 tmp;
1940
23.1M
        twiddles += nodespacing * 2;
1941
1942
23.1M
        x0r = *ptr_y;
1943
23.1M
        x0i = *(ptr_y + 1);
1944
23.1M
        ptr_y += (del << 1);
1945
1946
23.1M
        x1r = *ptr_y;
1947
23.1M
        x1i = *(ptr_y + 1);
1948
1949
23.1M
        tmp = ixheaac_add32_sat(ixheaacd_mult32_sat(x1r, w1h),
1950
23.1M
                                 ixheaacd_mult32_sat(x1i, w1l));
1951
23.1M
        x1i = ixheaac_sub32_sat(ixheaacd_mult32_sat(x1i, w1h),
1952
23.1M
                                 ixheaacd_mult32_sat(x1r, w1l));
1953
23.1M
        x1r = tmp;
1954
1955
23.1M
        *ptr_y = (x0r) / 2 - (x1r) / 2;
1956
23.1M
        *(ptr_y + 1) = (x0i) / 2 - (x1i) / 2;
1957
23.1M
        ptr_y -= (del << 1);
1958
1959
23.1M
        *ptr_y = (x0r) / 2 + (x1r) / 2;
1960
23.1M
        *(ptr_y + 1) = (x0i) / 2 + (x1i) / 2;
1961
23.1M
        ptr_y += 2;
1962
23.1M
      }
1963
6.98M
    }
1964
12.8M
  }
1965
1966
1.07M
  else {
1967
1.07M
    ptr_w = ixheaacd_twiddle_table_fft_32x32;
1968
1969
44.0M
    for (i = 0; i < npoints; i += 4) {
1970
42.9M
      WORD32 *inp = ptr_x;
1971
1972
42.9M
      DIG_REV(i, dig_rev_shift, h2);
1973
42.9M
      if (not_power_4) {
1974
31.3M
        h2 += 1;
1975
31.3M
        h2 &= ~1;
1976
31.3M
      }
1977
42.9M
      inp += (h2);
1978
1979
42.9M
      x0r = *inp;
1980
42.9M
      x0i = *(inp + 1);
1981
42.9M
      inp += (npoints >> 1);
1982
1983
42.9M
      x1r = *inp;
1984
42.9M
      x1i = *(inp + 1);
1985
42.9M
      inp += (npoints >> 1);
1986
1987
42.9M
      x2r = *inp;
1988
42.9M
      x2i = *(inp + 1);
1989
42.9M
      inp += (npoints >> 1);
1990
1991
42.9M
      x3r = *inp;
1992
42.9M
      x3i = *(inp + 1);
1993
1994
42.9M
      x0r = ixheaac_add32_sat(x0r, x2r);
1995
42.9M
      x0i = ixheaac_add32_sat(x0i, x2i);
1996
42.9M
      x2r = ixheaac_sub32_sat(x0r, ixheaac_shl32_sat(x2r, 1));
1997
42.9M
      x2i = ixheaac_sub32_sat(x0i, ixheaac_shl32_sat(x2i, 1));
1998
42.9M
      x1r = ixheaac_add32_sat(x1r, x3r);
1999
42.9M
      x1i = ixheaac_add32_sat(x1i, x3i);
2000
42.9M
      x3r = ixheaac_sub32_sat(x1r, ixheaac_shl32_sat(x3r, 1));
2001
42.9M
      x3i = ixheaac_sub32_sat(x1i, ixheaac_shl32_sat(x3i, 1));
2002
2003
42.9M
      x0r = ixheaac_add32_sat(x0r, x1r);
2004
42.9M
      x0i = ixheaac_add32_sat(x0i, x1i);
2005
42.9M
      x1r = ixheaac_sub32_sat(x0r, ixheaac_shl32_sat(x1r, 1));
2006
42.9M
      x1i = ixheaac_sub32_sat(x0i, ixheaac_shl32_sat(x1i, 1));
2007
42.9M
      x2r = ixheaac_sub32_sat(x2r, x3i);
2008
42.9M
      x2i = ixheaac_add32_sat(x2i, x3r);
2009
42.9M
      x3i = ixheaac_add32_sat(x2r, ixheaac_shl32_sat(x3i, 1));
2010
42.9M
      x3r = ixheaac_sub32_sat(x2i, ixheaac_shl32_sat(x3r, 1));
2011
2012
42.9M
      *ptr_y++ = x0r;
2013
42.9M
      *ptr_y++ = x0i;
2014
42.9M
      *ptr_y++ = x2r;
2015
42.9M
      *ptr_y++ = x2i;
2016
42.9M
      *ptr_y++ = x1r;
2017
42.9M
      *ptr_y++ = x1i;
2018
42.9M
      *ptr_y++ = x3i;
2019
42.9M
      *ptr_y++ = x3r;
2020
42.9M
    }
2021
1.07M
    ptr_y -= 2 * npoints;
2022
1.07M
    del = 4;
2023
1.07M
    nodespacing = 64;
2024
1.07M
    in_loop_cnt = npoints >> 4;
2025
3.37M
    for (i = n_stages - 1; i > 0; i--) {
2026
2.30M
      const WORD32 *twiddles = ptr_w;
2027
2.30M
      WORD32 *data = ptr_y;
2028
2.30M
      WORD32 w1h, w2h, w3h, w1l, w2l, w3l;
2029
2.30M
      WORD32 sec_loop_cnt;
2030
2031
16.1M
      for (k = in_loop_cnt; k != 0; k--) {
2032
13.8M
        x0r = (*data);
2033
13.8M
        x0i = (*(data + 1));
2034
13.8M
        data += (del << 1);
2035
2036
13.8M
        x1r = (*data);
2037
13.8M
        x1i = (*(data + 1));
2038
13.8M
        data += (del << 1);
2039
2040
13.8M
        x2r = (*data);
2041
13.8M
        x2i = (*(data + 1));
2042
13.8M
        data += (del << 1);
2043
2044
13.8M
        x3r = (*data);
2045
13.8M
        x3i = (*(data + 1));
2046
13.8M
        data -= 3 * (del << 1);
2047
2048
13.8M
        x0r = ixheaac_add32_sat(x0r, x2r);
2049
13.8M
        x0i = ixheaac_add32_sat(x0i, x2i);
2050
13.8M
        x2r = ixheaac_sub32_sat(x0r, ixheaac_shl32_sat(x2r, 1));
2051
13.8M
        x2i = ixheaac_sub32_sat(x0i, ixheaac_shl32_sat(x2i, 1));
2052
13.8M
        x1r = ixheaac_add32_sat(x1r, x3r);
2053
13.8M
        x1i = ixheaac_add32_sat(x1i, x3i);
2054
13.8M
        x3r = ixheaac_sub32_sat(x1r, ixheaac_shl32_sat(x3r, 1));
2055
13.8M
        x3i = ixheaac_sub32_sat(x1i, ixheaac_shl32_sat(x3i, 1));
2056
2057
13.8M
        x0r = ixheaac_add32_sat(x0r, x1r);
2058
13.8M
        x0i = ixheaac_add32_sat(x0i, x1i);
2059
13.8M
        x1r = ixheaac_sub32_sat(x0r, ixheaac_shl32_sat(x1r, 1));
2060
13.8M
        x1i = ixheaac_sub32_sat(x0i, ixheaac_shl32_sat(x1i, 1));
2061
13.8M
        x2r = ixheaac_sub32_sat(x2r, x3i);
2062
13.8M
        x2i = ixheaac_add32_sat(x2i, x3r);
2063
13.8M
        x3i = ixheaac_add32_sat(x2r, ixheaac_shl32_sat(x3i, 1));
2064
13.8M
        x3r = ixheaac_sub32_sat(x2i, ixheaac_shl32_sat(x3r, 1));
2065
2066
13.8M
        *data = x0r;
2067
13.8M
        *(data + 1) = x0i;
2068
13.8M
        data += (del << 1);
2069
2070
13.8M
        *data = x2r;
2071
13.8M
        *(data + 1) = x2i;
2072
13.8M
        data += (del << 1);
2073
2074
13.8M
        *data = x1r;
2075
13.8M
        *(data + 1) = x1i;
2076
13.8M
        data += (del << 1);
2077
2078
13.8M
        *data = x3i;
2079
13.8M
        *(data + 1) = x3r;
2080
13.8M
        data += (del << 1);
2081
13.8M
      }
2082
2.30M
      data = ptr_y + 2;
2083
2084
2.30M
      sec_loop_cnt = (nodespacing * del);
2085
2.30M
      sec_loop_cnt = (sec_loop_cnt / 4) + (sec_loop_cnt / 8) -
2086
2.30M
                     (sec_loop_cnt / 16) + (sec_loop_cnt / 32) -
2087
2.30M
                     (sec_loop_cnt / 64) + (sec_loop_cnt / 128) -
2088
2.30M
                     (sec_loop_cnt / 256);
2089
2.30M
      j = nodespacing;
2090
2091
13.1M
      for (j = nodespacing; j <= sec_loop_cnt; j += nodespacing) {
2092
10.8M
        w1h = *(twiddles + 2 * j);
2093
10.8M
        w2h = *(twiddles + 2 * (j << 1));
2094
10.8M
        w3h = *(twiddles + 2 * j + 2 * (j << 1));
2095
10.8M
        w1l = *(twiddles + 2 * j + 1);
2096
10.8M
        w2l = *(twiddles + 2 * (j << 1) + 1);
2097
10.8M
        w3l = *(twiddles + 2 * j + 2 * (j << 1) + 1);
2098
2099
44.5M
        for (k = in_loop_cnt; k != 0; k--) {
2100
33.6M
          WORD32 tmp;
2101
33.6M
          WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
2102
2103
33.6M
          data += (del << 1);
2104
2105
33.6M
          x1r = *data;
2106
33.6M
          x1i = *(data + 1);
2107
33.6M
          data += (del << 1);
2108
2109
33.6M
          x2r = *data;
2110
33.6M
          x2i = *(data + 1);
2111
33.6M
          data += (del << 1);
2112
2113
33.6M
          x3r = *data;
2114
33.6M
          x3i = *(data + 1);
2115
33.6M
          data -= 3 * (del << 1);
2116
2117
33.6M
          tmp = ixheaac_add32_sat(ixheaacd_mult32_sat(x1r, w1l),
2118
33.6M
                                   ixheaacd_mult32_sat(x1i, w1h));
2119
33.6M
          x1i = ixheaacd_mac32_sat(-ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
2120
33.6M
          x1r = tmp;
2121
2122
33.6M
          tmp = ixheaac_add32_sat(ixheaacd_mult32_sat(x2r, w2l),
2123
33.6M
                                   ixheaacd_mult32_sat(x2i, w2h));
2124
33.6M
          x2i = ixheaacd_mac32_sat(-ixheaacd_mult32_sat(x2r, w2h), x2i, w2l);
2125
33.6M
          x2r = tmp;
2126
2127
33.6M
          tmp = ixheaac_add32_sat(ixheaacd_mult32_sat(x3r, w3l),
2128
33.6M
                                   ixheaacd_mult32_sat(x3i, w3h));
2129
33.6M
          x3i = ixheaacd_mac32_sat(-ixheaacd_mult32_sat(x3r, w3h), x3i, w3l);
2130
33.6M
          x3r = tmp;
2131
2132
33.6M
          x0r = (*data);
2133
33.6M
          x0i = (*(data + 1));
2134
2135
33.6M
          x0r = ixheaac_add32_sat(x0r, x2r);
2136
33.6M
          x0i = ixheaac_add32_sat(x0i, x2i);
2137
33.6M
          x2r = ixheaac_sub32_sat(x0r, ixheaac_shl32_sat(x2r, 1));
2138
33.6M
          x2i = ixheaac_sub32_sat(x0i, ixheaac_shl32_sat(x2i, 1));
2139
33.6M
          x1r = ixheaac_add32_sat(x1r, x3r);
2140
33.6M
          x1i = ixheaac_add32_sat(x1i, x3i);
2141
33.6M
          x3r = ixheaac_sub32_sat(x1r, ixheaac_shl32_sat(x3r, 1));
2142
33.6M
          x3i = ixheaac_sub32_sat(x1i, ixheaac_shl32_sat(x3i, 1));
2143
2144
33.6M
          x0r = ixheaac_add32_sat(x0r, x1r);
2145
33.6M
          x0i = ixheaac_add32_sat(x0i, x1i);
2146
33.6M
          x1r = ixheaac_sub32_sat(x0r, ixheaac_shl32_sat(x1r, 1));
2147
33.6M
          x1i = ixheaac_sub32_sat(x0i, ixheaac_shl32_sat(x1i, 1));
2148
33.6M
          x2r = ixheaac_sub32_sat(x2r, x3i);
2149
33.6M
          x2i = ixheaac_add32_sat(x2i, x3r);
2150
33.6M
          x3i = ixheaac_add32_sat(x2r, ixheaac_shl32_sat(x3i, 1));
2151
33.6M
          x3r = ixheaac_sub32_sat(x2i, ixheaac_shl32_sat(x3r, 1));
2152
2153
33.6M
          *data = x0r;
2154
33.6M
          *(data + 1) = x0i;
2155
33.6M
          data += (del << 1);
2156
2157
33.6M
          *data = x2r;
2158
33.6M
          *(data + 1) = x2i;
2159
33.6M
          data += (del << 1);
2160
2161
33.6M
          *data = x1r;
2162
33.6M
          *(data + 1) = x1i;
2163
33.6M
          data += (del << 1);
2164
2165
33.6M
          *data = x3i;
2166
33.6M
          *(data + 1) = x3r;
2167
33.6M
          data += (del << 1);
2168
33.6M
        }
2169
10.8M
        data -= 2 * npoints;
2170
10.8M
        data += 2;
2171
10.8M
      }
2172
8.88M
      for (; j <= (nodespacing * del) >> 1; j += nodespacing) {
2173
6.58M
        w1h = *(twiddles + 2 * j);
2174
6.58M
        w2h = *(twiddles + 2 * (j << 1));
2175
6.58M
        w3h = *(twiddles + 2 * j + 2 * (j << 1) - 512);
2176
6.58M
        w1l = *(twiddles + 2 * j + 1);
2177
6.58M
        w2l = *(twiddles + 2 * (j << 1) + 1);
2178
6.58M
        w3l = *(twiddles + 2 * j + 2 * (j << 1) - 511);
2179
2180
30.3M
        for (k = in_loop_cnt; k != 0; k--) {
2181
23.7M
          WORD32 tmp;
2182
23.7M
          WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
2183
2184
23.7M
          data += (del << 1);
2185
2186
23.7M
          x1r = *data;
2187
23.7M
          x1i = *(data + 1);
2188
23.7M
          data += (del << 1);
2189
2190
23.7M
          x2r = *data;
2191
23.7M
          x2i = *(data + 1);
2192
23.7M
          data += (del << 1);
2193
2194
23.7M
          x3r = *data;
2195
23.7M
          x3i = *(data + 1);
2196
23.7M
          data -= 3 * (del << 1);
2197
2198
23.7M
          tmp = ixheaac_add32_sat(ixheaacd_mult32_sat(x1r, w1l),
2199
23.7M
                                   ixheaacd_mult32_sat(x1i, w1h));
2200
23.7M
          x1i = ixheaacd_mac32_sat(-ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
2201
23.7M
          x1r = tmp;
2202
2203
23.7M
          tmp = ixheaac_add32_sat(ixheaacd_mult32_sat(x2r, w2l),
2204
23.7M
                                   ixheaacd_mult32_sat(x2i, w2h));
2205
23.7M
          x2i = ixheaacd_mac32_sat(-ixheaacd_mult32_sat(x2r, w2h), x2i, w2l);
2206
23.7M
          x2r = tmp;
2207
2208
23.7M
          tmp = ixheaac_sub32_sat(ixheaacd_mult32_sat(x3r, w3h),
2209
23.7M
                                   ixheaacd_mult32_sat(x3i, w3l));
2210
23.7M
          x3i = ixheaac_add32_sat(ixheaacd_mult32_sat(x3r, w3l),
2211
23.7M
                                   ixheaacd_mult32_sat(x3i, w3h));
2212
23.7M
          x3r = tmp;
2213
2214
23.7M
          x0r = (*data);
2215
23.7M
          x0i = (*(data + 1));
2216
2217
23.7M
          x0r = ixheaac_add32_sat(x0r, x2r);
2218
23.7M
          x0i = ixheaac_add32_sat(x0i, x2i);
2219
23.7M
          x2r = ixheaac_sub32_sat(x0r, ixheaac_shl32_sat(x2r, 1));
2220
23.7M
          x2i = ixheaac_sub32_sat(x0i, ixheaac_shl32_sat(x2i, 1));
2221
23.7M
          x1r = ixheaac_add32_sat(x1r, x3r);
2222
23.7M
          x1i = ixheaac_add32_sat(x1i, x3i);
2223
23.7M
          x3r = ixheaac_sub32_sat(x1r, ixheaac_shl32_sat(x3r, 1));
2224
23.7M
          x3i = ixheaac_sub32_sat(x1i, ixheaac_shl32_sat(x3i, 1));
2225
2226
23.7M
          x0r = ixheaac_add32_sat(x0r, x1r);
2227
23.7M
          x0i = ixheaac_add32_sat(x0i, x1i);
2228
23.7M
          x1r = ixheaac_sub32_sat(x0r, ixheaac_shl32_sat(x1r, 1));
2229
23.7M
          x1i = ixheaac_sub32_sat(x0i, ixheaac_shl32_sat(x1i, 1));
2230
23.7M
          x2r = ixheaac_sub32_sat(x2r, x3i);
2231
23.7M
          x2i = ixheaac_add32_sat(x2i, x3r);
2232
23.7M
          x3i = ixheaac_add32_sat(x2r, ixheaac_shl32_sat(x3i, 1));
2233
23.7M
          x3r = ixheaac_sub32_sat(x2i, ixheaac_shl32_sat(x3r, 1));
2234
2235
23.7M
          *data = x0r;
2236
23.7M
          *(data + 1) = x0i;
2237
23.7M
          data += (del << 1);
2238
2239
23.7M
          *data = x2r;
2240
23.7M
          *(data + 1) = x2i;
2241
23.7M
          data += (del << 1);
2242
2243
23.7M
          *data = x1r;
2244
23.7M
          *(data + 1) = x1i;
2245
23.7M
          data += (del << 1);
2246
2247
23.7M
          *data = x3i;
2248
23.7M
          *(data + 1) = x3r;
2249
23.7M
          data += (del << 1);
2250
23.7M
        }
2251
6.58M
        data -= 2 * npoints;
2252
6.58M
        data += 2;
2253
6.58M
      }
2254
6.58M
      for (; j <= sec_loop_cnt * 2; j += nodespacing) {
2255
4.28M
        w1h = *(twiddles + 2 * j);
2256
4.28M
        w2h = *(twiddles + 2 * (j << 1) - 512);
2257
4.28M
        w3h = *(twiddles + 2 * j + 2 * (j << 1) - 512);
2258
4.28M
        w1l = *(twiddles + 2 * j + 1);
2259
4.28M
        w2l = *(twiddles + 2 * (j << 1) - 511);
2260
4.28M
        w3l = *(twiddles + 2 * j + 2 * (j << 1) - 511);
2261
2262
14.1M
        for (k = in_loop_cnt; k != 0; k--) {
2263
9.91M
          WORD32 tmp;
2264
9.91M
          WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
2265
2266
9.91M
          data += (del << 1);
2267
2268
9.91M
          x1r = *data;
2269
9.91M
          x1i = *(data + 1);
2270
9.91M
          data += (del << 1);
2271
2272
9.91M
          x2r = *data;
2273
9.91M
          x2i = *(data + 1);
2274
9.91M
          data += (del << 1);
2275
2276
9.91M
          x3r = *data;
2277
9.91M
          x3i = *(data + 1);
2278
9.91M
          data -= 3 * (del << 1);
2279
2280
9.91M
          tmp = ixheaac_add32_sat(ixheaacd_mult32_sat(x1r, w1l),
2281
9.91M
                                   ixheaacd_mult32_sat(x1i, w1h));
2282
9.91M
          x1i = ixheaacd_mac32_sat(-ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
2283
9.91M
          x1r = tmp;
2284
2285
9.91M
          tmp = ixheaac_sub32_sat(ixheaacd_mult32_sat(x2r, w2h),
2286
9.91M
                                   ixheaacd_mult32_sat(x2i, w2l));
2287
9.91M
          x2i = ixheaac_add32_sat(ixheaacd_mult32_sat(x2r, w2l),
2288
9.91M
                                   ixheaacd_mult32_sat(x2i, w2h));
2289
9.91M
          x2r = tmp;
2290
2291
9.91M
          tmp = ixheaac_sub32_sat(ixheaacd_mult32_sat(x3r, w3h),
2292
9.91M
                                   ixheaacd_mult32_sat(x3i, w3l));
2293
9.91M
          x3i = ixheaac_add32_sat(ixheaacd_mult32_sat(x3r, w3l),
2294
9.91M
                                   ixheaacd_mult32_sat(x3i, w3h));
2295
9.91M
          x3r = tmp;
2296
2297
9.91M
          x0r = (*data);
2298
9.91M
          x0i = (*(data + 1));
2299
2300
9.91M
          x0r = ixheaac_add32_sat(x0r, x2r);
2301
9.91M
          x0i = ixheaac_add32_sat(x0i, x2i);
2302
9.91M
          x2r = ixheaac_sub32_sat(x0r, ixheaac_shl32_sat(x2r, 1));
2303
9.91M
          x2i = ixheaac_sub32_sat(x0i, ixheaac_shl32_sat(x2i, 1));
2304
9.91M
          x1r = ixheaac_add32_sat(x1r, x3r);
2305
9.91M
          x1i = ixheaac_add32_sat(x1i, x3i);
2306
9.91M
          x3r = ixheaac_sub32_sat(x1r, ixheaac_shl32_sat(x3r, 1));
2307
9.91M
          x3i = ixheaac_sub32_sat(x1i, ixheaac_shl32_sat(x3i, 1));
2308
2309
9.91M
          x0r = ixheaac_add32_sat(x0r, x1r);
2310
9.91M
          x0i = ixheaac_add32_sat(x0i, x1i);
2311
9.91M
          x1r = ixheaac_sub32_sat(x0r, ixheaac_shl32_sat(x1r, 1));
2312
9.91M
          x1i = ixheaac_sub32_sat(x0i, ixheaac_shl32_sat(x1i, 1));
2313
9.91M
          x2r = ixheaac_sub32_sat(x2r, x3i);
2314
9.91M
          x2i = ixheaac_add32_sat(x2i, x3r);
2315
9.91M
          x3i = ixheaac_add32_sat(x2r, ixheaac_shl32_sat(x3i, 1));
2316
9.91M
          x3r = ixheaac_sub32_sat(x2i, ixheaac_shl32_sat(x3r, 1));
2317
2318
9.91M
          *data = x0r;
2319
9.91M
          *(data + 1) = x0i;
2320
9.91M
          data += (del << 1);
2321
2322
9.91M
          *data = x2r;
2323
9.91M
          *(data + 1) = x2i;
2324
9.91M
          data += (del << 1);
2325
2326
9.91M
          *data = x1r;
2327
9.91M
          *(data + 1) = x1i;
2328
9.91M
          data += (del << 1);
2329
2330
9.91M
          *data = x3i;
2331
9.91M
          *(data + 1) = x3r;
2332
9.91M
          data += (del << 1);
2333
9.91M
        }
2334
4.28M
        data -= 2 * npoints;
2335
4.28M
        data += 2;
2336
4.28M
      }
2337
13.1M
      for (; j < nodespacing * del; j += nodespacing) {
2338
10.8M
        w1h = *(twiddles + 2 * j);
2339
10.8M
        w2h = *(twiddles + 2 * (j << 1) - 512);
2340
10.8M
        w3h = *(twiddles + 2 * j + 2 * (j << 1) - 1024);
2341
10.8M
        w1l = *(twiddles + 2 * j + 1);
2342
10.8M
        w2l = *(twiddles + 2 * (j << 1) - 511);
2343
10.8M
        w3l = *(twiddles + 2 * j + 2 * (j << 1) - 1023);
2344
2345
44.5M
        for (k = in_loop_cnt; k != 0; k--) {
2346
33.6M
          WORD32 tmp;
2347
33.6M
          WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
2348
2349
33.6M
          data += (del << 1);
2350
2351
33.6M
          x1r = *data;
2352
33.6M
          x1i = *(data + 1);
2353
33.6M
          data += (del << 1);
2354
2355
33.6M
          x2r = *data;
2356
33.6M
          x2i = *(data + 1);
2357
33.6M
          data += (del << 1);
2358
2359
33.6M
          x3r = *data;
2360
33.6M
          x3i = *(data + 1);
2361
33.6M
          data -= 3 * (del << 1);
2362
2363
33.6M
          tmp = ixheaac_add32_sat(ixheaacd_mult32_sat(x1r, w1l),
2364
33.6M
                                   ixheaacd_mult32_sat(x1i, w1h));
2365
33.6M
          x1i = ixheaacd_mac32_sat(-ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
2366
33.6M
          x1r = tmp;
2367
2368
33.6M
          tmp = ixheaac_sub32_sat(ixheaacd_mult32_sat(x2r, w2h),
2369
33.6M
                                   ixheaacd_mult32_sat(x2i, w2l));
2370
33.6M
          x2i = ixheaac_add32_sat(ixheaacd_mult32_sat(x2r, w2l),
2371
33.6M
                                   ixheaacd_mult32_sat(x2i, w2h));
2372
33.6M
          x2r = tmp;
2373
2374
33.6M
          tmp = -ixheaac_add32_sat(ixheaacd_mult32_sat(x3r, w3l),
2375
33.6M
                                    ixheaacd_mult32_sat(x3i, w3h));
2376
33.6M
          x3i = ixheaacd_mac32_sat(-ixheaacd_mult32_sat(x3r, w3h), x3i, w3l);
2377
33.6M
          x3r = tmp;
2378
2379
33.6M
          x0r = (*data);
2380
33.6M
          x0i = (*(data + 1));
2381
2382
33.6M
          x0r = ixheaac_add32_sat(x0r, x2r);
2383
33.6M
          x0i = ixheaac_add32_sat(x0i, x2i);
2384
33.6M
          x2r = ixheaac_sub32_sat(x0r, ixheaac_shl32_sat(x2r, 1));
2385
33.6M
          x2i = ixheaac_sub32_sat(x0i, ixheaac_shl32_sat(x2i, 1));
2386
33.6M
          x1r = ixheaac_add32_sat(x1r, x3r);
2387
33.6M
          x1i = ixheaac_sub32_sat(x1i, x3i);
2388
33.6M
          x3r = ixheaac_sub32_sat(x1r, ixheaac_shl32_sat(x3r, 1));
2389
33.6M
          x3i = ixheaac_add32_sat(x1i, ixheaac_shl32_sat(x3i, 1));
2390
2391
33.6M
          x0r = ixheaac_add32_sat(x0r, x1r);
2392
33.6M
          x0i = ixheaac_add32_sat(x0i, x1i);
2393
33.6M
          x1r = ixheaac_sub32_sat(x0r, ixheaac_shl32_sat(x1r, 1));
2394
33.6M
          x1i = ixheaac_sub32_sat(x0i, ixheaac_shl32_sat(x1i, 1));
2395
33.6M
          x2r = ixheaac_sub32_sat(x2r, x3i);
2396
33.6M
          x2i = ixheaac_add32_sat(x2i, x3r);
2397
33.6M
          x3i = ixheaac_add32_sat(x2r, ixheaac_shl32_sat(x3i, 1));
2398
33.6M
          x3r = ixheaac_sub32_sat(x2i, ixheaac_shl32_sat(x3r, 1));
2399
2400
33.6M
          *data = x0r;
2401
33.6M
          *(data + 1) = x0i;
2402
33.6M
          data += (del << 1);
2403
2404
33.6M
          *data = x2r;
2405
33.6M
          *(data + 1) = x2i;
2406
33.6M
          data += (del << 1);
2407
2408
33.6M
          *data = x1r;
2409
33.6M
          *(data + 1) = x1i;
2410
33.6M
          data += (del << 1);
2411
2412
33.6M
          *data = x3i;
2413
33.6M
          *(data + 1) = x3r;
2414
33.6M
          data += (del << 1);
2415
33.6M
        }
2416
10.8M
        data -= 2 * npoints;
2417
10.8M
        data += 2;
2418
10.8M
      }
2419
2.30M
      nodespacing >>= 2;
2420
2.30M
      del <<= 2;
2421
2.30M
      in_loop_cnt >>= 2;
2422
2.30M
    }
2423
1.07M
    if (not_power_4) {
2424
293k
      const WORD32 *twiddles = ptr_w;
2425
293k
      nodespacing <<= 1;
2426
293k
      shift += 1;
2427
31.6M
      for (j = del / 2; j != 0; j--) {
2428
31.3M
        WORD32 w1h = *twiddles;
2429
31.3M
        WORD32 w1l = *(twiddles + 1);
2430
2431
31.3M
        WORD32 tmp;
2432
31.3M
        twiddles += nodespacing * 2;
2433
2434
31.3M
        x0r = *ptr_y;
2435
31.3M
        x0i = *(ptr_y + 1);
2436
31.3M
        ptr_y += (del << 1);
2437
2438
31.3M
        x1r = *ptr_y;
2439
31.3M
        x1i = *(ptr_y + 1);
2440
2441
31.3M
        tmp = ixheaac_add32_sat(ixheaacd_mult32_sat(x1r, w1l),
2442
31.3M
                                 ixheaacd_mult32_sat(x1i, w1h));
2443
31.3M
        x1i = ixheaacd_mac32_sat(-ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
2444
31.3M
        x1r = tmp;
2445
2446
31.3M
        *ptr_y = (x0r) / 2 - (x1r) / 2;
2447
31.3M
        *(ptr_y + 1) = (x0i) / 2 - (x1i) / 2;
2448
31.3M
        ptr_y -= (del << 1);
2449
2450
31.3M
        *ptr_y = (x0r) / 2 + (x1r) / 2;
2451
31.3M
        *(ptr_y + 1) = (x0i) / 2 + (x1i) / 2;
2452
31.3M
        ptr_y += 2;
2453
31.3M
      }
2454
293k
      twiddles = ptr_w;
2455
31.6M
      for (j = del / 2; j != 0; j--) {
2456
31.3M
        WORD32 w1h = *twiddles;
2457
31.3M
        WORD32 w1l = *(twiddles + 1);
2458
31.3M
        WORD32 tmp;
2459
31.3M
        twiddles += nodespacing * 2;
2460
2461
31.3M
        x0r = *ptr_y;
2462
31.3M
        x0i = *(ptr_y + 1);
2463
31.3M
        ptr_y += (del << 1);
2464
2465
31.3M
        x1r = *ptr_y;
2466
31.3M
        x1i = *(ptr_y + 1);
2467
2468
31.3M
        tmp = ixheaac_sub32_sat(ixheaacd_mult32_sat(x1r, w1h),
2469
31.3M
                                 ixheaacd_mult32_sat(x1i, w1l));
2470
31.3M
        x1i = ixheaac_add32_sat(ixheaacd_mult32_sat(x1r, w1l),
2471
31.3M
                                 ixheaacd_mult32_sat(x1i, w1h));
2472
31.3M
        x1r = tmp;
2473
2474
31.3M
        *ptr_y = (x0r) / 2 - (x1r) / 2;
2475
31.3M
        *(ptr_y + 1) = (x0i) / 2 - (x1i) / 2;
2476
31.3M
        ptr_y -= (del << 1);
2477
2478
31.3M
        *ptr_y = (x0r) / 2 + (x1r) / 2;
2479
31.3M
        *(ptr_y + 1) = (x0i) / 2 + (x1i) / 2;
2480
31.3M
        ptr_y += 2;
2481
31.3M
      }
2482
293k
    }
2483
1.07M
  }
2484
2485
323M
  for (i = 0; i < nlength; i++) {
2486
309M
    xr[i] = y[2 * i];
2487
309M
    xi[i] = y[2 * i + 1];
2488
309M
  }
2489
2490
13.9M
  *preshift = shift - *preshift;
2491
13.9M
  return;
2492
13.9M
}
2493
2494
static PLATFORM_INLINE void ixheaacd_complex_3point_fft(WORD32 *inp, WORD32 *op,
2495
15.3M
                                                        WORD32 sign_dir) {
2496
15.3M
  WORD32 add_r, sub_r;
2497
15.3M
  WORD32 add_i, sub_i;
2498
15.3M
  WORD32 temp_real, temp_imag, temp;
2499
2500
15.3M
  WORD32 p1, p2, p3, p4;
2501
2502
15.3M
  WORD32 sinmu;
2503
15.3M
  sinmu = -1859775393 * sign_dir;
2504
2505
15.3M
  temp_real = ixheaac_add32_sat(inp[0], inp[2]);
2506
15.3M
  temp_imag = ixheaac_add32_sat(inp[1], inp[3]);
2507
2508
15.3M
  add_r = ixheaac_add32_sat(inp[2], inp[4]);
2509
15.3M
  add_i = ixheaac_add32_sat(inp[3], inp[5]);
2510
2511
15.3M
  sub_r = ixheaac_sub32_sat(inp[2], inp[4]);
2512
15.3M
  sub_i = ixheaac_sub32_sat(inp[3], inp[5]);
2513
2514
15.3M
  p1 = add_r >> 1;
2515
15.3M
  p4 = add_i >> 1;
2516
15.3M
  p2 = ixheaac_mult32_shl(sub_i, sinmu);
2517
15.3M
  p3 = ixheaac_mult32_shl(sub_r, sinmu);
2518
2519
15.3M
  temp = ixheaac_sub32(inp[0], p1);
2520
2521
15.3M
  op[0] = ixheaac_add32_sat(temp_real, inp[4]);
2522
15.3M
  op[1] = ixheaac_add32_sat(temp_imag, inp[5]);
2523
15.3M
  op[2] = ixheaac_add32_sat(temp, p2);
2524
15.3M
  op[3] = ixheaac_sub32_sat(ixheaac_sub32_sat(inp[1], p3), p4);
2525
15.3M
  op[4] = ixheaac_sub32_sat(temp, p2);
2526
15.3M
  op[5] = ixheaac_sub32_sat(ixheaac_add32_sat(inp[1], p3), p4);
2527
2528
15.3M
  return;
2529
15.3M
}
2530
2531
VOID ixheaacd_complex_fft_p3(WORD32 *xr, WORD32 *xi, WORD32 nlength,
2532
2.01M
                             WORD32 fft_mode, WORD32 *preshift) {
2533
2.01M
  WORD32 i, j;
2534
2.01M
  WORD32 shift = 0;
2535
2.01M
  WORD32 xr_3[384];
2536
2.01M
  WORD32 xi_3[384];
2537
2.01M
  WORD32 x[1024];
2538
2.01M
  WORD32 y[1024];
2539
2.01M
  WORD32 cnfac, npts;
2540
2.01M
  WORD32 mpass = nlength;
2541
2.01M
  WORD32 n = 0;
2542
2.01M
  WORD32 *ptr_x = x;
2543
2.01M
  WORD32 *ptr_y = y;
2544
2545
2.01M
  cnfac = 0;
2546
4.03M
  while (mpass % 3 == 0) {
2547
2.01M
    mpass /= 3;
2548
2.01M
    cnfac++;
2549
2.01M
  }
2550
2.01M
  npts = mpass;
2551
2552
8.06M
  for (i = 0; i < 3 * cnfac; i++) {
2553
52.0M
    for (j = 0; j < mpass; j++) {
2554
45.9M
      xr_3[j] = xr[3 * j + i];
2555
45.9M
      xi_3[j] = xi[3 * j + i];
2556
45.9M
    }
2557
2558
6.05M
    (*ixheaacd_complex_fft_p2)(xr_3, xi_3, mpass, fft_mode, &shift);
2559
2560
52.0M
    for (j = 0; j < mpass; j++) {
2561
45.9M
      xr[3 * j + i] = xr_3[j];
2562
45.9M
      xi[3 * j + i] = xi_3[j];
2563
45.9M
    }
2564
6.05M
  }
2565
2566
6.67M
  while (npts >> 1) {
2567
4.65M
    n++;
2568
4.65M
    npts = npts >> 1;
2569
4.65M
  }
2570
2571
2.01M
  if (n % 2 == 0)
2572
1.89M
    shift = ((n + 4)) / 2;
2573
125k
  else
2574
125k
    shift = ((n + 5) / 2);
2575
2576
2.01M
  *preshift = shift - *preshift + 1;
2577
2578
47.9M
  for (i = 0; i < nlength; i++) {
2579
45.9M
    ptr_x[2 * i] = (xr[i] >> 1);
2580
45.9M
    ptr_x[2 * i + 1] = (xi[i] >> 1);
2581
45.9M
  }
2582
2583
2.01M
  {
2584
2.01M
    const WORD32 *w1r, *w1i;
2585
2.01M
    WORD32 tmp;
2586
2.01M
    w1r = ixheaacd_twiddle_table_3pr;
2587
2.01M
    w1i = ixheaacd_twiddle_table_3pi;
2588
2589
2.01M
    if (fft_mode < 0) {
2590
14.1M
      for (i = 0; i < nlength; i += 3) {
2591
12.1M
        w1r++;
2592
12.1M
        w1i++;
2593
2594
12.1M
        tmp = ixheaac_sub32_sat(ixheaacd_mult32_sat(ptr_x[2 * i + 2], (*w1r)),
2595
12.1M
                                 ixheaacd_mult32_sat(ptr_x[2 * i + 3], (*w1i)));
2596
12.1M
        ptr_x[2 * i + 3] =
2597
12.1M
            ixheaac_add32_sat(ixheaacd_mult32_sat(ptr_x[2 * i + 2], (*w1i)),
2598
12.1M
                               ixheaacd_mult32_sat(ptr_x[2 * i + 3], (*w1r)));
2599
12.1M
        ptr_x[2 * i + 2] = tmp;
2600
2601
12.1M
        w1r++;
2602
12.1M
        w1i++;
2603
2604
12.1M
        tmp = ixheaac_sub32_sat(ixheaacd_mult32_sat(ptr_x[2 * i + 4], (*w1r)),
2605
12.1M
                                 ixheaacd_mult32_sat(ptr_x[2 * i + 5], (*w1i)));
2606
12.1M
        ptr_x[2 * i + 5] =
2607
12.1M
            ixheaac_add32_sat(ixheaacd_mult32_sat(ptr_x[2 * i + 4], (*w1i)),
2608
12.1M
                               ixheaacd_mult32_sat(ptr_x[2 * i + 5], (*w1r)));
2609
12.1M
        ptr_x[2 * i + 4] = tmp;
2610
2611
12.1M
        w1r += 3 * (128 / mpass - 1) + 1;
2612
12.1M
        w1i += 3 * (128 / mpass - 1) + 1;
2613
12.1M
      }
2614
1.96M
    }
2615
2616
48.2k
    else {
2617
3.20M
      for (i = 0; i < nlength; i += 3) {
2618
3.15M
        w1r++;
2619
3.15M
        w1i++;
2620
2621
3.15M
        tmp = ixheaac_add32_sat(ixheaacd_mult32_sat(ptr_x[2 * i + 2], (*w1r)),
2622
3.15M
                                 ixheaacd_mult32_sat(ptr_x[2 * i + 3], (*w1i)));
2623
3.15M
        ptr_x[2 * i + 3] =
2624
3.15M
            ixheaac_sub32_sat(ixheaacd_mult32_sat(ptr_x[2 * i + 3], (*w1r)),
2625
3.15M
                               ixheaacd_mult32_sat(ptr_x[2 * i + 2], (*w1i)));
2626
3.15M
        ptr_x[2 * i + 2] = tmp;
2627
2628
3.15M
        w1r++;
2629
3.15M
        w1i++;
2630
2631
3.15M
        tmp = ixheaac_add32_sat(ixheaacd_mult32_sat(ptr_x[2 * i + 4], (*w1r)),
2632
3.15M
                                 ixheaacd_mult32_sat(ptr_x[2 * i + 5], (*w1i)));
2633
3.15M
        ptr_x[2 * i + 5] =
2634
3.15M
            ixheaac_sub32_sat(ixheaacd_mult32_sat(ptr_x[2 * i + 5], (*w1r)),
2635
3.15M
                               ixheaacd_mult32_sat(ptr_x[2 * i + 4], (*w1i)));
2636
3.15M
        ptr_x[2 * i + 4] = tmp;
2637
2638
3.15M
        w1r += 3 * (128 / mpass - 1) + 1;
2639
3.15M
        w1i += 3 * (128 / mpass - 1) + 1;
2640
3.15M
      }
2641
48.2k
    }
2642
2.01M
  }
2643
2644
17.3M
  for (i = 0; i < mpass; i++) {
2645
15.3M
    ixheaacd_complex_3point_fft(ptr_x, ptr_y, fft_mode);
2646
2647
15.3M
    ptr_x = ptr_x + 6;
2648
15.3M
    ptr_y = ptr_y + 6;
2649
15.3M
  }
2650
2651
2.01M
  ptr_y = y;
2652
17.3M
  for (i = 0; i < mpass; i++) {
2653
15.3M
    xr[i] = *ptr_y++;
2654
15.3M
    xi[i] = *ptr_y++;
2655
15.3M
    xr[mpass + i] = *ptr_y++;
2656
15.3M
    xi[mpass + i] = *ptr_y++;
2657
15.3M
    xr[2 * mpass + i] = *ptr_y++;
2658
15.3M
    xi[2 * mpass + i] = *ptr_y++;
2659
15.3M
  }
2660
2661
2.01M
  return;
2662
2.01M
}
2663
2664
VOID ixheaacd_complex_fft(WORD32 *data_r, WORD32 *data_i, WORD32 nlength, WORD32 fft_mode,
2665
1.63M
                          WORD32 *preshift) {
2666
1.63M
  if (nlength & (nlength - 1)) {
2667
213k
    ixheaacd_complex_fft_p3(data_r, data_i, nlength, fft_mode, preshift);
2668
213k
  } else
2669
1.42M
    (*ixheaacd_complex_fft_p2)(data_r, data_i, nlength, fft_mode, preshift);
2670
2671
1.63M
  return;
2672
1.63M
}