/******************************************************************************
 *                                                                            *
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *****************************************************************************
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
*/
#include <stdlib.h>
#include <stdio.h>

#include <ixheaacd_type_def.h>
#include "ixheaacd_interface.h"
#include "ixheaacd_constants.h"
#include <ixheaacd_basic_ops32.h>
#include "ixheaacd_basic_ops40.h"
#include "ixheaacd_function_selector.h"

extern const WORD32 ixheaacd_twiddle_table_fft_32x32[514];
extern const WORD32 ixheaacd_twiddle_table_3pr[1155];
extern const WORD32 ixheaacd_twiddle_table_3pi[1155];
extern const WORD8 ixheaacd_mps_dig_rev[16];

#define PLATFORM_INLINE __inline

#define DIG_REV(i, m, j)                                    \
  do {                                                      \
    unsigned _ = (i);                                       \
    _ = ((_ & 0x33333333) << 2) | ((_ & ~0x33333333) >> 2); \
    _ = ((_ & 0x0F0F0F0F) << 4) | ((_ & ~0x0F0F0F0F) >> 4); \
    _ = ((_ & 0x00FF00FF) << 8) | ((_ & ~0x00FF00FF) >> 8); \
    (j) = _ >> (m);                                         \
  } while (0)

static PLATFORM_INLINE WORD32 ixheaacd_mult32_sat(WORD32 a, WORD32 b) {
  WORD32 result;
  WORD64 temp_result;

  temp_result = (WORD64)a * (WORD64)b;
  result = ixheaacd_sat64_32(temp_result >> 31);

  return (result);
}

static PLATFORM_INLINE WORD32 ixheaacd_mac32_sat(WORD32 a, WORD32 b, WORD32 c) {
  WORD32 result;

  result = ixheaacd_add32_sat(a, ixheaacd_mult32_sat(b, c));

  return (result);
}


VOID ixheaacd_mps_complex_fft_64_dec(WORD32 *ptr_x, WORD32 *fin_re,
                                     WORD32 *fin_im, WORD32 nlength) {
  WORD32 i, j, k, n_stages;
  WORD32 h2, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
  WORD32 del, nodespacing, in_loop_cnt;
  WORD32 y[128];
  WORD32 npoints = nlength;
  WORD32 *ptr_y = y;
  const WORD32 *ptr_w;
  n_stages = 30 - ixheaacd_norm32(npoints);

  n_stages = n_stages >> 1;

  ptr_w = ixheaacd_twiddle_table_fft_32x32;

  for (i = 0; i < npoints; i += 4) {
    WORD32 *inp = ptr_x;
    h2 = ixheaacd_mps_dig_rev[i >> 2];
    inp += (h2);

    x0r = *inp;
    x0i = *(inp + 1);
    inp += (npoints >> 1);

    x1r = *inp;
    x1i = *(inp + 1);
    inp += (npoints >> 1);

    x2r = *inp;
    x2i = *(inp + 1);
    inp += (npoints >> 1);

    x3r = *inp;
    x3i = *(inp + 1);

    x0r = ixheaacd_add32_sat(x0r, x2r);
    x0i = ixheaacd_add32_sat(x0i, x2i);
    x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
    x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
    x1r = ixheaacd_add32_sat(x1r, x3r);
    x1i = ixheaacd_add32_sat(x1i, x3i);
    x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
    x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));

    x0r = ixheaacd_add32_sat(x0r, x1r);
    x0i = ixheaacd_add32_sat(x0i, x1i);
    x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
    x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
    x2r = ixheaacd_add32_sat(x2r, x3i);
    x2i = ixheaacd_sub32_sat(x2i, x3r);
    x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
    x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));

    *ptr_y++ = x0r;
    *ptr_y++ = x0i;
    *ptr_y++ = x2r;
    *ptr_y++ = x2i;
    *ptr_y++ = x1r;
    *ptr_y++ = x1i;
    *ptr_y++ = x3i;
    *ptr_y++ = x3r;
  }
  ptr_y -= 2 * npoints;
  del = 4;
  nodespacing = 64;
  in_loop_cnt = npoints >> 4;
  for (i = n_stages - 1; i > 0; i--) {
    const WORD32 *twiddles = ptr_w;
    WORD32 *data = ptr_y;
    WORD32 w1h, w2h, w3h, w1l, w2l, w3l;
    WORD32 sec_loop_cnt;

    for (k = in_loop_cnt; k != 0; k--) {
      x0r = (*data);
      x0i = (*(data + 1));
      data += (del << 1);

      x1r = (*data);
      x1i = (*(data + 1));
      data += (del << 1);

      x2r = (*data);
      x2i = (*(data + 1));
      data += (del << 1);

      x3r = (*data);
      x3i = (*(data + 1));
      data -= 3 * (del << 1);

      x0r = ixheaacd_add32_sat(x0r, x2r);
      x0i = ixheaacd_add32_sat(x0i, x2i);
      x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
      x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
      x1r = ixheaacd_add32_sat(x1r, x3r);
      x1i = ixheaacd_add32_sat(x1i, x3i);
      x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
      x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));

      x0r = ixheaacd_add32_sat(x0r, x1r);
      x0i = ixheaacd_add32_sat(x0i, x1i);
      x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
      x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
      x2r = ixheaacd_add32_sat(x2r, x3i);
      x2i = ixheaacd_sub32_sat(x2i, x3r);
      x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
      x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));

      *data = x0r;
      *(data + 1) = x0i;
      data += (del << 1);

      *data = x2r;
      *(data + 1) = x2i;
      data += (del << 1);

      *data = x1r;
      *(data + 1) = x1i;
      data += (del << 1);

      *data = x3i;
      *(data + 1) = x3r;
      data += (del << 1);
    }
    data = ptr_y + 2;

    sec_loop_cnt = (nodespacing * del);
    sec_loop_cnt = (sec_loop_cnt / 4) + (sec_loop_cnt / 8) -
                   (sec_loop_cnt / 16) + (sec_loop_cnt / 32) -
                   (sec_loop_cnt / 64) + (sec_loop_cnt / 128) -
                   (sec_loop_cnt / 256);
    j = nodespacing;

    for (j = nodespacing; j <= sec_loop_cnt; j += nodespacing) {
      w1h = *(twiddles + 2 * j);
      w1l = *(twiddles + 2 * j + 1);
      w2h = *(twiddles + 2 * (j << 1));
      w2l = *(twiddles + 2 * (j << 1) + 1);
      w3h = *(twiddles + 2 * j + 2 * (j << 1));
      w3l = *(twiddles + 2 * j + 2 * (j << 1) + 1);

      for (k = in_loop_cnt; k != 0; k--) {
        WORD32 tmp;
        WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;

        data += (del << 1);

        x1r = *data;
        x1i = *(data + 1);
        data += (del << 1);

        x2r = *data;
        x2i = *(data + 1);
        data += (del << 1);

        x3r = *data;
        x3i = *(data + 1);
        data -= 3 * (del << 1);

        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x1r, w1l),
                                 ixheaacd_mult32_sat(x1i, w1h));
        x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
        x1r = tmp;

        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x2r, w2l),
                                 ixheaacd_mult32_sat(x2i, w2h));
        x2i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x2r, w2h), x2i, w2l);
        x2r = tmp;

        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x3r, w3l),
                                 ixheaacd_mult32_sat(x3i, w3h));
        x3i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x3r, w3h), x3i, w3l);
        x3r = tmp;

        x0r = (*data);
        x0i = (*(data + 1));

        x0r = ixheaacd_add32_sat(x0r, x2r);
        x0i = ixheaacd_add32_sat(x0i, x2i);
        x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
        x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
        x1r = ixheaacd_add32_sat(x1r, x3r);
        x1i = ixheaacd_add32_sat(x1i, x3i);
        x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
        x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));

        x0r = ixheaacd_add32_sat(x0r, x1r);
        x0i = ixheaacd_add32_sat(x0i, x1i);
        x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
        x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
        x2r = ixheaacd_add32_sat(x2r, x3i);
        x2i = ixheaacd_sub32_sat(x2i, x3r);
        x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
        x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));

        *data = x0r;
        *(data + 1) = x0i;
        data += (del << 1);

        *data = x2r;
        *(data + 1) = x2i;
        data += (del << 1);

        *data = x1r;
        *(data + 1) = x1i;
        data += (del << 1);

        *data = x3i;
        *(data + 1) = x3r;
        data += (del << 1);
      }
      data -= 2 * npoints;
      data += 2;
    }
    for (; j <= (nodespacing * del) >> 1; j += nodespacing) {
      w1h = *(twiddles + 2 * j);
      w2h = *(twiddles + 2 * (j << 1));
      w3h = *(twiddles + 2 * j + 2 * (j << 1) - 512);
      w1l = *(twiddles + 2 * j + 1);
      w2l = *(twiddles + 2 * (j << 1) + 1);
      w3l = *(twiddles + 2 * j + 2 * (j << 1) - 511);

      for (k = in_loop_cnt; k != 0; k--) {
        WORD32 tmp;
        WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;

        data += (del << 1);

        x1r = *data;
        x1i = *(data + 1);
        data += (del << 1);

        x2r = *data;
        x2i = *(data + 1);
        data += (del << 1);

        x3r = *data;
        x3i = *(data + 1);
        data -= 3 * (del << 1);

        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x1r, w1l),
                                 ixheaacd_mult32_sat(x1i, w1h));
        x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
        x1r = tmp;

        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x2r, w2l),
                                 ixheaacd_mult32_sat(x2i, w2h));
        x2i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x2r, w2h), x2i, w2l);
        x2r = tmp;

        tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x3r, w3h),
                                 ixheaacd_mult32_sat(x3i, w3l));
        x3i = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x3i, w3h),
                                 ixheaacd_mult32_sat(x3r, w3l));
        x3r = tmp;

        x0r = (*data);
        x0i = (*(data + 1));

        x0r = ixheaacd_add32_sat(x0r, x2r);
        x0i = ixheaacd_add32_sat(x0i, x2i);
        x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
        x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
        x1r = ixheaacd_add32_sat(x1r, x3r);
        x1i = ixheaacd_add32_sat(x1i, x3i);
        x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
        x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));

        x0r = ixheaacd_add32_sat(x0r, x1r);
        x0i = ixheaacd_add32_sat(x0i, x1i);
        x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
        x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
        x2r = ixheaacd_add32_sat(x2r, x3i);
        x2i = ixheaacd_sub32_sat(x2i, x3r);
        x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
        x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));

        *data = x0r;
        *(data + 1) = x0i;
        data += (del << 1);

        *data = x2r;
        *(data + 1) = x2i;
        data += (del << 1);

        *data = x1r;
        *(data + 1) = x1i;
        data += (del << 1);

        *data = x3i;
        *(data + 1) = x3r;
        data += (del << 1);
      }
      data -= 2 * npoints;
      data += 2;
    }
    for (; j <= sec_loop_cnt * 2; j += nodespacing) {
      w1h = *(twiddles + 2 * j);
      w2h = *(twiddles + 2 * (j << 1) - 512);
      w3h = *(twiddles + 2 * j + 2 * (j << 1) - 512);
      w1l = *(twiddles + 2 * j + 1);
      w2l = *(twiddles + 2 * (j << 1) - 511);
      w3l = *(twiddles + 2 * j + 2 * (j << 1) - 511);

      for (k = in_loop_cnt; k != 0; k--) {
        WORD32 tmp;
        WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;

        data += (del << 1);

        x1r = *data;
        x1i = *(data + 1);
        data += (del << 1);

        x2r = *data;
        x2i = *(data + 1);
        data += (del << 1);

        x3r = *data;
        x3i = *(data + 1);
        data -= 3 * (del << 1);

        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x1r, w1l),
                                 ixheaacd_mult32_sat(x1i, w1h));
        x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
        x1r = tmp;

        tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x2r, w2h),
                                 ixheaacd_mult32_sat(x2i, w2l));
        x2i = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x2i, w2h),
                                 ixheaacd_mult32_sat(x2r, w2l));
        x2r = tmp;

        tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x3r, w3h),
                                 ixheaacd_mult32_sat(x3i, w3l));
        x3i = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x3i, w3h),
                                 ixheaacd_mult32_sat(x3r, w3l));
        x3r = tmp;

        x0r = (*data);
        x0i = (*(data + 1));

        x0r = ixheaacd_add32_sat(x0r, x2r);
        x0i = ixheaacd_add32_sat(x0i, x2i);
        x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
        x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
        x1r = ixheaacd_add32_sat(x1r, x3r);
        x1i = ixheaacd_add32_sat(x1i, x3i);
        x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
        x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));

        x0r = ixheaacd_add32_sat(x0r, x1r);
        x0i = ixheaacd_add32_sat(x0i, x1i);
        x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
        x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
        x2r = ixheaacd_add32_sat(x2r, x3i);
        x2i = ixheaacd_sub32_sat(x2i, x3r);
        x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
        x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));

        *data = x0r;
        *(data + 1) = x0i;
        data += (del << 1);

        *data = x2r;
        *(data + 1) = x2i;
        data += (del << 1);

        *data = x1r;
        *(data + 1) = x1i;
        data += (del << 1);

        *data = x3i;
        *(data + 1) = x3r;
        data += (del << 1);
      }
      data -= 2 * npoints;
      data += 2;
    }
    for (; j < nodespacing * del; j += nodespacing) {
      w1h = *(twiddles + 2 * j);
      w2h = *(twiddles + 2 * (j << 1) - 512);
      w3h = *(twiddles + 2 * j + 2 * (j << 1) - 1024);
      w1l = *(twiddles + 2 * j + 1);
      w2l = *(twiddles + 2 * (j << 1) - 511);
      w3l = *(twiddles + 2 * j + 2 * (j << 1) - 1023);

      for (k = in_loop_cnt; k != 0; k--) {
        WORD32 tmp;
        WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;

        data += (del << 1);

        x1r = *data;
        x1i = *(data + 1);
        data += (del << 1);

        x2r = *data;
        x2i = *(data + 1);
        data += (del << 1);

        x3r = *data;
        x3i = *(data + 1);
        data -= 3 * (del << 1);

        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x1r, w1l),
                                 ixheaacd_mult32_sat(x1i, w1h));
        x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
        x1r = tmp;

        tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x2r, w2h),
                                 ixheaacd_mult32_sat(x2i, w2l));
        x2i = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x2i, w2h),
                                 ixheaacd_mult32_sat(x2r, w2l));
        x2r = tmp;

        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x3i, w3h),
                                 ixheaacd_mult32_sat(x3r, w3l));
        x3i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x3r, w3h), x3i, w3l);
        x3r = tmp;

        x0r = (*data);
        x0i = (*(data + 1));

        x0r = ixheaacd_add32_sat(x0r, x2r);
        x0i = ixheaacd_add32_sat(x0i, x2i);
        x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
        x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
        x1r = ixheaacd_add32_sat(x1r, x3r);
        x1i = ixheaacd_sub32_sat(x1i, x3i);
        x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
        x3i = ixheaacd_add32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));

        x0r = ixheaacd_add32_sat(x0r, x1r);
        x0i = ixheaacd_add32_sat(x0i, x1i);
        x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
        x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
        x2r = ixheaacd_add32_sat(x2r, x3i);
        x2i = ixheaacd_sub32_sat(x2i, x3r);
        x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
        x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));

        *data = x0r;
        *(data + 1) = x0i;
        data += (del << 1);

        *data = x2r;
        *(data + 1) = x2i;
        data += (del << 1);

        *data = x1r;
        *(data + 1) = x1i;
        data += (del << 1);

        *data = x3i;
        *(data + 1) = x3r;
        data += (del << 1);
      }
      data -= 2 * npoints;
      data += 2;
    }
    nodespacing >>= 2;
    del <<= 2;
    in_loop_cnt >>= 2;
  }

  for (i = 0; i < 2 * nlength; i += 2) {
    fin_re[i] = y[i];
    fin_im[i] = y[i + 1];
  }

  return;
}

VOID ixheaacd_complex_fft_p2_dec(WORD32 *xr, WORD32 *xi, WORD32 nlength,
                                 WORD32 fft_mode, WORD32 *preshift) {
  WORD32 i, j, k, n_stages;
  WORD32 h2, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
  WORD32 del, nodespacing, in_loop_cnt;
  WORD32 not_power_4;
  WORD32 npts, shift;
  WORD32 dig_rev_shift;
  WORD32 ptr_x[1024];
  WORD32 y[1024];
  WORD32 npoints = nlength;
  WORD32 n = 0;
  WORD32 *ptr_y = y;
  const WORD32 *ptr_w;
  dig_rev_shift = ixheaacd_norm32(npoints) + 1 - 16;
  n_stages = 30 - ixheaacd_norm32(npoints);
  not_power_4 = n_stages & 1;

  n_stages = n_stages >> 1;

  npts = npoints;
  while (npts >> 1) {
    n++;
    npts = npts >> 1;
  }

  if (n % 2 == 0)
    shift = ((n + 4)) / 2;
  else
    shift = ((n + 3) / 2);

  for (i = 0; i < nlength; i++) {
    ptr_x[2 * i] = (xr[i] / (1 << (shift)));
    ptr_x[2 * i + 1] = (xi[i] / (1 << (shift)));
  }

  if (fft_mode == -1) {
    ptr_w = ixheaacd_twiddle_table_fft_32x32;

    for (i = 0; i < npoints; i += 4) {
      WORD32 *inp = ptr_x;

      DIG_REV(i, dig_rev_shift, h2);
      if (not_power_4) {
        h2 += 1;
        h2 &= ~1;
      }
      inp += (h2);

      x0r = *inp;
      x0i = *(inp + 1);
      inp += (npoints >> 1);

      x1r = *inp;
      x1i = *(inp + 1);
      inp += (npoints >> 1);

      x2r = *inp;
      x2i = *(inp + 1);
      inp += (npoints >> 1);

      x3r = *inp;
      x3i = *(inp + 1);

      x0r = ixheaacd_add32_sat(x0r, x2r);
      x0i = ixheaacd_add32_sat(x0i, x2i);
      x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
      x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
      x1r = ixheaacd_add32_sat(x1r, x3r);
      x1i = ixheaacd_add32_sat(x1i, x3i);
      x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
      x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));

      x0r = ixheaacd_add32_sat(x0r, x1r);
      x0i = ixheaacd_add32_sat(x0i, x1i);
      x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
      x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
      x2r = ixheaacd_add32_sat(x2r, x3i);
      x2i = ixheaacd_sub32_sat(x2i, x3r);
      x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
      x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));

      *ptr_y++ = x0r;
      *ptr_y++ = x0i;
      *ptr_y++ = x2r;
      *ptr_y++ = x2i;
      *ptr_y++ = x1r;
      *ptr_y++ = x1i;
      *ptr_y++ = x3i;
      *ptr_y++ = x3r;
    }
    ptr_y -= 2 * npoints;
    del = 4;
    nodespacing = 64;
    in_loop_cnt = npoints >> 4;
    for (i = n_stages - 1; i > 0; i--) {
      const WORD32 *twiddles = ptr_w;
      WORD32 *data = ptr_y;
      WORD32 w1h, w2h, w3h, w1l, w2l, w3l;
      WORD32 sec_loop_cnt;

      for (k = in_loop_cnt; k != 0; k--) {
        x0r = (*data);
        x0i = (*(data + 1));
        data += (del << 1);

        x1r = (*data);
        x1i = (*(data + 1));
        data += (del << 1);

        x2r = (*data);
        x2i = (*(data + 1));
        data += (del << 1);

        x3r = (*data);
        x3i = (*(data + 1));
        data -= 3 * (del << 1);

        x0r = ixheaacd_add32_sat(x0r, x2r);
        x0i = ixheaacd_add32_sat(x0i, x2i);
        x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
        x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
        x1r = ixheaacd_add32_sat(x1r, x3r);
        x1i = ixheaacd_add32_sat(x1i, x3i);
        x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
        x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));

        x0r = ixheaacd_add32_sat(x0r, x1r);
        x0i = ixheaacd_add32_sat(x0i, x1i);
        x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
        x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
        x2r = ixheaacd_add32_sat(x2r, x3i);
        x2i = ixheaacd_sub32_sat(x2i, x3r);
        x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
        x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));

        *data = x0r;
        *(data + 1) = x0i;
        data += (del << 1);

        *data = x2r;
        *(data + 1) = x2i;
        data += (del << 1);

        *data = x1r;
        *(data + 1) = x1i;
        data += (del << 1);

        *data = x3i;
        *(data + 1) = x3r;
        data += (del << 1);
      }
      data = ptr_y + 2;

      sec_loop_cnt = (nodespacing * del);
      sec_loop_cnt = (sec_loop_cnt / 4) + (sec_loop_cnt / 8) -
                     (sec_loop_cnt / 16) + (sec_loop_cnt / 32) -
                     (sec_loop_cnt / 64) + (sec_loop_cnt / 128) -
                     (sec_loop_cnt / 256);
      j = nodespacing;

      for (j = nodespacing; j <= sec_loop_cnt; j += nodespacing) {
        w1h = *(twiddles + 2 * j);
        w1l = *(twiddles + 2 * j + 1);
        w2h = *(twiddles + 2 * (j << 1));
        w2l = *(twiddles + 2 * (j << 1) + 1);
        w3h = *(twiddles + 2 * j + 2 * (j << 1));
        w3l = *(twiddles + 2 * j + 2 * (j << 1) + 1);

        for (k = in_loop_cnt; k != 0; k--) {
          WORD32 tmp;
          WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;

          data += (del << 1);

          x1r = *data;
          x1i = *(data + 1);
          data += (del << 1);

          x2r = *data;
          x2i = *(data + 1);
          data += (del << 1);

          x3r = *data;
          x3i = *(data + 1);
          data -= 3 * (del << 1);

          tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x1r, w1l),
                                   ixheaacd_mult32_sat(x1i, w1h));
          x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
          x1r = tmp;

          tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x2r, w2l),
                                   ixheaacd_mult32_sat(x2i, w2h));
          x2i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x2r, w2h), x2i, w2l);
          x2r = tmp;

          tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x3r, w3l),
                                   ixheaacd_mult32_sat(x3i, w3h));
          x3i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x3r, w3h), x3i, w3l);
          x3r = tmp;

          x0r = (*data);
          x0i = (*(data + 1));

          x0r = ixheaacd_add32_sat(x0r, x2r);
          x0i = ixheaacd_add32_sat(x0i, x2i);
          x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
          x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
          x1r = ixheaacd_add32_sat(x1r, x3r);
          x1i = ixheaacd_add32_sat(x1i, x3i);
          x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
          x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));

          x0r = ixheaacd_add32_sat(x0r, x1r);
          x0i = ixheaacd_add32_sat(x0i, x1i);
          x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
          x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
          x2r = ixheaacd_add32_sat(x2r, x3i);
          x2i = ixheaacd_sub32_sat(x2i, x3r);
          x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
          x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));

          *data = x0r;
          *(data + 1) = x0i;
          data += (del << 1);

          *data = x2r;
          *(data + 1) = x2i;
          data += (del << 1);

          *data = x1r;
          *(data + 1) = x1i;
          data += (del << 1);

          *data = x3i;
          *(data + 1) = x3r;
          data += (del << 1);
        }
        data -= 2 * npoints;
        data += 2;
      }
      for (; j <= (nodespacing * del) >> 1; j += nodespacing) {
        w1h = *(twiddles + 2 * j);
        w2h = *(twiddles + 2 * (j << 1));
        w3h = *(twiddles + 2 * j + 2 * (j << 1) - 512);
        w1l = *(twiddles + 2 * j + 1);
        w2l = *(twiddles + 2 * (j << 1) + 1);
        w3l = *(twiddles + 2 * j + 2 * (j << 1) - 511);

        for (k = in_loop_cnt; k != 0; k--) {
          WORD32 tmp;
          WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
          data += (del << 1);

          x1r = *data;
          x1i = *(data + 1);
          data += (del << 1);

          x2r = *data;
          x2i = *(data + 1);
          data += (del << 1);

          x3r = *data;
          x3i = *(data + 1);
          data -= 3 * (del << 1);

          tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x1r, w1l),
                                   ixheaacd_mult32_sat(x1i, w1h));
          x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
          x1r = tmp;

          tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x2r, w2l),
                                   ixheaacd_mult32_sat(x2i, w2h));
          x2i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x2r, w2h), x2i, w2l);
          x2r = tmp;

          tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x3r, w3h),
                                   ixheaacd_mult32_sat(x3i, w3l));
          x3i = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x3i, w3h),
                                   ixheaacd_mult32_sat(x3r, w3l));
          x3r = tmp;

          x0r = (*data);
          x0i = (*(data + 1));

          x0r = ixheaacd_add32_sat(x0r, x2r);
          x0i = ixheaacd_add32_sat(x0i, x2i);
          x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
          x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
          x1r = ixheaacd_add32_sat(x1r, x3r);
          x1i = ixheaacd_add32_sat(x1i, x3i);
          x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
          x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));

          x0r = ixheaacd_add32_sat(x0r, x1r);
          x0i = ixheaacd_add32_sat(x0i, x1i);
          x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
          x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
          x2r = ixheaacd_add32_sat(x2r, x3i);
          x2i = ixheaacd_sub32_sat(x2i, x3r);
          x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
          x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));

          *data = x0r;
          *(data + 1) = x0i;
          data += (del << 1);

          *data = x2r;
          *(data + 1) = x2i;
          data += (del << 1);

          *data = x1r;
          *(data + 1) = x1i;
          data += (del << 1);

          *data = x3i;
          *(data + 1) = x3r;
          data += (del << 1);
        }
        data -= 2 * npoints;
        data += 2;
      }
      for (; j <= sec_loop_cnt * 2; j += nodespacing) {
        w1h = *(twiddles + 2 * j);
        w2h = *(twiddles + 2 * (j << 1) - 512);
        w3h = *(twiddles + 2 * j + 2 * (j << 1) - 512);
        w1l = *(twiddles + 2 * j + 1);
        w2l = *(twiddles + 2 * (j << 1) - 511);
        w3l = *(twiddles + 2 * j + 2 * (j << 1) - 511);

        for (k = in_loop_cnt; k != 0; k--) {
          WORD32 tmp;
          WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;

          data += (del << 1);

          x1r = *data;
          x1i = *(data + 1);
          data += (del << 1);

          x2r = *data;
          x2i = *(data + 1);
          data += (del << 1);

          x3r = *data;
          x3i = *(data + 1);
          data -= 3 * (del << 1);

          tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x1r, w1l),
                                   ixheaacd_mult32_sat(x1i, w1h));
          x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
          x1r = tmp;

          tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x2r, w2h),
                                   ixheaacd_mult32_sat(x2i, w2l));
          x2i = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x2i, w2h),
                                   ixheaacd_mult32_sat(x2r, w2l));
          x2r = tmp;

          tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x3r, w3h),
                                   ixheaacd_mult32_sat(x3i, w3l));
          x3i = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x3i, w3h),
                                   ixheaacd_mult32_sat(x3r, w3l));
          x3r = tmp;

          x0r = (*data);
          x0i = (*(data + 1));

          x0r = ixheaacd_add32_sat(x0r, x2r);
          x0i = ixheaacd_add32_sat(x0i, x2i);
          x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
          x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
          x1r = ixheaacd_add32_sat(x1r, x3r);
          x1i = ixheaacd_add32_sat(x1i, x3i);
          x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
          x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));

          x0r = ixheaacd_add32_sat(x0r, x1r);
          x0i = ixheaacd_add32_sat(x0i, x1i);
          x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
          x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
          x2r = ixheaacd_add32_sat(x2r, x3i);
          x2i = ixheaacd_sub32_sat(x2i, x3r);
          x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
          x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));

          *data = x0r;
          *(data + 1) = x0i;
          data += (del << 1);

          *data = x2r;
          *(data + 1) = x2i;
          data += (del << 1);

          *data = x1r;
          *(data + 1) = x1i;
          data += (del << 1);

          *data = x3i;
          *(data + 1) = x3r;
          data += (del << 1);
        }
        data -= 2 * npoints;
        data += 2;
      }
      for (; j < nodespacing * del; j += nodespacing) {
        w1h = *(twiddles + 2 * j);
        w2h = *(twiddles + 2 * (j << 1) - 512);
        w3h = *(twiddles + 2 * j + 2 * (j << 1) - 1024);
        w1l = *(twiddles + 2 * j + 1);
        w2l = *(twiddles + 2 * (j << 1) - 511);
        w3l = *(twiddles + 2 * j + 2 * (j << 1) - 1023);

        for (k = in_loop_cnt; k != 0; k--) {
          WORD32 tmp;
          WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;

          data += (del << 1);

          x1r = *data;
          x1i = *(data + 1);
          data += (del << 1);

          x2r = *data;
          x2i = *(data + 1);
          data += (del << 1);

          x3r = *data;
          x3i = *(data + 1);
          data -= 3 * (del << 1);

          tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x1r, w1l),
                                   ixheaacd_mult32_sat(x1i, w1h));
          x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
          x1r = tmp;

          tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x2r, w2h),
                                   ixheaacd_mult32_sat(x2i, w2l));
          x2i = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x2i, w2h),
                                   ixheaacd_mult32_sat(x2r, w2l));
          x2r = tmp;

          tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x3i, w3h),
                                   ixheaacd_mult32_sat(x3r, w3l));
          x3i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x3r, w3h), x3i, w3l);
          x3r = tmp;

          x0r = (*data);
          x0i = (*(data + 1));

          x0r = ixheaacd_add32_sat(x0r, x2r);
          x0i = ixheaacd_add32_sat(x0i, x2i);
          x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
          x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
          x1r = ixheaacd_add32_sat(x1r, x3r);
          x1i = ixheaacd_sub32_sat(x1i, x3i);
          x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
          x3i = ixheaacd_add32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));

          x0r = ixheaacd_add32_sat(x0r, x1r);
          x0i = ixheaacd_add32_sat(x0i, x1i);
          x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
          x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
          x2r = ixheaacd_add32_sat(x2r, x3i);
          x2i = ixheaacd_sub32_sat(x2i, x3r);
          x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
          x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));

          *data = x0r;
          *(data + 1) = x0i;
          data += (del << 1);

          *data = x2r;
          *(data + 1) = x2i;
          data += (del << 1);

          *data = x1r;
          *(data + 1) = x1i;
          data += (del << 1);

          *data = x3i;
          *(data + 1) = x3r;
          data += (del << 1);
        }
        data -= 2 * npoints;
        data += 2;
      }
      nodespacing >>= 2;
      del <<= 2;
      in_loop_cnt >>= 2;
    }
    if (not_power_4) {
      const WORD32 *twiddles = ptr_w;
      nodespacing <<= 1;
      shift += 1;

      for (j = del / 2; j != 0; j--) {
        WORD32 w1h = *twiddles;
        WORD32 w1l = *(twiddles + 1);
        WORD32 tmp;
        twiddles += nodespacing * 2;

        x0r = *ptr_y;
        x0i = *(ptr_y + 1);
        ptr_y += (del << 1);

        x1r = *ptr_y;
        x1i = *(ptr_y + 1);

        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x1r, w1l),
                                 ixheaacd_mult32_sat(x1i, w1h));
        x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
        x1r = tmp;

        *ptr_y = (x0r) / 2 - (x1r) / 2;
        *(ptr_y + 1) = (x0i) / 2 - (x1i) / 2;
        ptr_y -= (del << 1);

        *ptr_y = (x0r) / 2 + (x1r) / 2;
        *(ptr_y + 1) = (x0i) / 2 + (x1i) / 2;
        ptr_y += 2;
      }
      twiddles = ptr_w;
      for (j = del / 2; j != 0; j--) {
        WORD32 w1h = *twiddles;
        WORD32 w1l = *(twiddles + 1);
        WORD32 tmp;
        twiddles += nodespacing * 2;

        x0r = *ptr_y;
        x0i = *(ptr_y + 1);
        ptr_y += (del << 1);

        x1r = *ptr_y;
        x1i = *(ptr_y + 1);

        tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x1r, w1h),
                                 ixheaacd_mult32_sat(x1i, w1l));
        x1i = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x1i, w1h),
                                 ixheaacd_mult32_sat(x1r, w1l));
        x1r = tmp;

        *ptr_y = (x0r) / 2 - (x1r) / 2;
        *(ptr_y + 1) = (x0i) / 2 - (x1i) / 2;
        ptr_y -= (del << 1);

        *ptr_y = (x0r) / 2 + (x1r) / 2;
        *(ptr_y + 1) = (x0i) / 2 + (x1i) / 2;
        ptr_y += 2;
      }
    }

  }

  else {
    ptr_w = ixheaacd_twiddle_table_fft_32x32;

    for (i = 0; i < npoints; i += 4) {
      WORD32 *inp = ptr_x;

      DIG_REV(i, dig_rev_shift, h2);
      if (not_power_4) {
        h2 += 1;
        h2 &= ~1;
      }
      inp += (h2);

      x0r = *inp;
      x0i = *(inp + 1);
      inp += (npoints >> 1);

      x1r = *inp;
      x1i = *(inp + 1);
      inp += (npoints >> 1);

      x2r = *inp;
      x2i = *(inp + 1);
      inp += (npoints >> 1);

      x3r = *inp;
      x3i = *(inp + 1);

      x0r = ixheaacd_add32_sat(x0r, x2r);
      x0i = ixheaacd_add32_sat(x0i, x2i);
      x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
      x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
      x1r = ixheaacd_add32_sat(x1r, x3r);
      x1i = ixheaacd_add32_sat(x1i, x3i);
      x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
      x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));

      x0r = ixheaacd_add32_sat(x0r, x1r);
      x0i = ixheaacd_add32_sat(x0i, x1i);
      x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
      x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
      x2r = ixheaacd_sub32_sat(x2r, x3i);
      x2i = ixheaacd_add32_sat(x2i, x3r);
      x3i = ixheaacd_add32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
      x3r = ixheaacd_sub32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));

      *ptr_y++ = x0r;
      *ptr_y++ = x0i;
      *ptr_y++ = x2r;
      *ptr_y++ = x2i;
      *ptr_y++ = x1r;
      *ptr_y++ = x1i;
      *ptr_y++ = x3i;
      *ptr_y++ = x3r;
    }
    ptr_y -= 2 * npoints;
    del = 4;
    nodespacing = 64;
    in_loop_cnt = npoints >> 4;
    for (i = n_stages - 1; i > 0; i--) {
      const WORD32 *twiddles = ptr_w;
      WORD32 *data = ptr_y;
      WORD32 w1h, w2h, w3h, w1l, w2l, w3l;
      WORD32 sec_loop_cnt;

      for (k = in_loop_cnt; k != 0; k--) {
        x0r = (*data);
        x0i = (*(data + 1));
        data += (del << 1);

        x1r = (*data);
        x1i = (*(data + 1));
        data += (del << 1);

        x2r = (*data);
        x2i = (*(data + 1));
        data += (del << 1);

        x3r = (*data);
        x3i = (*(data + 1));
        data -= 3 * (del << 1);

        x0r = ixheaacd_add32_sat(x0r, x2r);
        x0i = ixheaacd_add32_sat(x0i, x2i);
        x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
        x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
        x1r = ixheaacd_add32_sat(x1r, x3r);
        x1i = ixheaacd_add32_sat(x1i, x3i);
        x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
        x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));

        x0r = ixheaacd_add32_sat(x0r, x1r);
        x0i = ixheaacd_add32_sat(x0i, x1i);
        x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
        x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
        x2r = ixheaacd_sub32_sat(x2r, x3i);
        x2i = ixheaacd_add32_sat(x2i, x3r);
        x3i = ixheaacd_add32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
        x3r = ixheaacd_sub32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));

        *data = x0r;
        *(data + 1) = x0i;
        data += (del << 1);

        *data = x2r;
        *(data + 1) = x2i;
        data += (del << 1);

        *data = x1r;
        *(data + 1) = x1i;
        data += (del << 1);

        *data = x3i;
        *(data + 1) = x3r;
        data += (del << 1);
      }
      data = ptr_y + 2;

      sec_loop_cnt = (nodespacing * del);
      sec_loop_cnt = (sec_loop_cnt / 4) + (sec_loop_cnt / 8) -
                     (sec_loop_cnt / 16) + (sec_loop_cnt / 32) -
                     (sec_loop_cnt / 64) + (sec_loop_cnt / 128) -
                     (sec_loop_cnt / 256);
      j = nodespacing;

      for (j = nodespacing; j <= sec_loop_cnt; j += nodespacing) {
        w1h = *(twiddles + 2 * j);
        w2h = *(twiddles + 2 * (j << 1));
        w3h = *(twiddles + 2 * j + 2 * (j << 1));
        w1l = *(twiddles + 2 * j + 1);
        w2l = *(twiddles + 2 * (j << 1) + 1);
        w3l = *(twiddles + 2 * j + 2 * (j << 1) + 1);

        for (k = in_loop_cnt; k != 0; k--) {
          WORD32 tmp;
          WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;

          data += (del << 1);

          x1r = *data;
          x1i = *(data + 1);
          data += (del << 1);

          x2r = *data;
          x2i = *(data + 1);
          data += (del << 1);

          x3r = *data;
          x3i = *(data + 1);
          data -= 3 * (del << 1);

          tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x1r, w1l),
                                   ixheaacd_mult32_sat(x1i, w1h));
          x1i = ixheaacd_mac32_sat(-ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
          x1r = tmp;

          tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x2r, w2l),
                                   ixheaacd_mult32_sat(x2i, w2h));
          x2i = ixheaacd_mac32_sat(-ixheaacd_mult32_sat(x2r, w2h), x2i, w2l);
          x2r = tmp;

          tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x3r, w3l),
                                   ixheaacd_mult32_sat(x3i, w3h));
          x3i = ixheaacd_mac32_sat(-ixheaacd_mult32_sat(x3r, w3h), x3i, w3l);
          x3r = tmp;

          x0r = (*data);
          x0i = (*(data + 1));

          x0r = ixheaacd_add32_sat(x0r, x2r);
          x0i = ixheaacd_add32_sat(x0i, x2i);
          x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
          x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
          x1r = ixheaacd_add32_sat(x1r, x3r);
          x1i = ixheaacd_add32_sat(x1i, x3i);
          x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
          x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));

          x0r = ixheaacd_add32_sat(x0r, x1r);
          x0i = ixheaacd_add32_sat(x0i, x1i);
          x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
          x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
          x2r = ixheaacd_sub32_sat(x2r, x3i);
          x2i = ixheaacd_add32_sat(x2i, x3r);
          x3i = ixheaacd_add32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
          x3r = ixheaacd_sub32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));

          *data = x0r;
          *(data + 1) = x0i;
          data += (del << 1);

          *data = x2r;
          *(data + 1) = x2i;
          data += (del << 1);

          *data = x1r;
          *(data + 1) = x1i;
          data += (del << 1);

          *data = x3i;
          *(data + 1) = x3r;
          data += (del << 1);
        }
        data -= 2 * npoints;
        data += 2;
      }
      for (; j <= (nodespacing * del) >> 1; j += nodespacing) {
        w1h = *(twiddles + 2 * j);
        w2h = *(twiddles + 2 * (j << 1));
        w3h = *(twiddles + 2 * j + 2 * (j << 1) - 512);
        w1l = *(twiddles + 2 * j + 1);
        w2l = *(twiddles + 2 * (j << 1) + 1);
        w3l = *(twiddles + 2 * j + 2 * (j << 1) - 511);

        for (k = in_loop_cnt; k != 0; k--) {
          WORD32 tmp;
          WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;

          data += (del << 1);

          x1r = *data;
          x1i = *(data + 1);
          data += (del << 1);

          x2r = *data;
          x2i = *(data + 1);
          data += (del << 1);

          x3r = *data;
          x3i = *(data + 1);
          data -= 3 * (del << 1);

          tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x1r, w1l),
                                   ixheaacd_mult32_sat(x1i, w1h));
          x1i = ixheaacd_mac32_sat(-ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
          x1r = tmp;

          tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x2r, w2l),
                                   ixheaacd_mult32_sat(x2i, w2h));
          x2i = ixheaacd_mac32_sat(-ixheaacd_mult32_sat(x2r, w2h), x2i, w2l);
          x2r = tmp;

          tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x3r, w3h),
                                   ixheaacd_mult32_sat(x3i, w3l));
          x3i = ixheaacd_add32_sat(ixheaacd_mult32_sat(x3r, w3l),
                                   ixheaacd_mult32_sat(x3i, w3h));
          x3r = tmp;

          x0r = (*data);
          x0i = (*(data + 1));

          x0r = ixheaacd_add32_sat(x0r, x2r);
          x0i = ixheaacd_add32_sat(x0i, x2i);
          x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
          x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
          x1r = ixheaacd_add32_sat(x1r, x3r);
          x1i = ixheaacd_add32_sat(x1i, x3i);
          x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
          x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));

          x0r = ixheaacd_add32_sat(x0r, x1r);
          x0i = ixheaacd_add32_sat(x0i, x1i);
          x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
          x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
          x2r = ixheaacd_sub32_sat(x2r, x3i);
          x2i = ixheaacd_add32_sat(x2i, x3r);
          x3i = ixheaacd_add32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
          x3r = ixheaacd_sub32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));

          *data = x0r;
          *(data + 1) = x0i;
          data += (del << 1);

          *data = x2r;
          *(data + 1) = x2i;
          data += (del << 1);

          *data = x1r;
          *(data + 1) = x1i;
          data += (del << 1);

          *data = x3i;
          *(data + 1) = x3r;
          data += (del << 1);
        }
        data -= 2 * npoints;
        data += 2;
      }
      for (; j <= sec_loop_cnt * 2; j += nodespacing) {
        w1h = *(twiddles + 2 * j);
        w2h = *(twiddles + 2 * (j << 1) - 512);
        w3h = *(twiddles + 2 * j + 2 * (j << 1) - 512);
        w1l = *(twiddles + 2 * j + 1);
        w2l = *(twiddles + 2 * (j << 1) - 511);
        w3l = *(twiddles + 2 * j + 2 * (j << 1) - 511);

        for (k = in_loop_cnt; k != 0; k--) {
          WORD32 tmp;
          WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;

          data += (del << 1);

          x1r = *data;
          x1i = *(data + 1);
          data += (del << 1);

          x2r = *data;
          x2i = *(data + 1);
          data += (del << 1);

          x3r = *data;
          x3i = *(data + 1);
          data -= 3 * (del << 1);

          tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x1r, w1l),
                                   ixheaacd_mult32_sat(x1i, w1h));
          x1i = ixheaacd_mac32_sat(-ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
          x1r = tmp;

          tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x2r, w2h),
                                   ixheaacd_mult32_sat(x2i, w2l));
          x2i = ixheaacd_add32_sat(ixheaacd_mult32_sat(x2r, w2l),
                                   ixheaacd_mult32_sat(x2i, w2h));
          x2r = tmp;

          tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x3r, w3h),
                                   ixheaacd_mult32_sat(x3i, w3l));
          x3i = ixheaacd_add32_sat(ixheaacd_mult32_sat(x3r, w3l),
                                   ixheaacd_mult32_sat(x3i, w3h));
          x3r = tmp;

          x0r = (*data);
          x0i = (*(data + 1));

          x0r = ixheaacd_add32_sat(x0r, x2r);
          x0i = ixheaacd_add32_sat(x0i, x2i);
          x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
          x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
          x1r = ixheaacd_add32_sat(x1r, x3r);
          x1i = ixheaacd_add32_sat(x1i, x3i);
          x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
          x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));

          x0r = ixheaacd_add32_sat(x0r, x1r);
          x0i = ixheaacd_add32_sat(x0i, x1i);
          x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
          x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
          x2r = ixheaacd_sub32_sat(x2r, x3i);
          x2i = ixheaacd_add32_sat(x2i, x3r);
          x3i = ixheaacd_add32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
          x3r = ixheaacd_sub32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));

          *data = x0r;
          *(data + 1) = x0i;
          data += (del << 1);

          *data = x2r;
          *(data + 1) = x2i;
          data += (del << 1);

          *data = x1r;
          *(data + 1) = x1i;
          data += (del << 1);

          *data = x3i;
          *(data + 1) = x3r;
          data += (del << 1);
        }
        data -= 2 * npoints;
        data += 2;
      }
      for (; j < nodespacing * del; j += nodespacing) {
        w1h = *(twiddles + 2 * j);
        w2h = *(twiddles + 2 * (j << 1) - 512);
        w3h = *(twiddles + 2 * j + 2 * (j << 1) - 1024);
        w1l = *(twiddles + 2 * j + 1);
        w2l = *(twiddles + 2 * (j << 1) - 511);
        w3l = *(twiddles + 2 * j + 2 * (j << 1) - 1023);

        for (k = in_loop_cnt; k != 0; k--) {
          WORD32 tmp;
          WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;

          data += (del << 1);

          x1r = *data;
          x1i = *(data + 1);
          data += (del << 1);

          x2r = *data;
          x2i = *(data + 1);
          data += (del << 1);

          x3r = *data;
          x3i = *(data + 1);
          data -= 3 * (del << 1);

          tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x1r, w1l),
                                   ixheaacd_mult32_sat(x1i, w1h));
          x1i = ixheaacd_mac32_sat(-ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
          x1r = tmp;

          tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x2r, w2h),
                                   ixheaacd_mult32_sat(x2i, w2l));
          x2i = ixheaacd_add32_sat(ixheaacd_mult32_sat(x2r, w2l),
                                   ixheaacd_mult32_sat(x2i, w2h));
          x2r = tmp;

          tmp = -ixheaacd_add32_sat(ixheaacd_mult32_sat(x3r, w3l),
                                    ixheaacd_mult32_sat(x3i, w3h));
          x3i = ixheaacd_mac32_sat(-ixheaacd_mult32_sat(x3r, w3h), x3i, w3l);
          x3r = tmp;

          x0r = (*data);
          x0i = (*(data + 1));

          x0r = ixheaacd_add32_sat(x0r, x2r);
          x0i = ixheaacd_add32_sat(x0i, x2i);
          x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
          x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
          x1r = ixheaacd_add32_sat(x1r, x3r);
          x1i = ixheaacd_sub32_sat(x1i, x3i);
          x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
          x3i = ixheaacd_add32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));

          x0r = ixheaacd_add32_sat(x0r, x1r);
          x0i = ixheaacd_add32_sat(x0i, x1i);
          x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
          x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
          x2r = ixheaacd_sub32_sat(x2r, x3i);
          x2i = ixheaacd_add32_sat(x2i, x3r);
          x3i = ixheaacd_add32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
          x3r = ixheaacd_sub32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));

          *data = x0r;
          *(data + 1) = x0i;
          data += (del << 1);

          *data = x2r;
          *(data + 1) = x2i;
          data += (del << 1);

          *data = x1r;
          *(data + 1) = x1i;
          data += (del << 1);

          *data = x3i;
          *(data + 1) = x3r;
          data += (del << 1);
        }
        data -= 2 * npoints;
        data += 2;
      }
      nodespacing >>= 2;
      del <<= 2;
      in_loop_cnt >>= 2;
    }
    if (not_power_4) {
      const WORD32 *twiddles = ptr_w;
      nodespacing <<= 1;
      shift += 1;
      for (j = del / 2; j != 0; j--) {
        WORD32 w1h = *twiddles;
        WORD32 w1l = *(twiddles + 1);

        WORD32 tmp;
        twiddles += nodespacing * 2;

        x0r = *ptr_y;
        x0i = *(ptr_y + 1);
        ptr_y += (del << 1);

        x1r = *ptr_y;
        x1i = *(ptr_y + 1);

        tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x1r, w1l),
                                 ixheaacd_mult32_sat(x1i, w1h));
        x1i = ixheaacd_mac32_sat(-ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
        x1r = tmp;

        *ptr_y = (x0r) / 2 - (x1r) / 2;
        *(ptr_y + 1) = (x0i) / 2 - (x1i) / 2;
        ptr_y -= (del << 1);

        *ptr_y = (x0r) / 2 + (x1r) / 2;
        *(ptr_y + 1) = (x0i) / 2 + (x1i) / 2;
        ptr_y += 2;
      }
      twiddles = ptr_w;
      for (j = del / 2; j != 0; j--) {
        WORD32 w1h = *twiddles;
        WORD32 w1l = *(twiddles + 1);
        WORD32 tmp;
        twiddles += nodespacing * 2;

        x0r = *ptr_y;
        x0i = *(ptr_y + 1);
        ptr_y += (del << 1);

        x1r = *ptr_y;
        x1i = *(ptr_y + 1);

        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x1r, w1h),
                                 ixheaacd_mult32_sat(x1i, w1l));
        x1i = ixheaacd_add32_sat(ixheaacd_mult32_sat(x1r, w1l),
                                 ixheaacd_mult32_sat(x1i, w1h));
        x1r = tmp;

        *ptr_y = (x0r) / 2 - (x1r) / 2;
        *(ptr_y + 1) = (x0i) / 2 - (x1i) / 2;
        ptr_y -= (del << 1);

        *ptr_y = (x0r) / 2 + (x1r) / 2;
        *(ptr_y + 1) = (x0i) / 2 + (x1i) / 2;
        ptr_y += 2;
      }
    }
  }

  for (i = 0; i < nlength; i++) {
    xr[i] = y[2 * i];
    xi[i] = y[2 * i + 1];
  }

  *preshift = shift - *preshift;
  return;
}

static PLATFORM_INLINE void ixheaacd_complex_3point_fft(WORD32 *inp, WORD32 *op,
                                                        WORD32 sign_dir) {
  WORD32 add_r, sub_r;
  WORD32 add_i, sub_i;
  WORD32 temp_real, temp_imag, temp;

  WORD32 p1, p2, p3, p4;

  WORD32 sinmu;
  sinmu = -1859775393 * sign_dir;

  temp_real = ixheaacd_add32_sat(inp[0], inp[2]);
  temp_imag = ixheaacd_add32_sat(inp[1], inp[3]);

  add_r = ixheaacd_add32_sat(inp[2], inp[4]);
  add_i = ixheaacd_add32_sat(inp[3], inp[5]);

  sub_r = ixheaacd_sub32_sat(inp[2], inp[4]);
  sub_i = ixheaacd_sub32_sat(inp[3], inp[5]);

  p1 = add_r >> 1;
  p4 = add_i >> 1;
  p2 = ixheaacd_mult32_shl(sub_i, sinmu);
  p3 = ixheaacd_mult32_shl(sub_r, sinmu);

  temp = ixheaacd_sub32(inp[0], p1);

  op[0] = ixheaacd_add32_sat(temp_real, inp[4]);
  op[1] = ixheaacd_add32_sat(temp_imag, inp[5]);
  op[2] = ixheaacd_add32_sat(temp, p2);
  op[3] = ixheaacd_sub32_sat(ixheaacd_sub32_sat(inp[1], p3), p4);
  op[4] = ixheaacd_sub32_sat(temp, p2);
  op[5] = ixheaacd_sub32_sat(ixheaacd_add32_sat(inp[1], p3), p4);

  return;
}

VOID ixheaacd_complex_fft_p3(WORD32 *xr, WORD32 *xi, WORD32 nlength,
                             WORD32 fft_mode, WORD32 *preshift) {
  WORD32 i, j;
  WORD32 shift = 0;
  WORD32 xr_3[384];
  WORD32 xi_3[384];
  WORD32 x[1024];
  WORD32 y[1024];
  WORD32 cnfac, npts;
  WORD32 mpass = nlength;
  WORD32 n = 0;
  WORD32 *ptr_x = x;
  WORD32 *ptr_y = y;

  cnfac = 0;
  while (mpass % 3 == 0) {
    mpass /= 3;
    cnfac++;
  }
  npts = mpass;

  for (i = 0; i < 3 * cnfac; i++) {
    for (j = 0; j < mpass; j++) {
      xr_3[j] = xr[3 * j + i];
      xi_3[j] = xi[3 * j + i];
    }

    (*ixheaacd_complex_fft_p2)(xr_3, xi_3, mpass, fft_mode, &shift);

    for (j = 0; j < mpass; j++) {
      xr[3 * j + i] = xr_3[j];
      xi[3 * j + i] = xi_3[j];
    }
  }

  while (npts >> 1) {
    n++;
    npts = npts >> 1;
  }

  if (n % 2 == 0)
    shift = ((n + 4)) / 2;
  else
    shift = ((n + 5) / 2);

  *preshift = shift - *preshift + 1;

  for (i = 0; i < nlength; i++) {
    ptr_x[2 * i] = (xr[i] >> 1);
    ptr_x[2 * i + 1] = (xi[i] >> 1);
  }

  {
    const WORD32 *w1r, *w1i;
    WORD32 tmp;
    w1r = ixheaacd_twiddle_table_3pr;
    w1i = ixheaacd_twiddle_table_3pi;

    if (fft_mode < 0) {
      for (i = 0; i < nlength; i += 3) {
        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(ptr_x[2 * i], (*w1r)),
                                 ixheaacd_mult32_sat(ptr_x[2 * i + 1], (*w1i)));
        ptr_x[2 * i + 1] =
            ixheaacd_add32_sat(ixheaacd_mult32_sat(ptr_x[2 * i], (*w1i)),
                               ixheaacd_mult32_sat(ptr_x[2 * i + 1], (*w1r)));
        ptr_x[2 * i] = tmp;

        w1r++;
        w1i++;

        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(ptr_x[2 * i + 2], (*w1r)),
                                 ixheaacd_mult32_sat(ptr_x[2 * i + 3], (*w1i)));
        ptr_x[2 * i + 3] =
            ixheaacd_add32_sat(ixheaacd_mult32_sat(ptr_x[2 * i + 2], (*w1i)),
                               ixheaacd_mult32_sat(ptr_x[2 * i + 3], (*w1r)));
        ptr_x[2 * i + 2] = tmp;

        w1r++;
        w1i++;

        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(ptr_x[2 * i + 4], (*w1r)),
                                 ixheaacd_mult32_sat(ptr_x[2 * i + 5], (*w1i)));
        ptr_x[2 * i + 5] =
            ixheaacd_add32_sat(ixheaacd_mult32_sat(ptr_x[2 * i + 4], (*w1i)),
                               ixheaacd_mult32_sat(ptr_x[2 * i + 5], (*w1r)));
        ptr_x[2 * i + 4] = tmp;

        w1r += 3 * (128 / mpass - 1) + 1;
        w1i += 3 * (128 / mpass - 1) + 1;
      }
    }

    else {
      for (i = 0; i < nlength; i += 3) {
        tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(ptr_x[2 * i], (*w1r)),
                                 ixheaacd_mult32_sat(ptr_x[2 * i + 1], (*w1i)));
        ptr_x[2 * i + 1] =
            ixheaacd_sub32_sat(ixheaacd_mult32_sat(ptr_x[2 * i + 1], (*w1r)),
                               ixheaacd_mult32_sat(ptr_x[2 * i], (*w1i)));
        ptr_x[2 * i] = tmp;

        w1r++;
        w1i++;

        tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(ptr_x[2 * i + 2], (*w1r)),
                                 ixheaacd_mult32_sat(ptr_x[2 * i + 3], (*w1i)));
        ptr_x[2 * i + 3] =
            ixheaacd_sub32_sat(ixheaacd_mult32_sat(ptr_x[2 * i + 3], (*w1r)),
                               ixheaacd_mult32_sat(ptr_x[2 * i + 2], (*w1i)));
        ptr_x[2 * i + 2] = tmp;

        w1r++;
        w1i++;

        tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(ptr_x[2 * i + 4], (*w1r)),
                                 ixheaacd_mult32_sat(ptr_x[2 * i + 5], (*w1i)));
        ptr_x[2 * i + 5] =
            ixheaacd_sub32_sat(ixheaacd_mult32_sat(ptr_x[2 * i + 5], (*w1r)),
                               ixheaacd_mult32_sat(ptr_x[2 * i + 4], (*w1i)));
        ptr_x[2 * i + 4] = tmp;

        w1r += 3 * (128 / mpass - 1) + 1;
        w1i += 3 * (128 / mpass - 1) + 1;
      }
    }
  }

  for (i = 0; i < mpass; i++) {
    ixheaacd_complex_3point_fft(ptr_x, ptr_y, fft_mode);

    ptr_x = ptr_x + 6;
    ptr_y = ptr_y + 6;
  }

  for (i = 0; i < mpass; i++) {
    xr[i] = y[6 * i];
    xi[i] = y[6 * i + 1];
  }

  for (i = 0; i < mpass; i++) {
    xr[mpass + i] = y[6 * i + 2];
    xi[mpass + i] = y[6 * i + 3];
  }

  for (i = 0; i < mpass; i++) {
    xr[2 * mpass + i] = y[6 * i + 4];
    xi[2 * mpass + i] = y[6 * i + 5];
  }
  return;
}

VOID ixheaacd_complex_fft(WORD32 *data_r, WORD32 *data_i, WORD32 nlength,
                          WORD32 fft_mode, WORD32 *preshift) {
  if (nlength & (nlength - 1)) {
    if ((nlength != 24) && (nlength != 48) && (nlength != 96) &&
        (nlength != 192) && (nlength != 384)) {
      printf("%d point FFT not supported", nlength);
      exit(0);
    }
    ixheaacd_complex_fft_p3(data_r, data_i, nlength, fft_mode, preshift);
  } else
    (*ixheaacd_complex_fft_p2)(data_r, data_i, nlength, fft_mode, preshift);

  return;
}
