151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick/******************************************************************************
251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick *                                                                            *
351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * Copyright (C) 2018 The Android Open Source Project
451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick *
551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * Licensed under the Apache License, Version 2.0 (the "License");
651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * you may not use this file except in compliance with the License.
751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * You may obtain a copy of the License at:
851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick *
951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * http://www.apache.org/licenses/LICENSE-2.0
1051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick *
1151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * Unless required by applicable law or agreed to in writing, software
1251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * distributed under the License is distributed on an "AS IS" BASIS,
1351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * See the License for the specific language governing permissions and
1551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * limitations under the License.
1651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick *
1751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick *****************************************************************************
1851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
1951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick*/
2051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include <stdlib.h>
2151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include <stdio.h>
2251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
2351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include <ixheaacd_type_def.h>
2451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_interface.h"
2551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_constants.h"
2651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include <ixheaacd_basic_ops32.h>
2751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_function_selector.h"
2851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
2951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickextern const WORD32 ixheaacd_twiddle_table_fft_32x32[514];
3051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickextern const WORD32 ixheaacd_twiddle_table_3pr[1155];
3151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickextern const WORD32 ixheaacd_twiddle_table_3pi[1155];
3251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickextern const WORD8 ixheaacd_mps_dig_rev[16];
3351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
3451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#define PLATFORM_INLINE __inline
3551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
3651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#define DIG_REV(i, m, j)                                    \
3751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  do {                                                      \
3851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    unsigned _ = (i);                                       \
3951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    _ = ((_ & 0x33333333) << 2) | ((_ & ~0x33333333) >> 2); \
4051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    _ = ((_ & 0x0F0F0F0F) << 4) | ((_ & ~0x0F0F0F0F) >> 4); \
4151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    _ = ((_ & 0x00FF00FF) << 8) | ((_ & ~0x00FF00FF) >> 8); \
4251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    (j) = _ >> (m);                                         \
4351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  } while (0)
4451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
4551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickstatic PLATFORM_INLINE WORD32 ixheaacd_mult32(WORD32 a, WORD32 b) {
4651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 result;
4751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD64 temp_result;
4851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
4951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  temp_result = (WORD64)a * (WORD64)b;
5051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  result = (WORD32)(temp_result >> 31);
5151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
5251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  return (result);
5351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick}
5451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
5551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickstatic PLATFORM_INLINE WORD32 ixheaacd_mac32(WORD32 a, WORD32 b, WORD32 c) {
5651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 result;
5751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
5851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  result = a + ixheaacd_mult32(b, c);
5951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
6051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  return (result);
6151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick}
6251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
6351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickstatic PLATFORM_INLINE WORD32 ixheaacd_mult32_shl(WORD32 a, WORD32 b) {
6451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 result;
6551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD64 temp_result;
6651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
6751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  temp_result = (WORD64)a * (WORD64)b;
6851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  result = (WORD32)(temp_result >> 32);
6951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
7051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  return (result << 1);
7151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick}
7251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
7351aa06e124ba688ca810b25ee0b5bb66678aac14Ray EssickVOID ixheaacd_mps_complex_fft_64_dec(WORD32 *ptr_x, WORD32 *fin_re,
7451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                                     WORD32 *fin_im, WORD32 nlength) {
7551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 i, j, k, n_stages;
7651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 h2, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
7751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 del, nodespacing, in_loop_cnt;
7851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 y[128];
7951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 npoints = nlength;
8051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 *ptr_y = y;
8151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  const WORD32 *ptr_w;
8251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  n_stages = 30 - ixheaacd_norm32(npoints);
8351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
8451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  n_stages = n_stages >> 1;
8551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
8651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  ptr_w = ixheaacd_twiddle_table_fft_32x32;
8751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
8851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  for (i = 0; i < npoints; i += 4) {
8951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    WORD32 *inp = ptr_x;
9051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    h2 = ixheaacd_mps_dig_rev[i >> 2];
9151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    inp += (h2);
9251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
9351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    x0r = *inp;
9451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    x0i = *(inp + 1);
9551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    inp += (npoints >> 1);
9651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
9751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    x1r = *inp;
9851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    x1i = *(inp + 1);
9951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    inp += (npoints >> 1);
10051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
10151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    x2r = *inp;
10251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    x2i = *(inp + 1);
10351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    inp += (npoints >> 1);
10451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
10551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    x3r = *inp;
10651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    x3i = *(inp + 1);
10751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
10851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    x0r = x0r + x2r;
10951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    x0i = x0i + x2i;
11051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    x2r = x0r - (x2r << 1);
11151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    x2i = x0i - (x2i << 1);
11251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    x1r = x1r + x3r;
11351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    x1i = x1i + x3i;
11451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    x3r = x1r - (x3r << 1);
11551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    x3i = x1i - (x3i << 1);
11651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
11751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    x0r = x0r + x1r;
11851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    x0i = x0i + x1i;
11951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    x1r = x0r - (x1r << 1);
12051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    x1i = x0i - (x1i << 1);
12151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    x2r = x2r + x3i;
12251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    x2i = x2i - x3r;
12351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    x3i = x2r - (x3i << 1);
12451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    x3r = x2i + (x3r << 1);
12551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
12651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    *ptr_y++ = x0r;
12751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    *ptr_y++ = x0i;
12851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    *ptr_y++ = x2r;
12951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    *ptr_y++ = x2i;
13051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    *ptr_y++ = x1r;
13151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    *ptr_y++ = x1i;
13251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    *ptr_y++ = x3i;
13351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    *ptr_y++ = x3r;
13451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
13551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  ptr_y -= 2 * npoints;
13651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  del = 4;
13751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  nodespacing = 64;
13851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  in_loop_cnt = npoints >> 4;
13951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  for (i = n_stages - 1; i > 0; i--) {
14051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    const WORD32 *twiddles = ptr_w;
14151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    WORD32 *data = ptr_y;
14251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    WORD32 w1h, w2h, w3h, w1l, w2l, w3l;
14351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    WORD32 sec_loop_cnt;
14451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
14551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    for (k = in_loop_cnt; k != 0; k--) {
14651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x0r = (*data);
14751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x0i = (*(data + 1));
14851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      data += (del << 1);
14951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
15051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x1r = (*data);
15151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x1i = (*(data + 1));
15251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      data += (del << 1);
15351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
15451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x2r = (*data);
15551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x2i = (*(data + 1));
15651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      data += (del << 1);
15751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
15851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x3r = (*data);
15951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x3i = (*(data + 1));
16051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      data -= 3 * (del << 1);
16151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
16251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x0r = x0r + x2r;
16351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x0i = x0i + x2i;
16451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x2r = x0r - (x2r << 1);
16551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x2i = x0i - (x2i << 1);
16651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x1r = x1r + x3r;
16751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x1i = x1i + x3i;
16851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x3r = x1r - (x3r << 1);
16951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x3i = x1i - (x3i << 1);
17051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
17151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x0r = x0r + x1r;
17251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x0i = x0i + x1i;
17351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x1r = x0r - (x1r << 1);
17451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x1i = x0i - (x1i << 1);
17551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x2r = x2r + x3i;
17651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x2i = x2i - x3r;
17751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x3i = x2r - (x3i << 1);
17851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x3r = x2i + (x3r << 1);
17951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
18051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      *data = x0r;
18151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      *(data + 1) = x0i;
18251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      data += (del << 1);
18351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
18451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      *data = x2r;
18551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      *(data + 1) = x2i;
18651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      data += (del << 1);
18751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
18851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      *data = x1r;
18951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      *(data + 1) = x1i;
19051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      data += (del << 1);
19151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
19251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      *data = x3i;
19351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      *(data + 1) = x3r;
19451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      data += (del << 1);
19551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
19651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    data = ptr_y + 2;
19751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
19851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    sec_loop_cnt = (nodespacing * del);
19951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    sec_loop_cnt = (sec_loop_cnt / 4) + (sec_loop_cnt / 8) -
20051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                   (sec_loop_cnt / 16) + (sec_loop_cnt / 32) -
20151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                   (sec_loop_cnt / 64) + (sec_loop_cnt / 128) -
20251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                   (sec_loop_cnt / 256);
20351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    j = nodespacing;
20451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
20551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    for (j = nodespacing; j <= sec_loop_cnt; j += nodespacing) {
20651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      w1h = *(twiddles + 2 * j);
20751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      w1l = *(twiddles + 2 * j + 1);
20851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      w2h = *(twiddles + 2 * (j << 1));
20951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      w2l = *(twiddles + 2 * (j << 1) + 1);
21051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      w3h = *(twiddles + 2 * j + 2 * (j << 1));
21151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      w3l = *(twiddles + 2 * j + 2 * (j << 1) + 1);
21251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
21351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      for (k = in_loop_cnt; k != 0; k--) {
21451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        WORD32 tmp;
21551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
21651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
21751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
21851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
21951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = *data;
22051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = *(data + 1);
22151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
22251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
22351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2r = *data;
22451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2i = *(data + 1);
22551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
22651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
22751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3r = *data;
22851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3i = *(data + 1);
22951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data -= 3 * (del << 1);
23051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
23151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        tmp = (ixheaacd_mult32(x1r, w1l) - ixheaacd_mult32(x1i, w1h));
23251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = ixheaacd_mac32(ixheaacd_mult32(x1r, w1h), x1i, w1l);
23351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = tmp;
23451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
23551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        tmp = (ixheaacd_mult32(x2r, w2l) - ixheaacd_mult32(x2i, w2h));
23651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2i = ixheaacd_mac32(ixheaacd_mult32(x2r, w2h), x2i, w2l);
23751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2r = tmp;
23851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
23951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        tmp = (ixheaacd_mult32(x3r, w3l) - ixheaacd_mult32(x3i, w3h));
24051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3i = ixheaacd_mac32(ixheaacd_mult32(x3r, w3h), x3i, w3l);
24151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3r = tmp;
24251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
24351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0r = (*data);
24451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0i = (*(data + 1));
24551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
24651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0r = x0r + (x2r);
24751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0i = x0i + (x2i);
24851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2r = x0r - (x2r << 1);
24951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2i = x0i - (x2i << 1);
25051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = x1r + x3r;
25151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = x1i + x3i;
25251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3r = x1r - (x3r << 1);
25351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3i = x1i - (x3i << 1);
25451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
25551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0r = x0r + (x1r);
25651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0i = x0i + (x1i);
25751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = x0r - (x1r << 1);
25851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = x0i - (x1i << 1);
25951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2r = x2r + (x3i);
26051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2i = x2i - (x3r);
26151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3i = x2r - (x3i << 1);
26251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3r = x2i + (x3r << 1);
26351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
26451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *data = x0r;
26551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(data + 1) = x0i;
26651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
26751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
26851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *data = x2r;
26951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(data + 1) = x2i;
27051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
27151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
27251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *data = x1r;
27351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(data + 1) = x1i;
27451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
27551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
27651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *data = x3i;
27751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(data + 1) = x3r;
27851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
27951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
28051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      data -= 2 * npoints;
28151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      data += 2;
28251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
28351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    for (; j <= (nodespacing * del) >> 1; j += nodespacing) {
28451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      w1h = *(twiddles + 2 * j);
28551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      w2h = *(twiddles + 2 * (j << 1));
28651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      w3h = *(twiddles + 2 * j + 2 * (j << 1) - 512);
28751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      w1l = *(twiddles + 2 * j + 1);
28851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      w2l = *(twiddles + 2 * (j << 1) + 1);
28951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      w3l = *(twiddles + 2 * j + 2 * (j << 1) - 511);
29051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
29151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      for (k = in_loop_cnt; k != 0; k--) {
29251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        WORD32 tmp;
29351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
29451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
29551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
29651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
29751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = *data;
29851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = *(data + 1);
29951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
30051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
30151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2r = *data;
30251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2i = *(data + 1);
30351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
30451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
30551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3r = *data;
30651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3i = *(data + 1);
30751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data -= 3 * (del << 1);
30851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
30951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        tmp = (ixheaacd_mult32(x1r, w1l) - ixheaacd_mult32(x1i, w1h));
31051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = ixheaacd_mac32(ixheaacd_mult32(x1r, w1h), x1i, w1l);
31151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = tmp;
31251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
31351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        tmp = (ixheaacd_mult32(x2r, w2l) - ixheaacd_mult32(x2i, w2h));
31451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2i = ixheaacd_mac32(ixheaacd_mult32(x2r, w2h), x2i, w2l);
31551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2r = tmp;
31651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
31751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        tmp = (ixheaacd_mult32(x3r, w3h) + ixheaacd_mult32(x3i, w3l));
31851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3i = -ixheaacd_mult32(x3r, w3l) + ixheaacd_mult32(x3i, w3h);
31951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3r = tmp;
32051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
32151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0r = (*data);
32251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0i = (*(data + 1));
32351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
32451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0r = x0r + (x2r);
32551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0i = x0i + (x2i);
32651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2r = x0r - (x2r << 1);
32751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2i = x0i - (x2i << 1);
32851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = x1r + x3r;
32951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = x1i + x3i;
33051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3r = x1r - (x3r << 1);
33151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3i = x1i - (x3i << 1);
33251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
33351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0r = x0r + (x1r);
33451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0i = x0i + (x1i);
33551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = x0r - (x1r << 1);
33651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = x0i - (x1i << 1);
33751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2r = x2r + (x3i);
33851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2i = x2i - (x3r);
33951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3i = x2r - (x3i << 1);
34051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3r = x2i + (x3r << 1);
34151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
34251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *data = x0r;
34351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(data + 1) = x0i;
34451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
34551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
34651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *data = x2r;
34751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(data + 1) = x2i;
34851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
34951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
35051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *data = x1r;
35151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(data + 1) = x1i;
35251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
35351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
35451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *data = x3i;
35551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(data + 1) = x3r;
35651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
35751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
35851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      data -= 2 * npoints;
35951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      data += 2;
36051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
36151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    for (; j <= sec_loop_cnt * 2; j += nodespacing) {
36251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      w1h = *(twiddles + 2 * j);
36351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      w2h = *(twiddles + 2 * (j << 1) - 512);
36451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      w3h = *(twiddles + 2 * j + 2 * (j << 1) - 512);
36551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      w1l = *(twiddles + 2 * j + 1);
36651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      w2l = *(twiddles + 2 * (j << 1) - 511);
36751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      w3l = *(twiddles + 2 * j + 2 * (j << 1) - 511);
36851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
36951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      for (k = in_loop_cnt; k != 0; k--) {
37051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        WORD32 tmp;
37151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
37251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
37351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
37451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
37551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = *data;
37651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = *(data + 1);
37751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
37851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
37951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2r = *data;
38051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2i = *(data + 1);
38151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
38251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
38351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3r = *data;
38451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3i = *(data + 1);
38551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data -= 3 * (del << 1);
38651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
38751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        tmp = (ixheaacd_mult32(x1r, w1l) - ixheaacd_mult32(x1i, w1h));
38851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = ixheaacd_mac32(ixheaacd_mult32(x1r, w1h), x1i, w1l);
38951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = tmp;
39051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
39151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        tmp = (ixheaacd_mult32(x2r, w2h) + ixheaacd_mult32(x2i, w2l));
39251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2i = -ixheaacd_mult32(x2r, w2l) + ixheaacd_mult32(x2i, w2h);
39351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2r = tmp;
39451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
39551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        tmp = (ixheaacd_mult32(x3r, w3h) + ixheaacd_mult32(x3i, w3l));
39651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3i = -ixheaacd_mult32(x3r, w3l) + ixheaacd_mult32(x3i, w3h);
39751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3r = tmp;
39851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
39951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0r = (*data);
40051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0i = (*(data + 1));
40151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
40251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0r = x0r + (x2r);
40351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0i = x0i + (x2i);
40451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2r = x0r - (x2r << 1);
40551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2i = x0i - (x2i << 1);
40651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = x1r + x3r;
40751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = x1i + x3i;
40851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3r = x1r - (x3r << 1);
40951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3i = x1i - (x3i << 1);
41051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
41151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0r = x0r + (x1r);
41251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0i = x0i + (x1i);
41351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = x0r - (x1r << 1);
41451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = x0i - (x1i << 1);
41551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2r = x2r + (x3i);
41651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2i = x2i - (x3r);
41751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3i = x2r - (x3i << 1);
41851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3r = x2i + (x3r << 1);
41951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
42051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *data = x0r;
42151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(data + 1) = x0i;
42251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
42351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
42451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *data = x2r;
42551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(data + 1) = x2i;
42651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
42751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
42851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *data = x1r;
42951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(data + 1) = x1i;
43051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
43151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
43251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *data = x3i;
43351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(data + 1) = x3r;
43451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
43551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
43651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      data -= 2 * npoints;
43751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      data += 2;
43851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
43951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    for (; j < nodespacing * del; j += nodespacing) {
44051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      w1h = *(twiddles + 2 * j);
44151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      w2h = *(twiddles + 2 * (j << 1) - 512);
44251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      w3h = *(twiddles + 2 * j + 2 * (j << 1) - 1024);
44351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      w1l = *(twiddles + 2 * j + 1);
44451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      w2l = *(twiddles + 2 * (j << 1) - 511);
44551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      w3l = *(twiddles + 2 * j + 2 * (j << 1) - 1023);
44651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
44751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      for (k = in_loop_cnt; k != 0; k--) {
44851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        WORD32 tmp;
44951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
45051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
45151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
45251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
45351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = *data;
45451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = *(data + 1);
45551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
45651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
45751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2r = *data;
45851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2i = *(data + 1);
45951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
46051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
46151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3r = *data;
46251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3i = *(data + 1);
46351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data -= 3 * (del << 1);
46451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
46551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        tmp = (ixheaacd_mult32(x1r, w1l) - ixheaacd_mult32(x1i, w1h));
46651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = ixheaacd_mac32(ixheaacd_mult32(x1r, w1h), x1i, w1l);
46751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = tmp;
46851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
46951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        tmp = (ixheaacd_mult32(x2r, w2h) + ixheaacd_mult32(x2i, w2l));
47051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2i = -ixheaacd_mult32(x2r, w2l) + ixheaacd_mult32(x2i, w2h);
47151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2r = tmp;
47251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
47351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        tmp = (-ixheaacd_mult32(x3r, w3l) + ixheaacd_mult32(x3i, w3h));
47451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3i = ixheaacd_mac32(ixheaacd_mult32(x3r, w3h), x3i, w3l);
47551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3r = tmp;
47651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
47751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0r = (*data);
47851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0i = (*(data + 1));
47951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
48051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0r = x0r + (x2r);
48151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0i = x0i + (x2i);
48251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2r = x0r - (x2r << 1);
48351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2i = x0i - (x2i << 1);
48451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = x1r + x3r;
48551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = x1i - x3i;
48651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3r = x1r - (x3r << 1);
48751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3i = x1i + (x3i << 1);
48851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
48951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0r = x0r + (x1r);
49051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0i = x0i + (x1i);
49151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = x0r - (x1r << 1);
49251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = x0i - (x1i << 1);
49351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2r = x2r + (x3i);
49451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2i = x2i - (x3r);
49551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3i = x2r - (x3i << 1);
49651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3r = x2i + (x3r << 1);
49751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
49851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *data = x0r;
49951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(data + 1) = x0i;
50051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
50151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
50251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *data = x2r;
50351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(data + 1) = x2i;
50451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
50551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
50651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *data = x1r;
50751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(data + 1) = x1i;
50851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
50951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
51051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *data = x3i;
51151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(data + 1) = x3r;
51251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
51351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
51451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      data -= 2 * npoints;
51551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      data += 2;
51651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
51751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    nodespacing >>= 2;
51851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    del <<= 2;
51951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    in_loop_cnt >>= 2;
52051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
52151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
52251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  for (i = 0; i < 2 * nlength; i += 2) {
52351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    fin_re[i] = y[i];
52451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    fin_im[i] = y[i + 1];
52551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
52651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
52751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  return;
52851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick}
52951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
53051aa06e124ba688ca810b25ee0b5bb66678aac14Ray EssickVOID ixheaacd_complex_fft_p2_dec(WORD32 *xr, WORD32 *xi, WORD32 nlength,
53151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                                 WORD32 fft_mode, WORD32 *preshift) {
53251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 i, j, k, n_stages;
53351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 h2, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
53451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 del, nodespacing, in_loop_cnt;
53551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 not_power_4;
53651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 npts, shift;
53751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 dig_rev_shift;
53851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 ptr_x[1024];
53951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 y[1024];
54051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 npoints = nlength;
54151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 n = 0;
54251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 *ptr_y = y;
54351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  const WORD32 *ptr_w;
54451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  dig_rev_shift = ixheaacd_norm32(npoints) + 1 - 16;
54551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  n_stages = 30 - ixheaacd_norm32(npoints);
54651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  not_power_4 = n_stages & 1;
54751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
54851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  n_stages = n_stages >> 1;
54951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
55051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  npts = npoints;
55151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  while (npts >> 1) {
55251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    n++;
55351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    npts = npts >> 1;
55451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
55551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
55651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  if (n % 2 == 0)
55751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    shift = ((n + 4)) / 2;
55851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  else
55951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    shift = ((n + 3) / 2);
56051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
56151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  for (i = 0; i < nlength; i++) {
56251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    ptr_x[2 * i] = (xr[i] / (1 << (shift)));
56351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    ptr_x[2 * i + 1] = (xi[i] / (1 << (shift)));
56451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
56551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
56651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  if (fft_mode == -1) {
56751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    ptr_w = ixheaacd_twiddle_table_fft_32x32;
56851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
56951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    for (i = 0; i < npoints; i += 4) {
57051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      WORD32 *inp = ptr_x;
57151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
57251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      DIG_REV(i, dig_rev_shift, h2);
57351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      if (not_power_4) {
57451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        h2 += 1;
57551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        h2 &= ~1;
57651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
57751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      inp += (h2);
57851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
57951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x0r = *inp;
58051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x0i = *(inp + 1);
58151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      inp += (npoints >> 1);
58251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
58351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x1r = *inp;
58451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x1i = *(inp + 1);
58551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      inp += (npoints >> 1);
58651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
58751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x2r = *inp;
58851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x2i = *(inp + 1);
58951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      inp += (npoints >> 1);
59051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
59151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x3r = *inp;
59251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x3i = *(inp + 1);
59351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
59451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x0r = x0r + x2r;
59551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x0i = x0i + x2i;
59651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x2r = x0r - (x2r << 1);
59751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x2i = x0i - (x2i << 1);
59851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x1r = x1r + x3r;
59951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x1i = x1i + x3i;
60051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x3r = x1r - (x3r << 1);
60151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x3i = x1i - (x3i << 1);
60251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
60351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x0r = x0r + x1r;
60451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x0i = x0i + x1i;
60551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x1r = x0r - (x1r << 1);
60651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x1i = x0i - (x1i << 1);
60751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x2r = x2r + x3i;
60851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x2i = x2i - x3r;
60951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x3i = x2r - (x3i << 1);
61051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x3r = x2i + (x3r << 1);
61151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
61251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      *ptr_y++ = x0r;
61351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      *ptr_y++ = x0i;
61451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      *ptr_y++ = x2r;
61551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      *ptr_y++ = x2i;
61651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      *ptr_y++ = x1r;
61751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      *ptr_y++ = x1i;
61851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      *ptr_y++ = x3i;
61951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      *ptr_y++ = x3r;
62051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
62151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    ptr_y -= 2 * npoints;
62251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    del = 4;
62351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    nodespacing = 64;
62451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    in_loop_cnt = npoints >> 4;
62551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    for (i = n_stages - 1; i > 0; i--) {
62651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      const WORD32 *twiddles = ptr_w;
62751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      WORD32 *data = ptr_y;
62851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      WORD32 w1h, w2h, w3h, w1l, w2l, w3l;
62951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      WORD32 sec_loop_cnt;
63051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
63151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      for (k = in_loop_cnt; k != 0; k--) {
63251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0r = (*data);
63351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0i = (*(data + 1));
63451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
63551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
63651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = (*data);
63751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = (*(data + 1));
63851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
63951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
64051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2r = (*data);
64151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2i = (*(data + 1));
64251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
64351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
64451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3r = (*data);
64551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3i = (*(data + 1));
64651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data -= 3 * (del << 1);
64751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
64851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0r = x0r + x2r;
64951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0i = x0i + x2i;
65051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2r = x0r - (x2r << 1);
65151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2i = x0i - (x2i << 1);
65251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = x1r + x3r;
65351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = x1i + x3i;
65451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3r = x1r - (x3r << 1);
65551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3i = x1i - (x3i << 1);
65651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
65751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0r = x0r + x1r;
65851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0i = x0i + x1i;
65951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = x0r - (x1r << 1);
66051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = x0i - (x1i << 1);
66151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2r = x2r + x3i;
66251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2i = x2i - x3r;
66351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3i = x2r - (x3i << 1);
66451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3r = x2i + (x3r << 1);
66551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
66651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *data = x0r;
66751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(data + 1) = x0i;
66851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
66951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
67051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *data = x2r;
67151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(data + 1) = x2i;
67251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
67351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
67451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *data = x1r;
67551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(data + 1) = x1i;
67651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
67751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
67851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *data = x3i;
67951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(data + 1) = x3r;
68051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
68151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
68251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      data = ptr_y + 2;
68351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
68451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      sec_loop_cnt = (nodespacing * del);
68551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      sec_loop_cnt = (sec_loop_cnt / 4) + (sec_loop_cnt / 8) -
68651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                     (sec_loop_cnt / 16) + (sec_loop_cnt / 32) -
68751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                     (sec_loop_cnt / 64) + (sec_loop_cnt / 128) -
68851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                     (sec_loop_cnt / 256);
68951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      j = nodespacing;
69051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
69151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      for (j = nodespacing; j <= sec_loop_cnt; j += nodespacing) {
69251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1h = *(twiddles + 2 * j);
69351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1l = *(twiddles + 2 * j + 1);
69451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w2h = *(twiddles + 2 * (j << 1));
69551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w2l = *(twiddles + 2 * (j << 1) + 1);
69651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w3h = *(twiddles + 2 * j + 2 * (j << 1));
69751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w3l = *(twiddles + 2 * j + 2 * (j << 1) + 1);
69851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
69951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        for (k = in_loop_cnt; k != 0; k--) {
70051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          WORD32 tmp;
70151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
70251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
70351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
70451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
70551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = *data;
70651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = *(data + 1);
70751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
70851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
70951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = *data;
71051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = *(data + 1);
71151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
71251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
71351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = *data;
71451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = *(data + 1);
71551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data -= 3 * (del << 1);
71651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
71751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          tmp = (ixheaacd_mult32(x1r, w1l) - ixheaacd_mult32(x1i, w1h));
71851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = ixheaacd_mac32(ixheaacd_mult32(x1r, w1h), x1i, w1l);
71951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = tmp;
72051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
72151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          tmp = (ixheaacd_mult32(x2r, w2l) - ixheaacd_mult32(x2i, w2h));
72251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = ixheaacd_mac32(ixheaacd_mult32(x2r, w2h), x2i, w2l);
72351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = tmp;
72451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
72551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          tmp = (ixheaacd_mult32(x3r, w3l) - ixheaacd_mult32(x3i, w3h));
72651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = ixheaacd_mac32(ixheaacd_mult32(x3r, w3h), x3i, w3l);
72751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = tmp;
72851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
72951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0r = (*data);
73051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0i = (*(data + 1));
73151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
73251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0r = x0r + (x2r);
73351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0i = x0i + (x2i);
73451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = x0r - (x2r << 1);
73551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = x0i - (x2i << 1);
73651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = x1r + x3r;
73751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = x1i + x3i;
73851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = x1r - (x3r << 1);
73951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = x1i - (x3i << 1);
74051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
74151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0r = x0r + (x1r);
74251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0i = x0i + (x1i);
74351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = x0r - (x1r << 1);
74451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = x0i - (x1i << 1);
74551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = x2r + (x3i);
74651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = x2i - (x3r);
74751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = x2r - (x3i << 1);
74851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = x2i + (x3r << 1);
74951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
75051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x0r;
75151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x0i;
75251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
75351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
75451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x2r;
75551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x2i;
75651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
75751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
75851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x1r;
75951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x1i;
76051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
76151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
76251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x3i;
76351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x3r;
76451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
76551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        }
76651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data -= 2 * npoints;
76751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += 2;
76851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
76951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      for (; j <= (nodespacing * del) >> 1; j += nodespacing) {
77051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1h = *(twiddles + 2 * j);
77151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w2h = *(twiddles + 2 * (j << 1));
77251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w3h = *(twiddles + 2 * j + 2 * (j << 1) - 512);
77351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1l = *(twiddles + 2 * j + 1);
77451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w2l = *(twiddles + 2 * (j << 1) + 1);
77551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w3l = *(twiddles + 2 * j + 2 * (j << 1) - 511);
77651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
77751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        for (k = in_loop_cnt; k != 0; k--) {
77851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          WORD32 tmp;
77951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
78051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
78151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
78251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = *data;
78351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = *(data + 1);
78451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
78551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
78651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = *data;
78751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = *(data + 1);
78851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
78951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
79051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = *data;
79151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = *(data + 1);
79251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data -= 3 * (del << 1);
79351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
79451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          tmp = (ixheaacd_mult32(x1r, w1l) - ixheaacd_mult32(x1i, w1h));
79551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = ixheaacd_mac32(ixheaacd_mult32(x1r, w1h), x1i, w1l);
79651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = tmp;
79751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
79851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          tmp = (ixheaacd_mult32(x2r, w2l) - ixheaacd_mult32(x2i, w2h));
79951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = ixheaacd_mac32(ixheaacd_mult32(x2r, w2h), x2i, w2l);
80051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = tmp;
80151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
80251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          tmp = (ixheaacd_mult32(x3r, w3h) + ixheaacd_mult32(x3i, w3l));
80351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = -ixheaacd_mult32(x3r, w3l) + ixheaacd_mult32(x3i, w3h);
80451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = tmp;
80551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
80651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0r = (*data);
80751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0i = (*(data + 1));
80851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
80951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0r = x0r + (x2r);
81051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0i = x0i + (x2i);
81151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = x0r - (x2r << 1);
81251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = x0i - (x2i << 1);
81351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = x1r + x3r;
81451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = x1i + x3i;
81551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = x1r - (x3r << 1);
81651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = x1i - (x3i << 1);
81751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
81851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0r = x0r + (x1r);
81951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0i = x0i + (x1i);
82051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = x0r - (x1r << 1);
82151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = x0i - (x1i << 1);
82251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = x2r + (x3i);
82351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = x2i - (x3r);
82451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = x2r - (x3i << 1);
82551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = x2i + (x3r << 1);
82651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
82751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x0r;
82851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x0i;
82951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
83051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
83151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x2r;
83251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x2i;
83351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
83451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
83551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x1r;
83651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x1i;
83751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
83851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
83951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x3i;
84051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x3r;
84151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
84251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        }
84351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data -= 2 * npoints;
84451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += 2;
84551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
84651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      for (; j <= sec_loop_cnt * 2; j += nodespacing) {
84751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1h = *(twiddles + 2 * j);
84851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w2h = *(twiddles + 2 * (j << 1) - 512);
84951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w3h = *(twiddles + 2 * j + 2 * (j << 1) - 512);
85051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1l = *(twiddles + 2 * j + 1);
85151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w2l = *(twiddles + 2 * (j << 1) - 511);
85251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w3l = *(twiddles + 2 * j + 2 * (j << 1) - 511);
85351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
85451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        for (k = in_loop_cnt; k != 0; k--) {
85551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          WORD32 tmp;
85651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
85751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
85851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
85951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
86051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = *data;
86151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = *(data + 1);
86251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
86351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
86451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = *data;
86551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = *(data + 1);
86651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
86751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
86851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = *data;
86951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = *(data + 1);
87051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data -= 3 * (del << 1);
87151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
87251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          tmp = (ixheaacd_mult32(x1r, w1l) - ixheaacd_mult32(x1i, w1h));
87351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = ixheaacd_mac32(ixheaacd_mult32(x1r, w1h), x1i, w1l);
87451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = tmp;
87551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
87651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          tmp = (ixheaacd_mult32(x2r, w2h) + ixheaacd_mult32(x2i, w2l));
87751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = -ixheaacd_mult32(x2r, w2l) + ixheaacd_mult32(x2i, w2h);
87851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = tmp;
87951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
88051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          tmp = (ixheaacd_mult32(x3r, w3h) + ixheaacd_mult32(x3i, w3l));
88151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = -ixheaacd_mult32(x3r, w3l) + ixheaacd_mult32(x3i, w3h);
88251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = tmp;
88351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
88451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0r = (*data);
88551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0i = (*(data + 1));
88651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
88751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0r = x0r + (x2r);
88851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0i = x0i + (x2i);
88951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = x0r - (x2r << 1);
89051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = x0i - (x2i << 1);
89151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = x1r + x3r;
89251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = x1i + x3i;
89351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = x1r - (x3r << 1);
89451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = x1i - (x3i << 1);
89551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
89651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0r = x0r + (x1r);
89751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0i = x0i + (x1i);
89851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = x0r - (x1r << 1);
89951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = x0i - (x1i << 1);
90051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = x2r + (x3i);
90151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = x2i - (x3r);
90251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = x2r - (x3i << 1);
90351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = x2i + (x3r << 1);
90451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
90551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x0r;
90651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x0i;
90751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
90851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
90951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x2r;
91051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x2i;
91151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
91251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
91351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x1r;
91451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x1i;
91551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
91651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
91751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x3i;
91851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x3r;
91951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
92051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        }
92151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data -= 2 * npoints;
92251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += 2;
92351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
92451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      for (; j < nodespacing * del; j += nodespacing) {
92551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1h = *(twiddles + 2 * j);
92651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w2h = *(twiddles + 2 * (j << 1) - 512);
92751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w3h = *(twiddles + 2 * j + 2 * (j << 1) - 1024);
92851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1l = *(twiddles + 2 * j + 1);
92951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w2l = *(twiddles + 2 * (j << 1) - 511);
93051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w3l = *(twiddles + 2 * j + 2 * (j << 1) - 1023);
93151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
93251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        for (k = in_loop_cnt; k != 0; k--) {
93351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          WORD32 tmp;
93451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
93551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
93651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
93751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
93851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = *data;
93951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = *(data + 1);
94051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
94151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
94251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = *data;
94351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = *(data + 1);
94451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
94551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
94651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = *data;
94751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = *(data + 1);
94851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data -= 3 * (del << 1);
94951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
95051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          tmp = (ixheaacd_mult32(x1r, w1l) - ixheaacd_mult32(x1i, w1h));
95151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = ixheaacd_mac32(ixheaacd_mult32(x1r, w1h), x1i, w1l);
95251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = tmp;
95351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
95451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          tmp = (ixheaacd_mult32(x2r, w2h) + ixheaacd_mult32(x2i, w2l));
95551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = -ixheaacd_mult32(x2r, w2l) + ixheaacd_mult32(x2i, w2h);
95651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = tmp;
95751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
95851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          tmp = (-ixheaacd_mult32(x3r, w3l) + ixheaacd_mult32(x3i, w3h));
95951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = ixheaacd_mac32(ixheaacd_mult32(x3r, w3h), x3i, w3l);
96051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = tmp;
96151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
96251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0r = (*data);
96351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0i = (*(data + 1));
96451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
96551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0r = x0r + (x2r);
96651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0i = x0i + (x2i);
96751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = x0r - (x2r << 1);
96851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = x0i - (x2i << 1);
96951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = x1r + x3r;
97051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = x1i - x3i;
97151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = x1r - (x3r << 1);
97251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = x1i + (x3i << 1);
97351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
97451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0r = x0r + (x1r);
97551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0i = x0i + (x1i);
97651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = x0r - (x1r << 1);
97751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = x0i - (x1i << 1);
97851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = x2r + (x3i);
97951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = x2i - (x3r);
98051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = x2r - (x3i << 1);
98151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = x2i + (x3r << 1);
98251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
98351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x0r;
98451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x0i;
98551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
98651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
98751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x2r;
98851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x2i;
98951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
99051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
99151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x1r;
99251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x1i;
99351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
99451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
99551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x3i;
99651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x3r;
99751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
99851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        }
99951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data -= 2 * npoints;
100051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += 2;
100151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
100251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      nodespacing >>= 2;
100351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      del <<= 2;
100451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      in_loop_cnt >>= 2;
100551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
100651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    if (not_power_4) {
100751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      const WORD32 *twiddles = ptr_w;
100851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      nodespacing <<= 1;
100951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      shift += 1;
101051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
101151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      for (j = del / 2; j != 0; j--) {
101251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        WORD32 w1h = *twiddles;
101351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        WORD32 w1l = *(twiddles + 1);
101451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        WORD32 tmp;
101551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        twiddles += nodespacing * 2;
101651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
101751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0r = *ptr_y;
101851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0i = *(ptr_y + 1);
101951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        ptr_y += (del << 1);
102051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
102151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = *ptr_y;
102251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = *(ptr_y + 1);
102351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
102451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        tmp = (ixheaacd_mult32(x1r, w1l) - ixheaacd_mult32(x1i, w1h));
102551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = ixheaacd_mac32(ixheaacd_mult32(x1r, w1h), x1i, w1l);
102651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = tmp;
102751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
102851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *ptr_y = (x0r) / 2 - (x1r) / 2;
102951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(ptr_y + 1) = (x0i) / 2 - (x1i) / 2;
103051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        ptr_y -= (del << 1);
103151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
103251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *ptr_y = (x0r) / 2 + (x1r) / 2;
103351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(ptr_y + 1) = (x0i) / 2 + (x1i) / 2;
103451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        ptr_y += 2;
103551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
103651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      twiddles = ptr_w;
103751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      for (j = del / 2; j != 0; j--) {
103851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        WORD32 w1h = *twiddles;
103951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        WORD32 w1l = *(twiddles + 1);
104051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        WORD32 tmp;
104151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        twiddles += nodespacing * 2;
104251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
104351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0r = *ptr_y;
104451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0i = *(ptr_y + 1);
104551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        ptr_y += (del << 1);
104651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
104751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = *ptr_y;
104851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = *(ptr_y + 1);
104951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
105051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        tmp = (ixheaacd_mult32(x1r, w1h) + ixheaacd_mult32(x1i, w1l));
105151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = -ixheaacd_mult32(x1r, w1l) + ixheaacd_mult32(x1i, w1h);
105251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = tmp;
105351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
105451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *ptr_y = (x0r) / 2 - (x1r) / 2;
105551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(ptr_y + 1) = (x0i) / 2 - (x1i) / 2;
105651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        ptr_y -= (del << 1);
105751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
105851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *ptr_y = (x0r) / 2 + (x1r) / 2;
105951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(ptr_y + 1) = (x0i) / 2 + (x1i) / 2;
106051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        ptr_y += 2;
106151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
106251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
106351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
106451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
106551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
106651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  else {
106751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    ptr_w = ixheaacd_twiddle_table_fft_32x32;
106851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
106951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    for (i = 0; i < npoints; i += 4) {
107051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      WORD32 *inp = ptr_x;
107151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
107251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      DIG_REV(i, dig_rev_shift, h2);
107351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      if (not_power_4) {
107451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        h2 += 1;
107551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        h2 &= ~1;
107651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
107751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      inp += (h2);
107851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
107951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x0r = *inp;
108051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x0i = *(inp + 1);
108151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      inp += (npoints >> 1);
108251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
108351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x1r = *inp;
108451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x1i = *(inp + 1);
108551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      inp += (npoints >> 1);
108651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
108751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x2r = *inp;
108851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x2i = *(inp + 1);
108951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      inp += (npoints >> 1);
109051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
109151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x3r = *inp;
109251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x3i = *(inp + 1);
109351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
109451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x0r = x0r + x2r;
109551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x0i = x0i + x2i;
109651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x2r = x0r - (x2r << 1);
109751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x2i = x0i - (x2i << 1);
109851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x1r = x1r + x3r;
109951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x1i = x1i + x3i;
110051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x3r = x1r - (x3r << 1);
110151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x3i = x1i - (x3i << 1);
110251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
110351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x0r = x0r + x1r;
110451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x0i = x0i + x1i;
110551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x1r = x0r - (x1r << 1);
110651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x1i = x0i - (x1i << 1);
110751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x2r = x2r - x3i;
110851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x2i = x2i + x3r;
110951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x3i = x2r + (x3i << 1);
111051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      x3r = x2i - (x3r << 1);
111151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
111251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      *ptr_y++ = x0r;
111351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      *ptr_y++ = x0i;
111451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      *ptr_y++ = x2r;
111551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      *ptr_y++ = x2i;
111651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      *ptr_y++ = x1r;
111751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      *ptr_y++ = x1i;
111851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      *ptr_y++ = x3i;
111951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      *ptr_y++ = x3r;
112051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
112151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    ptr_y -= 2 * npoints;
112251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    del = 4;
112351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    nodespacing = 64;
112451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    in_loop_cnt = npoints >> 4;
112551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    for (i = n_stages - 1; i > 0; i--) {
112651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      const WORD32 *twiddles = ptr_w;
112751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      WORD32 *data = ptr_y;
112851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      WORD32 w1h, w2h, w3h, w1l, w2l, w3l;
112951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      WORD32 sec_loop_cnt;
113051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
113151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      for (k = in_loop_cnt; k != 0; k--) {
113251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0r = (*data);
113351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0i = (*(data + 1));
113451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
113551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
113651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = (*data);
113751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = (*(data + 1));
113851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
113951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
114051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2r = (*data);
114151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2i = (*(data + 1));
114251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
114351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
114451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3r = (*data);
114551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3i = (*(data + 1));
114651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data -= 3 * (del << 1);
114751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
114851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0r = x0r + x2r;
114951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0i = x0i + x2i;
115051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2r = x0r - (x2r << 1);
115151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x2i = x0i - (x2i << 1);
115251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = x1r + x3r;
115351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = x1i + x3i;
115451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3r = x1r - (x3r << 1);
115551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x3i = x1i - (x3i << 1);
115651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
1157b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri        x0r = ixheaacd_add32_sat(x0r, x1r);
1158b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri        x0i = ixheaacd_add32_sat(x0i, x1i);
1159b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri        x1r = ixheaacd_sub32_sat(x0r, (x1r << 1));
1160b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri        x1i = ixheaacd_sub32_sat(x0i, (x1i << 1));
1161b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri        x2r = ixheaacd_sub32_sat(x2r, x3i);
1162b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri        x2i = ixheaacd_add32_sat(x2i, x3r);
1163b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri        x3i = ixheaacd_add32_sat(x2r, (x3i << 1));
1164b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri        x3r = ixheaacd_sub32_sat(x2i, (x3r << 1));
116551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
116651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *data = x0r;
116751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(data + 1) = x0i;
116851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
116951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
117051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *data = x2r;
117151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(data + 1) = x2i;
117251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
117351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
117451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *data = x1r;
117551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(data + 1) = x1i;
117651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
117751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
117851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *data = x3i;
117951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(data + 1) = x3r;
118051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += (del << 1);
118151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
118251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      data = ptr_y + 2;
118351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
118451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      sec_loop_cnt = (nodespacing * del);
118551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      sec_loop_cnt = (sec_loop_cnt / 4) + (sec_loop_cnt / 8) -
118651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                     (sec_loop_cnt / 16) + (sec_loop_cnt / 32) -
118751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                     (sec_loop_cnt / 64) + (sec_loop_cnt / 128) -
118851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                     (sec_loop_cnt / 256);
118951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      j = nodespacing;
119051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
119151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      for (j = nodespacing; j <= sec_loop_cnt; j += nodespacing) {
119251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1h = *(twiddles + 2 * j);
119351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w2h = *(twiddles + 2 * (j << 1));
119451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w3h = *(twiddles + 2 * j + 2 * (j << 1));
119551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1l = *(twiddles + 2 * j + 1);
119651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w2l = *(twiddles + 2 * (j << 1) + 1);
119751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w3l = *(twiddles + 2 * j + 2 * (j << 1) + 1);
119851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
119951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        for (k = in_loop_cnt; k != 0; k--) {
120051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          WORD32 tmp;
120151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
120251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
120351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
120451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
120551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = *data;
120651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = *(data + 1);
120751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
120851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
120951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = *data;
121051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = *(data + 1);
121151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
121251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
121351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = *data;
121451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = *(data + 1);
121551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data -= 3 * (del << 1);
121651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
121751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          tmp = (ixheaacd_mult32(x1r, w1l) + ixheaacd_mult32(x1i, w1h));
121851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = ixheaacd_mac32(-ixheaacd_mult32(x1r, w1h), x1i, w1l);
121951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = tmp;
122051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
122151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          tmp = (ixheaacd_mult32(x2r, w2l) + ixheaacd_mult32(x2i, w2h));
122251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = ixheaacd_mac32(-ixheaacd_mult32(x2r, w2h), x2i, w2l);
122351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = tmp;
122451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
122551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          tmp = (ixheaacd_mult32(x3r, w3l) + ixheaacd_mult32(x3i, w3h));
122651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = ixheaacd_mac32(-ixheaacd_mult32(x3r, w3h), x3i, w3l);
122751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = tmp;
122851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
122951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0r = (*data);
123051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0i = (*(data + 1));
123151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
123251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0r = x0r + (x2r);
123351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0i = x0i + (x2i);
123451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = x0r - (x2r << 1);
123551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = x0i - (x2i << 1);
123651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = x1r + x3r;
123751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = x1i + x3i;
123851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = x1r - (x3r << 1);
123951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = x1i - (x3i << 1);
124051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
124151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0r = x0r + (x1r);
124251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0i = x0i + (x1i);
124351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = x0r - (x1r << 1);
124451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = x0i - (x1i << 1);
124551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = x2r - (x3i);
124651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = x2i + (x3r);
124751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = x2r + (x3i << 1);
124851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = x2i - (x3r << 1);
124951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
125051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x0r;
125151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x0i;
125251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
125351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
125451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x2r;
125551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x2i;
125651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
125751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
125851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x1r;
125951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x1i;
126051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
126151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
126251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x3i;
126351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x3r;
126451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
126551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        }
126651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data -= 2 * npoints;
126751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += 2;
126851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
126951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      for (; j <= (nodespacing * del) >> 1; j += nodespacing) {
127051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1h = *(twiddles + 2 * j);
127151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w2h = *(twiddles + 2 * (j << 1));
127251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w3h = *(twiddles + 2 * j + 2 * (j << 1) - 512);
127351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1l = *(twiddles + 2 * j + 1);
127451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w2l = *(twiddles + 2 * (j << 1) + 1);
127551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w3l = *(twiddles + 2 * j + 2 * (j << 1) - 511);
127651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
127751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        for (k = in_loop_cnt; k != 0; k--) {
127851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          WORD32 tmp;
127951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
128051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
128151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
128251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
128351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = *data;
128451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = *(data + 1);
128551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
128651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
128751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = *data;
128851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = *(data + 1);
128951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
129051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
129151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = *data;
129251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = *(data + 1);
129351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data -= 3 * (del << 1);
129451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
129551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          tmp = (ixheaacd_mult32(x1r, w1l) + ixheaacd_mult32(x1i, w1h));
129651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = ixheaacd_mac32(-ixheaacd_mult32(x1r, w1h), x1i, w1l);
129751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = tmp;
129851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
129951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          tmp = (ixheaacd_mult32(x2r, w2l) + ixheaacd_mult32(x2i, w2h));
130051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = ixheaacd_mac32(-ixheaacd_mult32(x2r, w2h), x2i, w2l);
130151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = tmp;
130251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
130351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          tmp = (ixheaacd_mult32(x3r, w3h) - ixheaacd_mult32(x3i, w3l));
130451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = ixheaacd_mult32(x3r, w3l) + ixheaacd_mult32(x3i, w3h);
130551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = tmp;
130651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
130751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0r = (*data);
130851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0i = (*(data + 1));
130951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
131051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0r = x0r + (x2r);
131151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0i = x0i + (x2i);
131251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = x0r - (x2r << 1);
131351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = x0i - (x2i << 1);
131451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = x1r + x3r;
131551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = x1i + x3i;
131651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = x1r - (x3r << 1);
131751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = x1i - (x3i << 1);
131851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
131951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0r = x0r + (x1r);
132051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0i = x0i + (x1i);
132151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = x0r - (x1r << 1);
132251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = x0i - (x1i << 1);
132351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = x2r - (x3i);
132451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = x2i + (x3r);
132551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = x2r + (x3i << 1);
132651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = x2i - (x3r << 1);
132751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
132851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x0r;
132951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x0i;
133051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
133151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
133251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x2r;
133351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x2i;
133451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
133551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
133651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x1r;
133751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x1i;
133851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
133951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
134051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x3i;
134151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x3r;
134251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
134351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        }
134451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data -= 2 * npoints;
134551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += 2;
134651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
134751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      for (; j <= sec_loop_cnt * 2; j += nodespacing) {
134851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1h = *(twiddles + 2 * j);
134951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w2h = *(twiddles + 2 * (j << 1) - 512);
135051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w3h = *(twiddles + 2 * j + 2 * (j << 1) - 512);
135151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1l = *(twiddles + 2 * j + 1);
135251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w2l = *(twiddles + 2 * (j << 1) - 511);
135351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w3l = *(twiddles + 2 * j + 2 * (j << 1) - 511);
135451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
135551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        for (k = in_loop_cnt; k != 0; k--) {
135651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          WORD32 tmp;
135751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
135851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
135951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
136051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
136151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = *data;
136251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = *(data + 1);
136351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
136451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
136551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = *data;
136651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = *(data + 1);
136751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
136851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
136951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = *data;
137051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = *(data + 1);
137151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data -= 3 * (del << 1);
137251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
137351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          tmp = (ixheaacd_mult32(x1r, w1l) + ixheaacd_mult32(x1i, w1h));
137451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = ixheaacd_mac32(-ixheaacd_mult32(x1r, w1h), x1i, w1l);
137551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = tmp;
137651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
137751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          tmp = (ixheaacd_mult32(x2r, w2h) - ixheaacd_mult32(x2i, w2l));
137851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = ixheaacd_mult32(x2r, w2l) + ixheaacd_mult32(x2i, w2h);
137951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = tmp;
138051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
138151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          tmp = (ixheaacd_mult32(x3r, w3h) - ixheaacd_mult32(x3i, w3l));
138251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = ixheaacd_mult32(x3r, w3l) + ixheaacd_mult32(x3i, w3h);
138351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = tmp;
138451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
138551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0r = (*data);
138651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0i = (*(data + 1));
138751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
138851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0r = x0r + (x2r);
138951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0i = x0i + (x2i);
139051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = x0r - (x2r << 1);
139151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = x0i - (x2i << 1);
139251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = x1r + x3r;
139351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = x1i + x3i;
139451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = x1r - (x3r << 1);
139551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = x1i - (x3i << 1);
139651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
139751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0r = x0r + (x1r);
139851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0i = x0i + (x1i);
139951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = x0r - (x1r << 1);
140051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = x0i - (x1i << 1);
140151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = x2r - (x3i);
140251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = x2i + (x3r);
140351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = x2r + (x3i << 1);
140451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = x2i - (x3r << 1);
140551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
140651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x0r;
140751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x0i;
140851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
140951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
141051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x2r;
141151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x2i;
141251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
141351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
141451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x1r;
141551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x1i;
141651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
141751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
141851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x3i;
141951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x3r;
142051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
142151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        }
142251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data -= 2 * npoints;
142351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += 2;
142451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
142551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      for (; j < nodespacing * del; j += nodespacing) {
142651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1h = *(twiddles + 2 * j);
142751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w2h = *(twiddles + 2 * (j << 1) - 512);
142851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w3h = *(twiddles + 2 * j + 2 * (j << 1) - 1024);
142951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1l = *(twiddles + 2 * j + 1);
143051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w2l = *(twiddles + 2 * (j << 1) - 511);
143151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w3l = *(twiddles + 2 * j + 2 * (j << 1) - 1023);
143251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
143351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        for (k = in_loop_cnt; k != 0; k--) {
143451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          WORD32 tmp;
143551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
143651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
143751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
143851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
143951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = *data;
144051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = *(data + 1);
144151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
144251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
144351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = *data;
144451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = *(data + 1);
144551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
144651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
144751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = *data;
144851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = *(data + 1);
144951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data -= 3 * (del << 1);
145051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
145151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          tmp = (ixheaacd_mult32(x1r, w1l) + ixheaacd_mult32(x1i, w1h));
145251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = ixheaacd_mac32(-ixheaacd_mult32(x1r, w1h), x1i, w1l);
145351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = tmp;
145451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
145551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          tmp = (ixheaacd_mult32(x2r, w2h) - ixheaacd_mult32(x2i, w2l));
145651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = ixheaacd_mult32(x2r, w2l) + ixheaacd_mult32(x2i, w2h);
145751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = tmp;
145851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
145951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          tmp = (-ixheaacd_mult32(x3r, w3l) - ixheaacd_mult32(x3i, w3h));
146051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = ixheaacd_mac32(-ixheaacd_mult32(x3r, w3h), x3i, w3l);
146151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = tmp;
146251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
146351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0r = (*data);
146451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0i = (*(data + 1));
146551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
146651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0r = x0r + (x2r);
146751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0i = x0i + (x2i);
146851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = x0r - (x2r << 1);
146951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = x0i - (x2i << 1);
147051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = x1r + x3r;
147151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = x1i - x3i;
147251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = x1r - (x3r << 1);
147351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = x1i + (x3i << 1);
147451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
147551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0r = x0r + (x1r);
147651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x0i = x0i + (x1i);
147751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1r = x0r - (x1r << 1);
147851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x1i = x0i - (x1i << 1);
147951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2r = x2r - (x3i);
148051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x2i = x2i + (x3r);
148151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3i = x2r + (x3i << 1);
148251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          x3r = x2i - (x3r << 1);
148351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
148451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x0r;
148551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x0i;
148651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
148751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
148851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x2r;
148951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x2i;
149051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
149151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
149251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x1r;
149351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x1i;
149451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
149551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
149651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *data = x3i;
149751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          *(data + 1) = x3r;
149851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          data += (del << 1);
149951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        }
150051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data -= 2 * npoints;
150151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        data += 2;
150251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
150351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      nodespacing >>= 2;
150451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      del <<= 2;
150551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      in_loop_cnt >>= 2;
150651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
150751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    if (not_power_4) {
150851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      const WORD32 *twiddles = ptr_w;
150951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      nodespacing <<= 1;
151051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      shift += 1;
151151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      for (j = del / 2; j != 0; j--) {
151251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        WORD32 w1h = *twiddles;
151351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        WORD32 w1l = *(twiddles + 1);
151451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
151551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        WORD32 tmp;
151651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        twiddles += nodespacing * 2;
151751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
151851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0r = *ptr_y;
151951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0i = *(ptr_y + 1);
152051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        ptr_y += (del << 1);
152151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
152251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = *ptr_y;
152351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = *(ptr_y + 1);
152451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
152551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        tmp = (ixheaacd_mult32(x1r, w1l) + ixheaacd_mult32(x1i, w1h));
152651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = ixheaacd_mac32(-ixheaacd_mult32(x1r, w1h), x1i, w1l);
152751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = tmp;
152851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
152951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *ptr_y = (x0r) / 2 - (x1r) / 2;
153051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(ptr_y + 1) = (x0i) / 2 - (x1i) / 2;
153151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        ptr_y -= (del << 1);
153251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
153351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *ptr_y = (x0r) / 2 + (x1r) / 2;
153451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(ptr_y + 1) = (x0i) / 2 + (x1i) / 2;
153551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        ptr_y += 2;
153651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
153751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      twiddles = ptr_w;
153851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      for (j = del / 2; j != 0; j--) {
153951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        WORD32 w1h = *twiddles;
154051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        WORD32 w1l = *(twiddles + 1);
154151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        WORD32 tmp;
154251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        twiddles += nodespacing * 2;
154351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
154451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0r = *ptr_y;
154551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x0i = *(ptr_y + 1);
154651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        ptr_y += (del << 1);
154751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
154851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = *ptr_y;
154951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = *(ptr_y + 1);
155051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
155151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        tmp = (ixheaacd_mult32(x1r, w1h) - ixheaacd_mult32(x1i, w1l));
155251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1i = ixheaacd_mult32(x1r, w1l) + ixheaacd_mult32(x1i, w1h);
155351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        x1r = tmp;
155451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
155551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *ptr_y = (x0r) / 2 - (x1r) / 2;
155651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(ptr_y + 1) = (x0i) / 2 - (x1i) / 2;
155751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        ptr_y -= (del << 1);
155851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
155951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *ptr_y = (x0r) / 2 + (x1r) / 2;
156051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        *(ptr_y + 1) = (x0i) / 2 + (x1i) / 2;
156151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        ptr_y += 2;
156251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
156351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
156451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
156551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
156651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  for (i = 0; i < nlength; i++) {
156751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    xr[i] = y[2 * i];
156851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    xi[i] = y[2 * i + 1];
156951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
157051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
157151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  *preshift = shift - *preshift;
157251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  return;
157351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick}
157451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
157551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickstatic PLATFORM_INLINE void ixheaacd_complex_3point_fft(WORD32 *inp, WORD32 *op,
157651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                                                        WORD32 sign_dir) {
157751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 add_r, sub_r;
157851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 add_i, sub_i;
157951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 temp_real, temp_imag, temp;
158051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
158151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 p1, p2, p3, p4;
158251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
158351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 sinmu;
158451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  sinmu = -1859775393 * sign_dir;
158551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
158651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  temp_real = ixheaacd_add32_sat(inp[0], inp[2]);
158751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  temp_imag = ixheaacd_add32_sat(inp[1], inp[3]);
158851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
158951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  add_r = ixheaacd_add32_sat(inp[2], inp[4]);
159051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  add_i = ixheaacd_add32_sat(inp[3], inp[5]);
159151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
159251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  sub_r = ixheaacd_sub32_sat(inp[2], inp[4]);
159351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  sub_i = ixheaacd_sub32_sat(inp[3], inp[5]);
159451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
159551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  p1 = add_r >> 1;
159651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  p4 = add_i >> 1;
159751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  p2 = ixheaacd_mult32_shl(sub_i, sinmu);
159851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  p3 = ixheaacd_mult32_shl(sub_r, sinmu);
159951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
160051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  temp = ixheaacd_sub32(inp[0], p1);
160151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
160251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  op[0] = ixheaacd_add32_sat(temp_real, inp[4]);
160351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  op[1] = ixheaacd_add32_sat(temp_imag, inp[5]);
160451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  op[2] = ixheaacd_add32_sat(temp, p2);
160551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  op[3] = ixheaacd_sub32_sat(ixheaacd_sub32_sat(inp[1], p3), p4);
160651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  op[4] = ixheaacd_sub32_sat(temp, p2);
160751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  op[5] = ixheaacd_sub32_sat(ixheaacd_add32_sat(inp[1], p3), p4);
160851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
160951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  return;
161051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick}
161151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
161251aa06e124ba688ca810b25ee0b5bb66678aac14Ray EssickVOID ixheaacd_complex_fft_p3(WORD32 *xr, WORD32 *xi, WORD32 nlength,
161351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                             WORD32 fft_mode, WORD32 *preshift) {
161451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 i, j;
161551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 shift = 0;
161651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 xr_3[384];
161751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 xi_3[384];
161851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 x[1024];
161951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 y[1024];
162051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 cnfac, npts;
162151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 mpass = nlength;
162251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 n = 0;
162351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 *ptr_x = x;
162451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 *ptr_y = y;
162551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
162651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  cnfac = 0;
162751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  while (mpass % 3 == 0) {
162851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    mpass /= 3;
162951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    cnfac++;
163051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
163151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  npts = mpass;
163251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
163351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  for (i = 0; i < 3 * cnfac; i++) {
163451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    for (j = 0; j < mpass; j++) {
163551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      xr_3[j] = xr[3 * j + i];
163651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      xi_3[j] = xi[3 * j + i];
163751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
163851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
163951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    (*ixheaacd_complex_fft_p2)(xr_3, xi_3, mpass, fft_mode, &shift);
164051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
164151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    for (j = 0; j < mpass; j++) {
164251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      xr[3 * j + i] = xr_3[j];
164351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      xi[3 * j + i] = xi_3[j];
164451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
164551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
164651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
164751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  while (npts >> 1) {
164851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    n++;
164951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    npts = npts >> 1;
165051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
165151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
165251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  if (n % 2 == 0)
165351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    shift = ((n + 4)) / 2;
165451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  else
165551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    shift = ((n + 5) / 2);
165651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
165751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  *preshift = shift - *preshift + 1;
165851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
165951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  for (i = 0; i < nlength; i++) {
166051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    ptr_x[2 * i] = (xr[i] >> 1);
166151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    ptr_x[2 * i + 1] = (xi[i] >> 1);
166251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
166351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
166451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  {
166551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    const WORD32 *w1r, *w1i;
166651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    WORD32 tmp;
166751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    w1r = ixheaacd_twiddle_table_3pr;
166851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    w1i = ixheaacd_twiddle_table_3pi;
166951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
167051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    if (fft_mode < 0) {
167151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      for (i = 0; i < nlength; i += 3) {
167251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        tmp = ixheaacd_sub32_sat(ixheaacd_mult32(ptr_x[2 * i], (*w1r)),
167351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                                 ixheaacd_mult32(ptr_x[2 * i + 1], (*w1i)));
167451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        ptr_x[2 * i + 1] =
167551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick            ixheaacd_add32_sat(ixheaacd_mult32(ptr_x[2 * i], (*w1i)),
167651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                               ixheaacd_mult32(ptr_x[2 * i + 1], (*w1r)));
167751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        ptr_x[2 * i] = tmp;
167851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
167951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1r++;
168051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1i++;
168151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
168251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        tmp = ixheaacd_sub32_sat(ixheaacd_mult32(ptr_x[2 * i + 2], (*w1r)),
168351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                                 ixheaacd_mult32(ptr_x[2 * i + 3], (*w1i)));
168451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        ptr_x[2 * i + 3] =
168551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick            ixheaacd_add32_sat(ixheaacd_mult32(ptr_x[2 * i + 2], (*w1i)),
168651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                               ixheaacd_mult32(ptr_x[2 * i + 3], (*w1r)));
168751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        ptr_x[2 * i + 2] = tmp;
168851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
168951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1r++;
169051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1i++;
169151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
169251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        tmp = ixheaacd_sub32_sat(ixheaacd_mult32(ptr_x[2 * i + 4], (*w1r)),
169351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                                 ixheaacd_mult32(ptr_x[2 * i + 5], (*w1i)));
169451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        ptr_x[2 * i + 5] =
169551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick            ixheaacd_add32_sat(ixheaacd_mult32(ptr_x[2 * i + 4], (*w1i)),
169651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                               ixheaacd_mult32(ptr_x[2 * i + 5], (*w1r)));
169751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        ptr_x[2 * i + 4] = tmp;
169851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
169951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1r += 3 * (128 / mpass - 1) + 1;
170051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1i += 3 * (128 / mpass - 1) + 1;
170151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
170251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
170351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
170451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    else {
170551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      for (i = 0; i < nlength; i += 3) {
170651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        tmp = ixheaacd_add32_sat(ixheaacd_mult32(ptr_x[2 * i], (*w1r)),
170751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                                 ixheaacd_mult32(ptr_x[2 * i + 1], (*w1i)));
170851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        ptr_x[2 * i + 1] =
170951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick            ixheaacd_sub32_sat(ixheaacd_mult32(ptr_x[2 * i + 1], (*w1r)),
171051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                               ixheaacd_mult32(ptr_x[2 * i], (*w1i)));
171151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        ptr_x[2 * i] = tmp;
171251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
171351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1r++;
171451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1i++;
171551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
171651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        tmp = ixheaacd_add32_sat(ixheaacd_mult32(ptr_x[2 * i + 2], (*w1r)),
171751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                                 ixheaacd_mult32(ptr_x[2 * i + 3], (*w1i)));
171851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        ptr_x[2 * i + 3] =
171951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick            ixheaacd_sub32_sat(ixheaacd_mult32(ptr_x[2 * i + 3], (*w1r)),
172051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                               ixheaacd_mult32(ptr_x[2 * i + 2], (*w1i)));
172151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        ptr_x[2 * i + 2] = tmp;
172251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
172351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1r++;
172451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1i++;
172551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
172651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        tmp = ixheaacd_add32_sat(ixheaacd_mult32(ptr_x[2 * i + 4], (*w1r)),
172751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                                 ixheaacd_mult32(ptr_x[2 * i + 5], (*w1i)));
172851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        ptr_x[2 * i + 5] =
172951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick            ixheaacd_sub32_sat(ixheaacd_mult32(ptr_x[2 * i + 5], (*w1r)),
173051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                               ixheaacd_mult32(ptr_x[2 * i + 4], (*w1i)));
173151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        ptr_x[2 * i + 4] = tmp;
173251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
173351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1r += 3 * (128 / mpass - 1) + 1;
173451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        w1i += 3 * (128 / mpass - 1) + 1;
173551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
173651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
173751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
173851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
173951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  for (i = 0; i < mpass; i++) {
174051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    ixheaacd_complex_3point_fft(ptr_x, ptr_y, fft_mode);
174151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
174251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    ptr_x = ptr_x + 6;
174351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    ptr_y = ptr_y + 6;
174451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
174551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
174651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  for (i = 0; i < mpass; i++) {
174751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    xr[i] = y[6 * i];
174851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    xi[i] = y[6 * i + 1];
174951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
175051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
175151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  for (i = 0; i < mpass; i++) {
175251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    xr[mpass + i] = y[6 * i + 2];
175351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    xi[mpass + i] = y[6 * i + 3];
175451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
175551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
175651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  for (i = 0; i < mpass; i++) {
175751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    xr[2 * mpass + i] = y[6 * i + 4];
175851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    xi[2 * mpass + i] = y[6 * i + 5];
175951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
176051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  return;
176151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick}
176251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
176351aa06e124ba688ca810b25ee0b5bb66678aac14Ray EssickVOID ixheaacd_complex_fft(WORD32 *data_r, WORD32 *data_i, WORD32 nlength,
176451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                          WORD32 fft_mode, WORD32 *preshift) {
176551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  if (nlength & (nlength - 1)) {
176651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    if ((nlength != 24) && (nlength != 48) && (nlength != 96) &&
176751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        (nlength != 192) && (nlength != 384)) {
176851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      printf("%d point FFT not supported", nlength);
176951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      exit(0);
177051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
177151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    ixheaacd_complex_fft_p3(data_r, data_i, nlength, fft_mode, preshift);
177251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  } else
177351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    (*ixheaacd_complex_fft_p2)(data_r, data_i, nlength, fft_mode, preshift);
177451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
177551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  return;
177651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick}
1777