LCOV - code coverage report
Current view: top level - lib_com - fft_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 574a190e3c6896c6c4ed10d7f23649709a0c4347 Lines: 3583 5271 68.0 %
Date: 2025-06-27 02:59:36 Functions: 44 71 62.0 %

          Line data    Source code
       1             : /******************************************************************************************************
       2             : 
       3             :    (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
       4             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
       5             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
       6             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
       7             :    contributors to this repository. All Rights Reserved.
       8             : 
       9             :    This software is protected by copyright law and by international treaties.
      10             :    The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
      11             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
      12             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
      13             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
      14             :    contributors to this repository retain full ownership rights in their respective contributions in
      15             :    the software. This notice grants no license of any kind, including but not limited to patent
      16             :    license, nor is any license granted by implication, estoppel or otherwise.
      17             : 
      18             :    Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
      19             :    contributions.
      20             : 
      21             :    This software is provided "AS IS", without any express or implied warranties. The software is in the
      22             :    development stage. It is intended exclusively for experts who have experience with such software and
      23             :    solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
      24             :    and fitness for a particular purpose are hereby disclaimed and excluded.
      25             : 
      26             :    Any dispute, controversy or claim arising under or in relation to providing this software shall be
      27             :    submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
      28             :    accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
      29             :    the United Nations Convention on Contracts on the International Sales of Goods.
      30             : 
      31             : *******************************************************************************************************/
      32             : 
      33             : 
      34             : /*====================================================================================
      35             :     3GPP TS26.258 Aug 24, 2023. IVAS Codec Version IVAS-FL-1.0
      36             :   ====================================================================================*/
      37             : 
      38             : /*====================================================================================
      39             :     EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0
      40             :   ====================================================================================*/
      41             : 
      42             : #include <assert.h>
      43             : #include <stdint.h>
      44             : #include "options.h"
      45             : #include <math.h>
      46             : #include "cnst.h"
      47             : #include "prot_fx.h"
      48             : #include "rom_com.h"
      49             : #include "rom_com_fx.h"
      50             : #include "wmc_auto.h"
      51             : #include "complex_basop.h"
      52             : 
      53             : #ifdef _MSC_VER
      54             : #pragma warning( disable : 4310 )
      55             : #endif
      56             : 
      57             : /*-----------------------------------------------------------------*
      58             :  * Local constants
      59             :  *-----------------------------------------------------------------*/
      60             : 
      61             : #define Mpy_32_xx Mpy_32_16_1
      62             : 
      63             : #define FFTC( x ) WORD322WORD16( (Word32) x )
      64             : 
      65             : /* DCT related */
      66             : #define KP559016994_16FX ( FFTC( 1200479845 ) ) /* EDCT & EMDCT constants Q15*/
      67             : #define KP951056516_16FX ( FFTC( 2042378325 ) ) /* EDCT & EMDCT constants Q15*/
      68             : #define KP587785252_16FX ( FFTC( 1262259213 ) ) /* EDCT & EMDCT constants Q15*/
      69             : 
      70             : #define FFT_15PONIT_WNK1 ( FFTC( 0x478dde64 ) ) /* EDCT & EMDCT constants Q15*/
      71             : #define FFT_15PONIT_WNK2 ( FFTC( 0x79bc3854 ) ) /* EDCT & EMDCT constants Q15*/
      72             : #define FFT_15PONIT_WNK3 ( FFTC( 0x4B3C8C0D ) ) /* EDCT & EMDCT constants Q15*/
      73             : #define FFT_15PONIT_WNK4 ( FFTC( 0x6ED9EBA0 ) ) /* EDCT & EMDCT constants Q15*/
      74             : #define FFT_15PONIT_WNK5 ( FFTC( 0x20000000 ) ) /* EDCT & EMDCT constants Q15*/
      75             : 
      76             : /* FFT constants */
      77             : #define FFT_C31  ( FFTC( 0x91261468 ) ) /* FL2WORD32( -0.86602540) -sqrt(3)/2 Q15*/
      78             : #define FFT_C51  ( FFTC( 0x79bc3854 ) ) /* FL2WORD32( 0.95105652)   Q15*/
      79             : #define FFT_C52  ( FFTC( 0x9d839db0 ) ) /* FL2WORD32(-1.53884180/2) Q15*/
      80             : #define FFT_C53  ( FFTC( 0xd18053ce ) ) /* FL2WORD32(-0.36327126)   Q15*/
      81             : #define FFT_C54  ( FFTC( 0x478dde64 ) ) /* FL2WORD32( 0.55901699)   Q15*/
      82             : #define FFT_C55  ( FFTC( 0xb0000001 ) ) /* FL2WORD32(-1.25/2)       Q15*/
      83             : #define FFT_C61  ( FFTC( 0x6ED9EBA0 ) ) // Q15
      84             : #define FFT_C81  ( FFTC( 0x5a82799a ) ) // Q15
      85             : #define FFT_C82  ( FFTC( 0xa57d8666 ) ) // Q15
      86             : #define FFT_C161 ( FFTC( 0x5a82799a ) ) /* FL2WORD32( 7.071067811865475e-1)  INV_SQRT2    Q15*/
      87             : #define FFT_C162 ( FFTC( 0xa57d8666 ) ) /* FL2WORD32(-7.071067811865475e-1) -INV_SQRT2    Q15*/
      88             : #define FFT_C163 ( FFTC( 0x7641af3d ) ) /* FL2WORD32( 9.238795325112867e-1)  COS_PI_DIV8  Q15*/
      89             : #define FFT_C164 ( FFTC( 0x89be50c3 ) ) /* FL2WORD32(-9.238795325112867e-1) -COS_PI_DIV8  Q15*/
      90             : #define FFT_C165 ( FFTC( 0x30fbc54d ) ) /* FL2WORD32( 3.826834323650898e-1)  COS_3PI_DIV8 Q15*/
      91             : #define FFT_C166 ( FFTC( 0xcf043ab3 ) ) /* FL2WORD32(-3.826834323650898e-1) -COS_3PI_DIV8 Q15*/
      92             : 
      93             : #define SCALEFACTOR16 ( 0 )
      94             : #define SCALEFACTOR20 ( 0 )
      95             : /*-----------------------------------------------------------------*
      96             :  * Local function prototypes
      97             :  *-----------------------------------------------------------------*/
      98             : 
      99             : static void cdftForw( Word16 n, Word32 *a, const Word16 *ip, const Word16 *w );
     100             : static void bitrv2_SR( Word16 n, const Word16 *ip, Word32 *a );
     101             : static void cftfsub( Word16 n, Word32 *a, const Word16 *w );
     102             : static void cft1st( Word16 n, Word32 *a, const Word16 *w );
     103             : static void cftmdl( Word16 n, Word16 l, Word32 *a, const Word16 *w );
     104             : static void fft16_ivas( Word32 *x, Word32 *y, const Word16 *Idx );
     105             : static void fft5_shift1( Word16 n1, Word32 *zRe, Word32 *zIm, const Word16 *Idx );
     106             : static void fft8( Word32 *x, Word32 *y, const Word16 *Idx );
     107             : static void fft15_shift2( Word16 n1, Word32 *zRe, Word32 *zIm, const Word16 *Idx );
     108             : static void fft15_shift8( Word16 n1, Word32 *zRe, Word32 *zIm, const Word16 *Idx );
     109             : static void fft5_shift4( Word16 n1, Word32 *zRe, Word32 *zIm, const Word16 *Idx );
     110             : static void fft5_32( Word32 *zRe, Word32 *zIm, const Word16 *Idx );
     111             : static void fft64( Word32 *x, Word32 *y, const Word16 *Idx );
     112             : static void fft32_15( Word32 *x, Word32 *y, const Word16 *Idx );
     113             : static void fft32_5( Word32 *x, Word32 *y, const Word16 *Idx );
     114             : static void fft8_5( Word32 *x, Word32 *y, const Word16 *Idx );
     115             : static void fft5_8( Word16 n1, Word32 *zRe, Word32 *zIm, const Word16 *Idx );
     116             : static void fft4_5( Word32 *x, Word32 *y, const Word16 *Idx );
     117             : static void fft5_4( Word16 n1, Word32 *zRe, Word32 *zIm, const Word16 *Idx );
     118             : 
     119             : void DoRTFTn_fx_ivas(
     120             :     Word32 *x,     /* i/o: real part of input and output data       */
     121             :     Word32 *y,     /* i/o: imaginary part of input and output data  */
     122             :     const Word16 n /* i  : size of the FFT n=(2^k) up to 1024       */
     123             : );
     124             : /*-----------------------------------------------------------------*
     125             :  * fft15_shift2()
     126             :  * 15-point FFT with 2-point circular shift
     127             :  *-----------------------------------------------------------------*/
     128             : 
     129           0 : static void fft15_shift2(
     130             :     Word16 n1,        /* i  : length of data                           */
     131             :     Word32 *zRe,      /* i/o: real part of input and output data Qx      */
     132             :     Word32 *zIm,      /* i/o: imaginary part of input and output data Qx */
     133             :     const Word16 *Idx /* i  : pointer of the address table Q0            */
     134             : )
     135             : {
     136             :     Word16 in0, in8, in16, in24, in32, in1, in9, in17, in25, in33, in2, in10, in18, in26, in34;
     137             :     Word32 fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8, fi9, fi10, fi11, fi12, fi13, fi14, fi15;
     138             :     Word32 fi16, fi17, fi18, fi19, fi20, fi21, fi22, fi23, fi24, fi25, fi26, fi27, fi28, fi29, fi30;
     139             :     Word32 f2i1, f2i2, f2i3, f2i4, f2i5, f2i6, f2i7, f2i8, f2i9, f2i10, f2i11, f2i12;
     140             :     Word32 f2i13, f2i14, f2i15, f2i16, f2i17, f2i18, f2i19, f2i20, f2i21, f2i22, f2i23, f2i24;
     141             :     Word32 f3i1, f3i2, f3i3, f3i4, f3i5, f3i6, f3i7, f3i8, f3i9, f3i10, f3i11, f3i12, f3i13, f3i14, f3i15;
     142             :     Word32 f4i1, f4i2, f4i3, f4i4, f4i5, f4i6, f4i7, f4i8, f4i9;
     143             :     Word32 f4i10, f4i11, f4i12, f4i13, f4i14, f4i15, f4i16, f4i17, f4i18, f4i19, f4i20, fo1, fo2, fo3, fo4;
     144             :     Word32 fo5, fo6, fo7, fo8, fo9, fo10, fo11, fo12, fo13, fo14, fo15, fo16, fo17, fo18;
     145             :     Word32 f2o1, f2o2, f2o3, f2o4, f2o5, f2o6, f2o7, f2o8, f2o9, f2o10, f2o11, f2o12, f2o13;
     146             :     Word32 f2o14, f2o15, f3o1, f3o2, f3o3, f3o4, f3o5, f3o6, f3o7, f3o8, f3o9, f3o10, f3o11;
     147             :     Word32 f3o12, f3o13, f3o14, f3o15, f4o1, f4o2, f4o3, f4o4, f4o5, f4o6;
     148             :     Word32 f4o7, f4o8, f4o9, f4o10, f4o11, f4o12, f4o13, f4o14, f4o15, f4o16, f4o17, f4o18, f4o19;
     149             : 
     150           0 :     in0 = Idx[0];
     151           0 :     move16();
     152           0 :     in8 = Idx[n1];
     153           0 :     move16();
     154           0 :     in16 = Idx[n1 * 2];
     155           0 :     move16();
     156           0 :     in24 = Idx[( n1 * 3 )];
     157           0 :     move16();
     158           0 :     in32 = Idx[n1 * 4];
     159           0 :     move16();
     160           0 :     in1 = Idx[( n1 * 5 )];
     161           0 :     move16();
     162           0 :     in9 = Idx[n1 * 6];
     163           0 :     move16();
     164           0 :     in17 = Idx[( n1 * 7 )];
     165           0 :     move16();
     166           0 :     in25 = Idx[n1 * 8];
     167           0 :     move16();
     168           0 :     in33 = Idx[( n1 * 9 )];
     169           0 :     move16();
     170           0 :     in2 = Idx[n1 * 10];
     171           0 :     move16();
     172           0 :     in10 = Idx[( n1 * 11 )];
     173           0 :     move16();
     174           0 :     in18 = Idx[n1 * 12];
     175           0 :     move16();
     176           0 :     in26 = Idx[( n1 * 13 )];
     177           0 :     move16();
     178           0 :     in34 = Idx[n1 * 14];
     179           0 :     move16();
     180             : 
     181           0 :     f2i13 = zRe[in0]; // Qx
     182           0 :     move32();
     183           0 :     f2i14 = zIm[in0]; // Qx
     184           0 :     move32();
     185           0 :     f2i21 = zRe[in1]; // Qx
     186           0 :     move32();
     187           0 :     f2i22 = zRe[in2]; // Qx
     188           0 :     move32();
     189           0 :     f2i23 = zIm[in1]; // Qx
     190           0 :     move32();
     191           0 :     f2i24 = zIm[in2]; // Qx
     192           0 :     move32();
     193             : 
     194           0 :     f2i15 = L_add( f2i21, f2i22 );
     195           0 :     f2i16 = Mpy_32_16_1( L_sub( f2i22, f2i21 ), FFT_15PONIT_WNK4 ); // Qx
     196           0 :     f2i17 = Mpy_32_16_1( L_sub( f2i23, f2i24 ), FFT_15PONIT_WNK4 ); // Qx
     197           0 :     f2i18 = L_add( f2i23, f2i24 );
     198           0 :     fi1 = L_add( f2i13, f2i15 );
     199           0 :     fi2 = L_add( f2i14, f2i18 );
     200             : 
     201           0 :     f2i19 = L_sub( f2i13, L_shr( f2i15, 1 ) );
     202           0 :     f2i20 = L_sub( f2i14, L_shr( f2i18, 1 ) );
     203           0 :     fi3 = L_sub( f2i19, f2i17 );
     204           0 :     fi4 = L_add( f2i19, f2i17 );
     205           0 :     fi5 = L_add( f2i16, f2i20 );
     206           0 :     fi6 = L_sub( f2i20, f2i16 );
     207             : 
     208           0 :     f3i1 = zRe[in9]; // Qx
     209           0 :     move32();
     210           0 :     f4i2 = zRe[in10]; // Qx
     211           0 :     move32();
     212           0 :     f4i3 = zRe[in8]; // Qx
     213           0 :     move32();
     214           0 :     f3i2 = L_add( f4i2, f4i3 );
     215           0 :     f3i3 = L_sub( f3i1, L_shr( f3i2, 1 ) );
     216           0 :     f3i4 = Mpy_32_16_1( L_sub( f4i3, f4i2 ), FFT_15PONIT_WNK4 ); // Qx
     217             : 
     218           0 :     f3i5 = zIm[in9]; // Qx
     219           0 :     move32();
     220           0 :     f4i4 = zIm[in10]; // Qx
     221           0 :     move32();
     222           0 :     f4i5 = zIm[in8]; // Qx
     223           0 :     move32();
     224           0 :     f3i6 = L_add( f4i4, f4i5 );
     225           0 :     f3i7 = Mpy_32_16_1( L_sub( f4i4, f4i5 ), FFT_15PONIT_WNK4 ); // Qx
     226           0 :     f3i8 = L_sub( f3i5, L_shr( f3i6, 1 ) );
     227             : 
     228           0 :     f3i9 = zRe[in33]; // Qx
     229           0 :     move32();
     230           0 :     f4i6 = zRe[in34]; // Qx
     231           0 :     move32();
     232           0 :     f4i7 = zRe[in32]; // Qx
     233           0 :     move32();
     234           0 :     f3i10 = L_add( f4i6, f4i7 );
     235           0 :     f3i11 = L_sub( f3i9, L_shr( f3i10, 1 ) );
     236           0 :     f3i12 = Mpy_32_16_1( L_sub( f4i7, f4i6 ), FFT_15PONIT_WNK4 ); // Qx
     237             : 
     238           0 :     f3i13 = zIm[in33]; // Qx
     239           0 :     move32();
     240           0 :     f4i8 = zIm[in34]; // Qx
     241           0 :     move32();
     242           0 :     f4i9 = zIm[in32]; // Qx
     243           0 :     move32();
     244           0 :     f3i14 = L_add( f4i8, f4i9 );
     245           0 :     f3i15 = Mpy_32_16_1( L_sub( f4i8, f4i9 ), FFT_15PONIT_WNK4 ); // Qx
     246           0 :     f4i1 = L_sub( f3i13, L_shr( f3i14, 1 ) );
     247             : 
     248           0 :     fi7 = L_add( f3i1, f3i2 );
     249           0 :     fi8 = L_add( f3i9, f3i10 );
     250           0 :     fi9 = L_add( fi7, fi8 );
     251           0 :     fi10 = L_sub( f3i3, f3i7 );
     252           0 :     fi11 = L_sub( f3i11, f3i15 );
     253           0 :     fi12 = L_add( fi10, fi11 );
     254           0 :     fi13 = L_add( f3i5, f3i6 );
     255           0 :     fi14 = L_add( f3i13, f3i14 );
     256           0 :     fi15 = L_add( fi13, fi14 );
     257           0 :     fi16 = L_sub( f3i8, f3i4 );
     258           0 :     fi17 = L_sub( f4i1, f3i12 );
     259           0 :     fi18 = L_add( fi16, fi17 );
     260           0 :     fi19 = L_add( f3i4, f3i8 );
     261           0 :     fi20 = L_add( f3i12, f4i1 );
     262           0 :     fi21 = L_add( fi19, fi20 );
     263           0 :     fi22 = L_add( f3i3, f3i7 );
     264           0 :     fi23 = L_add( f3i11, f3i15 );
     265           0 :     fi24 = L_add( fi22, fi23 );
     266             : 
     267           0 :     f4i10 = zRe[in24]; // Qx
     268           0 :     move32();
     269           0 :     fo6 = zRe[in25]; // Qx
     270           0 :     move32();
     271           0 :     fo7 = zRe[in26]; // Qx
     272           0 :     move32();
     273           0 :     f4i11 = L_add( fo6, fo7 );
     274           0 :     f4i12 = L_sub( f4i10, L_shr( f4i11, 1 ) );
     275           0 :     f4i13 = Mpy_32_16_1( L_sub( fo7, fo6 ), FFT_15PONIT_WNK4 ); // Qx
     276             : 
     277           0 :     f4i14 = zIm[in24]; // Qx
     278           0 :     move32();
     279           0 :     fo8 = zIm[in25]; // Qx
     280           0 :     move32();
     281           0 :     fo9 = zIm[in26]; // Qx
     282           0 :     move32();
     283           0 :     f4i15 = L_add( fo8, fo9 );
     284           0 :     f4i16 = Mpy_32_16_1( L_sub( fo8, fo9 ), FFT_15PONIT_WNK4 ); // Qx
     285           0 :     f4i17 = L_sub( f4i14, L_shr( f4i15, 1 ) );
     286             : 
     287           0 :     f4i18 = zRe[in18]; // Qx
     288           0 :     move32();
     289           0 :     f2o10 = zRe[in16]; // Qx
     290           0 :     move32();
     291           0 :     f2o11 = zRe[in17]; // Qx
     292           0 :     move32();
     293           0 :     f4i19 = L_add( f2o10, f2o11 );
     294           0 :     f4i20 = L_sub( f4i18, L_shr( f4i19, 1 ) );
     295           0 :     fo1 = Mpy_32_16_1( L_sub( f2o11, f2o10 ), FFT_15PONIT_WNK4 ); // Qx
     296             : 
     297           0 :     fo2 = zIm[in18]; // Qx
     298           0 :     move32();
     299           0 :     f2o12 = zIm[in16]; // Qx
     300           0 :     move32();
     301           0 :     f2o13 = zIm[in17]; // Qx
     302           0 :     move32();
     303           0 :     fo3 = L_add( f2o12, f2o13 );
     304           0 :     fo4 = Mpy_32_16_1( L_sub( f2o12, f2o13 ), FFT_15PONIT_WNK4 ); // Qx
     305           0 :     fo5 = L_sub( fo2, L_shr( fo3, 1 ) );
     306             : 
     307           0 :     fi25 = L_add( f4i10, f4i11 );
     308           0 :     fi26 = L_add( f4i18, f4i19 );
     309           0 :     fi27 = L_add( fi25, fi26 );
     310           0 :     fi28 = L_sub( f4i12, f4i16 );
     311           0 :     fi29 = L_sub( f4i20, fo4 );
     312           0 :     fi30 = L_add( fi28, fi29 );
     313           0 :     f2i1 = L_add( f4i14, f4i15 );
     314           0 :     f2i2 = L_add( fo2, fo3 );
     315           0 :     f2i3 = L_add( f2i1, f2i2 );
     316           0 :     f2i4 = L_sub( f4i17, f4i13 );
     317           0 :     f2i5 = L_sub( fo5, fo1 );
     318           0 :     f2i6 = L_add( f2i4, f2i5 );
     319           0 :     f2i7 = L_add( f4i13, f4i17 );
     320           0 :     f2i8 = L_add( fo1, fo5 );
     321           0 :     f2i9 = L_add( f2i7, f2i8 );
     322           0 :     f2i10 = L_add( f4i12, f4i16 );
     323           0 :     f2i11 = L_add( f4i20, fo4 );
     324           0 :     f2i12 = L_add( f2i10, f2i11 );
     325             : 
     326           0 :     fo10 = Mpy_32_16_1( L_sub( fi27, fi9 ), FFT_15PONIT_WNK1 ); // Qx
     327           0 :     fo11 = L_add( fi27, fi9 );
     328           0 :     fo12 = L_sub( fi1, Mpy_32_16_1( fo11, FFT_15PONIT_WNK5 ) ); // Qx
     329           0 :     fo15 = L_sub( fi13, fi14 );
     330           0 :     fo16 = L_sub( f2i1, f2i2 );
     331           0 :     fo13 = L_sub( Mpy_32_16_1( fo15, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fo16, FFT_15PONIT_WNK3 ) ); // Qx
     332           0 :     fo14 = L_add( Mpy_32_16_1( fo15, FFT_15PONIT_WNK3 ), Mpy_32_16_1( fo16, FFT_15PONIT_WNK2 ) ); // Qx
     333             : 
     334           0 :     zRe[in0] = L_add( fi1, fo11 );
     335           0 :     move32();
     336           0 :     fo17 = L_add( fo10, fo12 );
     337           0 :     zRe[in18] = L_sub( fo17, fo14 );
     338           0 :     move32();
     339           0 :     zRe[in24] = L_add( fo17, fo14 );
     340           0 :     move32();
     341           0 :     fo18 = L_sub( fo12, fo10 );
     342           0 :     zRe[in9] = L_sub( fo18, fo13 );
     343           0 :     move32();
     344           0 :     zRe[in33] = L_add( fo18, fo13 );
     345           0 :     move32();
     346             : 
     347           0 :     f2o1 = Mpy_32_16_1( L_sub( f2i3, fi15 ), FFT_15PONIT_WNK1 ); // Qx
     348           0 :     f2o2 = L_add( f2i3, fi15 );
     349           0 :     f2o3 = L_sub( fi2, Mpy_32_16_1( f2o2, FFT_15PONIT_WNK5 ) ); // Qx
     350           0 :     f2o6 = L_sub( fi7, fi8 );
     351           0 :     f2o7 = L_sub( fi25, fi26 );
     352           0 :     f2o4 = L_sub( Mpy_32_16_1( f2o6, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f2o7, FFT_15PONIT_WNK3 ) ); // Qx
     353           0 :     f2o5 = L_add( Mpy_32_16_1( f2o6, FFT_15PONIT_WNK3 ), Mpy_32_16_1( f2o7, FFT_15PONIT_WNK2 ) ); // Qx
     354           0 :     zIm[in0] = L_add( fi2, f2o2 );
     355           0 :     move32();
     356           0 :     f2o8 = L_add( f2o1, f2o3 );
     357           0 :     zIm[in24] = L_sub( f2o8, f2o5 );
     358           0 :     move32();
     359           0 :     zIm[in18] = L_add( f2o5, f2o8 );
     360           0 :     move32();
     361           0 :     f2o9 = L_sub( f2o3, f2o1 );
     362           0 :     zIm[in33] = L_sub( f2o9, f2o4 );
     363           0 :     move32();
     364           0 :     zIm[in9] = L_add( f2o4, f2o9 );
     365           0 :     move32();
     366             : 
     367           0 :     f2o14 = Mpy_32_16_1( L_sub( fi30, fi12 ), FFT_15PONIT_WNK1 ); // Qx
     368           0 :     f2o15 = L_add( fi30, fi12 );
     369           0 :     f3o1 = L_sub( fi3, Mpy_32_16_1( f2o15, FFT_15PONIT_WNK5 ) ); // Qx
     370           0 :     f3o4 = L_sub( fi16, fi17 );
     371           0 :     f3o5 = L_sub( f2i4, f2i5 );
     372           0 :     f3o2 = L_sub( Mpy_32_16_1( f3o4, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f3o5, FFT_15PONIT_WNK3 ) ); // Qx
     373           0 :     f3o3 = L_add( Mpy_32_16_1( f3o5, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f3o4, FFT_15PONIT_WNK3 ) ); // Qx
     374           0 :     zRe[in2] = L_add( fi3, f2o15 );
     375           0 :     move32();
     376           0 :     f3o6 = L_add( f2o14, f3o1 );
     377           0 :     zRe[in17] = L_sub( f3o6, f3o3 );
     378           0 :     move32();
     379           0 :     zRe[in26] = L_add( f3o6, f3o3 );
     380           0 :     move32();
     381           0 :     f3o7 = L_sub( f3o1, f2o14 );
     382           0 :     zRe[in8] = L_sub( f3o7, f3o2 );
     383           0 :     move32();
     384           0 :     zRe[in32] = L_add( f3o7, f3o2 );
     385           0 :     move32();
     386             : 
     387           0 :     f3o8 = Mpy_32_16_1( L_sub( f2i6, fi18 ), FFT_15PONIT_WNK1 ); // Qx
     388           0 :     f3o9 = L_add( f2i6, fi18 );
     389           0 :     f3o10 = L_sub( fi6, Mpy_32_16_1( f3o9, FFT_15PONIT_WNK5 ) ); // Qx
     390           0 :     f3o13 = L_sub( fi10, fi11 );
     391           0 :     f3o14 = L_sub( fi28, fi29 );
     392           0 :     f3o11 = L_sub( Mpy_32_16_1( f3o13, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f3o14, FFT_15PONIT_WNK3 ) ); // Qx
     393           0 :     f3o12 = L_add( Mpy_32_16_1( f3o14, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f3o13, FFT_15PONIT_WNK3 ) ); // Qx
     394           0 :     zIm[in2] = L_add( fi6, f3o9 );
     395           0 :     move32();
     396           0 :     f3o15 = L_add( f3o8, f3o10 );
     397           0 :     zIm[in26] = L_sub( f3o15, f3o12 );
     398           0 :     move32();
     399           0 :     zIm[in17] = L_add( f3o12, f3o15 );
     400           0 :     move32();
     401           0 :     f4o1 = L_sub( f3o10, f3o8 );
     402           0 :     zIm[in8] = L_add( f3o11, f4o1 );
     403           0 :     move32();
     404           0 :     zIm[in32] = L_sub( f4o1, f3o11 );
     405           0 :     move32();
     406             : 
     407           0 :     f4o2 = Mpy_32_16_1( L_sub( f2i9, fi21 ), FFT_15PONIT_WNK1 ); // Qx
     408           0 :     f4o3 = L_add( f2i9, fi21 );
     409           0 :     f4o4 = L_sub( fi5, Mpy_32_16_1( f4o3, FFT_15PONIT_WNK5 ) ); // Qx
     410           0 :     f4o7 = L_sub( f2i10, f2i11 );
     411           0 :     f4o8 = L_sub( fi22, fi23 );
     412           0 :     f4o5 = L_add( Mpy_32_16_1( f4o8, FFT_15PONIT_WNK3 ), Mpy_32_16_1( f4o7, FFT_15PONIT_WNK2 ) ); // Qx
     413           0 :     f4o6 = L_sub( Mpy_32_16_1( f4o8, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f4o7, FFT_15PONIT_WNK3 ) ); // Qx
     414           0 :     zIm[in1] = L_add( fi5, f4o3 );
     415           0 :     move32();
     416           0 :     f4o9 = L_sub( f4o4, f4o2 );
     417           0 :     f4o10 = L_add( f4o2, f4o4 );
     418             : 
     419           0 :     zIm[in10] = L_add( f4o6, f4o9 );
     420           0 :     move32();
     421           0 :     zIm[in34] = L_sub( f4o9, f4o6 );
     422           0 :     move32();
     423           0 :     zIm[in25] = L_sub( f4o10, f4o5 );
     424           0 :     move32();
     425           0 :     zIm[in16] = L_add( f4o5, f4o10 );
     426           0 :     move32();
     427             : 
     428           0 :     f4o11 = Mpy_32_16_1( L_sub( f2i12, fi24 ), FFT_15PONIT_WNK1 ); // Qx
     429           0 :     f4o12 = L_add( f2i12, fi24 );
     430           0 :     f4o13 = L_sub( fi4, Mpy_32_16_1( f4o12, FFT_15PONIT_WNK5 ) ); // Qx
     431           0 :     f4o16 = L_sub( f2i7, f2i8 );
     432           0 :     f4o17 = L_sub( fi19, fi20 );
     433           0 :     f4o14 = L_add( Mpy_32_16_1( f4o16, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f4o17, FFT_15PONIT_WNK3 ) ); // Qx
     434           0 :     f4o15 = L_sub( Mpy_32_16_1( f4o17, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f4o16, FFT_15PONIT_WNK3 ) ); // Qx
     435           0 :     zRe[in1] = L_add( fi4, f4o12 );
     436           0 :     move32();
     437           0 :     f4o18 = L_sub( f4o13, f4o11 );
     438           0 :     f4o19 = L_add( f4o11, f4o13 );
     439             : 
     440           0 :     zRe[in10] = L_sub( f4o18, f4o15 );
     441           0 :     move32();
     442           0 :     zRe[in34] = L_add( f4o18, f4o15 );
     443           0 :     move32();
     444           0 :     zRe[in16] = L_sub( f4o19, f4o14 );
     445           0 :     move32();
     446           0 :     zRe[in25] = L_add( f4o19, f4o14 );
     447           0 :     move32();
     448             : 
     449           0 :     return;
     450             : }
     451             : 
     452             : /*-----------------------------------------------------------------*
     453             :  * fft15_shift8()
     454             :  * 15-point FFT with 8-point circular shift
     455             :  *-----------------------------------------------------------------*/
     456             : 
     457           0 : static void fft15_shift8(
     458             :     Word16 n1,        /* i  : length of data                           */
     459             :     Word32 *zRe,      /* i/o: real part of input and output data Qx      */
     460             :     Word32 *zIm,      /* i/o: imaginary part of input and output data Qx */
     461             :     const Word16 *Idx /* i  : pointer of the address table Q0            */
     462             : )
     463             : {
     464             :     Word16 in0, in8, in16, in24, in32, in1, in9, in17, in25, in33, in2, in10, in18, in26, in34;
     465             :     Word32 fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8, fi9, fi10, fi11, fi12, fi13, fi14, fi15;
     466             :     Word32 fi16, fi17, fi18, fi19, fi20, fi21, fi22, fi23, fi24, fi25, fi26, fi27, fi28, fi29, fi30;
     467             :     Word32 f2i1, f2i2, f2i3, f2i4, f2i5, f2i6, f2i7, f2i8, f2i9, f2i10, f2i11, f2i12;
     468             :     Word32 f2i13, f2i14, f2i15, f3i1, f3i2, f3i3, f3i4, f3i5, f3i6, f3i7, f3i8, f3i9;
     469             :     Word32 f3i10, f3i11, f3i12, f3i13, f3i14, f3i15, f4i1, f4i2, f4i3, f4i4, f4i5, f4i6, f4i7, f4i8, f4i9;
     470             :     Word32 f4i10, f4i11, f4i12, f4i13, f4i14, f4i15, fo1, fo2, fo3, fo4, fo5, fo6;
     471             :     Word32 fo7, fo8, fo9, fo10, fo11, fo12, fo13, fo14, fo15, f2o1, f2o2, f2o3, f2o4;
     472             :     Word32 f2o5, f2o6, f2o7, f2o8, f2o9, f2o10, f2o11, f2o12, f2o13, f2o14, f2o15;
     473             :     Word32 f3o1, f3o2, f3o3, f3o4, f3o5, f3o6, f3o7, f3o8, f3o9, f3o10, f3o11, f3o12;
     474             :     Word32 f3o13, f3o14, f3o15, f4o1, f4o2, f4o3, f4o4, f4o5, f4o6, f4o7, f4o8, f4o9;
     475             :     Word32 f4o10, f4o11, f4o12, f4o13, f4o14, f4o15, f5o1, f5o2, f5o3, f5o4, f5o5, f5o6, f5o7;
     476             :     Word32 f5o8, f5o9, f5o10, f5o11, f5o12, f5o13, f5o14, f5o15, f5o16, f5o17, f5o18, f5o19, f5o21, f5o22;
     477             : 
     478           0 :     in0 = Idx[0];
     479           0 :     move16();
     480           0 :     in8 = Idx[n1];
     481           0 :     move16();
     482           0 :     in16 = Idx[n1 * 2];
     483           0 :     move16();
     484           0 :     in24 = Idx[( n1 * 3 )];
     485           0 :     move16();
     486           0 :     in32 = Idx[n1 * 4];
     487           0 :     move16();
     488           0 :     in1 = Idx[( n1 * 5 )];
     489           0 :     move16();
     490           0 :     in9 = Idx[n1 * 6];
     491           0 :     move16();
     492           0 :     in17 = Idx[( n1 * 7 )];
     493           0 :     move16();
     494           0 :     in25 = Idx[n1 * 8];
     495           0 :     move16();
     496           0 :     in33 = Idx[( n1 * 9 )];
     497           0 :     move16();
     498           0 :     in2 = Idx[n1 * 10];
     499           0 :     move16();
     500           0 :     in10 = Idx[( n1 * 11 )];
     501           0 :     move16();
     502           0 :     in18 = Idx[n1 * 12];
     503           0 :     move16();
     504           0 :     in26 = Idx[( n1 * 13 )];
     505           0 :     move16();
     506           0 :     in34 = Idx[n1 * 14];
     507           0 :     move16();
     508             : 
     509           0 :     f2i13 = zRe[in0]; // Qx
     510           0 :     f2i14 = zIm[in0]; // Qx
     511           0 :     f3i6 = zRe[in1];  // Qx
     512           0 :     f3i7 = zRe[in2];  // Qx
     513           0 :     f3i8 = zIm[in1];  // Qx
     514           0 :     f3i9 = zIm[in2];  // Qx
     515             : 
     516           0 :     f2i15 = L_add( f3i6, f3i7 );
     517           0 :     f3i1 = Mpy_32_16_1( L_sub( f3i7, f3i6 ), FFT_15PONIT_WNK4 ); // Qx
     518           0 :     f3i2 = Mpy_32_16_1( L_sub( f3i8, f3i9 ), FFT_15PONIT_WNK4 ); // Qx
     519           0 :     f3i3 = L_add( f3i8, f3i9 );
     520             : 
     521           0 :     fi1 = L_add( f2i13, f2i15 );
     522           0 :     fi2 = L_add( f2i14, f3i3 );
     523           0 :     f3i4 = L_sub( f2i13, L_shr( f2i15, 1 ) );
     524           0 :     fi3 = L_sub( f3i4, f3i2 );
     525           0 :     fi4 = L_add( f3i4, f3i2 );
     526           0 :     f3i5 = L_sub( f2i14, L_shr( f3i3, 1 ) );
     527           0 :     fi5 = L_add( f3i1, f3i5 );
     528           0 :     fi6 = L_sub( f3i5, f3i1 );
     529             : 
     530           0 :     f3i10 = zRe[in9];
     531           0 :     move32();
     532           0 :     f4i11 = zRe[in10];
     533           0 :     move32();
     534           0 :     f4i12 = zRe[in8];
     535           0 :     move32();
     536           0 :     f3i14 = zIm[in9];
     537           0 :     move32();
     538           0 :     f4i13 = zIm[in10];
     539           0 :     move32();
     540           0 :     f4i14 = zIm[in8];
     541           0 :     move32();
     542           0 :     f4i3 = zRe[in33];
     543           0 :     move32();
     544           0 :     f4i15 = zRe[in34];
     545           0 :     move32();
     546           0 :     fo1 = zRe[in32];
     547           0 :     move32();
     548           0 :     f4i7 = zIm[in33];
     549           0 :     move32();
     550           0 :     fo2 = zIm[in34];
     551           0 :     move32();
     552           0 :     fo3 = zIm[in32];
     553           0 :     move32();
     554             : 
     555             : 
     556           0 :     f3i11 = L_add( f4i11, f4i12 );
     557           0 :     f3i12 = L_sub( f3i10, L_shr( f3i11, 1 ) );
     558           0 :     f3i13 = Mpy_32_16_1( L_sub( f4i12, f4i11 ), FFT_15PONIT_WNK4 ); // Qx
     559           0 :     f3i15 = L_add( f4i13, f4i14 );
     560           0 :     f4i1 = Mpy_32_16_1( L_sub( f4i13, f4i14 ), FFT_15PONIT_WNK4 ); // Qx
     561           0 :     f4i2 = L_sub( f3i14, L_shr( f3i15, 1 ) );
     562           0 :     f4i4 = L_add( f4i15, fo1 );
     563           0 :     f4i5 = L_sub( f4i3, L_shr( f4i4, 1 ) );
     564           0 :     f4i6 = Mpy_32_16_1( L_sub( fo1, f4i15 ), FFT_15PONIT_WNK4 ); // Qx
     565           0 :     f4i8 = L_add( fo2, fo3 );
     566           0 :     f4i9 = Mpy_32_16_1( L_sub( fo2, fo3 ), FFT_15PONIT_WNK4 ); // Qx
     567           0 :     f4i10 = L_sub( f4i7, L_shr( f4i8, 1 ) );
     568             : 
     569           0 :     fi7 = L_add( f3i10, f3i11 );
     570           0 :     fi8 = L_add( f4i3, f4i4 );
     571           0 :     fi9 = L_add( fi7, fi8 );
     572           0 :     fi10 = L_sub( f3i12, f4i1 );
     573           0 :     fi11 = L_sub( f4i5, f4i9 );
     574           0 :     fi12 = L_add( fi10, fi11 );
     575           0 :     fi13 = L_add( f3i14, f3i15 );
     576           0 :     fi14 = L_add( f4i7, f4i8 );
     577           0 :     fi15 = L_add( fi13, fi14 );
     578           0 :     fi16 = L_sub( f4i2, f3i13 );
     579           0 :     fi17 = L_sub( f4i10, f4i6 );
     580           0 :     fi18 = L_add( fi16, fi17 );
     581           0 :     fi19 = L_add( f3i13, f4i2 );
     582           0 :     fi20 = L_add( f4i6, f4i10 );
     583           0 :     fi21 = L_add( fi19, fi20 );
     584           0 :     fi22 = L_add( f3i12, f4i1 );
     585           0 :     fi23 = L_add( f4i5, f4i9 );
     586           0 :     fi24 = L_add( fi22, fi23 );
     587             : 
     588           0 :     fo4 = zRe[in24];
     589           0 :     move32();
     590           0 :     f2o5 = zRe[in25];
     591           0 :     move32();
     592           0 :     f2o6 = zRe[in26];
     593           0 :     move32();
     594           0 :     fo8 = zIm[in24];
     595           0 :     move32();
     596           0 :     f2o7 = zIm[in25];
     597           0 :     move32();
     598           0 :     f2o8 = zIm[in26];
     599           0 :     move32();
     600           0 :     fo12 = zRe[in18];
     601           0 :     move32();
     602           0 :     f2o9 = zRe[in16];
     603           0 :     move32();
     604           0 :     f2o10 = zRe[in17];
     605           0 :     move32();
     606           0 :     f2o1 = zIm[in18];
     607           0 :     move32();
     608           0 :     f2o11 = zIm[in16];
     609           0 :     move32();
     610           0 :     f2o12 = zIm[in17];
     611           0 :     move32();
     612             : 
     613             : 
     614           0 :     fo5 = L_add( f2o5, f2o6 );
     615           0 :     fo6 = L_sub( fo4, L_shr( fo5, 1 ) );
     616           0 :     fo7 = Mpy_32_16_1( L_sub( f2o6, f2o5 ), FFT_15PONIT_WNK4 ); // Qx
     617           0 :     fo9 = L_add( f2o7, f2o8 );
     618           0 :     fo10 = Mpy_32_16_1( L_sub( f2o7, f2o8 ), FFT_15PONIT_WNK4 ); // Qx
     619           0 :     fo11 = L_sub( fo8, L_shr( fo9, 1 ) );
     620           0 :     fo13 = L_add( f2o9, f2o10 );
     621           0 :     fo14 = L_sub( fo12, L_shr( fo13, 1 ) );
     622           0 :     fo15 = Mpy_32_16_1( L_sub( f2o10, f2o9 ), FFT_15PONIT_WNK4 ); // Qx
     623           0 :     f2o2 = L_add( f2o11, f2o12 );
     624           0 :     f2o3 = Mpy_32_16_1( L_sub( f2o11, f2o12 ), FFT_15PONIT_WNK4 ); // Qx
     625           0 :     f2o4 = L_sub( f2o1, L_shr( f2o2, 1 ) );
     626             : 
     627           0 :     fi25 = L_add( fo4, fo5 );
     628           0 :     fi26 = L_add( fo12, fo13 );
     629           0 :     fi27 = L_add( fi25, fi26 );
     630           0 :     fi28 = L_sub( fo6, fo10 );
     631           0 :     fi29 = L_sub( fo14, f2o3 );
     632           0 :     fi30 = L_add( fi28, fi29 );
     633           0 :     f2i1 = L_add( fo8, fo9 );
     634           0 :     f2i2 = L_add( f2o1, f2o2 );
     635           0 :     f2i3 = L_add( f2i1, f2i2 );
     636           0 :     f2i4 = L_sub( fo11, fo7 );
     637           0 :     f2i5 = L_sub( f2o4, fo15 );
     638           0 :     f2i6 = L_add( f2i4, f2i5 );
     639           0 :     f2i7 = L_add( fo7, fo11 );
     640           0 :     f2i8 = L_add( fo15, f2o4 );
     641           0 :     f2i9 = L_add( f2i7, f2i8 );
     642           0 :     f2i10 = L_add( fo6, fo10 );
     643           0 :     f2i11 = L_add( fo14, f2o3 );
     644           0 :     f2i12 = L_add( f2i10, f2i11 );
     645             : 
     646           0 :     f2o13 = Mpy_32_16_1( L_sub( fi27, fi9 ), FFT_15PONIT_WNK1 ); // Qx
     647           0 :     f2o14 = L_add( fi27, fi9 );
     648           0 :     f2o15 = L_sub( fi1, Mpy_32_16_1( f2o14, FFT_15PONIT_WNK5 ) ); // Qx
     649           0 :     f3o3 = L_sub( fi13, fi14 );
     650           0 :     f3o4 = L_sub( f2i1, f2i2 );
     651           0 :     f3o1 = L_sub( Mpy_32_16_1( f3o3, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f3o4, FFT_15PONIT_WNK3 ) ); // Qx
     652           0 :     f3o2 = L_add( Mpy_32_16_1( f3o4, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f3o3, FFT_15PONIT_WNK3 ) ); // Qx
     653           0 :     zRe[in0] = L_add( fi1, f2o14 );
     654           0 :     move32();
     655           0 :     f3o5 = L_add( f2o13, f2o15 );
     656           0 :     zRe[in24] = L_sub( f3o5, f3o2 );
     657           0 :     move32();
     658           0 :     zRe[in18] = L_add( f3o5, f3o2 );
     659           0 :     move32();
     660           0 :     f3o6 = L_sub( f2o15, f2o13 );
     661           0 :     zRe[in33] = L_sub( f3o6, f3o1 );
     662           0 :     move32();
     663           0 :     zRe[in9] = L_add( f3o6, f3o1 );
     664           0 :     move32();
     665             : 
     666           0 :     f3o7 = Mpy_32_16_1( L_sub( f2i3, fi15 ), FFT_15PONIT_WNK1 ); // Qx
     667           0 :     f3o8 = L_add( f2i3, fi15 );
     668           0 :     f3o9 = L_sub( fi2, Mpy_32_16_1( f3o8, FFT_15PONIT_WNK5 ) ); // Qx
     669           0 :     f3o12 = L_sub( fi7, fi8 );
     670           0 :     f3o13 = L_sub( fi25, fi26 );
     671           0 :     f3o10 = L_sub( Mpy_32_16_1( f3o12, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f3o13, FFT_15PONIT_WNK3 ) ); // Qx
     672           0 :     f3o11 = L_add( Mpy_32_16_1( f3o13, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f3o12, FFT_15PONIT_WNK3 ) ); // Qx
     673           0 :     zIm[in0] = L_add( fi2, f3o8 );
     674           0 :     move32();
     675           0 :     f3o14 = L_add( f3o7, f3o9 );
     676           0 :     zIm[in18] = L_sub( f3o14, f3o11 );
     677           0 :     move32();
     678           0 :     zIm[in24] = L_add( f3o11, f3o14 );
     679           0 :     move32();
     680           0 :     f3o15 = L_sub( f3o9, f3o7 );
     681           0 :     zIm[in9] = L_sub( f3o15, f3o10 );
     682           0 :     move32();
     683           0 :     zIm[in33] = L_add( f3o10, f3o15 );
     684           0 :     move32();
     685             : 
     686           0 :     f4o1 = Mpy_32_16_1( L_sub( fi30, fi12 ), FFT_15PONIT_WNK1 ); // Qx
     687           0 :     f4o2 = L_add( fi30, fi12 );
     688           0 :     f4o3 = L_sub( fi3, Mpy_32_16_1( f4o2, FFT_15PONIT_WNK5 ) ); // Qx
     689           0 :     f4o6 = L_sub( fi16, fi17 );
     690           0 :     f4o7 = L_sub( f2i4, f2i5 );
     691           0 :     f4o4 = L_sub( Mpy_32_16_1( f4o6, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f4o7, FFT_15PONIT_WNK3 ) ); // Qx
     692           0 :     f4o5 = L_add( Mpy_32_16_1( f4o7, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f4o6, FFT_15PONIT_WNK3 ) ); // Qx
     693           0 :     zRe[in2] = L_add( fi3, f4o2 );
     694           0 :     move32();
     695           0 :     f4o8 = L_add( f4o1, f4o3 );
     696           0 :     zRe[in26] = L_sub( f4o8, f4o5 );
     697           0 :     move32();
     698           0 :     zRe[in17] = L_add( f4o8, f4o5 );
     699           0 :     move32();
     700           0 :     f4o9 = L_sub( f4o3, f4o1 );
     701           0 :     zRe[in32] = L_sub( f4o9, f4o4 );
     702           0 :     move32();
     703           0 :     zRe[in8] = L_add( f4o9, f4o4 );
     704           0 :     move32();
     705             : 
     706           0 :     f4o10 = Mpy_32_16_1( L_sub( f2i6, fi18 ), FFT_15PONIT_WNK1 ); // Qx
     707           0 :     f4o11 = L_add( f2i6, fi18 );
     708           0 :     f4o12 = L_sub( fi6, Mpy_32_16_1( f4o11, FFT_15PONIT_WNK5 ) ); // Qx
     709           0 :     f4o15 = L_sub( fi10, fi11 );
     710           0 :     f5o1 = L_sub( fi28, fi29 );
     711           0 :     f4o13 = L_sub( Mpy_32_16_1( f4o15, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f5o1, FFT_15PONIT_WNK3 ) ); // Qx
     712           0 :     f4o14 = L_add( Mpy_32_16_1( f5o1, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f4o15, FFT_15PONIT_WNK3 ) ); // Qx
     713           0 :     zIm[in2] = L_add( fi6, f4o11 );
     714           0 :     move32();
     715           0 :     f5o2 = L_add( f4o10, f4o12 );
     716           0 :     zIm[in17] = L_sub( f5o2, f4o14 );
     717           0 :     move32();
     718           0 :     zIm[in26] = L_add( f4o14, f5o2 );
     719           0 :     move32();
     720           0 :     f5o3 = L_sub( f4o12, f4o10 );
     721           0 :     zIm[in32] = L_add( f4o13, f5o3 );
     722           0 :     move32();
     723           0 :     zIm[in8] = L_sub( f5o3, f4o13 );
     724           0 :     move32();
     725             : 
     726           0 :     f5o4 = Mpy_32_16_1( L_sub( f2i9, fi21 ), FFT_15PONIT_WNK1 ); // Qx
     727           0 :     f5o5 = L_add( f2i9, fi21 );
     728           0 :     f5o6 = L_sub( fi5, Mpy_32_16_1( f5o5, FFT_15PONIT_WNK5 ) ); // Qx
     729           0 :     f5o9 = L_sub( f2i10, f2i11 );
     730           0 :     f5o10 = L_sub( fi22, fi23 );
     731           0 :     f5o7 = L_add( Mpy_32_16_1( f5o9, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f5o10, FFT_15PONIT_WNK3 ) ); // Qx
     732           0 :     f5o8 = L_sub( Mpy_32_16_1( f5o10, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f5o9, FFT_15PONIT_WNK3 ) ); // Qx
     733           0 :     zIm[in1] = L_add( fi5, f5o5 );
     734           0 :     move32();
     735           0 :     f5o11 = L_sub( f5o6, f5o4 );
     736           0 :     f5o12 = L_add( f5o4, f5o6 );
     737           0 :     zIm[in34] = L_add( f5o8, f5o11 );
     738           0 :     move32();
     739           0 :     zIm[in10] = L_sub( f5o11, f5o8 );
     740           0 :     move32();
     741             : 
     742           0 :     zIm[in16] = L_sub( f5o12, f5o7 );
     743           0 :     move32();
     744           0 :     zIm[in25] = L_add( f5o7, f5o12 );
     745           0 :     move32();
     746             : 
     747           0 :     f5o13 = Mpy_32_16_1( L_sub( f2i12, fi24 ), FFT_15PONIT_WNK1 ); // Qx
     748           0 :     f5o14 = L_add( f2i12, fi24 );
     749           0 :     f5o15 = L_sub( fi4, Mpy_32_16_1( f5o14, FFT_15PONIT_WNK5 ) ); // Qx
     750           0 :     f5o18 = L_sub( f2i7, f2i8 );
     751           0 :     f5o19 = L_sub( fi19, fi20 );
     752           0 :     f5o16 = L_add( Mpy_32_16_1( f5o18, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f5o19, FFT_15PONIT_WNK3 ) ); // Qx
     753           0 :     f5o17 = L_sub( Mpy_32_16_1( f5o19, FFT_15PONIT_WNK2 ), Mpy_32_16_1( f5o18, FFT_15PONIT_WNK3 ) ); // Qx
     754           0 :     zRe[in1] = L_add( fi4, f5o14 );
     755           0 :     move32();
     756           0 :     f5o21 = L_sub( f5o15, f5o13 );
     757           0 :     f5o22 = L_add( f5o13, f5o15 );
     758             : 
     759           0 :     zRe[in34] = L_sub( f5o21, f5o17 );
     760           0 :     move32();
     761           0 :     zRe[in10] = L_add( f5o21, f5o17 );
     762           0 :     move32();
     763           0 :     zRe[in25] = L_sub( f5o22, f5o16 );
     764           0 :     move32();
     765           0 :     zRe[in16] = L_add( f5o22, f5o16 );
     766           0 :     move32();
     767             : 
     768           0 :     return;
     769             : }
     770             : 
     771             : /*-----------------------------------------------------------------*
     772             :  * fft5_shift1()
     773             :  * 5-point FFT with 1-point circular shift
     774             :  *-----------------------------------------------------------------*/
     775             : 
     776       58240 : static void fft5_shift1(
     777             :     Word16 n1,        /* i  : length of data Q0                          */
     778             :     Word32 *zRe,      /* i/o: real part of input and output data Qx      */
     779             :     Word32 *zIm,      /* i/o: imaginary part of input and output data Qx */
     780             :     const Word16 *Idx /* i  : pointer of the address table Q0            */
     781             : )
     782             : {
     783             :     Word32 fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8;
     784             :     Word32 fo1, fo2, fo3, fo4, fo5, fo6, fo7, fo8;
     785             :     Word16 in1, in2, in3, in4, in5;
     786             : 
     787       58240 :     in1 = Idx[0];
     788       58240 :     move16();
     789       58240 :     in2 = Idx[n1];
     790       58240 :     move16();
     791       58240 :     in3 = Idx[n1 * 2];
     792       58240 :     move16();
     793       58240 :     in4 = Idx[( n1 * 3 )];
     794       58240 :     move16();
     795       58240 :     in5 = Idx[n1 * 4];
     796       58240 :     move16();
     797             : 
     798       58240 :     fi1 = zRe[in1]; // Qx
     799       58240 :     move32();
     800       58240 :     fi2 = zIm[in1]; // Qx
     801       58240 :     move32();
     802       58240 :     fo3 = zRe[in2]; // Qx
     803       58240 :     move32();
     804       58240 :     fo4 = zRe[in5]; // Qx
     805       58240 :     move32();
     806       58240 :     fo6 = zRe[in3]; // Qx
     807       58240 :     move32();
     808       58240 :     fo7 = zRe[in4]; // Qx
     809       58240 :     move32();
     810             : 
     811       58240 :     fo5 = L_add( fo3, fo4 );
     812       58240 :     fo8 = L_add( fo6, fo7 );
     813       58240 :     fi3 = L_add( fo5, fo8 );
     814       58240 :     fi4 = L_sub( fo6, fo7 );
     815       58240 :     fi5 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); // Qx
     816       58240 :     fi6 = L_sub( fo3, fo4 );
     817             : 
     818       58240 :     fo3 = zIm[in2];
     819       58240 :     move32();
     820       58240 :     fo4 = zIm[in5];
     821       58240 :     move32();
     822       58240 :     fo6 = zIm[in3];
     823       58240 :     move32();
     824       58240 :     fo7 = zIm[in4];
     825       58240 :     move32();
     826             : 
     827       58240 :     fo5 = L_add( fo3, fo4 );
     828       58240 :     fo8 = L_add( fo6, fo7 );
     829       58240 :     fi7 = L_sub( fo3, fo4 );
     830       58240 :     fi8 = L_add( fo5, fo8 );
     831       58240 :     fo1 = L_sub( fo6, fo7 );
     832       58240 :     fo2 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); // Qx
     833             : 
     834       58240 :     zRe[in1] = L_add( fi1, fi3 );
     835       58240 :     move32();
     836       58240 :     zIm[in1] = L_add( fi2, fi8 );
     837       58240 :     move32();
     838             : 
     839       58240 :     fo3 = L_add( Mpy_32_16_1( fi7, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fo1, FFT_15PONIT_WNK3 ) ); // Qx
     840       58240 :     fo4 = L_sub( Mpy_32_16_1( fo1, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi7, FFT_15PONIT_WNK3 ) ); // Qx
     841       58240 :     fo7 = L_sub( fi1, L_shr( fi3, 2 ) );
     842       58240 :     fo5 = L_add( fi5, fo7 );
     843       58240 :     fo6 = L_sub( fo7, fi5 );
     844             : 
     845       58240 :     zRe[in2] = L_add( fo5, fo3 );
     846       58240 :     move32();
     847       58240 :     zRe[in3] = L_sub( fo6, fo4 );
     848       58240 :     move32();
     849       58240 :     zRe[in4] = L_add( fo6, fo4 );
     850       58240 :     move32();
     851       58240 :     zRe[in5] = L_sub( fo5, fo3 );
     852       58240 :     move32();
     853             : 
     854       58240 :     fo3 = L_add( Mpy_32_16_1( fi6, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi4, FFT_15PONIT_WNK3 ) ); // Qx
     855       58240 :     fo4 = L_sub( Mpy_32_16_1( fi4, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi6, FFT_15PONIT_WNK3 ) ); // Qx
     856       58240 :     fo7 = L_sub( fi2, L_shr( fi8, 2 ) );
     857       58240 :     fo5 = L_add( fo2, fo7 );
     858       58240 :     fo6 = L_sub( fo7, fo2 );
     859             : 
     860       58240 :     zIm[in2] = L_sub( fo5, fo3 );
     861       58240 :     move32();
     862       58240 :     zIm[in3] = L_add( fo4, fo6 );
     863       58240 :     move32();
     864       58240 :     zIm[in4] = L_sub( fo6, fo4 );
     865       58240 :     move32();
     866       58240 :     zIm[in5] = L_add( fo3, fo5 );
     867       58240 :     move32();
     868             : 
     869       58240 :     return;
     870             : }
     871             : 
     872             : /*-----------------------------------------------------------------*
     873             :  * fft5_shift4()
     874             :  * 5-point FFT with 4-point circular shift
     875             :  *-----------------------------------------------------------------*/
     876             : 
     877     4796288 : static void fft5_shift4(
     878             :     Word16 n1,        /* i  : length of data Q0                          */
     879             :     Word32 *zRe,      /* i/o: real part of input and output data Qx      */
     880             :     Word32 *zIm,      /* i/o: imaginary part of input and output data Qx */
     881             :     const Word16 *Idx /* i  : pointer of the address table Q0            */
     882             : )
     883             : {
     884             :     Word32 fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8;
     885             :     Word32 fo1, fo2, fo3, fo4, fo5, fo6, fo7, fo8;
     886             :     Word16 in1, in2, in3, in4, in5;
     887             : 
     888     4796288 :     in1 = Idx[0];
     889     4796288 :     move16();
     890     4796288 :     in2 = Idx[n1];
     891     4796288 :     move16();
     892     4796288 :     in3 = Idx[n1 * 2];
     893     4796288 :     move16();
     894     4796288 :     in4 = Idx[( n1 * 3 )];
     895     4796288 :     move16();
     896     4796288 :     in5 = Idx[n1 * 4];
     897     4796288 :     move16();
     898             : 
     899     4796288 :     fi1 = zRe[in1]; // Qx
     900     4796288 :     move32();
     901     4796288 :     fi2 = zIm[in1]; // Qx
     902     4796288 :     move32();
     903     4796288 :     fo3 = zRe[in2]; // Qx
     904     4796288 :     move32();
     905     4796288 :     fo4 = zRe[in5]; // Qx
     906     4796288 :     move32();
     907     4796288 :     fo6 = zRe[in3]; // Qx
     908     4796288 :     move32();
     909     4796288 :     fo7 = zRe[in4]; // Qx
     910     4796288 :     move32();
     911             : 
     912     4796288 :     fo5 = L_add( fo3, fo4 );
     913     4796288 :     fo8 = L_add( fo6, fo7 );
     914     4796288 :     fi3 = L_add( fo5, fo8 );
     915     4796288 :     fi4 = L_sub( fo6, fo7 );
     916     4796288 :     fi5 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); // Qx
     917     4796288 :     fi6 = L_sub( fo3, fo4 );
     918             : 
     919     4796288 :     fo3 = zIm[in2];
     920     4796288 :     move32();
     921     4796288 :     fo4 = zIm[in5];
     922     4796288 :     move32();
     923     4796288 :     fo6 = zIm[in3];
     924     4796288 :     move32();
     925     4796288 :     fo7 = zIm[in4];
     926     4796288 :     move32();
     927             : 
     928     4796288 :     fo5 = L_add( fo3, fo4 );
     929     4796288 :     fo8 = L_add( fo6, fo7 );
     930     4796288 :     fi7 = L_sub( fo3, fo4 );
     931     4796288 :     fi8 = L_add( fo5, fo8 );
     932     4796288 :     fo1 = L_sub( fo6, fo7 );
     933     4796288 :     fo2 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); // Qx
     934             : 
     935     4796288 :     zRe[in1] = L_add( fi1, fi3 );
     936     4796288 :     move32();
     937     4796288 :     zIm[in1] = L_add( fi2, fi8 );
     938     4796288 :     move32();
     939             : 
     940     4796288 :     fo3 = L_add( Mpy_32_16_1( fi7, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fo1, FFT_15PONIT_WNK3 ) ); // Qx
     941     4796288 :     fo4 = L_sub( Mpy_32_16_1( fo1, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi7, FFT_15PONIT_WNK3 ) ); // Qx
     942     4796288 :     fo7 = L_sub( fi1, L_shr( fi3, 2 ) );
     943     4796288 :     fo5 = L_add( fi5, fo7 );
     944     4796288 :     fo6 = L_sub( fo7, fi5 );
     945             : 
     946     4796288 :     zRe[in2] = L_sub( fo5, fo3 );
     947     4796288 :     move32();
     948     4796288 :     zRe[in4] = L_sub( fo6, fo4 );
     949     4796288 :     move32();
     950     4796288 :     zRe[in3] = L_add( fo6, fo4 );
     951     4796288 :     move32();
     952     4796288 :     zRe[in5] = L_add( fo5, fo3 );
     953     4796288 :     move32();
     954             : 
     955     4796288 :     fo3 = L_add( Mpy_32_16_1( fi6, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi4, FFT_15PONIT_WNK3 ) ); // Qx
     956     4796288 :     fo4 = L_sub( Mpy_32_16_1( fi4, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi6, FFT_15PONIT_WNK3 ) ); // Qx
     957     4796288 :     fo7 = L_sub( fi2, L_shr( fi8, 2 ) );
     958     4796288 :     fo5 = L_add( fo2, fo7 );
     959     4796288 :     fo6 = L_sub( fo7, fo2 );
     960             : 
     961     4796288 :     zIm[in3] = L_sub( fo6, fo4 );
     962     4796288 :     move32();
     963     4796288 :     zIm[in2] = L_add( fo3, fo5 );
     964     4796288 :     move32();
     965     4796288 :     zIm[in4] = L_add( fo4, fo6 );
     966     4796288 :     move32();
     967     4796288 :     zIm[in5] = L_sub( fo5, fo3 );
     968     4796288 :     move32();
     969             : 
     970     4796288 :     return;
     971             : }
     972             : 
     973             : /*-----------------------------------------------------------------*
     974             :  * fft5_32()
     975             :  * 5-point FFT called for 32 times
     976             :  *-----------------------------------------------------------------*/
     977             : 
     978       41536 : static void fft5_32(
     979             :     Word32 *zRe,      /* i/o: real part of input and output data Qx      */
     980             :     Word32 *zIm,      /* i/o: imaginary part of input and output data Qx */
     981             :     const Word16 *Idx /* i  : pointer of the address table Q0            */
     982             : )
     983             : {
     984             :     Word32 fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8;
     985             :     Word32 fo1, fo2, fo3, fo4, fo5, fo6, fo7, fo8;
     986             :     Word16 in1, in2, in3, in4, in5;
     987             : 
     988       41536 :     in1 = Idx[0];
     989       41536 :     move16();
     990       41536 :     in2 = Idx[32];
     991       41536 :     move16();
     992       41536 :     in3 = Idx[64];
     993       41536 :     move16();
     994       41536 :     in4 = Idx[96];
     995       41536 :     move16();
     996       41536 :     in5 = Idx[128];
     997       41536 :     move16();
     998             : 
     999       41536 :     fi1 = zRe[in1]; // Qx
    1000       41536 :     move32();
    1001       41536 :     fi2 = zIm[in1]; // Qx
    1002       41536 :     move32();
    1003       41536 :     fo3 = zRe[in2]; // Qx
    1004       41536 :     move32();
    1005       41536 :     fo4 = zRe[in5]; // Qx
    1006       41536 :     move32();
    1007       41536 :     fo6 = zRe[in3]; // Qx
    1008       41536 :     move32();
    1009       41536 :     fo7 = zRe[in4]; // Qx
    1010       41536 :     move32();
    1011             : 
    1012       41536 :     fo5 = L_add( fo3, fo4 );
    1013       41536 :     fo8 = L_add( fo6, fo7 );
    1014       41536 :     fi3 = L_add( fo5, fo8 );
    1015       41536 :     fi4 = L_sub( fo6, fo7 );
    1016       41536 :     fi5 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); // Qx
    1017       41536 :     fi6 = L_sub( fo3, fo4 );
    1018             : 
    1019       41536 :     fo3 = zIm[in2];
    1020       41536 :     move32();
    1021       41536 :     fo4 = zIm[in5];
    1022       41536 :     move32();
    1023       41536 :     fo6 = zIm[in3];
    1024       41536 :     move32();
    1025       41536 :     fo7 = zIm[in4];
    1026       41536 :     move32();
    1027             : 
    1028       41536 :     fo5 = L_add( fo3, fo4 );
    1029       41536 :     fo8 = L_add( fo6, fo7 );
    1030       41536 :     fi7 = L_sub( fo3, fo4 );
    1031       41536 :     fi8 = L_add( fo5, fo8 );
    1032       41536 :     fo1 = L_sub( fo6, fo7 );
    1033       41536 :     fo2 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); // Qx
    1034             : 
    1035       41536 :     zRe[in1] = L_add( fi1, fi3 );
    1036       41536 :     move32();
    1037       41536 :     zIm[in1] = L_add( fi2, fi8 );
    1038       41536 :     move32();
    1039             : 
    1040       41536 :     fo3 = L_add( Mpy_32_16_1( fi7, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fo1, FFT_15PONIT_WNK3 ) ); // Qx
    1041       41536 :     fo4 = L_sub( Mpy_32_16_1( fo1, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi7, FFT_15PONIT_WNK3 ) ); // Qx
    1042       41536 :     fo7 = L_sub( fi1, L_shr( fi3, 2 ) );
    1043       41536 :     fo5 = L_add( fi5, fo7 );
    1044       41536 :     fo6 = L_sub( fo7, fi5 );
    1045             : 
    1046       41536 :     zRe[in2] = L_add( fo6, fo4 );
    1047       41536 :     move32();
    1048       41536 :     zRe[in3] = L_add( fo5, fo3 );
    1049       41536 :     move32();
    1050       41536 :     zRe[in4] = L_sub( fo5, fo3 );
    1051       41536 :     move32();
    1052       41536 :     zRe[in5] = L_sub( fo6, fo4 );
    1053       41536 :     move32();
    1054             : 
    1055       41536 :     fo3 = L_add( Mpy_32_16_1( fi6, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi4, FFT_15PONIT_WNK3 ) ); // Qx
    1056       41536 :     fo4 = L_sub( Mpy_32_16_1( fi4, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi6, FFT_15PONIT_WNK3 ) ); // Qx
    1057       41536 :     fo7 = L_sub( fi2, L_shr( fi8, 2 ) );
    1058       41536 :     fo5 = L_add( fo2, fo7 );
    1059       41536 :     fo6 = L_sub( fo7, fo2 );
    1060             : 
    1061       41536 :     zIm[in2] = L_sub( fo6, fo4 );
    1062       41536 :     move32();
    1063       41536 :     zIm[in3] = L_sub( fo5, fo3 );
    1064       41536 :     move32();
    1065       41536 :     zIm[in4] = L_add( fo3, fo5 );
    1066       41536 :     move32();
    1067       41536 :     zIm[in5] = L_add( fo4, fo6 );
    1068       41536 :     move32();
    1069             : 
    1070       41536 :     return;
    1071             : }
    1072             : 
    1073             : /*-----------------------------------------------------------------*
    1074             :  * fft64()
    1075             :  * 64-point FFT
    1076             :  *-----------------------------------------------------------------*/
    1077             : 
    1078      374710 : static void fft64(
    1079             :     Word32 *x,        /* i/o: real part of input and output data Qx      */
    1080             :     Word32 *y,        /* i/o: imaginary part of input and output data Qx */
    1081             :     const Word16 *Idx /* i  : pointer of the address table Q0            */
    1082             : )
    1083             : {
    1084             :     Word16 i, id, jd;
    1085             :     Word32 z[128];
    1086    24356150 :     FOR( i = 0; i < 64; i++ )
    1087             :     {
    1088    23981440 :         id = Idx[i];
    1089    23981440 :         move16();
    1090    23981440 :         z[2 * i] = x[id]; // Qx
    1091    23981440 :         move32();
    1092    23981440 :         z[( ( i << 1 ) + 1 )] = y[id]; // Qx
    1093    23981440 :         move32();
    1094             :     }
    1095             : 
    1096      374710 :     cdftForw( 128, z, Ip_fft64, w_fft64_fx );
    1097             : 
    1098    24356150 :     FOR( i = 0; i < 64; i++ )
    1099             :     {
    1100    23981440 :         jd = Odx_fft64[i];
    1101    23981440 :         move16();
    1102    23981440 :         id = Idx[jd];
    1103    23981440 :         move16();
    1104    23981440 :         x[id] = z[2 * i]; // Qx
    1105    23981440 :         move32();
    1106    23981440 :         y[id] = z[( ( i << 1 ) + 1 )]; // Qx
    1107    23981440 :         move32();
    1108             :     }
    1109             : 
    1110      374710 :     return;
    1111             : }
    1112             : 
    1113             : 
    1114             : /*-----------------------------------------------------------------*
    1115             :  * fft32_15()
    1116             :  * 32-point FFT called for 15 times
    1117             :  *-----------------------------------------------------------------*/
    1118             : 
    1119           0 : static void fft32_15(
    1120             :     Word32 *x,        /* i/o: real part of input and output data Qx      */
    1121             :     Word32 *y,        /* i/o: imaginary part of input and output data Qx */
    1122             :     const Word16 *Idx /* i  : pointer of the address table Q0            */
    1123             : )
    1124             : {
    1125             :     Word16 i, id, jd;
    1126             :     Word32 z[64];
    1127             : 
    1128           0 :     FOR( i = 0; i < 32; i++ )
    1129             :     {
    1130           0 :         id = Idx[i];
    1131           0 :         move16();
    1132           0 :         z[2 * i] = x[id]; // Qx
    1133           0 :         move32();
    1134           0 :         z[( ( i << 1 ) + 1 )] = y[id]; // Qx
    1135           0 :         move32();
    1136             :     }
    1137             : 
    1138           0 :     cdftForw( 64, z, Ip_fft32, w_fft32_fx );
    1139             : 
    1140           0 :     FOR( i = 0; i < 32; i++ )
    1141             :     {
    1142           0 :         jd = Odx_fft32_15[i];
    1143           0 :         move16();
    1144           0 :         id = Idx[jd];
    1145           0 :         move16();
    1146           0 :         x[id] = z[2 * i]; // Qx
    1147           0 :         move32();
    1148           0 :         y[id] = z[( ( i << 1 ) + 1 )]; // Qx
    1149           0 :         move32();
    1150             :     }
    1151             : 
    1152           0 :     return;
    1153             : }
    1154             : 
    1155             : /*-----------------------------------------------------------------*
    1156             :  * fft32_5()
    1157             :  * 32-point FFT called for 5 times
    1158             :  *-----------------------------------------------------------------*/
    1159             : 
    1160        6490 : static void fft32_5(
    1161             :     Word32 *x,        /* i/o: real part of input and output data Qx      */
    1162             :     Word32 *y,        /* i/o: imaginary part of input and output data Qx */
    1163             :     const Word16 *Idx /* i  : pointer of the address table Q0            */
    1164             : )
    1165             : {
    1166             :     Word16 i, id, jd;
    1167             :     Word32 z[64];
    1168             : 
    1169      214170 :     FOR( i = 0; i < 32; i++ )
    1170             :     {
    1171      207680 :         id = Idx[i];
    1172      207680 :         move16();
    1173      207680 :         z[2 * i] = x[id]; // Qx
    1174      207680 :         move32();
    1175      207680 :         z[( ( i << 1 ) + 1 )] = y[id]; // Qx
    1176      207680 :         move32();
    1177             :     }
    1178             : 
    1179        6490 :     cdftForw( 64, z, Ip_fft32, w_fft32_fx );
    1180             : 
    1181      214170 :     FOR( i = 0; i < 32; i++ )
    1182             :     {
    1183      207680 :         jd = Odx_fft32_5[i];
    1184      207680 :         move16();
    1185      207680 :         id = Idx[jd];
    1186      207680 :         move16();
    1187      207680 :         x[id] = z[2 * i]; // Qx
    1188      207680 :         move32();
    1189      207680 :         y[id] = z[( ( i << 1 ) + 1 )]; // Qx
    1190      207680 :         move32();
    1191             :     }
    1192             : 
    1193        6490 :     return;
    1194             : }
    1195             : 
    1196             : /*-----------------------------------------------------------------*
    1197             :  * fft16_ivas()
    1198             :  * 16-point FFT
    1199             :  *-----------------------------------------------------------------*/
    1200             : 
    1201       18200 : static void fft16_ivas(
    1202             :     Word32 *x,        /* i/o: real part of input and output data Qx      */
    1203             :     Word32 *y,        /* i/o: imaginary part of input and output data Qx */
    1204             :     const Word16 *Idx /* i  : pointer of the address table Q0            */
    1205             : )
    1206             : {
    1207             :     Word16 i, id, jd;
    1208             :     Word32 z[32];
    1209             : 
    1210      309400 :     FOR( i = 0; i < 16; i++ )
    1211             :     {
    1212      291200 :         id = Idx[i];
    1213      291200 :         move16();
    1214      291200 :         z[2 * i] = x[id]; // Qx
    1215      291200 :         move32();
    1216      291200 :         z[( ( i << 1 ) + 1 )] = y[id]; // Qx
    1217      291200 :         move32();
    1218             :     }
    1219             : 
    1220       18200 :     cdftForw( 32, z, Ip_fft16, w_fft16_fx );
    1221             : 
    1222      309400 :     FOR( i = 0; i < 16; i++ )
    1223             :     {
    1224      291200 :         jd = Odx_fft16[i];
    1225      291200 :         move16();
    1226      291200 :         id = Idx[jd];
    1227      291200 :         move16();
    1228      291200 :         x[id] = z[2 * i]; // Qx
    1229      291200 :         move32();
    1230      291200 :         y[id] = z[( ( i << 1 ) + 1 )]; // Qx
    1231      291200 :         move32();
    1232             :     }
    1233             : 
    1234       18200 :     return;
    1235             : }
    1236             : 
    1237             : /*-----------------------------------------------------------------*
    1238             :  * fft8()
    1239             :  * 8-point FFT
    1240             :  *-----------------------------------------------------------------*/
    1241             : 
    1242           0 : static void fft8(
    1243             :     Word32 *x,        /* i/o: real part of input and output data Qx      */
    1244             :     Word32 *y,        /* i/o: imaginary part of input and output data Qx */
    1245             :     const Word16 *Idx /* i  : pointer of the address table Q0            */
    1246             : )
    1247             : {
    1248             :     Word16 i, id;
    1249             :     Word32 z[16];
    1250             : 
    1251           0 :     FOR( i = 0; i < 8; i++ )
    1252             :     {
    1253           0 :         id = Idx[i];
    1254           0 :         move16();
    1255           0 :         z[2 * i] = x[id]; // Qx
    1256           0 :         move32();
    1257           0 :         z[( ( i << 1 ) + 1 )] = y[id]; // Qx
    1258           0 :         move32();
    1259             :     }
    1260             : 
    1261           0 :     cdftForw( 16, z, Ip_fft8, w_fft8_fx );
    1262             : 
    1263           0 :     FOR( i = 0; i < 8; i++ )
    1264             :     {
    1265           0 :         id = Idx[i];
    1266           0 :         move16();
    1267           0 :         x[id] = z[2 * i]; // Qx
    1268           0 :         move32();
    1269           0 :         y[id] = z[( ( i << 1 ) + 1 )]; // Qx
    1270           0 :         move32();
    1271             :     }
    1272             : 
    1273           0 :     return;
    1274             : }
    1275             : 
    1276             : /*-----------------------------------------------------------------*
    1277             :  * fft8_5()
    1278             :  * 8-point FFT with shift 5
    1279             :  *-----------------------------------------------------------------*/
    1280             : 
    1281           0 : static void fft8_5(
    1282             :     Word32 *x,        /* i/o: real part of input and output data Qx      */
    1283             :     Word32 *y,        /* i/o: imaginary part of input and output data Qx */
    1284             :     const Word16 *Idx /* i  : pointer of the address table Q0            */
    1285             : )
    1286             : {
    1287             :     Word16 i, id, jd;
    1288             :     Word32 z[16];
    1289             : 
    1290           0 :     FOR( i = 0; i < 8; i++ )
    1291             :     {
    1292           0 :         id = Idx[i];
    1293           0 :         move16();
    1294           0 :         z[2 * i] = x[id];
    1295           0 :         move32();
    1296           0 :         z[( ( i << 1 ) + 1 )] = y[id]; // Qx
    1297           0 :         move32();
    1298             :     }
    1299             : 
    1300           0 :     cdftForw( 16, z, Ip_fft8, w_fft8_fx );
    1301             : 
    1302           0 :     FOR( i = 0; i < 8; i++ )
    1303             :     {
    1304           0 :         jd = Odx_fft8_5[i];
    1305           0 :         move16();
    1306           0 :         id = Idx[jd];
    1307           0 :         move16();
    1308           0 :         x[id] = z[2 * i]; // Qx
    1309           0 :         move32();
    1310           0 :         y[id] = z[( ( i << 1 ) + 1 )]; // Qx
    1311           0 :         move32();
    1312             :     }
    1313           0 :     return;
    1314             : }
    1315             : 
    1316             : /*-----------------------------------------------------------------*
    1317             :  * fft5_8()
    1318             :  * 5-point FFT with shift 2
    1319             :  *-----------------------------------------------------------------*/
    1320             : 
    1321           0 : static void fft5_8(
    1322             :     Word16 n1,        /* i  : length of data Q0                          */
    1323             :     Word32 *zRe,      /* i/o: real part of input and output data Qx      */
    1324             :     Word32 *zIm,      /* i/o: imaginary part of input and output data Qx */
    1325             :     const Word16 *Idx /* i  : pointer of the address table Q0            */
    1326             : )
    1327             : {
    1328             :     Word32 fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8;
    1329             :     Word32 fo1, fo2, fo3, fo4, fo5, fo6, fo7, fo8;
    1330             :     Word16 in1, in2, in3, in4, in5;
    1331             : 
    1332           0 :     in1 = Idx[0];
    1333           0 :     move16();
    1334           0 :     in2 = Idx[n1];
    1335           0 :     move16();
    1336           0 :     in3 = Idx[n1 * 2];
    1337           0 :     move16();
    1338           0 :     in4 = Idx[( n1 * 3 )];
    1339           0 :     move16();
    1340           0 :     in5 = Idx[n1 * 4];
    1341           0 :     move16();
    1342             : 
    1343           0 :     fi1 = zRe[in1]; // Qx
    1344           0 :     move32();
    1345           0 :     fi2 = zIm[in1]; // Qx
    1346           0 :     move32();
    1347           0 :     fo3 = zRe[in2]; // Qx
    1348           0 :     move32();
    1349           0 :     fo4 = zRe[in5]; // Qx
    1350           0 :     move32();
    1351           0 :     fo6 = zRe[in3]; // Qx
    1352           0 :     move32();
    1353           0 :     fo7 = zRe[in4]; // Qx
    1354           0 :     move32();
    1355             : 
    1356           0 :     fo5 = L_add( fo3, fo4 );
    1357           0 :     fo8 = L_add( fo6, fo7 );
    1358           0 :     fi3 = L_add( fo5, fo8 );
    1359           0 :     fi4 = L_sub( fo6, fo7 );
    1360           0 :     fi5 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); // Qx
    1361           0 :     fi6 = L_sub( fo3, fo4 );
    1362             : 
    1363           0 :     fo3 = zIm[in2];
    1364           0 :     move32();
    1365           0 :     fo4 = zIm[in5];
    1366           0 :     move32();
    1367           0 :     fo6 = zIm[in3];
    1368           0 :     move32();
    1369           0 :     fo7 = zIm[in4];
    1370           0 :     move32();
    1371             : 
    1372           0 :     fo5 = L_add( fo3, fo4 );
    1373           0 :     fo8 = L_add( fo6, fo7 );
    1374           0 :     fi7 = L_sub( fo3, fo4 );
    1375           0 :     fi8 = L_add( fo5, fo8 );
    1376           0 :     fo1 = L_sub( fo6, fo7 );
    1377           0 :     fo2 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); // Qx
    1378             : 
    1379           0 :     zRe[in1] = L_add( fi1, fi3 );
    1380           0 :     move32();
    1381           0 :     zIm[in1] = L_add( fi2, fi8 );
    1382           0 :     move32();
    1383             : 
    1384           0 :     fo3 = L_add( Mpy_32_16_1( fi7, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fo1, FFT_15PONIT_WNK3 ) ); // Qx
    1385           0 :     fo4 = L_sub( Mpy_32_16_1( fo1, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi7, FFT_15PONIT_WNK3 ) ); // Qx
    1386           0 :     fo7 = L_sub( fi1, L_shr( fi3, 2 ) );
    1387           0 :     fo5 = L_add( fi5, fo7 );
    1388           0 :     fo6 = L_sub( fo7, fi5 );
    1389             : 
    1390           0 :     zRe[in2] = L_sub( fo6, fo4 );
    1391           0 :     move32();
    1392           0 :     zRe[in3] = L_sub( fo5, fo3 );
    1393           0 :     move32();
    1394           0 :     zRe[in5] = L_add( fo6, fo4 );
    1395           0 :     move32();
    1396           0 :     zRe[in4] = L_add( fo5, fo3 );
    1397           0 :     move32();
    1398             : 
    1399           0 :     fo3 = L_add( Mpy_32_16_1( fi6, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi4, FFT_15PONIT_WNK3 ) ); // Qx
    1400           0 :     fo4 = L_sub( Mpy_32_16_1( fi4, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi6, FFT_15PONIT_WNK3 ) ); // Qx
    1401           0 :     fo7 = L_sub( fi2, L_shr( fi8, 2 ) );
    1402           0 :     fo5 = L_add( fo2, fo7 );
    1403           0 :     fo6 = L_sub( fo7, fo2 );
    1404             : 
    1405           0 :     zIm[in2] = L_add( fo4, fo6 );
    1406           0 :     move32();
    1407           0 :     zIm[in3] = L_add( fo3, fo5 );
    1408           0 :     move32();
    1409           0 :     zIm[in4] = L_sub( fo5, fo3 );
    1410           0 :     move32();
    1411           0 :     zIm[in5] = L_sub( fo6, fo4 );
    1412           0 :     move32();
    1413             : 
    1414           0 :     return;
    1415             : }
    1416             : 
    1417             : /*-----------------------------------------------------------------*
    1418             :  * fft4_5()
    1419             :  * 8-point FFT with shift 1
    1420             :  *-----------------------------------------------------------------*/
    1421             : 
    1422           0 : static void fft4_5(
    1423             :     Word32 *x,        /* i/o: real part of input and output data Qx      */
    1424             :     Word32 *y,        /* i/o: imaginary part of input and output data Qx */
    1425             :     const Word16 *Idx /* i  : pointer of the address table Q0            */
    1426             : )
    1427             : {
    1428             :     Word16 i, id, jd;
    1429             :     Word32 z[8];
    1430             : 
    1431           0 :     FOR( i = 0; i < 4; i++ )
    1432             :     {
    1433           0 :         id = Idx[i];
    1434           0 :         move16();
    1435           0 :         z[2 * i] = x[id]; // Qx
    1436           0 :         move32();
    1437           0 :         z[( ( i << 1 ) + 1 )] = y[id]; // Qx
    1438           0 :         move32();
    1439             :     }
    1440             : 
    1441           0 :     cdftForw( 8, z, Ip_fft4, w_fft4_fx );
    1442             : 
    1443           0 :     FOR( i = 0; i < 4; i++ )
    1444             :     {
    1445           0 :         jd = Odx_fft4_5[i];
    1446           0 :         move16();
    1447           0 :         id = Idx[jd];
    1448           0 :         move16();
    1449           0 :         x[id] = z[2 * i]; // Qx
    1450           0 :         move32();
    1451           0 :         y[id] = z[( ( i << 1 ) + 1 )]; // Qx
    1452           0 :         move32();
    1453             :     }
    1454           0 :     return;
    1455             : }
    1456             : 
    1457             : /*-----------------------------------------------------------------*
    1458             :  * fft5_4()
    1459             :  * 5-point FFT with shift 4
    1460             :  *-----------------------------------------------------------------*/
    1461             : 
    1462           0 : static void fft5_4(
    1463             :     Word16 n1,        // Q0
    1464             :     Word32 *zRe,      // Qx
    1465             :     Word32 *zIm,      // Qx
    1466             :     const Word16 *Idx // Q0
    1467             : )
    1468             : {
    1469             :     Word32 fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8;
    1470             :     Word32 fo1, fo2, fo3, fo4, fo5, fo6, fo7, fo8;
    1471             :     Word16 in1, in2, in3, in4, in5;
    1472             : 
    1473           0 :     in1 = Idx[0];
    1474           0 :     move16();
    1475           0 :     in2 = Idx[n1];
    1476           0 :     move16();
    1477           0 :     in3 = Idx[n1 * 2];
    1478           0 :     move16();
    1479           0 :     in4 = Idx[( n1 * 3 )];
    1480           0 :     move16();
    1481           0 :     in5 = Idx[n1 * 4];
    1482           0 :     move16();
    1483             : 
    1484           0 :     fi1 = zRe[in1]; // Qx
    1485           0 :     move32();
    1486           0 :     fi2 = zIm[in1]; // Qx
    1487           0 :     move32();
    1488           0 :     fo3 = zRe[in2]; // Qx
    1489           0 :     move32();
    1490           0 :     fo4 = zRe[in5]; // Qx
    1491           0 :     move32();
    1492           0 :     fo6 = zRe[in3]; // Qx
    1493           0 :     move32();
    1494           0 :     fo7 = zRe[in4]; // Qx
    1495           0 :     move32();
    1496             : 
    1497           0 :     fo5 = L_add( fo3, fo4 );
    1498           0 :     fo8 = L_add( fo6, fo7 );
    1499           0 :     fi3 = L_add( fo5, fo8 );
    1500           0 :     fi4 = L_sub( fo6, fo7 );
    1501           0 :     fi5 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); // Qx
    1502           0 :     fi6 = L_sub( fo3, fo4 );
    1503             : 
    1504           0 :     fo3 = zIm[in2];
    1505           0 :     move32();
    1506           0 :     fo4 = zIm[in5];
    1507           0 :     move32();
    1508           0 :     fo6 = zIm[in3];
    1509           0 :     move32();
    1510           0 :     fo7 = zIm[in4];
    1511           0 :     move32();
    1512             : 
    1513           0 :     fo5 = L_add( fo3, fo4 );
    1514           0 :     fo8 = L_add( fo6, fo7 );
    1515           0 :     fi7 = L_sub( fo3, fo4 );
    1516           0 :     fi8 = L_add( fo5, fo8 );
    1517           0 :     fo1 = L_sub( fo6, fo7 );
    1518           0 :     fo2 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); // Qx
    1519             : 
    1520           0 :     zRe[in1] = L_add( fi1, fi3 );
    1521           0 :     move32();
    1522           0 :     zIm[in1] = L_add( fi2, fi8 );
    1523           0 :     move32();
    1524             : 
    1525           0 :     fo3 = L_add( Mpy_32_16_1( fi7, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fo1, FFT_15PONIT_WNK3 ) ); // Qx
    1526           0 :     fo4 = L_sub( Mpy_32_16_1( fo1, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi7, FFT_15PONIT_WNK3 ) ); // Qx
    1527           0 :     fo7 = L_sub( fi1, L_shr( fi3, 2 ) );
    1528           0 :     fo5 = L_add( fi5, fo7 );
    1529           0 :     fo6 = L_sub( fo7, fi5 );
    1530             : 
    1531           0 :     zRe[in2] = L_sub( fo5, fo3 );
    1532           0 :     move32();
    1533           0 :     zRe[in4] = L_sub( fo6, fo4 );
    1534           0 :     move32();
    1535           0 :     zRe[in3] = L_add( fo6, fo4 );
    1536           0 :     move32();
    1537           0 :     zRe[in5] = L_add( fo5, fo3 );
    1538           0 :     move32();
    1539             : 
    1540           0 :     fo3 = L_add( Mpy_32_16_1( fi6, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi4, FFT_15PONIT_WNK3 ) ); // Qx
    1541           0 :     fo4 = L_sub( Mpy_32_16_1( fi4, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi6, FFT_15PONIT_WNK3 ) ); // Qx
    1542           0 :     fo7 = L_sub( fi2, L_shr( fi8, 2 ) );
    1543           0 :     fo5 = L_add( fo2, fo7 );
    1544           0 :     fo6 = L_sub( fo7, fo2 );
    1545             : 
    1546           0 :     zIm[in2] = L_add( fo3, fo5 );
    1547           0 :     move32();
    1548           0 :     zIm[in3] = L_sub( fo6, fo4 );
    1549           0 :     move32();
    1550           0 :     zIm[in4] = L_add( fo4, fo6 );
    1551           0 :     move32();
    1552           0 :     zIm[in5] = L_sub( fo5, fo3 );
    1553           0 :     move32();
    1554           0 :     return;
    1555             : }
    1556             : 
    1557             : 
    1558             : /*-----------------------------------------------------------------*
    1559             :  * DoRTFT80_fx()
    1560             :  * a low complexity 2-dimensional DFT of 80 points
    1561             :  *-----------------------------------------------------------------*/
    1562             : 
    1563        3640 : void DoRTFT80_fx(
    1564             :     Word32 *x, /* i/o: real part of input and output data Qx      */
    1565             :     Word32 *y  /* i/o: imaginary part of input and output data Qx */
    1566             : )
    1567             : {
    1568             :     Word16 j;
    1569             : 
    1570             :     /* Applying 16-point FFT for 5 times based on the address table Idx_dortft80 */
    1571       21840 :     FOR( j = 0; j < 5; j++ )
    1572             :     {
    1573       18200 :         fft16_ivas( x, y, Idx_dortft80 + shl( j, 4 ) );
    1574             :     }
    1575             : 
    1576             :     /* Applying 5-point FFT for 16 times based on the address table Idx_dortft80 */
    1577       61880 :     FOR( j = 0; j < 16; j++ )
    1578             :     {
    1579       58240 :         fft5_shift1( 16, x, y, Idx_dortft80 + j );
    1580             :     }
    1581             : 
    1582        3640 :     return;
    1583             : }
    1584             : 
    1585             : /*-----------------------------------------------------------------*
    1586             :  * DoRTFT120_fx()
    1587             :  * a low complexity 2-dimensional DFT of 120 points
    1588             :  *-----------------------------------------------------------------*/
    1589             : 
    1590           0 : void DoRTFT120_fx(
    1591             :     Word32 *x, /* i/o: real part of input and output data Qx      */
    1592             :     Word32 *y  /* i/o: imaginary part of input and output data Qx */
    1593             : )
    1594             : {
    1595             :     Word16 j;
    1596             : 
    1597             :     /* Applying 8-point FFT for 15 times based on the address table Idx_dortft120 */
    1598           0 :     FOR( j = 0; j < 15; j++ )
    1599             :     {
    1600           0 :         fft8( x, y, Idx_dortft120 + shl( j, 3 ) );
    1601             :     }
    1602             : 
    1603             :     /* Applying 15-point FFT for 8 times based on the address table Idx_dortft120 */
    1604           0 :     FOR( j = 0; j < 8; j++ )
    1605             :     {
    1606           0 :         fft15_shift2( 8, x, y, Idx_dortft120 + j );
    1607             :     }
    1608             : 
    1609           0 :     return;
    1610             : }
    1611             : 
    1612             : /*-----------------------------------------------------------------*
    1613             :  * DoRTFT160_fx()
    1614             :  * a low complexity 2-dimensional DFT of 160 points
    1615             :  *-----------------------------------------------------------------*/
    1616             : 
    1617        1298 : void DoRTFT160_fx(
    1618             :     Word32 x[], /* i/o: real part of input and output data Qx      */
    1619             :     Word32 y[]  /* i/o: imaginary part of input and output data Qx */
    1620             : )
    1621             : {
    1622             :     Word16 j;
    1623             : 
    1624             :     /* Applying 32-point FFT for 5 times based on the address table Idx_dortft160 */
    1625        7788 :     FOR( j = 0; j < 5; j++ )
    1626             :     {
    1627        6490 :         fft32_5( x, y, Idx_dortft160 + shl( j, 5 ) );
    1628             :     }
    1629             : 
    1630             :     /* Applying 5-point FFT for 32 times based on the address table Idx_dortft160 */
    1631       42834 :     FOR( j = 0; j < 32; j++ )
    1632             :     {
    1633       41536 :         fft5_32( x, y, Idx_dortft160 + j );
    1634             :     }
    1635             : 
    1636        1298 :     return;
    1637             : }
    1638             : 
    1639             : /*-----------------------------------------------------------------*
    1640             :  * DoRTFT320_fx()
    1641             :  * a low complexity 2-dimensional DFT of 320 points
    1642             :  *-----------------------------------------------------------------*/
    1643             : 
    1644       74942 : void DoRTFT320_fx(
    1645             :     Word32 *x, /* i/o: real part of input and output data Qx      */
    1646             :     Word32 *y  /* i/o: imaginary part of input and output data Qx */
    1647             : )
    1648             : {
    1649             :     Word16 j;
    1650             : 
    1651             :     /* Applying 64-point FFT for 5 times based on the address table Idx_dortft160 */
    1652      449652 :     FOR( j = 0; j < 5; j++ )
    1653             :     {
    1654      374710 :         fft64( x, y, Idx_dortft320 + shl( j, 6 ) );
    1655             :     }
    1656             : 
    1657             :     /* Applying 5-point FFT for 64 times based on the address table Idx_dortft160 */
    1658     4871230 :     FOR( j = 0; j < 64; j++ )
    1659             :     {
    1660     4796288 :         fft5_shift4( 64, x, y, Idx_dortft320 + j );
    1661             :     }
    1662             : 
    1663       74942 :     return;
    1664             : }
    1665             : 
    1666             : /*-----------------------------------------------------------------*
    1667             :  * DoRTFT480_fx()
    1668             :  * a low complexity 2-dimensional DFT of 480 points
    1669             :  *-----------------------------------------------------------------*/
    1670             : 
    1671           0 : void DoRTFT480_fx(
    1672             :     Word32 *x, /* i/o: real part of input and output data Qx      */
    1673             :     Word32 *y  /* i/o: imaginary part of input and output data Qx */
    1674             : )
    1675             : {
    1676             :     Word16 j;
    1677             : 
    1678             :     /* Applying 32-point FFT for 15 times based on the address table Idx_dortft160 */
    1679           0 :     FOR( j = 0; j < 15; j++ )
    1680             :     {
    1681           0 :         fft32_15( x, y, Idx_dortft480 + shl( j, 5 ) );
    1682             :     }
    1683             : 
    1684             :     /* Applying 5-point FFT for 32 times based on the address table Idx_dortft160 */
    1685           0 :     FOR( j = 0; j < 32; j++ )
    1686             :     {
    1687           0 :         fft15_shift8( 32, x, y, Idx_dortft480 + j );
    1688             :     }
    1689             : 
    1690           0 :     return;
    1691             : }
    1692             : 
    1693             : /*-----------------------------------------------------------------*
    1694             :  * DoRTFT40_fx()
    1695             :  * a low complexity 2-dimensional DFT of 40 points
    1696             :  *-----------------------------------------------------------------*/
    1697             : 
    1698           0 : void DoRTFT40_fx(
    1699             :     Word32 *x, /* i/o: real part of input and output data Qx      */
    1700             :     Word32 *y  /* i/o: imaginary part of input and output data Qx */
    1701             : )
    1702             : {
    1703             :     Word16 j;
    1704             :     /* Applying 8-point FFT for 5 times based on the address table Idx_dortft40 */
    1705           0 :     FOR( j = 0; j < 5; j++ )
    1706             :     {
    1707           0 :         fft8_5( x, y, Idx_dortft40 + shl( j, 3 ) );
    1708             :     }
    1709             : 
    1710             :     /* Applying 5-point FFT for 8 times based on the address table Idx_dortft40 */
    1711           0 :     FOR( j = 0; j < 8; j++ )
    1712             :     {
    1713           0 :         fft5_8( 8, x, y, Idx_dortft40 + j );
    1714             :     }
    1715             : 
    1716           0 :     return;
    1717             : }
    1718             : 
    1719             : /*-----------------------------------------------------------------*
    1720             :  * DoRTFT20()
    1721             :  * a low complexity 2-dimensional DFT of 20 points
    1722             :  *-----------------------------------------------------------------*/
    1723             : 
    1724           0 : void DoRTFT20_fx(
    1725             :     Word32 *x, /* i/o: real part of input and output data Qx      */
    1726             :     Word32 *y  /* i/o: imaginary part of input and output data Qx */
    1727             : )
    1728             : {
    1729             :     Word16 j;
    1730             : 
    1731             :     /* Applying 4-point FFT for 5 times based on the address table Idx_dortft20 */
    1732           0 :     FOR( j = 0; j < 5; j++ )
    1733             :     {
    1734           0 :         fft4_5( x, y, Idx_dortft20 + shl( j, 2 ) );
    1735             :     }
    1736             : 
    1737             :     /* Applying 5-point FFT for 4 times based on the address table Idx_dortft20 */
    1738           0 :     FOR( j = 0; j < 4; j++ )
    1739             :     {
    1740           0 :         fft5_4( 4, x, y, Idx_dortft20 + j );
    1741             :     }
    1742             : 
    1743           0 :     return;
    1744             : }
    1745             : 
    1746             : /*-----------------------------------------------------------------*
    1747             :  * DoRTFT128_fx()
    1748             :  * FFT with 128 points
    1749             :  *-----------------------------------------------------------------*/
    1750             : 
    1751           0 : void DoRTFT128_fx(
    1752             :     Word32 *x, /* i/o: real part of input and output data Qx      */
    1753             :     Word32 *y  /* i/o: imaginary part of input and output data Qx */
    1754             : )
    1755             : {
    1756             : 
    1757             :     Word16 i;
    1758             :     Word32 z[256];
    1759             : 
    1760           0 :     FOR( i = 0; i < 128; i++ )
    1761             :     {
    1762           0 :         z[2 * i] = x[i];
    1763           0 :         move32();
    1764           0 :         z[( ( i << 1 ) + 1 )] = y[i];
    1765           0 :         move32();
    1766             :     }
    1767             : 
    1768           0 :     cdftForw( 256, z, Ip_fft128, w_fft128_fx );
    1769             : 
    1770           0 :     x[0] = z[0];
    1771           0 :     move32();
    1772           0 :     y[0] = z[1];
    1773           0 :     move32();
    1774           0 :     FOR( i = 1; i < 128; i++ )
    1775             :     {
    1776           0 :         x[128 - i] = z[2 * i];
    1777           0 :         move32();
    1778           0 :         y[128 - i] = z[( ( i << 1 ) + 1 )];
    1779           0 :         move32();
    1780             :     }
    1781             : 
    1782           0 :     return;
    1783             : }
    1784             : 
    1785             : /*-----------------------------------------------------------------*
    1786             :  * cdftForw()
    1787             :  * Main fuction of Complex Discrete Fourier Transform
    1788             :  *-----------------------------------------------------------------*/
    1789             : 
    1790     1106196 : static void cdftForw(
    1791             :     Word16 n,         /* i  : data length of real and imag Q0 */
    1792             :     Word32 *a,        /* i/o: input/output data Qx            */
    1793             :     const Word16 *ip, /* i  : work area for bit reversal Qx   */
    1794             :     const Word16 *w   /* i  : cos/sin table Q15                */
    1795             : )
    1796             : {
    1797             :     /* bit reversal */
    1798     1106196 :     bitrv2_SR( n, ip + 2, a );
    1799             : 
    1800             :     /* Do FFT */
    1801     1106196 :     cftfsub( n, a, w );
    1802     1106196 : }
    1803             : 
    1804             : /*-----------------------------------------------------------------*
    1805             :  * bitrv2_SR()
    1806             :  * Bit reversal
    1807             :  *-----------------------------------------------------------------*/
    1808             : 
    1809     1106196 : static void bitrv2_SR(
    1810             :     Word16 n,         /* i  : data length of real and imag Q0 */
    1811             :     const Word16 *ip, /* i/o: work area for bit reversal Q0   */
    1812             :     Word32 *a         /* i/o: input/output data Qx            */
    1813             : )
    1814             : {
    1815             :     Word16 j, j1, k, k1, m, m2;
    1816             :     Word16 l;
    1817             :     Word32 xr, xi, yr, yi;
    1818             : 
    1819     1106196 :     IF( EQ_16( n, 64 ) )
    1820             :     {
    1821        6490 :         m = 4;
    1822        6490 :         move16();
    1823        6490 :         l = -1;
    1824        6490 :         move16();
    1825             :     }
    1826     1099706 :     ELSE IF( EQ_16( n, 256 ) )
    1827             :     {
    1828           0 :         m = 8;
    1829           0 :         move16();
    1830           0 :         l = -1;
    1831           0 :         move16();
    1832             :     }
    1833     1099706 :     ELSE IF( EQ_16( n, 16 ) )
    1834             :     {
    1835           0 :         m = 2;
    1836           0 :         move16();
    1837           0 :         l = -1;
    1838           0 :         move16();
    1839             :     }
    1840             :     ELSE
    1841             :     {
    1842     1099706 :         l = n;
    1843     1099706 :         move16();
    1844     1099706 :         m = 1;
    1845     1099706 :         move16();
    1846             : 
    1847     4682586 :         WHILE( ( m << 3 ) < l )
    1848             :         {
    1849     3582880 :             l = shr( l, 1 );
    1850     3582880 :             m = shl( m, 1 );
    1851             :         }
    1852     1099706 :         l = sub( l, shl( m, 3 ) );
    1853             :     }
    1854             : 
    1855     1106196 :     m2 = shl( m, 1 );
    1856             : 
    1857     1106196 :     IF( l == 0 )
    1858             :     {
    1859     2035466 :         FOR( k = 0; k < m; k++ )
    1860             :         {
    1861     4230964 :             FOR( j = 0; j < k; j++ )
    1862             :             {
    1863     2600332 :                 j1 = add( shl( j, 1 ), ip[k] );
    1864     2600332 :                 k1 = add( shl( k, 1 ), ip[j] );
    1865     2600332 :                 xr = a[j1]; // Qx
    1866     2600332 :                 move32();
    1867     2600332 :                 xi = a[j1 + 1]; // Qx
    1868     2600332 :                 move32();
    1869     2600332 :                 yr = a[k1]; // Qx
    1870     2600332 :                 move32();
    1871     2600332 :                 yi = a[k1 + 1]; // Qx
    1872     2600332 :                 move32();
    1873     2600332 :                 a[j1] = yr; // Qx
    1874     2600332 :                 move32();
    1875     2600332 :                 a[j1 + 1] = yi; // Qx
    1876     2600332 :                 move32();
    1877     2600332 :                 a[k1] = xr; // Qx
    1878     2600332 :                 move32();
    1879     2600332 :                 a[k1 + 1] = xi; // Qx
    1880     2600332 :                 move32();
    1881     2600332 :                 j1 = add( j1, m2 );
    1882     2600332 :                 k1 = add( k1, 2 * m2 );
    1883     2600332 :                 xr = a[j1];
    1884     2600332 :                 move32();
    1885     2600332 :                 xi = a[j1 + 1];
    1886     2600332 :                 move32();
    1887     2600332 :                 yr = a[k1];
    1888     2600332 :                 move32();
    1889     2600332 :                 yi = a[k1 + 1];
    1890     2600332 :                 move32();
    1891     2600332 :                 a[j1] = yr;
    1892     2600332 :                 move32();
    1893     2600332 :                 a[j1 + 1] = yi;
    1894     2600332 :                 move32();
    1895     2600332 :                 a[k1] = xr;
    1896     2600332 :                 move32();
    1897     2600332 :                 a[k1 + 1] = xi;
    1898     2600332 :                 move32();
    1899     2600332 :                 j1 = add( j1, m2 );
    1900     2600332 :                 k1 = sub( k1, m2 );
    1901     2600332 :                 xr = a[j1];
    1902     2600332 :                 move32();
    1903     2600332 :                 xi = a[j1 + 1];
    1904     2600332 :                 move32();
    1905     2600332 :                 yr = a[k1];
    1906     2600332 :                 move32();
    1907     2600332 :                 yi = a[k1 + 1];
    1908     2600332 :                 move32();
    1909     2600332 :                 a[j1] = yr;
    1910     2600332 :                 move32();
    1911     2600332 :                 a[j1 + 1] = yi;
    1912     2600332 :                 move32();
    1913     2600332 :                 a[k1] = xr;
    1914     2600332 :                 move32();
    1915     2600332 :                 a[k1 + 1] = xi;
    1916     2600332 :                 move32();
    1917     2600332 :                 j1 = add( j1, m2 );
    1918     2600332 :                 k1 = add( k1, shl( m2, 1 ) );
    1919     2600332 :                 xr = a[j1];
    1920     2600332 :                 move32();
    1921     2600332 :                 xi = a[j1 + 1];
    1922     2600332 :                 move32();
    1923     2600332 :                 yr = a[k1];
    1924     2600332 :                 move32();
    1925     2600332 :                 yi = a[k1 + 1];
    1926     2600332 :                 move32();
    1927     2600332 :                 a[j1] = yr;
    1928     2600332 :                 move32();
    1929     2600332 :                 a[j1 + 1] = yi;
    1930     2600332 :                 move32();
    1931     2600332 :                 a[k1] = xr;
    1932     2600332 :                 move32();
    1933     2600332 :                 a[k1 + 1] = xi;
    1934     2600332 :                 move32();
    1935             :             }
    1936             : 
    1937     1630632 :             j1 = add( shl( k, 1 ), add( m2, ip[k] ) );
    1938     1630632 :             k1 = add( j1, m2 );
    1939     1630632 :             xr = a[j1];
    1940     1630632 :             move32();
    1941     1630632 :             xi = a[j1 + 1];
    1942     1630632 :             move32();
    1943     1630632 :             yr = a[k1];
    1944     1630632 :             move32();
    1945     1630632 :             yi = a[k1 + 1];
    1946     1630632 :             move32();
    1947     1630632 :             a[j1] = yr;
    1948     1630632 :             move32();
    1949     1630632 :             a[j1 + 1] = yi;
    1950     1630632 :             move32();
    1951     1630632 :             a[k1] = xr;
    1952     1630632 :             move32();
    1953     1630632 :             a[k1 + 1] = xi;
    1954     1630632 :             move32();
    1955             :         }
    1956             :     }
    1957             :     ELSE
    1958             :     {
    1959    11143912 :         FOR( k = 1; k < m; k++ )
    1960             :         {
    1961    93866130 :             FOR( j = 0; j < k; j++ )
    1962             :             {
    1963    83423580 :                 j1 = add( shl( j, 1 ), ip[k] );
    1964    83423580 :                 k1 = add( shl( k, 1 ), ip[j] );
    1965    83423580 :                 xr = a[j1];
    1966    83423580 :                 move32();
    1967    83423580 :                 xi = a[j1 + 1];
    1968    83423580 :                 move32();
    1969    83423580 :                 yr = a[k1];
    1970    83423580 :                 move32();
    1971    83423580 :                 yi = a[k1 + 1];
    1972    83423580 :                 move32();
    1973    83423580 :                 a[j1] = yr;
    1974    83423580 :                 move32();
    1975    83423580 :                 a[j1 + 1] = yi;
    1976    83423580 :                 move32();
    1977    83423580 :                 a[k1] = xr;
    1978    83423580 :                 move32();
    1979    83423580 :                 a[k1 + 1] = xi;
    1980    83423580 :                 move32();
    1981    83423580 :                 j1 = add( j1, m2 );
    1982    83423580 :                 k1 = add( k1, m2 );
    1983    83423580 :                 xr = a[j1];
    1984    83423580 :                 move32();
    1985    83423580 :                 xi = a[j1 + 1];
    1986    83423580 :                 move32();
    1987    83423580 :                 yr = a[k1];
    1988    83423580 :                 move32();
    1989    83423580 :                 yi = a[k1 + 1];
    1990    83423580 :                 move32();
    1991    83423580 :                 a[j1] = yr;
    1992    83423580 :                 move32();
    1993    83423580 :                 a[j1 + 1] = yi;
    1994    83423580 :                 move32();
    1995    83423580 :                 a[k1] = xr;
    1996    83423580 :                 move32();
    1997    83423580 :                 a[k1 + 1] = xi;
    1998    83423580 :                 move32();
    1999             :             }
    2000             :         }
    2001             :     }
    2002             : 
    2003     1106196 :     return;
    2004             : }
    2005             : 
    2006             : /*-----------------------------------------------------------------*
    2007             :  * cftfsub()
    2008             :  * Complex Discrete Fourier Transform
    2009             :  *-----------------------------------------------------------------*/
    2010             : 
    2011     1106196 : static void cftfsub(
    2012             :     Word16 n,       /* i  : data length of real and imag Q0 */
    2013             :     Word32 *a,      /* i/o: input/output data Qx            */
    2014             :     const Word16 *w /* i  : cos/sin table Q15                */
    2015             : )
    2016             : {
    2017             :     Word16 j, j1, j2, j3, l;
    2018             :     Word32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
    2019             : 
    2020     1106196 :     l = 2;
    2021     1106196 :     move16();
    2022             : 
    2023     1106196 :     IF( GT_16( n, 8 ) )
    2024             :     {
    2025     1106196 :         cft1st( n, a, w );
    2026             : 
    2027     1106196 :         l = 8;
    2028     1106196 :         move16();
    2029             : 
    2030     3595860 :         WHILE( ( ( l << 2 ) < n ) )
    2031             :         {
    2032     2489664 :             cftmdl( n, l, a, w );
    2033     2489664 :             l = shl( l, 2 );
    2034             :         }
    2035             :     }
    2036             : 
    2037     1106196 :     IF( EQ_16( shl( l, 2 ), n ) )
    2038             :     {
    2039     7236130 :         FOR( j = 0; j < l; j += 2 )
    2040             :         {
    2041     6831296 :             j1 = add( j, l );
    2042     6831296 :             j2 = add( j1, l );
    2043     6831296 :             j3 = add( j2, l );
    2044     6831296 :             x0r = L_add( a[j], a[j1] );          // Qx
    2045     6831296 :             x0i = L_add( a[j + 1], a[j1 + 1] );  // Qx
    2046     6831296 :             x1r = L_sub( a[j], a[j1] );          // Qx
    2047     6831296 :             x1i = L_sub( a[j + 1], a[j1 + 1] );  // Qx
    2048     6831296 :             x2r = L_add( a[j2], a[j3] );         // Qx
    2049     6831296 :             x2i = L_add( a[j2 + 1], a[j3 + 1] ); // Qx
    2050     6831296 :             x3r = L_sub( a[j2], a[j3] );         // Qx
    2051     6831296 :             x3i = L_sub( a[j2 + 1], a[j3 + 1] ); // Qx
    2052     6831296 :             a[j] = L_add( x0r, x2r );
    2053     6831296 :             move32();
    2054     6831296 :             a[j + 1] = L_add( x0i, x2i );
    2055     6831296 :             move32();
    2056     6831296 :             a[j2] = L_sub( x0r, x2r );
    2057     6831296 :             move32();
    2058     6831296 :             a[j2 + 1] = L_sub( x0i, x2i );
    2059     6831296 :             move32();
    2060     6831296 :             a[j1] = L_sub( x1r, x3i );
    2061     6831296 :             move32();
    2062     6831296 :             a[j1 + 1] = L_add( x1i, x3r );
    2063     6831296 :             move32();
    2064     6831296 :             a[j3] = L_add( x1r, x3i );
    2065     6831296 :             move32();
    2066     6831296 :             a[j3 + 1] = L_sub( x1i, x3r );
    2067     6831296 :             move32();
    2068             :         }
    2069             :     }
    2070             :     ELSE
    2071             :     {
    2072   178692434 :         FOR( j = 0; j < l; j += 2 )
    2073             :         {
    2074   177991072 :             j1 = add( j, l );
    2075   177991072 :             x0r = L_sub( a[j], a[j1] );
    2076   177991072 :             x0i = L_sub( a[j + 1], a[j1 + 1] );
    2077   177991072 :             a[j] = L_add( a[j], a[j1] );
    2078   177991072 :             move32();
    2079   177991072 :             a[j + 1] = L_add( a[j + 1], a[j1 + 1] );
    2080   177991072 :             move32();
    2081   177991072 :             a[j1] = x0r;
    2082   177991072 :             move32();
    2083   177991072 :             a[j1 + 1] = x0i;
    2084   177991072 :             move32();
    2085             :         }
    2086             :     }
    2087             : 
    2088     1106196 :     return;
    2089             : }
    2090             : 
    2091             : /*-----------------------------------------------------------------*
    2092             :  * cft1st()
    2093             :  * Subfunction of Complex Discrete Fourier Transform
    2094             :  *-----------------------------------------------------------------*/
    2095             : 
    2096     1106196 : static void cft1st(
    2097             :     Word16 n,       /* i  : data length of real and imag Q0 */
    2098             :     Word32 *a,      /* i/o: input/output data Qx            */
    2099             :     const Word16 *w /* i  : cos/sin table Q15                */
    2100             : )
    2101             : {
    2102             :     Word16 j, k1, k2;
    2103             :     Word16 wk1r, wk1i, wk2r, wk2i, wk3r, wk3i, wtmp;
    2104             :     Word32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
    2105             : 
    2106     1106196 :     x0r = L_add( a[0], a[2] ); // Qx
    2107     1106196 :     x0i = L_add( a[1], a[3] ); // Qx
    2108     1106196 :     x1r = L_sub( a[0], a[2] ); // Qx
    2109     1106196 :     x1i = L_sub( a[1], a[3] ); // Qx
    2110     1106196 :     x2r = L_add( a[4], a[6] ); // Qx
    2111     1106196 :     x2i = L_add( a[5], a[7] ); // Qx
    2112     1106196 :     x3r = L_sub( a[4], a[6] ); // Qx
    2113     1106196 :     x3i = L_sub( a[5], a[7] ); // Qx
    2114     1106196 :     a[0] = L_add( x0r, x2r );
    2115     1106196 :     move32();
    2116     1106196 :     a[1] = L_add( x0i, x2i );
    2117     1106196 :     move32();
    2118     1106196 :     a[4] = L_sub( x0r, x2r );
    2119     1106196 :     move32();
    2120     1106196 :     a[5] = L_sub( x0i, x2i );
    2121     1106196 :     move32();
    2122     1106196 :     a[2] = L_sub( x1r, x3i );
    2123     1106196 :     move32();
    2124     1106196 :     a[3] = L_add( x1i, x3r );
    2125     1106196 :     move32();
    2126     1106196 :     a[6] = L_add( x1r, x3i );
    2127     1106196 :     move32();
    2128     1106196 :     a[7] = L_sub( x1i, x3r );
    2129     1106196 :     move32();
    2130     1106196 :     wk1r = w[2];
    2131     1106196 :     x0r = L_add( a[8], a[10] );
    2132     1106196 :     x0i = L_add( a[9], a[11] );
    2133     1106196 :     x1r = L_sub( a[8], a[10] );
    2134     1106196 :     x1i = L_sub( a[9], a[11] );
    2135     1106196 :     x2r = L_add( a[12], a[14] );
    2136     1106196 :     x2i = L_add( a[13], a[15] );
    2137     1106196 :     x3r = L_sub( a[12], a[14] );
    2138     1106196 :     x3i = L_sub( a[13], a[15] );
    2139     1106196 :     a[8] = L_add( x0r, x2r );
    2140     1106196 :     move32();
    2141     1106196 :     a[9] = L_add( x0i, x2i );
    2142     1106196 :     move32();
    2143     1106196 :     a[12] = L_sub( x2i, x0i );
    2144     1106196 :     move32();
    2145     1106196 :     a[13] = L_sub( x0r, x2r );
    2146     1106196 :     move32();
    2147     1106196 :     x0r = L_sub( x1r, x3i );
    2148     1106196 :     x0i = L_add( x1i, x3r );
    2149     1106196 :     a[10] = Mpy_32_16_1( L_sub( x0r, x0i ), wk1r );
    2150     1106196 :     move32();
    2151     1106196 :     a[11] = Mpy_32_16_1( L_add( x0r, x0i ), wk1r );
    2152     1106196 :     move32();
    2153     1106196 :     x0r = L_add( x3i, x1r );
    2154     1106196 :     x0i = L_sub( x3r, x1i );
    2155     1106196 :     a[14] = Mpy_32_16_1( L_sub( x0i, x0r ), wk1r );
    2156     1106196 :     move32();
    2157     1106196 :     a[15] = Mpy_32_16_1( L_add( x0i, x0r ), wk1r );
    2158     1106196 :     move32();
    2159     1106196 :     k1 = 0;
    2160     1106196 :     move16();
    2161             : 
    2162    47913416 :     FOR( j = 16; j < n; j += 16 )
    2163             :     {
    2164    46807220 :         k1 = add( k1, 2 );
    2165    46807220 :         k2 = shl( k1, 1 );
    2166    46807220 :         wk2r = w[k1];
    2167    46807220 :         move16();
    2168    46807220 :         wk2i = w[k1 + 1];
    2169    46807220 :         move16();
    2170    46807220 :         wk1r = w[k2];
    2171    46807220 :         move16();
    2172    46807220 :         wk1i = w[k2 + 1];
    2173    46807220 :         move16();
    2174    46807220 :         wtmp = mult_r( wk2i, wk1i );
    2175    46807220 :         wk3r = sub( wk1r, wtmp );
    2176    46807220 :         wk3r = sub( wk3r, wtmp );
    2177    46807220 :         wtmp = mult_r( wk2i, wk1r );
    2178    46807220 :         wk3i = sub( wtmp, wk1i );
    2179    46807220 :         wk3i = add( wtmp, wk3i );
    2180    46807220 :         x0r = L_add( a[j], a[j + 2] );
    2181    46807220 :         x0i = L_add( a[j + 1], a[j + 3] );
    2182    46807220 :         x1r = L_sub( a[j], a[j + 2] );
    2183    46807220 :         x1i = L_sub( a[j + 1], a[j + 3] );
    2184    46807220 :         x2r = L_add( a[j + 4], a[j + 6] );
    2185    46807220 :         x2i = L_add( a[j + 5], a[j + 7] );
    2186    46807220 :         x3r = L_sub( a[j + 4], a[j + 6] );
    2187    46807220 :         x3i = L_sub( a[j + 5], a[j + 7] );
    2188    46807220 :         a[j] = L_add( x0r, x2r );
    2189    46807220 :         move32();
    2190    46807220 :         a[j + 1] = L_add( x0i, x2i );
    2191    46807220 :         move32();
    2192    46807220 :         x0r = L_sub( x0r, x2r );
    2193    46807220 :         x0i = L_sub( x0i, x2i );
    2194    46807220 :         a[j + 4] = L_sub( Mpy_32_16_1( x0r, wk2r ), Mpy_32_16_1( x0i, wk2i ) );
    2195    46807220 :         move32();
    2196    46807220 :         a[j + 5] = L_add( Mpy_32_16_1( x0i, wk2r ), Mpy_32_16_1( x0r, wk2i ) );
    2197    46807220 :         move32();
    2198    46807220 :         x0r = L_sub( x1r, x3i );
    2199    46807220 :         x0i = L_add( x1i, x3r );
    2200    46807220 :         a[j + 2] = L_sub( Mpy_32_16_1( x0r, wk1r ), Mpy_32_16_1( x0i, wk1i ) );
    2201    46807220 :         move32();
    2202    46807220 :         a[j + 3] = L_add( Mpy_32_16_1( x0i, wk1r ), Mpy_32_16_1( x0r, wk1i ) );
    2203    46807220 :         move32();
    2204    46807220 :         x0r = L_add( x1r, x3i );
    2205    46807220 :         x0i = L_sub( x1i, x3r );
    2206    46807220 :         a[j + 6] = L_sub( Mpy_32_16_1( x0r, wk3r ), Mpy_32_16_1( x0i, wk3i ) );
    2207    46807220 :         move32();
    2208    46807220 :         a[j + 7] = L_add( Mpy_32_16_1( x0i, wk3r ), Mpy_32_16_1( x0r, wk3i ) );
    2209    46807220 :         move32();
    2210    46807220 :         wk1r = w[k2 + 2];
    2211    46807220 :         move16();
    2212    46807220 :         wk1i = w[k2 + 3];
    2213    46807220 :         move16();
    2214    46807220 :         wtmp = mult_r( wk2r, wk1i );
    2215    46807220 :         wk3r = sub( wk1r, wtmp );
    2216    46807220 :         wk3r = sub( wk3r, wtmp );
    2217    46807220 :         wtmp = mult_r( wk2r, wk1r );
    2218    46807220 :         wk3i = sub( wtmp, wk1i );
    2219    46807220 :         wk3i = add( wtmp, wk3i );
    2220    46807220 :         x0r = L_add( a[j + 8], a[j + 10] );
    2221    46807220 :         x0i = L_add( a[j + 9], a[j + 11] );
    2222    46807220 :         x1r = L_sub( a[j + 8], a[j + 10] );
    2223    46807220 :         x1i = L_sub( a[j + 9], a[j + 11] );
    2224    46807220 :         x2r = L_add( a[j + 12], a[j + 14] );
    2225    46807220 :         x2i = L_add( a[j + 13], a[j + 15] );
    2226    46807220 :         x3r = L_sub( a[j + 12], a[j + 14] );
    2227    46807220 :         x3i = L_sub( a[j + 13], a[j + 15] );
    2228    46807220 :         a[j + 8] = L_add( x0r, x2r );
    2229    46807220 :         move32();
    2230    46807220 :         a[j + 9] = L_add( x0i, x2i );
    2231    46807220 :         move32();
    2232    46807220 :         x0r = L_sub( x0r, x2r );
    2233    46807220 :         x0i = L_sub( x0i, x2i );
    2234    46807220 :         a[j + 12] = L_negate( L_add( Mpy_32_16_1( x0r, wk2i ), Mpy_32_16_1( x0i, wk2r ) ) );
    2235    46807220 :         move32();
    2236    46807220 :         a[j + 13] = L_sub( Mpy_32_16_1( x0r, wk2r ), Mpy_32_16_1( x0i, wk2i ) );
    2237    46807220 :         move32();
    2238    46807220 :         x0r = L_sub( x1r, x3i );
    2239    46807220 :         x0i = L_add( x1i, x3r );
    2240    46807220 :         a[j + 10] = L_sub( Mpy_32_16_1( x0r, wk1r ), Mpy_32_16_1( x0i, wk1i ) );
    2241    46807220 :         move32();
    2242    46807220 :         a[j + 11] = L_add( Mpy_32_16_1( x0i, wk1r ), Mpy_32_16_1( x0r, wk1i ) );
    2243    46807220 :         x0r = L_add( x1r, x3i );
    2244    46807220 :         x0i = L_sub( x1i, x3r );
    2245    46807220 :         a[j + 14] = L_sub( Mpy_32_16_1( x0r, wk3r ), Mpy_32_16_1( x0i, wk3i ) );
    2246    46807220 :         move32();
    2247    46807220 :         a[j + 15] = L_add( Mpy_32_16_1( x0i, wk3r ), Mpy_32_16_1( x0r, wk3i ) );
    2248    46807220 :         move32();
    2249             :     }
    2250             : 
    2251     1106196 :     return;
    2252             : }
    2253             : 
    2254             : /*-----------------------------------------------------------------*
    2255             :  * cftmdl()
    2256             :  * Subfunction of Complex Discrete Fourier Transform
    2257             :  *-----------------------------------------------------------------*/
    2258             : 
    2259     2489664 : static void cftmdl(
    2260             :     Word16 n,       /* i  : data length of real and imag Q0 */
    2261             :     Word16 l,       /* i  : initial shift for processing Q0 */
    2262             :     Word32 *a,      /* i/o: input/output data Qx            */
    2263             :     const Word16 *w /* i  : cos/sin table Q15                */
    2264             : )
    2265             : {
    2266             :     Word16 j, j1, j2, j3, k, k1, k2, m, m2;
    2267             :     Word16 wk1r, wk1i, wk2r, wk2i, wk3r, wk3i, wtmp;
    2268             :     Word32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
    2269             : 
    2270     2489664 :     m = shl( l, 2 );
    2271    62622192 :     FOR( j = 0; j < l; j += 2 )
    2272             :     {
    2273    60132528 :         j1 = add( j, l );
    2274    60132528 :         j2 = add( j1, l );
    2275    60132528 :         j3 = add( j2, l );
    2276    60132528 :         x0r = L_add( a[j], a[j1] );          // Qx
    2277    60132528 :         x0i = L_add( a[j + 1], a[j1 + 1] );  // Qx
    2278    60132528 :         x1r = L_sub( a[j], a[j1] );          // Qx
    2279    60132528 :         x1i = L_sub( a[j + 1], a[j1 + 1] );  // Qx
    2280    60132528 :         x2r = L_add( a[j2], a[j3] );         // Qx
    2281    60132528 :         x2i = L_add( a[j2 + 1], a[j3 + 1] ); // Qx
    2282    60132528 :         x3r = L_sub( a[j2], a[j3] );         // Qx
    2283    60132528 :         x3i = L_sub( a[j2 + 1], a[j3 + 1] ); // Qx
    2284    60132528 :         a[j] = L_add( x0r, x2r );
    2285    60132528 :         move32();
    2286    60132528 :         a[j + 1] = L_add( x0i, x2i );
    2287    60132528 :         move32();
    2288    60132528 :         a[j2] = L_sub( x0r, x2r );
    2289    60132528 :         move32();
    2290    60132528 :         a[j2 + 1] = L_sub( x0i, x2i );
    2291    60132528 :         move32();
    2292    60132528 :         a[j1] = L_sub( x1r, x3i );
    2293    60132528 :         move32();
    2294    60132528 :         a[j1 + 1] = L_add( x1i, x3r );
    2295    60132528 :         move32();
    2296    60132528 :         a[j3] = L_add( x1r, x3i );
    2297    60132528 :         move32();
    2298    60132528 :         a[j3 + 1] = L_sub( x1i, x3r );
    2299    60132528 :         move32();
    2300             :     }
    2301             : 
    2302     2489664 :     wk1r = w[2];
    2303     2489664 :     move16();
    2304    62622192 :     FOR( j = m; j < l + m; j += 2 )
    2305             :     {
    2306    60132528 :         j1 = add( j, l );
    2307    60132528 :         j2 = add( j1, l );
    2308    60132528 :         j3 = add( j2, l );
    2309    60132528 :         x0r = L_add( a[j], a[j1] );
    2310    60132528 :         x0i = L_add( a[j + 1], a[j1 + 1] );
    2311    60132528 :         x1r = L_sub( a[j], a[j1] );
    2312    60132528 :         x1i = L_sub( a[j + 1], a[j1 + 1] );
    2313    60132528 :         x2r = L_add( a[j2], a[j3] );
    2314    60132528 :         x2i = L_add( a[j2 + 1], a[j3 + 1] );
    2315    60132528 :         x3r = L_sub( a[j2], a[j3] );
    2316    60132528 :         x3i = L_sub( a[j2 + 1], a[j3 + 1] );
    2317    60132528 :         a[j] = L_add( x0r, x2r );
    2318    60132528 :         move32();
    2319    60132528 :         a[j + 1] = L_add( x0i, x2i );
    2320    60132528 :         move32();
    2321    60132528 :         a[j2] = L_sub( x2i, x0i );
    2322    60132528 :         move32();
    2323    60132528 :         a[j2 + 1] = L_sub( x0r, x2r );
    2324    60132528 :         move32();
    2325    60132528 :         x0r = L_sub( x1r, x3i );
    2326    60132528 :         x0i = L_add( x1i, x3r );
    2327    60132528 :         a[j1] = Mpy_32_16_1( L_sub( x0r, x0i ), wk1r );
    2328    60132528 :         move32();
    2329    60132528 :         a[j1 + 1] = Mpy_32_16_1( L_add( x0r, x0i ), wk1r );
    2330    60132528 :         move32();
    2331    60132528 :         x0r = L_add( x3i, x1r );
    2332    60132528 :         x0i = L_sub( x3r, x1i );
    2333    60132528 :         a[j3] = Mpy_32_16_1( L_sub( x0i, x0r ), wk1r );
    2334    60132528 :         move32();
    2335    60132528 :         a[j3 + 1] = Mpy_32_16_1( L_add( x0i, x0r ), wk1r );
    2336    60132528 :         move32();
    2337             :     }
    2338             : 
    2339     2489664 :     k1 = 0;
    2340     2489664 :     move16();
    2341     2489664 :     m2 = shl( m, 1 );
    2342    15467462 :     FOR( k = m2; k < n; k += m2 )
    2343             :     {
    2344    12977798 :         k1 = add( k1, 2 );
    2345    12977798 :         k2 = shl( k1, 1 );
    2346    12977798 :         wk2r = w[k1];
    2347    12977798 :         move16();
    2348    12977798 :         wk2i = w[k1 + 1];
    2349    12977798 :         move16();
    2350    12977798 :         wk1r = w[k2];
    2351    12977798 :         move16();
    2352    12977798 :         wk1i = w[k2 + 1];
    2353    12977798 :         move16();
    2354    12977798 :         wtmp = mult_r( wk2i, wk1i );
    2355    12977798 :         wk3r = sub( wk1r, wtmp );
    2356    12977798 :         wk3r = sub( wk3r, wtmp );
    2357    12977798 :         wtmp = mult_r( wk2i, wk1r );
    2358    12977798 :         wk3i = sub( wtmp, wk1i );
    2359    12977798 :         wk3i = add( wtmp, wk3i );
    2360    90047470 :         FOR( j = k; j < l + k; j += 2 )
    2361             :         {
    2362    77069672 :             j1 = add( j, l );
    2363    77069672 :             j2 = add( j1, l );
    2364    77069672 :             j3 = add( j2, l );
    2365    77069672 :             x0r = L_add( a[j], a[j1] );
    2366    77069672 :             x0i = L_add( a[j + 1], a[j1 + 1] );
    2367    77069672 :             x1r = L_sub( a[j], a[j1] );
    2368    77069672 :             x1i = L_sub( a[j + 1], a[j1 + 1] );
    2369    77069672 :             x2r = L_add( a[j2], a[j3] );
    2370    77069672 :             x2i = L_add( a[j2 + 1], a[j3 + 1] );
    2371    77069672 :             x3r = L_sub( a[j2], a[j3] );
    2372    77069672 :             x3i = L_sub( a[j2 + 1], a[j3 + 1] );
    2373    77069672 :             a[j] = L_add( x0r, x2r );
    2374    77069672 :             move32();
    2375    77069672 :             a[j + 1] = L_add( x0i, x2i );
    2376    77069672 :             move32();
    2377    77069672 :             x0r = L_sub( x0r, x2r );
    2378    77069672 :             x0i = L_sub( x0i, x2i );
    2379    77069672 :             a[j2] = L_sub( Mpy_32_16_1( x0r, wk2r ), Mpy_32_16_1( x0i, wk2i ) ); // Qx
    2380    77069672 :             move32();
    2381    77069672 :             a[j2 + 1] = L_add( Mpy_32_16_1( x0i, wk2r ), Mpy_32_16_1( x0r, wk2i ) ); // Qx
    2382    77069672 :             move32();
    2383    77069672 :             x0r = L_sub( x1r, x3i );
    2384    77069672 :             x0i = L_add( x1i, x3r );
    2385    77069672 :             a[j1] = L_sub( Mpy_32_16_1( x0r, wk1r ), Mpy_32_16_1( x0i, wk1i ) ); // Qx
    2386    77069672 :             move32();
    2387    77069672 :             a[j1 + 1] = L_add( Mpy_32_16_1( x0i, wk1r ), Mpy_32_16_1( x0r, wk1i ) ); // Qx
    2388    77069672 :             move32();
    2389    77069672 :             x0r = L_add( x1r, x3i );
    2390    77069672 :             x0i = L_sub( x1i, x3r );
    2391    77069672 :             a[j3] = L_sub( Mpy_32_16_1( x0r, wk3r ), Mpy_32_16_1( x0i, wk3i ) ); // Qx
    2392    77069672 :             move32();
    2393    77069672 :             a[j3 + 1] = L_add( Mpy_32_16_1( x0i, wk3r ), Mpy_32_16_1( x0r, wk3i ) ); // Qx
    2394    77069672 :             move32();
    2395             :         }
    2396             : 
    2397    12977798 :         wk1r = w[k2 + 2];
    2398    12977798 :         move16();
    2399    12977798 :         wk1i = w[k2 + 3];
    2400    12977798 :         move16();
    2401    12977798 :         wtmp = mult_r( wk2r, wk1i );
    2402    12977798 :         wk3r = sub( wk1r, wtmp );
    2403    12977798 :         wk3r = sub( wk3r, wtmp );
    2404    12977798 :         wtmp = mult_r( wk2r, wk1r );
    2405    12977798 :         wk3i = sub( wtmp, wk1i );
    2406    12977798 :         wk3i = add( wtmp, wk3i );
    2407    90047470 :         FOR( j = k + m; j < l + ( k + m ); j += 2 )
    2408             :         {
    2409    77069672 :             j1 = add( j, l );
    2410    77069672 :             j2 = add( j1, l );
    2411    77069672 :             j3 = add( j2, l );
    2412    77069672 :             x0r = L_add( a[j], a[j1] );
    2413    77069672 :             x0i = L_add( a[j + 1], a[j1 + 1] );
    2414    77069672 :             x1r = L_sub( a[j], a[j1] );
    2415    77069672 :             x1i = L_sub( a[j + 1], a[j1 + 1] );
    2416    77069672 :             x2r = L_add( a[j2], a[j3] );
    2417    77069672 :             x2i = L_add( a[j2 + 1], a[j3 + 1] );
    2418    77069672 :             x3r = L_sub( a[j2], a[j3] );
    2419    77069672 :             x3i = L_sub( a[j2 + 1], a[j3 + 1] );
    2420    77069672 :             a[j] = L_add( x0r, x2r );
    2421    77069672 :             move32();
    2422    77069672 :             a[j + 1] = L_add( x0i, x2i );
    2423    77069672 :             move32();
    2424    77069672 :             x0r = L_sub( x0r, x2r );
    2425    77069672 :             x0i = L_sub( x0i, x2i );
    2426    77069672 :             a[j2] = L_negate( L_add( Mpy_32_16_1( x0r, wk2i ), Mpy_32_16_1( x0i, wk2r ) ) ); // Qx
    2427    77069672 :             move32();
    2428    77069672 :             a[j2 + 1] = L_sub( Mpy_32_16_1( x0r, wk2r ), Mpy_32_16_1( x0i, wk2i ) ); // Qx
    2429    77069672 :             move32();
    2430    77069672 :             x0r = L_sub( x1r, x3i );
    2431    77069672 :             x0i = L_add( x1i, x3r );
    2432    77069672 :             a[j1] = L_sub( Mpy_32_16_1( x0r, wk1r ), Mpy_32_16_1( x0i, wk1i ) ); // Qx
    2433    77069672 :             move32();
    2434    77069672 :             a[j1 + 1] = L_add( Mpy_32_16_1( x0i, wk1r ), Mpy_32_16_1( x0r, wk1i ) ); // Qx
    2435    77069672 :             move32();
    2436    77069672 :             x0r = L_add( x1r, x3i );
    2437    77069672 :             x0i = L_sub( x1i, x3r );
    2438    77069672 :             a[j3] = L_sub( Mpy_32_16_1( x0r, wk3r ), Mpy_32_16_1( x0i, wk3i ) ); // Qx
    2439    77069672 :             move32();
    2440    77069672 :             a[j3 + 1] = L_add( Mpy_32_16_1( x0i, wk3r ), Mpy_32_16_1( x0r, wk3i ) ); // Qx
    2441    77069672 :             move32();
    2442             :         }
    2443             :     }
    2444             : 
    2445     2489664 :     return;
    2446             : }
    2447             : 
    2448           0 : static void cftbsub(
    2449             :     Word16 n,       // Q0
    2450             :     Word32 *a,      // Qx
    2451             :     const Word16 *w /* i  : cos/sin table  Q15               */
    2452             : )
    2453             : {
    2454             :     Word16 j, j1, j2, j3, l;
    2455             :     Word32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
    2456             : 
    2457           0 :     l = 2;
    2458           0 :     move16();
    2459           0 :     IF( GT_16( n, 8 ) )
    2460             :     {
    2461           0 :         cft1st( n, a, w );
    2462           0 :         l = 8;
    2463           0 :         move16();
    2464             : 
    2465           0 :         WHILE( ( ( l << 2 ) < n ) )
    2466             :         {
    2467           0 :             cftmdl( n, l, a, w );
    2468           0 :             l = shl( l, 2 );
    2469             :         }
    2470             :     }
    2471             : 
    2472           0 :     IF( EQ_16( shl( l, 2 ), n ) )
    2473             :     {
    2474           0 :         FOR( j = 0; j < l; j += 2 )
    2475             :         {
    2476           0 :             j1 = add( j, l );
    2477           0 :             j2 = add( j1, l );
    2478           0 :             j3 = add( j2, l );
    2479           0 :             x0r = L_add( a[j], a[j1] );                     // Qx
    2480           0 :             x0i = L_negate( L_add( a[j + 1], a[j1 + 1] ) ); // Qx
    2481           0 :             x1r = L_sub( a[j], a[j1] );                     // Qx
    2482           0 :             x1i = L_sub( a[j1 + 1], a[j + 1] );             // Qx
    2483           0 :             x2r = L_add( a[j2], a[j3] );                    // Qx
    2484           0 :             x2i = L_add( a[j2 + 1], a[j3 + 1] );            // Qx
    2485           0 :             x3r = L_sub( a[j2], a[j3] );                    // Qx
    2486           0 :             x3i = L_sub( a[j2 + 1], a[j3 + 1] );            // Qx
    2487           0 :             a[j] = L_add( x0r, x2r );
    2488           0 :             move32();
    2489           0 :             a[j + 1] = L_sub( x0i, x2i );
    2490           0 :             move32();
    2491           0 :             a[j2] = L_sub( x0r, x2r );
    2492           0 :             move32();
    2493           0 :             a[j2 + 1] = L_add( x0i, x2i );
    2494           0 :             move32();
    2495           0 :             a[j1] = L_sub( x1r, x3i );
    2496           0 :             move32();
    2497           0 :             a[j1 + 1] = L_sub( x1i, x3r );
    2498           0 :             move32();
    2499           0 :             a[j3] = L_add( x1r, x3i );
    2500           0 :             move32();
    2501           0 :             a[j3 + 1] = L_add( x1i, x3r );
    2502           0 :             move32();
    2503             :         }
    2504             :     }
    2505             :     ELSE
    2506             :     {
    2507           0 :         FOR( j = 0; j < l; j += 2 )
    2508             :         {
    2509           0 :             j1 = add( j, l );
    2510           0 :             x0r = L_sub( a[j], a[j1] );
    2511           0 :             x0i = L_sub( a[j1 + 1], a[j + 1] );
    2512           0 :             a[j] = L_add( a[j], a[j1] );
    2513           0 :             move32();
    2514           0 :             a[j + 1] = L_negate( L_add( a[j + 1], a[j1 + 1] ) );
    2515           0 :             move32();
    2516           0 :             a[j1] = x0r;
    2517           0 :             move32();
    2518           0 :             a[j1 + 1] = x0i;
    2519           0 :             move32();
    2520             :         }
    2521             :     }
    2522             : 
    2523           0 :     return;
    2524             : }
    2525             : 
    2526           0 : static void rftfsub(
    2527             :     Word16 n,       // Q0
    2528             :     Word32 *a,      // Qx
    2529             :     Word16 nc,      // Q0
    2530             :     const Word16 *c // Q15
    2531             : )
    2532             : {
    2533             :     Word16 j, k, kk, ks, m;
    2534             :     Word16 wkr, wki;
    2535             :     Word32 xr, xi, yr, yi;
    2536             : 
    2537           0 :     m = shr( n, 1 );
    2538           0 :     ks = idiv1616( shl( nc, 1 ), m );
    2539           0 :     kk = 0;
    2540           0 :     move16();
    2541           0 :     FOR( j = 2; j < m; j += 2 )
    2542             :     {
    2543           0 :         k = sub( n, j );
    2544           0 :         kk = add( kk, ks );
    2545           0 :         wkr = sub( extract_l( 0x4000 ) /*0.5.Q15*/, c[( nc - kk )] );
    2546           0 :         wki = c[kk]; // Q15
    2547           0 :         move16();
    2548           0 :         xr = L_sub( a[j], a[k] );
    2549           0 :         xi = L_add( a[j + 1], a[k + 1] );
    2550           0 :         yr = L_sub( Mpy_32_16_1( xr, wkr ), Mpy_32_16_1( xi, wki ) );
    2551           0 :         yi = L_add( Mpy_32_16_1( xi, wkr ), Mpy_32_16_1( xr, wki ) );
    2552           0 :         a[j] = L_sub( a[j], yr );
    2553           0 :         move32();
    2554           0 :         a[j + 1] = L_sub( a[j + 1], yi );
    2555           0 :         move32();
    2556           0 :         a[k] = L_add( a[k], yr );
    2557           0 :         move32();
    2558           0 :         a[k + 1] = L_sub( a[k + 1], yi );
    2559           0 :         move32();
    2560             :     }
    2561             : 
    2562           0 :     return;
    2563             : }
    2564             : 
    2565             : 
    2566           0 : static void rftbsub(
    2567             :     Word16 n,       // Q0
    2568             :     Word32 *a,      // Qx
    2569             :     Word16 nc,      // Q0
    2570             :     const Word16 *c // Q15
    2571             : )
    2572             : {
    2573             :     Word16 j, k, kk, ks, m;
    2574             :     Word16 wkr, wki;
    2575             :     Word32 xr, xi, yr, yi;
    2576           0 :     a[1] = L_negate( a[1] );
    2577           0 :     move32();
    2578           0 :     m = shr( n, 1 );
    2579           0 :     ks = idiv1616( shl( nc, 1 ), m );
    2580           0 :     kk = 0;
    2581           0 :     move16();
    2582           0 :     FOR( j = 2; j < m; j += 2 )
    2583             :     {
    2584           0 :         k = sub( n, j );
    2585           0 :         kk = add( kk, ks );
    2586           0 :         wkr = sub( extract_l( 0x4000 ) /*0.5.Q15*/, c[( nc - kk )] );
    2587           0 :         wki = c[kk]; // Q15
    2588           0 :         xr = L_sub( a[j], a[k] );
    2589           0 :         xi = L_add( a[j + 1], a[k + 1] );
    2590           0 :         yr = L_add( Mpy_32_16_1( xr, wkr ), Mpy_32_16_1( xi, wki ) ); // Qx
    2591           0 :         yi = L_sub( Mpy_32_16_1( xi, wkr ), Mpy_32_16_1( xr, wki ) ); // Qx
    2592           0 :         a[j] = L_sub( a[j], yr );
    2593           0 :         move32();
    2594           0 :         a[j + 1] = L_sub( yi, a[j + 1] );
    2595           0 :         move32();
    2596           0 :         a[k] = L_add( a[k], yr );
    2597           0 :         move32();
    2598           0 :         a[k + 1] = L_sub( yi, a[k + 1] );
    2599           0 :         move32();
    2600             :     }
    2601           0 :     a[m + 1] = L_negate( a[m + 1] );
    2602             : 
    2603           0 :     return;
    2604             : }
    2605             : 
    2606             : 
    2607           0 : static void dctsub(
    2608             :     Word16 n,       // Q0
    2609             :     Word32 *a,      // Qx
    2610             :     Word16 nc,      // Q0
    2611             :     const Word16 *c // Q15
    2612             : )
    2613             : {
    2614             :     Word16 j, k, kk, ks, m;
    2615             :     Word16 wkr, wki;
    2616             :     Word32 xr;
    2617             : 
    2618           0 :     m = shr( n, 1 );
    2619           0 :     ks = idiv1616( nc, n );
    2620           0 :     kk = 0;
    2621           0 :     move16();
    2622           0 :     FOR( j = 1; j < m; j++ )
    2623             :     {
    2624           0 :         k = sub( n, j );
    2625           0 :         kk = add( kk, ks );
    2626           0 :         wkr = sub( c[kk], c[( nc - kk )] );                                 // Q15
    2627           0 :         wki = add( c[kk], c[( nc - kk )] );                                 // Q15
    2628           0 :         xr = L_sub( Mpy_32_16_1( a[j], wki ), Mpy_32_16_1( a[k], wkr ) );   // Qx
    2629           0 :         a[j] = L_add( Mpy_32_16_1( a[j], wkr ), Mpy_32_16_1( a[k], wki ) ); // Qx
    2630           0 :         move32();
    2631           0 :         a[k] = xr;
    2632           0 :         move32();
    2633             :     }
    2634           0 :     a[m] = Mpy_32_16_1( a[m], c[0] ); // Qx
    2635           0 :     move32();
    2636             : 
    2637           0 :     return;
    2638             : }
    2639             : 
    2640             : /*-----------------------------------------------------------------*
    2641             :  * edct2_fx_ivas()
    2642             :  *
    2643             :  * Transformation of the signal to DCT domain
    2644             :  * OR Inverse EDCT-II for short frames
    2645             :  *-----------------------------------------------------------------*/
    2646             : 
    2647           0 : void edct2_fx_ivas(
    2648             :     const Word16 n, // Q0
    2649             :     const Word16 isgn,
    2650             :     Word32 *in, // Qx
    2651             :     Word32 *a,  // Qx
    2652             :     const Word16 *ip,
    2653             :     const Word16 *w // Q15
    2654             : )
    2655             : {
    2656             :     Word16 j, nw, nc;
    2657             :     Word32 xr;
    2658             : 
    2659           0 :     Copy32( in, a, n );
    2660             : 
    2661           0 :     nw = ip[0];
    2662           0 :     move16();
    2663           0 :     IF( GT_16( n, shl( nw, 2 ) ) )
    2664             :     {
    2665           0 :         nw = shr( n, 2 );
    2666             :     }
    2667             : 
    2668           0 :     nc = ip[1];
    2669           0 :     move16();
    2670           0 :     if ( GT_16( n, nc ) )
    2671             :     {
    2672           0 :         nc = n;
    2673           0 :         move16();
    2674             :     }
    2675           0 :     IF( isgn < 0 )
    2676             :     {
    2677           0 :         xr = a[n - 1];
    2678           0 :         move16();
    2679           0 :         FOR( j = n - 2; j >= 2; j -= 2 )
    2680             :         {
    2681           0 :             a[j + 1] = L_sub( a[j], a[j - 1] );
    2682           0 :             move32();
    2683           0 :             a[j] = L_add( a[j], a[j - 1] );
    2684           0 :             move32();
    2685             :         }
    2686           0 :         a[1] = L_sub( a[0], xr );
    2687           0 :         move32();
    2688           0 :         a[0] = L_add( a[0], xr );
    2689           0 :         move32();
    2690             : 
    2691           0 :         IF( GT_16( n, 4 ) )
    2692             :         {
    2693           0 :             rftbsub( n, a, nc, w + nw );
    2694           0 :             bitrv2_SR( n, ip + 2, a );
    2695           0 :             cftbsub( n, a, w );
    2696             :         }
    2697           0 :         ELSE IF( EQ_16( n, 4 ) )
    2698             :         {
    2699           0 :             cftfsub( n, a, w );
    2700             :         }
    2701             :     }
    2702             : 
    2703           0 :     IF( isgn >= 0 )
    2704             :     {
    2705           0 :         a[0] = L_shr( a[0], 1 );
    2706           0 :         move32();
    2707             :     }
    2708             : 
    2709           0 :     dctsub( n, a, nc, w + nw );
    2710             : 
    2711           0 :     IF( isgn >= 0 )
    2712             :     {
    2713           0 :         IF( GT_16( n, 4 ) )
    2714             :         {
    2715           0 :             bitrv2_SR( n, ip + 2, a );
    2716           0 :             cftfsub( n, a, w );
    2717           0 :             rftfsub( n, a, nc, w + nw );
    2718             :         }
    2719           0 :         ELSE IF( EQ_16( n, 4 ) )
    2720             :         {
    2721           0 :             cftfsub( n, a, w );
    2722             :         }
    2723           0 :         xr = L_sub( a[0], a[1] );
    2724           0 :         a[0] = L_add( a[0], a[1] );
    2725           0 :         move32();
    2726           0 :         FOR( j = 2; j < n; j += 2 )
    2727             :         {
    2728           0 :             a[j - 1] = L_sub( a[j], a[j + 1] );
    2729           0 :             move32();
    2730           0 :             a[j] = L_add( a[j], a[j + 1] );
    2731           0 :             move32();
    2732             :         }
    2733           0 :         a[n - 1] = xr;
    2734           0 :         move32();
    2735             : 
    2736           0 :         FOR( j = 0; j < n; j++ )
    2737             :         {
    2738           0 :             a[j] = L_shr( a[j], 5 );
    2739           0 :             move32();
    2740             :         }
    2741             :     }
    2742           0 : }
    2743             : 
    2744      706796 : void DoRTFTn_fx_ivas(
    2745             :     Word32 *x,     /* i/o: real part of input and output data Qx      */
    2746             :     Word32 *y,     /* i/o: imaginary part of input and output data Qx */
    2747             :     const Word16 n /* i  : size of the FFT up to 1024 Q0*/
    2748             : )
    2749             : {
    2750             : 
    2751             :     Word16 i;
    2752             :     Word32 z[2048];
    2753             : 
    2754   359533804 :     FOR( i = 0; i < n; i++ )
    2755             :     {
    2756   358827008 :         z[2 * i] = x[i]; // Qx
    2757   358827008 :         move32();
    2758   358827008 :         z[( ( i << 1 ) + 1 )] = y[i]; // Qx
    2759   358827008 :         move32();
    2760             :     }
    2761             : 
    2762      706796 :     SWITCH( n )
    2763             :     {
    2764           0 :         case ( 16 ):
    2765           0 :             cdftForw( 2 * n, z, Ip_fft16, w_fft16_fx );
    2766           0 :             BREAK;
    2767           0 :         case ( 32 ):
    2768           0 :             cdftForw( 2 * n, z, Ip_fft32, w_fft32_fx );
    2769           0 :             BREAK;
    2770           0 :         case ( 64 ):
    2771           0 :             cdftForw( 2 * n, z, Ip_fft64, w_fft64_fx );
    2772           0 :             BREAK;
    2773           0 :         case ( 128 ):
    2774           0 :             cdftForw( 2 * n, z, Ip_fft128, w_fft128_fx );
    2775           0 :             BREAK;
    2776       11924 :         case ( 256 ):
    2777       11924 :             cdftForw( 2 * n, z, Ip_fft256, w_fft256_fx );
    2778       11924 :             BREAK;
    2779      694872 :         case ( 512 ):
    2780      694872 :             cdftForw( 2 * n, z, Ip_fft512, w_fft512_fx );
    2781      694872 :             BREAK;
    2782           0 :         default:
    2783           0 :             assert( 0 );
    2784             :     }
    2785             : 
    2786      706796 :     x[0] = z[0]; // Qx
    2787      706796 :     move32();
    2788      706796 :     y[0] = z[1]; // Qx
    2789      706796 :     move32();
    2790   358827008 :     FOR( i = 1; i < n; i++ )
    2791             :     {
    2792   358120212 :         x[( n - i )] = z[2 * i];
    2793   358120212 :         move32();
    2794   358120212 :         y[( n - i )] = z[( ( i << 1 ) + 1 )];
    2795   358120212 :         move32();
    2796             :     }
    2797             : 
    2798      706796 :     return;
    2799             : }
    2800             : 
    2801           0 : void fft3_fx_ivas(
    2802             :     const Word32 X[], // Qx
    2803             :     Word32 Y[],       // Qx
    2804             :     const Word16 n    // Q0
    2805             : )
    2806             : {
    2807             :     Word32 Z[PH_ECU_SPEC_SIZE];
    2808             :     Word32 *Z0, *Z1, *Z2;
    2809             :     Word32 *z0, *z1, *z2;
    2810             :     const Word32 *x;
    2811           0 :     const Word16 *t_sin = sincos_t_rad3_fx; // Q15
    2812             :     Word16 m, step, order;
    2813             :     Word16 i, j;
    2814             :     Word16 c1_ind, s1_ind, c2_ind, s2_ind;
    2815             :     Word16 c1_step, s1_step, c2_step, s2_step;
    2816             :     Word32 *RY, *IY, *RZ0, *IZ0, *RZ1, *IZ1, *RZ2, *IZ2;
    2817             : 
    2818             :     /* Determine the order of the transform, the length of decimated  */
    2819             :     /* transforms m, and the step for the sine and cosine tables.     */
    2820           0 :     SWITCH( n )
    2821             :     {
    2822           0 :         case 1536:
    2823           0 :             order = 9;
    2824           0 :             move16();
    2825           0 :             m = 512;
    2826           0 :             move16();
    2827           0 :             step = 1;
    2828           0 :             move16();
    2829           0 :             BREAK;
    2830           0 :         case 384:
    2831           0 :             order = 7;
    2832           0 :             move16();
    2833           0 :             m = 128;
    2834           0 :             move16();
    2835           0 :             step = 4;
    2836           0 :             move16();
    2837           0 :             BREAK;
    2838           0 :         default:
    2839           0 :             order = 9;
    2840           0 :             move16();
    2841           0 :             m = 512;
    2842           0 :             move16();
    2843           0 :             step = 1;
    2844           0 :             move16();
    2845             :     }
    2846             : 
    2847             :     /* Compose decimated sequences X[3i], X[3i+1],X[3i+2] */
    2848             :     /* compute their FFT of length m.                                 */
    2849           0 :     Z0 = &Z[0];
    2850           0 :     z0 = &Z0[0];
    2851           0 :     Z1 = &Z0[m];
    2852           0 :     z1 = &Z1[0]; /* Z1 = &Z[ m];     */
    2853           0 :     Z2 = &Z1[m];
    2854           0 :     z2 = &Z2[0]; /* Z2 = &Z[2m];     */
    2855           0 :     x = &X[0];
    2856           0 :     FOR( i = 0; i < n / 3; i++ )
    2857             :     {
    2858           0 :         *z0++ = *x++; /* Z0[i] = X[3i];   */
    2859           0 :         move32();
    2860           0 :         *z1++ = *x++; /* Z1[i] = X[3i+1]; */
    2861           0 :         move32();
    2862           0 :         *z2++ = *x++; /* Z2[i] = X[3i+2]; */
    2863           0 :         move32();
    2864             :     }
    2865             : 
    2866           0 :     fft_rel_fx32( &Z0[0], m, order );
    2867           0 :     fft_rel_fx32( &Z1[0], m, order );
    2868           0 :     fft_rel_fx32( &Z2[0], m, order );
    2869             : 
    2870             :     /* Butterflies of order 3. */
    2871             :     /* pointer initialization */
    2872           0 :     RY = &Y[0]; // Qx
    2873           0 :     IY = &Y[n]; // Qx
    2874           0 :     RZ0 = &Z0[0];
    2875           0 :     IZ0 = &Z0[m];
    2876           0 :     RZ1 = &Z1[0];
    2877           0 :     IZ1 = &Z1[m];
    2878           0 :     RZ2 = &Z2[0];
    2879           0 :     IZ2 = &Z2[m];
    2880             : 
    2881           0 :     c1_step = negate( step );
    2882           0 :     s1_step = step;
    2883           0 :     move16();
    2884           0 :     c2_step = negate( shl( step, 1 ) );
    2885           0 :     s2_step = shl( step, 1 );
    2886           0 :     c1_ind = add( T_SIN_PI_2, c1_step );
    2887           0 :     s1_ind = s1_step;
    2888           0 :     move16();
    2889           0 :     c2_ind = add( T_SIN_PI_2, c2_step );
    2890           0 :     s2_ind = s2_step;
    2891           0 :     move16();
    2892             : 
    2893             :     /* special case: i = 0 */
    2894           0 :     RY[0] = L_add( RZ0[0], L_add( RZ1[0], RZ2[0] ) );
    2895           0 :     move32();
    2896             : 
    2897             :     /* first 3/12 */
    2898           0 :     FOR( i = 1; i < ( 3 * ( m >> 3 ) ); ( i++, c1_ind = ( c1_ind + c1_step ), s1_ind = ( s1_ind + s1_step ), c2_ind = ( c2_ind + c2_step ), s2_ind = ( s2_ind + s2_step ) ) )
    2899             :     {
    2900           0 :         RY[i] = L_add( RZ0[i], L_add( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ),
    2901           0 :                                       L_add( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ),
    2902           0 :                                              L_add( Mpy_32_16_1( RZ2[i], t_sin[c2_ind] ),
    2903           0 :                                                     Mpy_32_16_1( IZ2[-i], t_sin[s2_ind] ) ) ) ) ); // Qx
    2904           0 :         move32();
    2905           0 :         IY[-i] = L_sub( IZ0[-i], L_add( L_sub( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ),
    2906           0 :                                                Mpy_32_16_1( IZ1[-i], t_sin[c1_ind] ) ),
    2907           0 :                                         L_sub( Mpy_32_16_1( RZ2[i], t_sin[s2_ind] ),
    2908           0 :                                                Mpy_32_16_1( IZ2[-i], t_sin[c2_ind] ) ) ) ); // Qx
    2909           0 :         move32();
    2910             :     }
    2911             : 
    2912             :     /* next 1/12 */
    2913           0 :     FOR( ; i < 4 * m / 8; ( i++, c1_ind = ( c1_ind + c1_step ), s1_ind = ( s1_ind + s1_step ), c2_ind = ( c2_ind - c2_step ), s2_ind = ( s2_ind - s2_step ) ) )
    2914             :     {
    2915           0 :         RY[i] = L_add( RZ0[i], L_sub( L_add( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ),
    2916           0 :                                              Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ) ),
    2917           0 :                                       L_sub( Mpy_32_16_1( RZ2[i], t_sin[c2_ind] ),
    2918           0 :                                              Mpy_32_16_1( IZ2[-i], t_sin[s2_ind] ) ) ) ); // Qx
    2919           0 :         move32();
    2920           0 :         IY[-i] = L_sub( IZ0[-i], L_sub( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ),
    2921           0 :                                         L_sub( Mpy_32_16_1( IZ1[-i], t_sin[c1_ind] ),
    2922           0 :                                                L_add( Mpy_32_16_1( RZ2[i], t_sin[s2_ind] ),
    2923           0 :                                                       Mpy_32_16_1( IZ2[-i], t_sin[c2_ind] ) ) ) ) ); // Qx
    2924           0 :         move32();
    2925             :     }
    2926             : 
    2927             :     /* special case: i = m/2 i.e. 1/3 */
    2928           0 :     RY[i] = L_add( RZ0[i],
    2929           0 :                    L_sub( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ),
    2930           0 :                           Mpy_32_16_1( RZ2[i], t_sin[c2_ind] ) ) ); // Qx
    2931           0 :     move32();
    2932           0 :     IY[-i] = L_negate( L_add( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ),
    2933           0 :                               Mpy_32_16_1( RZ2[i], t_sin[s2_ind] ) ) ); // Qx
    2934           0 :     move32();
    2935           0 :     i = add( i, 1 );
    2936             : 
    2937           0 :     c1_ind = add( c1_ind, c1_step );
    2938           0 :     s1_ind = add( s1_ind, s1_step );
    2939           0 :     c2_ind = sub( c2_ind, c2_step );
    2940           0 :     s2_ind = sub( s2_ind, s2_step );
    2941             : 
    2942             :     /* next  2/12 */
    2943           0 :     FOR( j = i - 2; i < 6 * m / 8; ( i++, j--, c1_ind = ( c1_ind + c1_step ), s1_ind = ( s1_ind + s1_step ), c2_ind = ( c2_ind - c2_step ), s2_ind = ( s2_ind - s2_step ) ) )
    2944             :     {
    2945           0 :         RY[i] = L_add( RZ0[j], L_sub( Mpy_32_16_1( RZ1[j], t_sin[c1_ind] ),
    2946           0 :                                       L_add( Mpy_32_16_1( IZ1[-j], t_sin[s1_ind] ),
    2947           0 :                                              L_add( Mpy_32_16_1( RZ2[j], t_sin[c2_ind] ),
    2948           0 :                                                     Mpy_32_16_1( IZ2[-j], t_sin[s2_ind] ) ) ) ) ); // Qx
    2949           0 :         move32();
    2950             : 
    2951           0 :         IY[-i] = L_negate( L_add( IZ0[-j], L_add( Mpy_32_16_1( RZ1[j], t_sin[s1_ind] ),
    2952           0 :                                                   L_add( Mpy_32_16_1( IZ1[-j], t_sin[c1_ind] ),
    2953           0 :                                                          L_sub( Mpy_32_16_1( RZ2[j], t_sin[s2_ind] ),
    2954           0 :                                                                 Mpy_32_16_1( IZ2[-j], t_sin[c2_ind] ) ) ) ) ) ); // Qx
    2955           0 :         move32();
    2956             :     }
    2957             : 
    2958             :     /*--------------------------half--------------------------*/
    2959             :     /* next 2/12 */
    2960           0 :     FOR( ; i < 8 * m / 8; ( i++, j--, c1_ind = ( c1_ind - c1_step ), s1_ind = ( s1_ind - s1_step ), c2_ind = ( c2_ind + c2_step ), s2_ind = ( s2_ind + s2_step ) ) )
    2961             :     {
    2962           0 :         RY[i] = L_sub( RZ0[j], L_add( Mpy_32_16_1( RZ1[j], t_sin[c1_ind] ),
    2963           0 :                                       L_add( Mpy_32_16_1( IZ1[-j], t_sin[s1_ind] ),
    2964           0 :                                              L_sub( Mpy_32_16_1( RZ2[j], t_sin[c2_ind] ),
    2965           0 :                                                     Mpy_32_16_1( IZ2[-j], t_sin[s2_ind] ) ) ) ) ); // Qx
    2966           0 :         move32();
    2967           0 :         IY[-i] = L_negate( L_add( IZ0[-j], L_sub( Mpy_32_16_1( RZ1[j], t_sin[s1_ind] ),
    2968           0 :                                                   L_add( Mpy_32_16_1( IZ1[-j], t_sin[c1_ind] ),
    2969           0 :                                                          L_add( Mpy_32_16_1( RZ2[j], t_sin[s2_ind] ),
    2970           0 :                                                                 Mpy_32_16_1( IZ2[-j], t_sin[c2_ind] ) ) ) ) ) ); // Qx
    2971           0 :         move32();
    2972             :     }
    2973             : 
    2974             :     /* special case: i = m, i.e 2/3 */
    2975           0 :     RY[i] = L_sub( RZ0[j], L_add( Mpy_32_16_1( RZ1[j], t_sin[c1_ind] ),
    2976           0 :                                   Mpy_32_16_1( RZ2[j], t_sin[c2_ind] ) ) ); // Qx
    2977           0 :     move32();
    2978           0 :     IY[-i] = L_sub( Mpy_32_16_1( RZ2[j], t_sin[s2_ind] ),
    2979           0 :                     Mpy_32_16_1( RZ1[j], t_sin[s1_ind] ) ); // Qx
    2980           0 :     move32();
    2981           0 :     i = add( i, 1 );
    2982           0 :     c1_ind = sub( c1_ind, c1_step ), s1_ind = sub( s1_ind, s1_step ), c2_ind = add( c2_ind, c2_step ), s2_ind = add( s2_ind, s2_step );
    2983             : 
    2984             :     /* next 1/12 */
    2985           0 :     FOR( j = 1; i < ( 9 * ( m >> 3 ) ); ( i++, j++, c1_ind = ( c1_ind - c1_step ), s1_ind = ( s1_ind - s1_step ), c2_ind = ( c2_ind + c2_step ), s2_ind = ( s2_ind + s2_step ) ) )
    2986             :     {
    2987           0 :         RY[i] = L_sub( RZ0[j], L_sub( Mpy_32_16_1( RZ1[j], t_sin[c1_ind] ),
    2988           0 :                                       L_sub( Mpy_32_16_1( IZ1[-j], t_sin[s1_ind] ),
    2989           0 :                                              L_add( Mpy_32_16_1( RZ2[j], t_sin[c2_ind] ),
    2990           0 :                                                     Mpy_32_16_1( IZ2[-j], t_sin[s2_ind] ) ) ) ) ); // Qx
    2991           0 :         move32();
    2992           0 :         IY[-i] = L_sub( IZ0[-j], L_add( Mpy_32_16_1( RZ1[j], t_sin[s1_ind] ),
    2993           0 :                                         L_sub( Mpy_32_16_1( IZ1[-j], t_sin[c1_ind] ),
    2994           0 :                                                L_sub( Mpy_32_16_1( RZ2[j], t_sin[s2_ind] ),
    2995           0 :                                                       Mpy_32_16_1( IZ2[-j], t_sin[c2_ind] ) ) ) ) ); // Qx
    2996           0 :         move32();
    2997             :     }
    2998             : 
    2999             :     /* last 3/12 */
    3000           0 :     FOR( ; i < 12 * m / 8; ( i++, j++, c1_ind = ( c1_ind - c1_step ), s1_ind = ( s1_ind - s1_step ), c2_ind = ( c2_ind - c2_step ), s2_ind = ( s2_ind - s2_step ) ) )
    3001             :     {
    3002           0 :         RY[i] = L_sub( RZ0[j], L_sub( L_sub( Mpy_32_16_1( RZ1[j], t_sin[c1_ind] ),
    3003           0 :                                              Mpy_32_16_1( IZ1[-j], t_sin[s1_ind] ) ),
    3004           0 :                                       L_sub( Mpy_32_16_1( RZ2[j], t_sin[c2_ind] ),
    3005           0 :                                              Mpy_32_16_1( IZ2[-j], t_sin[s2_ind] ) ) ) ); // Qx
    3006           0 :         move32();
    3007           0 :         IY[-i] = L_sub( IZ0[-j], L_sub( L_add( Mpy_32_16_1( RZ1[j], t_sin[s1_ind] ),
    3008           0 :                                                Mpy_32_16_1( IZ1[-j], t_sin[c1_ind] ) ),
    3009           0 :                                         L_add( Mpy_32_16_1( RZ2[j], t_sin[s2_ind] ),
    3010           0 :                                                Mpy_32_16_1( IZ2[-j], t_sin[c2_ind] ) ) ) ); // Qx
    3011           0 :         move32();
    3012             :     }
    3013             : 
    3014             :     /* special case: i = 3*m/2 */
    3015           0 :     RY[i] = L_sub( RZ0[j], L_sub( Mpy_32_16_1( RZ1[j], t_sin[c1_ind] ),
    3016           0 :                                   Mpy_32_16_1( RZ2[j], t_sin[c2_ind] ) ) ); // Qx
    3017           0 :     move32();
    3018             : 
    3019           0 :     return;
    3020             : }
    3021             : 
    3022           0 : void ifft3_fx_ivas(
    3023             :     const Word32 Z[], // Qx
    3024             :     Word32 X[],
    3025             :     const Word16 n )
    3026             : {
    3027             :     Word32 Y[PH_ECU_SPEC_SIZE];
    3028           0 :     const Word16 *t_sin = sincos_t_rad3_fx; // Q15
    3029             :     Word16 m, step, step2, order;
    3030             :     Word16 i;
    3031             :     Word16 c0_ind, s0_ind, c1_ind, s1_ind, c2_ind, s2_ind;
    3032             :     Word16 scale;
    3033             :     const Word32 *RZ0, *IZ0, *RZ1, *IZ1, *RZ2, *IZ2;
    3034             :     Word32 *RY0, *IY0, *RY1, *IY1, *RY2, *IY2, *y0, *y1, *y2;
    3035             : 
    3036             :     /* Determine the order of the transform, the length of decimated  */
    3037             :     /* transforms m, and the step for the sine and cosine tables.     */
    3038           0 :     SWITCH( n )
    3039             :     {
    3040           0 :         case 1536:
    3041           0 :             order = 9;
    3042           0 :             move16();
    3043           0 :             m = 512;
    3044           0 :             move16();
    3045           0 :             step = 1;
    3046           0 :             move16();
    3047           0 :             BREAK;
    3048           0 :         case 384:
    3049           0 :             order = 7;
    3050           0 :             move16();
    3051           0 :             m = 128;
    3052           0 :             move16();
    3053           0 :             step = 4;
    3054           0 :             move16();
    3055           0 :             BREAK;
    3056           0 :         default:
    3057           0 :             order = 9;
    3058           0 :             move16();
    3059           0 :             m = 512;
    3060           0 :             move16();
    3061           0 :             step = 1;
    3062           0 :             move16();
    3063             :     }
    3064             : 
    3065             :     /* pointer initialization */
    3066           0 :     RY0 = &Y[0];
    3067           0 :     IY0 = &RY0[m];
    3068           0 :     RY1 = &RY0[m];
    3069           0 :     IY1 = &RY1[m];
    3070           0 :     RY2 = &RY1[m];
    3071           0 :     IY2 = &RY2[m];
    3072             : 
    3073           0 :     RZ0 = &Z[0]; // Qx
    3074           0 :     RZ1 = RZ0 + m;
    3075           0 :     RZ2 = RZ0 + sub( shr( n, 1 ), shr( m, 1 ) );
    3076           0 :     IZ0 = &Z[n];
    3077           0 :     IZ1 = IZ0 - m;
    3078           0 :     IZ2 = IZ0 - sub( shr( n, 1 ), shr( m, 1 ) );
    3079             : 
    3080             :     /* Inverse butterflies of order 3. */
    3081             : 
    3082             :     /* Construction of Y0 */
    3083           0 :     RY0[0] = L_add( RZ0[0], L_add( RZ1[0], RZ2[0] ) );
    3084           0 :     move32();
    3085           0 :     FOR( i = 1; i < m / 2; i++ )
    3086             :     {
    3087           0 :         RY0[i] = L_add( RZ0[i], L_add( RZ1[i], RZ2[-i] ) );
    3088           0 :         move32();
    3089           0 :         IY0[-i] = L_add( IZ0[-i], L_sub( IZ1[-i], IZ2[i] ) );
    3090           0 :         move32();
    3091             :     }
    3092             : 
    3093             :     /* m/2 */
    3094           0 :     RY0[i] = L_add( RZ0[i], L_add( RZ1[i], RZ2[-i] ) );
    3095           0 :     move32();
    3096             : 
    3097             :     /* Construction of Y1 */
    3098           0 :     c0_ind = T_SIN_PI_2;
    3099           0 :     s0_ind = 0;
    3100           0 :     c1_ind = T_SIN_PI_2 * 1 / 3;
    3101           0 :     s1_ind = T_SIN_PI_2 * 2 / 3;
    3102           0 :     c2_ind = T_SIN_PI_2 * 1 / 3;
    3103           0 :     s2_ind = T_SIN_PI_2 * 2 / 3;
    3104             : 
    3105           0 :     RY1[0] = L_sub( Mpy_32_16_1( RZ0[0], t_sin[c0_ind] ),
    3106           0 :                     L_add( Mpy_32_16_1( RZ1[0], t_sin[c1_ind] ),
    3107           0 :                            L_add( Mpy_32_16_1( RZ2[0], t_sin[c2_ind] ),
    3108           0 :                                   L_add( Mpy_32_16_1( IZ1[0], t_sin[s1_ind] ),
    3109           0 :                                          Mpy_32_16_1( IZ2[0], t_sin[s2_ind] ) ) ) ) ); // Qx
    3110           0 :     move32();
    3111             : 
    3112           0 :     c0_ind = sub( c0_ind, step );
    3113           0 :     s0_ind = add( s0_ind, step );
    3114           0 :     c1_ind = add( c1_ind, step );
    3115           0 :     s1_ind = sub( s1_ind, step );
    3116           0 :     c2_ind = sub( c2_ind, step );
    3117           0 :     s2_ind = add( s2_ind, step );
    3118           0 :     FOR( i = 1; i < m / 4; ( i++, c0_ind = ( c0_ind - step ), s0_ind = ( s0_ind + step ), c1_ind = ( c1_ind + step ), s1_ind = ( s1_ind - step ), c2_ind = ( c2_ind - step ), s2_ind = ( s2_ind + step ) ) )
    3119             :     {
    3120           0 :         RY1[i] = L_sub( Mpy_32_16_1( RZ0[i], t_sin[c0_ind] ),
    3121           0 :                         L_add( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ),
    3122           0 :                                L_add( Mpy_32_16_1( RZ2[-i], t_sin[c2_ind] ),
    3123           0 :                                       L_add( Mpy_32_16_1( IZ0[-i], t_sin[s0_ind] ),
    3124           0 :                                              L_add( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ),
    3125           0 :                                                     Mpy_32_16_1( IZ2[i], t_sin[s2_ind] ) ) ) ) ) ); // Qx
    3126           0 :         move32();
    3127           0 :         IY1[-i] = L_add( L_sub( Mpy_32_16_1( IZ0[-i], t_sin[c0_ind] ),
    3128           0 :                                 Mpy_32_16_1( IZ1[-i], t_sin[c1_ind] ) ),
    3129           0 :                          L_add( Mpy_32_16_1( IZ2[i], t_sin[c2_ind] ),
    3130           0 :                                 L_add( Mpy_32_16_1( RZ0[i], t_sin[s0_ind] ),
    3131           0 :                                        L_sub( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ),
    3132           0 :                                               Mpy_32_16_1( RZ2[-i], t_sin[s2_ind] ) ) ) ) ); // Qx
    3133           0 :         move32();
    3134             :     }
    3135             : 
    3136           0 :     FOR( ; i < m / 2; ( i++, c0_ind = ( c0_ind - step ), s0_ind = ( s0_ind + step ), c1_ind = ( c1_ind + step ), s1_ind = ( s1_ind - step ), c2_ind = ( c2_ind + step ), s2_ind = ( s2_ind - step ) ) )
    3137             :     {
    3138           0 :         RY1[i] = L_sub( Mpy_32_16_1( RZ0[i], t_sin[c0_ind] ),
    3139           0 :                         L_add( L_sub( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ),
    3140           0 :                                       Mpy_32_16_1( RZ2[-i], t_sin[c2_ind] ) ),
    3141           0 :                                L_add( Mpy_32_16_1( IZ0[-i], t_sin[s0_ind] ),
    3142           0 :                                       L_add( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ),
    3143           0 :                                              Mpy_32_16_1( IZ2[i], t_sin[s2_ind] ) ) ) ) ); // Qx
    3144           0 :         move32();
    3145           0 :         IY1[-i] = L_sub( Mpy_32_16_1( IZ0[-i], t_sin[c0_ind] ),
    3146           0 :                          L_sub( L_add( Mpy_32_16_1( IZ1[-i], t_sin[c1_ind] ),
    3147           0 :                                        Mpy_32_16_1( IZ2[i], t_sin[c2_ind] ) ),
    3148           0 :                                 L_add( Mpy_32_16_1( RZ0[i], t_sin[s0_ind] ),
    3149           0 :                                        L_sub( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ),
    3150           0 :                                               Mpy_32_16_1( RZ2[-i], t_sin[s2_ind] ) ) ) ) ); // Qx
    3151           0 :         move32();
    3152             :     }
    3153             : 
    3154             :     /* m/2 */
    3155           0 :     RY1[i] = L_sub( Mpy_32_16_1( RZ0[i], t_sin[c0_ind] ),
    3156           0 :                     L_add( L_sub( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ),
    3157           0 :                                   Mpy_32_16_1( RZ2[-i], t_sin[c2_ind] ) ),
    3158           0 :                            L_add( Mpy_32_16_1( IZ0[-i], t_sin[s0_ind] ),
    3159           0 :                                   L_add( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ),
    3160           0 :                                          Mpy_32_16_1( IZ2[i], t_sin[s2_ind] ) ) ) ) ); // Qx
    3161           0 :     move32();
    3162             : 
    3163             :     /* Construction of Y2 */
    3164           0 :     c0_ind = T_SIN_PI_2;
    3165           0 :     move16();
    3166           0 :     s0_ind = 0;
    3167           0 :     move16();
    3168           0 :     c1_ind = T_SIN_PI_2 * 1 / 3;
    3169           0 :     move16();
    3170           0 :     s1_ind = T_SIN_PI_2 * 2 / 3;
    3171           0 :     move16();
    3172           0 :     c2_ind = T_SIN_PI_2 * 1 / 3;
    3173           0 :     move16();
    3174           0 :     s2_ind = T_SIN_PI_2 * 2 / 3;
    3175           0 :     move16();
    3176           0 :     step2 = shl( step, 1 );
    3177           0 :     RY2[0] = L_sub( Mpy_32_16_1( RZ0[0], t_sin[c0_ind] ),
    3178           0 :                     L_sub( L_add( Mpy_32_16_1( RZ1[0], t_sin[c1_ind] ),
    3179           0 :                                   Mpy_32_16_1( RZ2[0], t_sin[c2_ind] ) ),
    3180           0 :                            L_add( Mpy_32_16_1( IZ1[0], t_sin[s1_ind] ),
    3181           0 :                                   Mpy_32_16_1( IZ2[0], t_sin[s2_ind] ) ) ) ); // Qx
    3182           0 :     move32();
    3183             : 
    3184           0 :     c0_ind = sub( c0_ind, step2 );
    3185           0 :     s0_ind = add( s0_ind, step2 );
    3186           0 :     c1_ind = sub( c1_ind, step2 );
    3187           0 :     s1_ind = add( s1_ind, step2 );
    3188           0 :     c2_ind = add( c2_ind, step2 );
    3189           0 :     s2_ind = sub( s2_ind, step2 );
    3190           0 :     FOR( i = 1; i < m / 8; ( i++, c0_ind = ( c0_ind - step2 ), s0_ind = ( s0_ind + step2 ), c1_ind = ( c1_ind - step2 ), s1_ind = ( s1_ind + step2 ), c2_ind = ( c2_ind + step2 ), s2_ind = ( s2_ind - step2 ) ) )
    3191             :     {
    3192           0 :         RY2[i] = L_sub( Mpy_32_16_1( RZ0[i], t_sin[c0_ind] ),
    3193           0 :                         L_add( L_add( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ),
    3194           0 :                                       Mpy_32_16_1( RZ2[-i], t_sin[c2_ind] ) ),
    3195           0 :                                L_sub( Mpy_32_16_1( IZ0[-i], t_sin[s0_ind] ),
    3196           0 :                                       L_add( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ),
    3197           0 :                                              Mpy_32_16_1( IZ2[i], t_sin[s2_ind] ) ) ) ) ); // Qx
    3198           0 :         move32();
    3199           0 :         IY2[-i] = L_add( L_sub( Mpy_32_16_1( IZ0[-i], t_sin[c0_ind] ),
    3200           0 :                                 Mpy_32_16_1( IZ1[-i], t_sin[c1_ind] ) ),
    3201           0 :                          L_add( Mpy_32_16_1( IZ2[i], t_sin[c2_ind] ),
    3202           0 :                                 L_sub( Mpy_32_16_1( RZ0[i], t_sin[s0_ind] ),
    3203           0 :                                        L_sub( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ),
    3204           0 :                                               Mpy_32_16_1( RZ2[-i], t_sin[s2_ind] ) ) ) ) ); // Qx
    3205           0 :         move32();
    3206             :     }
    3207             : 
    3208           0 :     FOR( ; i < m / 4; ( i++, c0_ind = ( c0_ind - step2 ), s0_ind = ( s0_ind + step2 ), c1_ind = ( c1_ind + step2 ), s1_ind = ( s1_ind - step2 ), c2_ind = ( c2_ind + step2 ), s2_ind = ( s2_ind - step2 ) ) )
    3209             :     {
    3210           0 :         RY2[i] = L_add( Mpy_32_16_1( RZ0[i], t_sin[c0_ind] ),
    3211           0 :                         L_sub( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ),
    3212           0 :                                L_sub( L_add( Mpy_32_16_1( RZ2[-i], t_sin[c2_ind] ),
    3213           0 :                                              Mpy_32_16_1( IZ0[-i], t_sin[s0_ind] ) ),
    3214           0 :                                       L_add( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ),
    3215           0 :                                              Mpy_32_16_1( IZ2[i], t_sin[s2_ind] ) ) ) ) ); // Qx
    3216           0 :         move32();
    3217           0 :         IY2[-i] = L_add( Mpy_32_16_1( IZ0[-i], t_sin[c0_ind] ),
    3218           0 :                          L_add( Mpy_32_16_1( IZ1[-i], t_sin[c1_ind] ),
    3219           0 :                                 L_add( Mpy_32_16_1( IZ2[i], t_sin[c2_ind] ),
    3220           0 :                                        L_sub( Mpy_32_16_1( RZ0[i], t_sin[s0_ind] ),
    3221           0 :                                               L_sub( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ),
    3222           0 :                                                      Mpy_32_16_1( RZ2[-i], t_sin[s2_ind] ) ) ) ) ) ); // Qx
    3223           0 :         move32();
    3224             :     }
    3225             : 
    3226           0 :     FOR( ; i < ( 3 * ( m >> 3 ) ); ( i++, c0_ind = ( c0_ind - step2 ), s0_ind = ( s0_ind + step2 ), c1_ind = ( c1_ind + step2 ), s1_ind = ( s1_ind - step2 ), c2_ind = ( c2_ind - step2 ), s2_ind = ( s2_ind + step2 ) ) )
    3227             :     {
    3228           0 :         RY2[i] = L_sub( L_add( Mpy_32_16_1( RZ0[i], t_sin[c0_ind] ),
    3229           0 :                                Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ) ),
    3230           0 :                         L_sub( L_add( Mpy_32_16_1( RZ2[-i], t_sin[c2_ind] ),
    3231           0 :                                       Mpy_32_16_1( IZ0[-i], t_sin[s0_ind] ) ),
    3232           0 :                                L_sub( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ),
    3233           0 :                                       Mpy_32_16_1( IZ2[i], t_sin[s2_ind] ) ) ) ); // Qx
    3234           0 :         move32();
    3235           0 :         IY2[-i] = L_sub( L_add( Mpy_32_16_1( IZ0[-i], t_sin[c0_ind] ),
    3236           0 :                                 L_add( Mpy_32_16_1( IZ1[-i], t_sin[c1_ind] ),
    3237           0 :                                        L_add( Mpy_32_16_1( IZ2[i], t_sin[c2_ind] ),
    3238           0 :                                               Mpy_32_16_1( RZ0[i], t_sin[s0_ind] ) ) ) ),
    3239           0 :                          L_add( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ),
    3240           0 :                                 Mpy_32_16_1( RZ2[-i], t_sin[s2_ind] ) ) ); // Qx
    3241           0 :         move32();
    3242             :     }
    3243             : 
    3244           0 :     FOR( ; i < m / 2; ( i++, c0_ind = ( c0_ind + step2 ), s0_ind = ( s0_ind - step2 ), c1_ind = ( c1_ind + step2 ), s1_ind = ( s1_ind - step2 ), c2_ind = ( c2_ind - step2 ), s2_ind = ( s2_ind + step2 ) ) )
    3245             :     {
    3246           0 :         RY2[i] = L_sub( L_sub( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ),
    3247           0 :                                Mpy_32_16_1( RZ0[i], t_sin[c0_ind] ) ),
    3248           0 :                         L_sub( L_add( Mpy_32_16_1( RZ2[-i], t_sin[c2_ind] ),
    3249           0 :                                       Mpy_32_16_1( IZ0[-i], t_sin[s0_ind] ) ),
    3250           0 :                                L_sub( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ),
    3251           0 :                                       Mpy_32_16_1( IZ2[i], t_sin[s2_ind] ) ) ) ); // Qx
    3252           0 :         move32();
    3253           0 :         IY2[-i] = L_add( L_sub( Mpy_32_16_1( IZ1[-i], t_sin[c1_ind] ),
    3254           0 :                                 Mpy_32_16_1( IZ0[-i], t_sin[c0_ind] ) ),
    3255           0 :                          L_sub( L_add( Mpy_32_16_1( IZ2[i], t_sin[c2_ind] ),
    3256           0 :                                        Mpy_32_16_1( RZ0[i], t_sin[s0_ind] ) ),
    3257           0 :                                 L_add( Mpy_32_16_1( RZ1[i], t_sin[s1_ind] ),
    3258           0 :                                        Mpy_32_16_1( RZ2[-i], t_sin[s2_ind] ) ) ) ); // Qx
    3259           0 :         move32();
    3260             :     }
    3261             : 
    3262             :     /* m/2 */
    3263           0 :     RY2[i] = L_sub( L_sub( Mpy_32_16_1( RZ1[i], t_sin[c1_ind] ),
    3264           0 :                            Mpy_32_16_1( RZ0[i], t_sin[c0_ind] ) ),
    3265           0 :                     L_sub( L_add( Mpy_32_16_1( RZ2[-i], t_sin[c2_ind] ),
    3266           0 :                                   Mpy_32_16_1( IZ0[-i], t_sin[s0_ind] ) ),
    3267           0 :                            L_sub( Mpy_32_16_1( IZ1[-i], t_sin[s1_ind] ),
    3268           0 :                                   Mpy_32_16_1( IZ2[i], t_sin[s2_ind] ) ) ) ); // Qx
    3269           0 :     move32();
    3270             : 
    3271             :     /* Compute the inverse FFT for all 3 blocks. */
    3272           0 :     ifft_rel_fx32( RY0, m, order );
    3273           0 :     ifft_rel_fx32( RY1, m, order );
    3274           0 :     ifft_rel_fx32( RY2, m, order );
    3275             : 
    3276           0 :     y0 = RY0;
    3277           0 :     y1 = RY1;
    3278           0 :     y2 = RY2;
    3279             : 
    3280             :     /* Interlacing and scaling, scale = 1/3 */
    3281           0 :     scale = extract_l( 0x2AAB /*(1/3).Q15*/ );
    3282           0 :     FOR( i = 0; i < n; )
    3283             :     {
    3284           0 :         X[i] = Mpy_32_16_1( ( *y0++ ), scale ); // Qx
    3285           0 :         move32();
    3286           0 :         i = add( i, 1 );
    3287           0 :         X[i] = Mpy_32_16_1( ( *y1++ ), scale ); // Qx
    3288           0 :         move32();
    3289           0 :         i = add( i, 1 );
    3290           0 :         X[i] = Mpy_32_16_1( ( *y2++ ), scale ); // Qx
    3291           0 :         move32();
    3292           0 :         i = add( i, 1 );
    3293             :     }
    3294             : 
    3295           0 :     return;
    3296             : }
    3297             : 
    3298             : 
    3299       44912 : static void rfft_post(
    3300             :     const Word16 *sine_table, // Q15
    3301             :     Word32 *buf,              // hFdCngCom->fftBuffer_exp(Qx)
    3302             :     const Word16 len )
    3303             : {
    3304             :     Word32 tmp1, tmp2, tmp3, tmp4;
    3305             :     Word16 s, c;
    3306       44912 :     Word16 i = 0;
    3307       44912 :     move16();
    3308             : 
    3309       44912 :     tmp1 = L_add( buf[0], buf[1] );
    3310       44912 :     buf[1] = L_sub( buf[0], buf[1] );
    3311       44912 :     move32();
    3312       44912 :     buf[0] = tmp1;
    3313       44912 :     move32();
    3314             : 
    3315     7230832 :     FOR( i = 1; i <= ( ( len + 2 ) >> 2 ); i++ )
    3316             :     {
    3317     7185920 :         s = sine_table[i]; /* sin(pi*i/(len/2)) Q15*/
    3318     7185920 :         move16();
    3319     7185920 :         c = sine_table[( i + ( len >> 2 ) )]; /* cos(pi*i/(len/2)) Q15*/
    3320     7185920 :         move16();
    3321             : 
    3322     7185920 :         tmp1 = L_sub( buf[2 * i], buf[( len - ( i << 1 ) )] );
    3323     7185920 :         tmp2 = L_add( buf[( ( i << 1 ) + 1 )], buf[( ( len - ( i << 1 ) ) + 1 )] );
    3324     7185920 :         tmp3 = L_sub( Mpy_32_16_1( tmp1, s ), Mpy_32_16_1( tmp2, c ) ); /* real part of j*W(k,N)*[T(k) - T'(N-k)] Qx*/
    3325     7185920 :         tmp4 = L_add( Mpy_32_16_1( tmp1, c ), Mpy_32_16_1( tmp2, s ) ); /* imag part of j*W(k,N)*[T(k) - T'(N-k)] Qx*/
    3326     7185920 :         tmp1 = L_add( buf[2 * i], buf[( len - ( i << 1 ) )] );
    3327     7185920 :         tmp2 = L_sub( buf[( ( i << 1 ) + 1 )], buf[( ( len - ( i << 1 ) ) + 1 )] );
    3328             : 
    3329     7185920 :         buf[2 * i] = L_shr( L_sub( tmp1, tmp3 ), 1 );
    3330     7185920 :         move32();
    3331     7185920 :         buf[( ( i << 1 ) + 1 )] = L_shr( L_sub( tmp2, tmp4 ), 1 );
    3332     7185920 :         move32();
    3333     7185920 :         buf[( len - ( i << 1 ) )] = L_shr( L_add( tmp1, tmp3 ), 1 );
    3334     7185920 :         move32();
    3335     7185920 :         buf[( ( len - ( i << 1 ) ) + 1 )] = L_negate( L_shr( L_add( tmp2, tmp4 ), 1 ) );
    3336     7185920 :         move32();
    3337             :     }
    3338       44912 : }
    3339             : 
    3340       30030 : static void rfft_pre(
    3341             :     const Word16 *sine_table, // Q15
    3342             :     Word32 *buf,              // hFdCngCom->fftBuffer_exp (Qx)
    3343             :     const Word16 len          // Q0
    3344             : )
    3345             : {
    3346       30030 :     const Word16 scale = ( div_s( 1, len ) ); // Q15
    3347             :     Word32 tmp1, tmp2, tmp3, tmp4;
    3348             :     Word16 s, c;
    3349       30030 :     Word16 i = 0;
    3350             : 
    3351       30030 :     tmp1 = L_add( buf[0], buf[1] );                         // Qx
    3352       30030 :     buf[1] = Mpy_32_16_1( L_sub( buf[0], buf[1] ), scale ); // Qx
    3353       30030 :     move32();
    3354       30030 :     buf[0] = Mpy_32_16_1( tmp1, scale ); // Qx
    3355       30030 :     move32();
    3356             : 
    3357     4834830 :     FOR( i = 1; i <= ( ( len + 2 ) >> 2 ); i++ )
    3358             :     {
    3359     4804800 :         s = sine_table[i]; /* sin(pi*i/(len/2)) Q15*/
    3360     4804800 :         move16();
    3361     4804800 :         c = sine_table[( i + ( len >> 2 ) )]; /* cos(pi*i/(len/2)) Q15*/
    3362     4804800 :         move16();
    3363             : 
    3364     4804800 :         tmp1 = L_sub( buf[2 * i], buf[( len - ( i << 1 ) )] );                      // Qx
    3365     4804800 :         tmp2 = L_add( buf[( ( i << 1 ) + 1 )], buf[( ( len - ( i << 1 ) ) + 1 )] ); // Qx
    3366     4804800 :         tmp3 = L_add( Mpy_32_16_1( tmp1, s ), Mpy_32_16_1( tmp2, c ) );             /* real part of j*W(k,N)*[T(k) - T'(N-k)] Qx*/
    3367     4804800 :         tmp4 = L_sub( Mpy_32_16_1( tmp2, s ), Mpy_32_16_1( tmp1, c ) );             /* imag part of j*W(k,N)*[T(k) - T'(N-k)] Qx*/
    3368     4804800 :         tmp1 = L_add( buf[2 * i], buf[( len - ( i << 1 ) )] );                      // Qx
    3369     4804800 :         tmp2 = L_sub( buf[( ( i << 1 ) + 1 )], buf[( ( len - ( i << 1 ) ) + 1 )] ); // Qx
    3370             : 
    3371     4804800 :         buf[2 * i] = Mpy_32_16_1( L_add( tmp1, tmp3 ), scale ); // Qx
    3372     4804800 :         move32();
    3373     4804800 :         buf[( ( i << 1 ) + 1 )] = L_negate( Mpy_32_16_1( L_add( tmp2, tmp4 ), scale ) ); // Qx
    3374     4804800 :         move32();
    3375     4804800 :         buf[( len - ( i << 1 ) )] = Mpy_32_16_1( L_sub( tmp1, tmp3 ), scale ); // Qx
    3376     4804800 :         move32();
    3377     4804800 :         buf[( ( len - ( i << 1 ) ) + 1 )] = Mpy_32_16_1( L_sub( tmp2, tmp4 ), scale ); // Qx
    3378     4804800 :         move32();
    3379             :     }
    3380             : 
    3381       30030 :     return;
    3382             : }
    3383             : 
    3384      151422 : Word16 RFFTN_fx(
    3385             :     Word32 *data,             // hFdCngCom->fftBuffer_exp (Qx)
    3386             :     const Word16 *sine_table, // Q15
    3387             :     const Word16 len,         // Q0
    3388             :     const Word16 sign )
    3389             : {
    3390      151422 :     assert( len <= 640 && len > 0 );
    3391             : 
    3392      151422 :     IF( EQ_16( len, 640 ) )
    3393             :     {
    3394             :         Word32 x[320], y[320];
    3395             :         Word16 i;
    3396             : 
    3397       74942 :         IF( NE_16( sign, -1 ) )
    3398             :         {
    3399       30030 :             rfft_pre( sine_table, data, len );
    3400             :         }
    3401             : 
    3402    24056382 :         FOR( i = 0; i < 320; i++ )
    3403             :         {
    3404    23981440 :             x[i] = data[2 * i];
    3405    23981440 :             move32();
    3406    23981440 :             y[i] = data[( ( i << 1 ) + 1 )];
    3407    23981440 :             move32();
    3408             :         }
    3409       74942 :         DoRTFT320_fx( x, y );
    3410    24056382 :         FOR( i = 0; i < 320; i++ )
    3411             :         {
    3412    23981440 :             data[2 * i] = x[i];
    3413    23981440 :             move32();
    3414    23981440 :             data[( ( i << 1 ) + 1 )] = y[i];
    3415    23981440 :             move32();
    3416             :         }
    3417             : 
    3418       74942 :         IF( EQ_16( sign, -1 ) )
    3419             :         {
    3420       44912 :             rfft_post( sine_table, data, len );
    3421             :         }
    3422             :     }
    3423             :     ELSE
    3424             :     {
    3425       76480 :         IF( EQ_16( len, 512 ) )
    3426             :         {
    3427             :             Word16 i;
    3428       76480 :             const Word16 log2 = 9;
    3429       76480 :             move16();
    3430             :             Word32 reordered_data[512];
    3431             : 
    3432       76480 :             IF( EQ_16( sign, -1 ) )
    3433             :             {
    3434       43049 :                 fft_rel_fx32( data, len, log2 );
    3435       43049 :                 reordered_data[0] = data[0];
    3436       43049 :                 move32();
    3437       43049 :                 reordered_data[1] = data[len / 2];
    3438       43049 :                 move32();
    3439    11020544 :                 FOR( i = 1; i < len / 2; i++ )
    3440             :                 {
    3441    10977495 :                     reordered_data[2 * i] = data[i];
    3442    10977495 :                     move32();
    3443    10977495 :                     reordered_data[( ( i << 1 ) + 1 )] = data[( len - i )];
    3444    10977495 :                     move32();
    3445             :                 }
    3446             :             }
    3447             :             ELSE
    3448             :             {
    3449       33431 :                 reordered_data[0] = data[0];
    3450       33431 :                 move32();
    3451       33431 :                 reordered_data[len / 2] = data[1];
    3452       33431 :                 move32();
    3453     8558336 :                 FOR( i = 1; i < len / 2; i++ )
    3454             :                 {
    3455     8524905 :                     reordered_data[i] = data[2 * i];
    3456     8524905 :                     move32();
    3457     8524905 :                     reordered_data[( len - i )] = data[( ( i << 1 ) + 1 )];
    3458     8524905 :                     move32();
    3459             :                 }
    3460       33431 :                 ifft_rel_fx32( reordered_data, len, log2 );
    3461             :             }
    3462       76480 :             Copy32( reordered_data, data, len );
    3463             :         }
    3464             :         ELSE
    3465             :         {
    3466           0 :             assert( !"Not supported FFT length!" );
    3467             :         }
    3468             :     }
    3469             : 
    3470      151422 :     return 0;
    3471             : }
    3472             : 
    3473    17608320 : static void butterfly(
    3474             :     const Word32 a, // Qx
    3475             :     const Word32 b, // Qx
    3476             :     Word32 *aPlusb, // Qx
    3477             :     Word32 *aMinusb // Qx
    3478             : )
    3479             : {
    3480    17608320 :     *aPlusb = L_add( a, b );
    3481    17608320 :     move32();
    3482    17608320 :     *aMinusb = L_sub( a, b );
    3483    17608320 :     move32();
    3484             : 
    3485    17608320 :     return;
    3486             : }
    3487             : 
    3488    11738880 : static void fft2(
    3489             :     Word32 *pInOut // Qx
    3490             : )
    3491             : {
    3492             :     /*  FFT MATRIX:
    3493             :         1.0000             1.0000
    3494             :         1.0000            -1.0000
    3495             :     */
    3496             :     Word32 re1, im1;
    3497             :     Word32 re2, im2;
    3498             : 
    3499    11738880 :     re1 = pInOut[0];
    3500    11738880 :     move32();
    3501    11738880 :     im1 = pInOut[1];
    3502    11738880 :     move32();
    3503    11738880 :     re2 = pInOut[2];
    3504    11738880 :     move32();
    3505    11738880 :     im2 = pInOut[3];
    3506    11738880 :     move32();
    3507    11738880 :     pInOut[0] = L_add( re1, re2 );
    3508    11738880 :     move32();
    3509    11738880 :     pInOut[1] = L_add( im1, im2 );
    3510    11738880 :     move32();
    3511             : 
    3512    11738880 :     pInOut[2] = L_sub( re1, re2 );
    3513    11738880 :     move32();
    3514    11738880 :     pInOut[3] = L_sub( im1, im2 );
    3515    11738880 :     move32();
    3516             : 
    3517    11738880 :     return;
    3518             : }
    3519             : 
    3520             : static const Word16 C31 = 0x4000; /*0.5f in Q15 cos(PI/3); sin(2*PI/3) */
    3521             : static const Word16 C32 = 0x6ED9; /*0.866025403784439f in Q15 cos(PI/3); sin(2*PI/3) */
    3522             : 
    3523     7825920 : static void fft3_2( Word32 *pInOut /*Qx*/ )
    3524             : {
    3525             :     Word32 re1, im1;
    3526             :     Word32 re2, im2;
    3527             :     Word32 re3, im3;
    3528             : 
    3529             :     Word32 tmp1, tmp2;
    3530             :     Word32 tmp3, tmp4;
    3531             : 
    3532     7825920 :     re1 = pInOut[0]; // Qx
    3533     7825920 :     move32();
    3534     7825920 :     im1 = pInOut[1]; // Qx
    3535     7825920 :     move32();
    3536     7825920 :     re2 = pInOut[2]; // Qx
    3537     7825920 :     move32();
    3538     7825920 :     im2 = pInOut[3]; // Qx
    3539     7825920 :     move32();
    3540     7825920 :     re3 = pInOut[4]; // Qx
    3541     7825920 :     move32();
    3542     7825920 :     im3 = pInOut[5]; // Qx
    3543     7825920 :     move32();
    3544             : 
    3545             :     /*  FFT MATRIX:
    3546             :        1.0000             1.0000             1.0000
    3547             :                             C31      C32
    3548             :        1.0000            -0.5000 - 0.8660i  -0.5000 + 0.8660i
    3549             :        1.0000            -0.5000 + 0.8660i  -0.5000 - 0.8660i
    3550             :     */
    3551     7825920 :     tmp1 = L_add( re2, re3 );
    3552     7825920 :     tmp3 = L_add( im2, im3 );
    3553     7825920 :     tmp2 = L_sub( re2, re3 );
    3554     7825920 :     tmp4 = L_sub( im2, im3 );
    3555     7825920 :     pInOut[0] = L_add( re1, tmp1 );
    3556     7825920 :     move32();
    3557     7825920 :     pInOut[1] = L_add( im1, tmp3 );
    3558     7825920 :     move32();
    3559     7825920 :     pInOut[2] = L_sub( re1, L_sub( Mpy_32_16_1( tmp1, C31 ), Mpy_32_16_1( tmp4, C32 ) ) ); // Qx
    3560     7825920 :     move32();
    3561     7825920 :     pInOut[4] = L_sub( re1, L_add( Mpy_32_16_1( tmp1, C31 ), Mpy_32_16_1( tmp4, C32 ) ) ); // Qx
    3562     7825920 :     move32();
    3563             : 
    3564     7825920 :     pInOut[3] = L_sub( im1, L_add( Mpy_32_16_1( tmp2, C32 ), Mpy_32_16_1( tmp3, C31 ) ) ); // Qx
    3565     7825920 :     move32();
    3566     7825920 :     pInOut[5] = L_add( im1, L_sub( Mpy_32_16_1( tmp2, C32 ), Mpy_32_16_1( tmp3, C31 ) ) ); // Qx
    3567     7825920 :     move32();
    3568     7825920 : }
    3569             : 
    3570             : 
    3571           0 : static void fft4(
    3572             :     Word32 *pInOut /*Qx*/ )
    3573             : {
    3574             :     Word32 re1, im1;
    3575             :     Word32 re2, im2;
    3576             :     Word32 re3, im3;
    3577             :     Word32 re4, im4;
    3578             : 
    3579             :     Word32 tmp1, tmp2;
    3580             :     Word32 tmp3, tmp4;
    3581             :     Word32 tmp5, tmp6;
    3582             :     Word32 tmp7, tmp8;
    3583             : 
    3584           0 :     re1 = pInOut[0];
    3585           0 :     move32();
    3586           0 :     im1 = pInOut[1];
    3587           0 :     move32();
    3588           0 :     re2 = pInOut[2];
    3589           0 :     move32();
    3590           0 :     im2 = pInOut[3];
    3591           0 :     move32();
    3592           0 :     re3 = pInOut[4];
    3593           0 :     move32();
    3594           0 :     im3 = pInOut[5];
    3595           0 :     move32();
    3596           0 :     re4 = pInOut[6];
    3597           0 :     move32();
    3598           0 :     im4 = pInOut[7];
    3599           0 :     move32();
    3600             : 
    3601             :     /*
    3602             :      1.0000    1.0000      1.0000    1.0000
    3603             :      1.0000   -1.0000i    -1.0000    1.0000i
    3604             :      1.0000   -1.0000      1.0000   -1.0000
    3605             :      1.0000    1.0000i    -1.0000   -1.0000i
    3606             :     */
    3607           0 :     tmp1 = L_add( re1, re3 );
    3608           0 :     tmp3 = L_add( re2, re4 );
    3609           0 :     tmp5 = L_add( im1, im3 );
    3610           0 :     tmp7 = L_add( im2, im4 );
    3611           0 :     pInOut[0] = L_add( tmp1, tmp3 );
    3612           0 :     move32();
    3613           0 :     pInOut[4] = L_sub( tmp1, tmp3 );
    3614           0 :     move32();
    3615             : 
    3616           0 :     pInOut[1] = L_add( tmp5, tmp7 );
    3617           0 :     move32();
    3618           0 :     pInOut[5] = L_sub( tmp5, tmp7 );
    3619           0 :     move32();
    3620           0 :     tmp2 = L_sub( re1, re3 );
    3621           0 :     tmp4 = L_sub( re2, re4 );
    3622           0 :     tmp6 = L_sub( im1, im3 );
    3623           0 :     tmp8 = L_sub( im2, im4 );
    3624           0 :     pInOut[2] = L_add( tmp2, tmp8 );
    3625           0 :     move32();
    3626           0 :     pInOut[6] = L_sub( tmp2, tmp8 );
    3627           0 :     move32();
    3628             : 
    3629           0 :     pInOut[3] = L_sub( tmp6, tmp4 );
    3630           0 :     move32();
    3631           0 :     pInOut[7] = L_add( tmp4, tmp6 );
    3632           0 :     move32();
    3633             : 
    3634           0 :     return;
    3635             : }
    3636             : 
    3637             : static const Word16 C51 = 0x278D; /* 0.309016994374947f cos(2*PI/5);   Q15*/
    3638             : static const Word16 C52 = 0x79bc; /* 0.951056516295154f sin(2*PI/5);   Q15*/
    3639             : static const Word16 C53 = 0x678D; /* 0.809016994374947f cos(  PI/5);   Q15*/
    3640             : static const Word16 C54 = 0x4B3D; /* 0.587785252292473f sin(  PI/5);   Q15*/
    3641             : 
    3642     4695552 : static void fft5(
    3643             :     cmplx *pInOut /*Qx*/ )
    3644             : {
    3645             :     cmplx x[5];
    3646             :     cmplx t[4];
    3647             : 
    3648     4695552 :     x[0] = pInOut[0];
    3649     4695552 :     move32();
    3650     4695552 :     x[1] = pInOut[1];
    3651     4695552 :     move32();
    3652     4695552 :     x[2] = pInOut[2];
    3653     4695552 :     move32();
    3654     4695552 :     x[3] = pInOut[3];
    3655     4695552 :     move32();
    3656     4695552 :     x[4] = pInOut[4];
    3657     4695552 :     move32();
    3658             : 
    3659             :     /*
    3660             :      1.0000             1.0000             1.0000             1.0000             1.0000
    3661             :                           C51      C52      C53       C54
    3662             :      1.0000             0.3090 - 0.9511i  -0.8090 - 0.5878i  -0.8090 + 0.5878i   0.3090 + 0.9511i
    3663             :      1.0000            -0.8090 - 0.5878i   0.3090 + 0.9511i   0.3090 - 0.9511i  -0.8090 + 0.5878i
    3664             :      1.0000            -0.8090 + 0.5878i   0.3090 - 0.9511i   0.3090 + 0.9511i  -0.8090 - 0.5878i
    3665             :      1.0000             0.3090 + 0.9511i  -0.8090 + 0.5878i  -0.8090 - 0.5878i   0.3090 - 0.9511i
    3666             :     */
    3667     4695552 :     t[0] = CL_add( x[1], x[4] );
    3668     4695552 :     move32();
    3669     4695552 :     t[1] = CL_sub( x[1], x[4] );
    3670     4695552 :     move32();
    3671     4695552 :     t[2] = CL_add( x[2], x[3] );
    3672     4695552 :     move32();
    3673     4695552 :     t[3] = CL_sub( x[2], x[3] );
    3674     4695552 :     move32();
    3675             : 
    3676             : 
    3677     4695552 :     pInOut[0] = CL_add( x[0], CL_add( t[0], t[2] ) );
    3678     4695552 :     move32();
    3679             : 
    3680     4695552 :     pInOut[1] = CL_add( CL_add( x[0], CL_sub( CL_scale( t[0], C51 ), CL_scale( t[2], C53 ) ) ), CL_add( CL_conjugate( CL_scale( CL_swap_real_imag( t[1] ), C52 ) ), CL_conjugate( CL_scale( CL_swap_real_imag( t[3] ), C54 ) ) ) ); // Qx
    3681     4695552 :     move32();
    3682     4695552 :     pInOut[4] = CL_add( x[0], CL_sub( CL_scale( t[0], C51 ), CL_add( CL_scale( t[2], C53 ), CL_add( CL_conjugate( CL_scale( CL_swap_real_imag( t[1] ), C52 ) ), CL_conjugate( CL_scale( CL_swap_real_imag( t[3] ), C54 ) ) ) ) ) ); // Qx
    3683     4695552 :     move32();
    3684     4695552 :     pInOut[2] = CL_add( CL_sub( x[0], CL_scale( t[0], C53 ) ), CL_add( CL_scale( t[2], C51 ), CL_sub( CL_conjugate( CL_scale( CL_swap_real_imag( t[1] ), C54 ) ), CL_conjugate( CL_scale( CL_swap_real_imag( t[3] ), C52 ) ) ) ) ); // Qx
    3685     4695552 :     move32();
    3686     4695552 :     pInOut[3] = CL_add( CL_sub( x[0], CL_scale( t[0], C53 ) ), CL_add( CL_sub( CL_scale( t[2], C51 ), CL_conjugate( CL_scale( CL_swap_real_imag( t[1] ), C54 ) ) ), CL_conjugate( CL_scale( CL_swap_real_imag( t[3] ), C52 ) ) ) ); // Qx
    3687     4695552 :     move32();
    3688             : 
    3689     4695552 :     return;
    3690             : }
    3691             : 
    3692             : static const Word16 C81 = 0x5a82; /* 0.707106781186548f cos(PI/4);   Q15*/
    3693             : 
    3694     2934720 : static void fft8_2(
    3695             :     Word32 *pInOut /*Qx*/ )
    3696             : {
    3697             :     Word32 re0, im0, re4, im4;
    3698             : 
    3699             :     Word32 re1_7p, re1_7m;
    3700             :     Word32 im1_7p, im1_7m;
    3701             :     Word32 re2_6p, re2_6m;
    3702             :     Word32 im2_6p, im2_6m;
    3703             :     Word32 re3_5p, re3_5m;
    3704             :     Word32 im3_5p, im3_5m;
    3705             : 
    3706     2934720 :     re0 = pInOut[0];
    3707     2934720 :     move32();
    3708     2934720 :     im0 = pInOut[1];
    3709     2934720 :     move32();
    3710     2934720 :     re4 = pInOut[8];
    3711     2934720 :     move32();
    3712     2934720 :     im4 = pInOut[9];
    3713     2934720 :     move32();
    3714     2934720 :     butterfly( pInOut[1 * 2], pInOut[7 * 2], &re1_7p, &re1_7m );
    3715     2934720 :     butterfly( pInOut[1 * 2 + 1], pInOut[7 * 2 + 1], &im1_7p, &im1_7m );
    3716     2934720 :     butterfly( pInOut[2 * 2], pInOut[6 * 2], &re2_6p, &re2_6m );
    3717     2934720 :     butterfly( pInOut[2 * 2 + 1], pInOut[6 * 2 + 1], &im2_6p, &im2_6m );
    3718     2934720 :     butterfly( pInOut[3 * 2], pInOut[5 * 2], &re3_5p, &re3_5m );
    3719     2934720 :     butterfly( pInOut[3 * 2 + 1], pInOut[5 * 2 + 1], &im3_5p, &im3_5m );
    3720             : 
    3721             :     /*
    3722             :     0:  1 + 0i     1   + 0i    1 + 0i        1 +   0i    1 + 0i      1 +   0i     1 + 0i      1 +   0i
    3723             :     1:  1 + 0i   C81 - C81i    0 - 1i     -C81 - C81i   -1 - 0i   -C81 + C81i   - 0 + 1i    C81 + C81i
    3724             :     2:  1 + 0i     0 -   1i   -1 - 0i     -  0 +   1i    1 + 0i      0 -   1i   - 1 - 0i   -  0 +   1i
    3725             :     3:  1 + 0i  -C81 - C81i   -0 + 1i      C81 - C81i   -1 - 0i    C81 + C81i     0 - 1i   -C81 + C81i
    3726             :     4:  1 + 0i  -  1 -   0i    1 + 0i     -  1 -   0i    1 + 0i   -  1 -   0i     1 + 0i   -  1 -   0i
    3727             :     5:  1 + 0i  -C81 + C81i    0 - 1i      C81 + C81i   -1 - 0i    C81 - C81i   - 0 + 1i   -C81 - C81i
    3728             :     6:  1 + 0i  -  0 +   1i   -1 - 0i        0 -   1i    1 + 0i   -  0 +   1i   - 1 - 0i    - 0 -   1i
    3729             :     7:  1 + 0i   C81 + C81i   -0 + 1i     -C81 + C81i   -1 - 0i   -C81 - C81i   - 0 - 1i    C81 - C81i
    3730             :     */
    3731     2934720 :     pInOut[0] = L_add( L_add( L_add( L_add( re0, re4 ), re1_7p ), re2_6p ), re3_5p );
    3732     2934720 :     move32();
    3733     2934720 :     pInOut[1] = L_add( L_add( L_add( L_add( im0, im4 ), im1_7p ), im2_6p ), im3_5p );
    3734     2934720 :     move32();
    3735             : 
    3736     2934720 :     pInOut[2] = L_add( L_add( L_sub( L_add( re0, Mpy_32_16_1( L_sub( re1_7p, re3_5p ), C81 ) ), re4 ), Mpy_32_16_1( L_add( im1_7m, im3_5m ), C81 ) ), im2_6m );
    3737     2934720 :     move32();
    3738     2934720 :     pInOut[3] = L_sub( L_sub( L_sub( L_add( im0, Mpy_32_16_1( L_sub( im1_7p, im3_5p ), C81 ) ), im4 ), Mpy_32_16_1( L_add( re1_7m, re3_5m ), C81 ) ), re2_6m );
    3739     2934720 :     move32();
    3740             : 
    3741     2934720 :     pInOut[4] = L_sub( L_add( L_add( L_sub( re0, re2_6p ), re4 ), im1_7m ), im3_5m );
    3742     2934720 :     move32();
    3743     2934720 :     pInOut[5] = L_add( L_sub( L_add( L_sub( im0, im2_6p ), im4 ), re1_7m ), re3_5m );
    3744     2934720 :     move32();
    3745             : 
    3746     2934720 :     pInOut[6] = L_sub( L_add( L_sub( L_add( re0, Mpy_32_16_1( L_sub( re3_5p, re1_7p ), C81 ) ), re4 ), Mpy_32_16_1( L_add( im1_7m, im3_5m ), C81 ) ), im2_6m );
    3747     2934720 :     move32();
    3748     2934720 :     pInOut[7] = L_add( L_sub( L_sub( L_add( im0, Mpy_32_16_1( L_sub( im3_5p, im1_7p ), C81 ) ), im4 ), Mpy_32_16_1( L_add( re1_7m, re3_5m ), C81 ) ), re2_6m );
    3749     2934720 :     move32();
    3750             : 
    3751     2934720 :     pInOut[8] = L_add( L_sub( L_add( L_sub( re0, re1_7p ), re2_6p ), re3_5p ), re4 );
    3752     2934720 :     move32();
    3753     2934720 :     pInOut[9] = L_add( L_sub( L_add( L_sub( im0, im1_7p ), im2_6p ), im3_5p ), im4 );
    3754     2934720 :     move32();
    3755             : 
    3756     2934720 :     pInOut[10] = L_add( L_sub( L_sub( L_add( re0, Mpy_32_16_1( L_sub( re3_5p, re1_7p ), C81 ) ), re4 ), Mpy_32_16_1( L_add( im1_7m, im3_5m ), C81 ) ), im2_6m );
    3757     2934720 :     move32();
    3758     2934720 :     pInOut[11] = L_sub( L_add( L_sub( L_add( im0, Mpy_32_16_1( L_sub( im3_5p, im1_7p ), C81 ) ), im4 ), Mpy_32_16_1( L_add( re1_7m, re3_5m ), C81 ) ), re2_6m );
    3759     2934720 :     move32();
    3760             : 
    3761     2934720 :     pInOut[12] = L_add( L_sub( L_add( L_sub( re0, re2_6p ), re4 ), im1_7m ), im3_5m );
    3762     2934720 :     move32();
    3763     2934720 :     pInOut[13] = L_sub( L_add( L_add( L_sub( im0, im2_6p ), im4 ), re1_7m ), re3_5m );
    3764     2934720 :     move32();
    3765             : 
    3766     2934720 :     pInOut[14] = L_sub( L_sub( L_sub( L_add( re0, Mpy_32_16_1( L_sub( re1_7p, re3_5p ), C81 ) ), re4 ), Mpy_32_16_1( L_add( im1_7m, im3_5m ), C81 ) ), im2_6m );
    3767     2934720 :     move32();
    3768     2934720 :     pInOut[15] = L_add( L_add( L_sub( L_add( im0, Mpy_32_16_1( L_sub( im1_7p, im3_5p ), C81 ) ), im4 ), Mpy_32_16_1( L_add( re1_7m, re3_5m ), C81 ) ), re2_6m );
    3769     2934720 :     move32();
    3770             : 
    3771     2934720 :     return;
    3772             : }
    3773             : 
    3774     2934720 : static void nextFFT(
    3775             :     Word32 *x, /*Qx*/
    3776             :     const Word16 length /*Qx*/ )
    3777             : {
    3778             :     cmplx val[5];
    3779     2934720 :     SWITCH( length )
    3780             :     {
    3781           0 :         case 2:
    3782           0 :             fft2( x );
    3783           0 :             BREAK;
    3784           0 :         case 3:
    3785           0 :             fft3_2( x );
    3786           0 :             BREAK;
    3787           0 :         case 4:
    3788           0 :             fft4( x );
    3789           0 :             BREAK;
    3790           0 :         case 5:
    3791           0 :             FOR( Word16 i = 0; i < 5; i++ )
    3792             :             {
    3793           0 :                 val[i].re = x[2 * i];
    3794           0 :                 move32();
    3795           0 :                 val[i].im = x[( ( i << 1 ) + 1 )];
    3796           0 :                 move32();
    3797             :             }
    3798           0 :             fft5( val );
    3799           0 :             FOR( Word16 i = 0; i < 5; i++ )
    3800             :             {
    3801           0 :                 x[2 * i] = val[i].re;
    3802           0 :                 move32();
    3803           0 :                 x[( ( i << 1 ) + 1 )] = val[i].im;
    3804           0 :                 move32();
    3805             :             }
    3806           0 :             BREAK;
    3807     2934720 :         case 8:
    3808     2934720 :             fft8_2( x );
    3809     2934720 :             BREAK;
    3810           0 :         default:
    3811           0 :             assert( !"length not supported" );
    3812             :             BREAK;
    3813             :     }
    3814             : 
    3815     2934720 :     return;
    3816             : }
    3817             : 
    3818             : static const Word16 CTFFTfactors[] = { 9, 8, 7, 5, 4, 3, 2, 0 };
    3819             : 
    3820     1467360 : static __inline Word16 findFactor(
    3821             :     const Word16 length )
    3822             : {
    3823     1467360 :     Word16 i = 0;
    3824     1467360 :     move16();
    3825     1467360 :     Word16 factor = 0;
    3826     1467360 :     move16();
    3827             : 
    3828     2934720 :     WHILE( CTFFTfactors[i] != 0 )
    3829             :     {
    3830     2934720 :         IF( ( length % CTFFTfactors[i] ) == 0 )
    3831             :         {
    3832     1467360 :             factor = CTFFTfactors[i];
    3833     1467360 :             move16();
    3834     1467360 :             BREAK;
    3835             :         }
    3836     1467360 :         i += 1;
    3837             :     }
    3838     1467360 :     return factor;
    3839             : }
    3840             : 
    3841     1467360 : static __inline void twiddle(
    3842             :     Word32 *x, // Qx
    3843             :     const Word16 length,
    3844             :     const Word16 n1,
    3845             :     const Word16 n2 )
    3846             : {
    3847             :     Word16 i, ii;
    3848     1467360 :     const Word16 *ptr_sin = &sin_twiddle_table_25_5_5[0]; // Q15
    3849     1467360 :     const Word16 *ptr_cos = &cos_twiddle_table_25_5_5[0]; // Q15
    3850             : 
    3851     1467360 :     test();
    3852     1467360 :     test();
    3853     1467360 :     test();
    3854     1467360 :     test();
    3855     1467360 :     IF( EQ_16( length, 16 ) && EQ_16( n1, 8 ) && EQ_16( n2, 2 ) )
    3856             :     {
    3857     1467360 :         ptr_sin = &sin_twiddle_table_16_8_2[0]; // Q15
    3858     1467360 :         ptr_cos = &cos_twiddle_table_16_8_2[0]; // Q15
    3859             :     }
    3860           0 :     ELSE IF( NE_16( length, 25 ) || NE_16( n1, 5 ) || NE_16( n2, 5 ) )
    3861             :     {
    3862           0 :         assert( 0 );
    3863             :     }
    3864             : 
    3865    11738880 :     FOR( i = 1; i < n1; i++ )
    3866             :     {
    3867    20543040 :         FOR( ii = 1; ii < n2; ii++ )
    3868             :         {
    3869             :             Word32 xRe, xIm;
    3870    10271520 :             xRe = x[( ( ( ( i * n2 ) + ii ) ) << 1 )];                                                                                                         // Qx
    3871    10271520 :             xIm = x[( ( ( ( ( i * n2 ) + ii ) ) << 1 ) + 1 )];                                                                                                 // Qx
    3872    10271520 :             x[( ( ( ( i * n2 ) + ii ) ) << 1 )] = L_sub( Mpy_32_16_1( xRe, ptr_cos[( ( i * n2 ) + ii )] ), Mpy_32_16_1( xIm, ptr_sin[( ( i * n2 ) + ii )] ) ); // Qx
    3873    10271520 :             move32();
    3874    10271520 :             x[( ( ( ( ( i * n2 ) + ii ) ) << 1 ) + 1 )] = L_add( Mpy_32_16_1( xRe, ptr_sin[( ( i * n2 ) + ii )] ), Mpy_32_16_1( xIm, ptr_cos[( ( i * n2 ) + ii )] ) ); // Qx
    3875    10271520 :             move32();
    3876             :         }
    3877             :     }
    3878     1467360 :     return;
    3879             : }
    3880             : 
    3881    25727712 : static void cooleyTukeyFFT(
    3882             :     Word32 *x, // Qx
    3883             :     const Word16 length,
    3884             :     Word32 *scratch // Qx
    3885             : )
    3886             : {
    3887             :     Word16 factor;
    3888             :     Word16 i, ii;
    3889             :     Word16 n1, n2;
    3890    25727712 :     Word16 cnt = 0;
    3891    25727712 :     move16();
    3892             :     Word32 *src, *dest;
    3893             :     cmplx val[5];
    3894             : 
    3895    25727712 :     SWITCH( length )
    3896             :     {
    3897           0 :         case 1:
    3898           0 :             BREAK;
    3899    11738880 :         case 2:
    3900    11738880 :             fft2( x );
    3901    11738880 :             BREAK;
    3902     7825920 :         case 3:
    3903     7825920 :             fft3_2( x );
    3904     7825920 :             BREAK;
    3905           0 :         case 4:
    3906           0 :             fft4( x );
    3907           0 :             BREAK;
    3908     4695552 :         case 5:
    3909    28173312 :             FOR( i = 0; i < 5; i++ )
    3910             :             {
    3911    23477760 :                 val[i].re = x[2 * i]; // Qx
    3912    23477760 :                 move32();
    3913    23477760 :                 val[i].im = x[( ( i << 1 ) + 1 )]; // Qx
    3914    23477760 :                 move32();
    3915             :             }
    3916     4695552 :             fft5( val );
    3917    28173312 :             FOR( i = 0; i < 5; i++ )
    3918             :             {
    3919    23477760 :                 x[2 * i] = val[i].re;
    3920    23477760 :                 move32();
    3921    23477760 :                 x[( ( i << 1 ) + 1 )] = val[i].im;
    3922    23477760 :                 move32();
    3923             :             }
    3924     4695552 :             BREAK;
    3925           0 :         case 8:
    3926           0 :             fft8_2( x );
    3927           0 :             BREAK;
    3928     1467360 :         default:
    3929             :         {
    3930     1467360 :             factor = findFactor( length );
    3931             : 
    3932     1467360 :             IF( ( factor > 0 ) && GT_16( idiv1616( length, factor ), 1 ) )
    3933             :             {
    3934     1467360 :                 n1 = factor;
    3935     1467360 :                 move16();
    3936     1467360 :                 n2 = idiv1616( length, factor );
    3937             : 
    3938             :                 /* DATA Resorting for stage1 */
    3939     1467360 :                 dest = scratch; // Qx
    3940    13206240 :                 FOR( i = 0; i < 2 * n1; i += 2 )
    3941             :                 {
    3942    11738880 :                     src = x + i;
    3943    35216640 :                     FOR( ii = 0; ii < n2; ii++ )
    3944             :                     {
    3945             :                         /* *dest++ = x[2*(i+ii*n1)]; */
    3946             :                         /* *dest++ = x[2*(i+ii*n1)+1]; */
    3947    23477760 :                         *dest++ = *src;
    3948    23477760 :                         move32();
    3949    23477760 :                         *dest++ = *( src + 1 );
    3950    23477760 :                         move32();
    3951    23477760 :                         src += 2 * n1;
    3952             :                     }
    3953             :                 }
    3954     1467360 :                 src = scratch; // Qx
    3955     1467360 :                 dest = x;
    3956    24945120 :                 FOR( i = 0; i < length; i++ )
    3957             :                 {
    3958    23477760 :                     *dest++ = *src++;
    3959    23477760 :                     move32();
    3960    23477760 :                     *dest++ = *src++;
    3961    23477760 :                     move32();
    3962             :                 }
    3963             :                 /* perform n1 ffts of length n2 */
    3964    13206240 :                 FOR( i = 0; i < n1; i++ )
    3965             :                 {
    3966    11738880 :                     cooleyTukeyFFT( x + shl( i_mult( i, n2 ), 1 ), n2, scratch + shl( i_mult( i, n2 ), 1 ) );
    3967             :                 }
    3968             :                 /*data twiddeling */
    3969     1467360 :                 twiddle( x, length, n1, n2 );
    3970             :                 /* DATA Resorting for stage2 */
    3971     1467360 :                 cnt = 0;
    3972     1467360 :                 move16();
    3973     4402080 :                 FOR( i = 0; i < n2; i++ )
    3974             :                 {
    3975    26412480 :                     FOR( ii = 0; ii < n1; ii++ )
    3976             :                     {
    3977    23477760 :                         scratch[2 * cnt] = x[( ( i + ( ii * n2 ) ) << 1 )];
    3978    23477760 :                         move32();
    3979    23477760 :                         scratch[( ( cnt << 1 ) + 1 )] = x[( ( ( i + ( ii * n2 ) ) << 1 ) + 1 )];
    3980    23477760 :                         move32();
    3981    23477760 :                         cnt = add( cnt, 1 );
    3982             :                     }
    3983             :                 }
    3984             :                 /* perform n2 ffts of length n1 */
    3985     4402080 :                 FOR( i = 0; i < n2; i++ )
    3986             :                 {
    3987     2934720 :                     nextFFT( scratch + shl( i_mult( i, n1 ), 1 ), n1 );
    3988             :                 }
    3989     1467360 :                 cnt = 0;
    3990     1467360 :                 move16();
    3991    13206240 :                 FOR( i = 0; i < n1; i++ )
    3992             :                 {
    3993    35216640 :                     FOR( ii = 0; ii < n2; ii++ )
    3994             :                     {
    3995    23477760 :                         x[2 * cnt] = scratch[( ( i + ( ii * n1 ) ) << 1 )];
    3996    23477760 :                         move32();
    3997    23477760 :                         x[( ( cnt << 1 ) + 1 )] = scratch[( ( ( i + ( ii * n1 ) ) << 1 ) + 1 )];
    3998    23477760 :                         move32();
    3999    23477760 :                         cnt = add( cnt, 1 );
    4000             :                     }
    4001             :                 }
    4002             :             }
    4003             :             ELSE
    4004             :             {
    4005           0 :                 assert( !"length not supported" );
    4006             :             }
    4007             :         }
    4008             :     }
    4009             : 
    4010    25727712 :     return;
    4011             : }
    4012             : 
    4013     9488928 : static void pfaDFT(
    4014             :     Word32 *x,           // Qx
    4015             :     const Word16 length, // Q0
    4016             :     Word32 *scratch1,    // Qx
    4017             :     const Word16 numFactors,
    4018             :     const Word16 *factor )
    4019             : {
    4020             :     Word16 i, ii;
    4021             :     Word16 cnt;
    4022             : 
    4023     9488928 :     IF( GT_16( numFactors, 1 ) )
    4024             :     {
    4025     1663008 :         Word32 *tmp = scratch1;
    4026     1663008 :         Word16 n1_inv = 1, n2_inv = 1;
    4027     1663008 :         move16();
    4028     1663008 :         move16();
    4029     1663008 :         Word16 n2 = factor[0 /*idx*/];
    4030     1663008 :         move16();
    4031     1663008 :         Word16 n1 = idiv1616( length, n2 );
    4032             :         Word16 idx, incr;
    4033             : 
    4034     4597728 :         WHILE( ( ( n1_inv * n1 ) % n2 ) != 1 )
    4035             :         {
    4036     2934720 :             n1_inv = add( n1_inv, 1 );
    4037             :         }
    4038     3228192 :         WHILE( ( ( n2_inv * n2 ) % n1 ) != 1 )
    4039             :         {
    4040     1565184 :             n2_inv = add( n2_inv, 1 );
    4041             :         }
    4042     1663008 :         idx = 0;
    4043     1663008 :         move16();
    4044     1663008 :         incr = ( n1 * n1_inv );
    4045     1663008 :         move16();
    4046     1663008 :         cnt = 0;
    4047     1663008 :         move16();
    4048     7825920 :         FOR( i = 0; i < n1; i++ )
    4049             :         {
    4050    46955520 :             FOR( ii = 0; ii < n2 - 1; ii++ )
    4051             :             {
    4052    40792608 :                 tmp[cnt] = x[2 * idx];
    4053    40792608 :                 move32();
    4054    40792608 :                 cnt = add( cnt, 1 );
    4055    40792608 :                 tmp[cnt] = x[( ( idx << 1 ) + 1 )]; // Qx
    4056    40792608 :                 move32();
    4057    40792608 :                 cnt = add( cnt, 1 );
    4058             : 
    4059    40792608 :                 idx = add( idx, incr );
    4060             : 
    4061    40792608 :                 IF( GT_16( idx, length ) )
    4062             :                 {
    4063    26803776 :                     idx = sub( idx, length );
    4064             :                 }
    4065             :             }
    4066     6162912 :             tmp[cnt] = x[2 * idx]; // Qx
    4067     6162912 :             move32();
    4068     6162912 :             cnt = add( cnt, 1 );
    4069     6162912 :             tmp[cnt] = x[( ( idx << 1 ) + 1 )]; // Qx
    4070     6162912 :             move32();
    4071     6162912 :             cnt = add( cnt, 1 );
    4072     6162912 :             idx = add( idx, 1 );
    4073             :         }
    4074     7825920 :         FOR( cnt = 0; cnt < length; cnt += n2 )
    4075             :         {
    4076     6162912 :             cooleyTukeyFFT( tmp + 2 * cnt, n2, x + 2 * cnt );
    4077             :         }
    4078     7825920 :         FOR( cnt = 0; cnt < n1; cnt++ )
    4079             :         {
    4080    53118432 :             FOR( i = 0; i < n2; i++ )
    4081             :             {
    4082    46955520 :                 x[( ( cnt + ( i * n1 ) ) << 1 )] = tmp[( ( ( cnt * n2 ) + i ) << 1 )];
    4083    46955520 :                 move32();
    4084    46955520 :                 x[( ( ( cnt + ( i * n1 ) ) << 1 ) + 1 )] = tmp[( ( ( ( cnt * n2 ) + i ) << 1 ) + 1 )];
    4085    46955520 :                 move32();
    4086             :             }
    4087             :         }
    4088    11054112 :         FOR( cnt = 0; cnt < length; cnt += n1 )
    4089             :         {
    4090     9391104 :             pfaDFT( x + 2 * cnt, n1, tmp, sub( numFactors, 1 ), &factor[1] );
    4091             :         }
    4092     1663008 :         idx = 0;
    4093     1663008 :         move16();
    4094     1663008 :         cnt = 0;
    4095     1663008 :         move16();
    4096    11054112 :         FOR( i = 0; i < n2; i++ )
    4097             :         {
    4098     9391104 :             idx = i_mult( i, n1 );
    4099    56346624 :             FOR( ii = 0; ii < n1; ii++ )
    4100             :             {
    4101    46955520 :                 tmp[2 * idx] = x[cnt];
    4102    46955520 :                 move32();
    4103    46955520 :                 cnt = add( cnt, 1 );
    4104    46955520 :                 tmp[( ( idx << 1 ) + 1 )] = x[cnt];
    4105    46955520 :                 move32();
    4106    46955520 :                 cnt = add( cnt, 1 );
    4107    46955520 :                 idx = add( idx, n2 );
    4108             : 
    4109    46955520 :                 IF( GT_16( idx, length ) )
    4110             :                 {
    4111     7728096 :                     idx = sub( idx, length );
    4112             :                 }
    4113             :             }
    4114             :         }
    4115    48618528 :         FOR( cnt = 0; cnt < length; cnt++ )
    4116             :         {
    4117    46955520 :             x[2 * cnt] = tmp[2 * cnt];
    4118    46955520 :             move32();
    4119    46955520 :             x[( ( cnt << 1 ) + 1 )] = tmp[( ( cnt << 1 ) + 1 )];
    4120    46955520 :             move32();
    4121             :         }
    4122             :     }
    4123             :     ELSE
    4124             :     {
    4125     7825920 :         cooleyTukeyFFT( x, length, scratch1 );
    4126             :     }
    4127             : 
    4128     9488928 :     return;
    4129             : }
    4130             : 
    4131       97824 : static void fftf_interleave(
    4132             :     Word32 *re,      // Qx
    4133             :     Word32 *im,      // Qx
    4134             :     Word32 *out,     // Qx
    4135             :     const Word16 len // Q0
    4136             : )
    4137             : {
    4138       97824 :     Word16 i = 0;
    4139       97824 :     move16();
    4140             : 
    4141    23575584 :     FOR( i = 0; i < len; i++ )
    4142             :     {
    4143    23477760 :         *out++ = *re++;
    4144    23477760 :         move32();
    4145    23477760 :         *out++ = *im++;
    4146    23477760 :         move32();
    4147             :     }
    4148             : 
    4149       97824 :     return;
    4150             : }
    4151             : 
    4152       97824 : static void fftf_deinterleave(
    4153             :     Word32 *in,      // Qx
    4154             :     Word32 *re,      // Qx
    4155             :     Word32 *im,      // Qx
    4156             :     const Word16 len // Q0
    4157             : )
    4158             : {
    4159       97824 :     Word16 i = 0;
    4160       97824 :     move16();
    4161             : 
    4162    23575584 :     FOR( i = 0; i < len; i++ )
    4163             :     {
    4164    23477760 :         *re++ = *in++;
    4165    23477760 :         move32();
    4166    23477760 :         *im++ = *in++;
    4167    23477760 :         move32();
    4168             :     }
    4169             : 
    4170       97824 :     return;
    4171             : }
    4172             : 
    4173           0 : static void DoRTFT600(
    4174             :     Word32 *x, /* i/o: real part of input and output data       Qx*/
    4175             :     Word32 *y  /* i/o: imaginary part of input and output data  Qx*/
    4176             : )
    4177             : {
    4178             :     Word32 scratch[1200], cmplx[1200];
    4179           0 :     Word16 factors[3] = { 25, 8, 3 };
    4180           0 :     move16();
    4181           0 :     move16();
    4182           0 :     move16();
    4183             : 
    4184           0 :     fftf_interleave( x, y, cmplx, 600 );
    4185           0 :     pfaDFT( cmplx, 600, scratch, 3, factors );
    4186           0 :     fftf_deinterleave( cmplx, x, y, 600 );
    4187             : 
    4188           0 :     return;
    4189             : }
    4190             : 
    4191           0 : static void DoRTFT400(
    4192             :     Word32 *x, /* i/o: real part of input and output data Qx      */
    4193             :     Word32 *y  /* i/o: imaginary part of input and output data Qx */
    4194             : )
    4195             : {
    4196             :     Word32 scratch[800], cmplx[800];
    4197           0 :     Word16 factors[2] = { 25, 16 };
    4198           0 :     move16();
    4199           0 :     move16();
    4200             : 
    4201           0 :     fftf_interleave( x, y, cmplx, 400 );
    4202           0 :     pfaDFT( cmplx, 400, scratch, 2, factors );
    4203           0 :     fftf_deinterleave( cmplx, x, y, 400 );
    4204             : 
    4205             : 
    4206           0 :     return;
    4207             : }
    4208             : 
    4209       97824 : static void DoRTFT240(
    4210             :     Word32 *x, /* i/o: real part of input and output data Qx      */
    4211             :     Word32 *y  /* i/o: imaginary part of input and output data Qx */
    4212             : )
    4213             : {
    4214             :     Word32 scratch[480], cmplx[480];
    4215       97824 :     Word16 factors[3] = { 16, 5, 3 };
    4216       97824 :     move16();
    4217       97824 :     move16();
    4218       97824 :     move16();
    4219             : 
    4220       97824 :     fftf_interleave( x, y, cmplx, 240 );
    4221       97824 :     pfaDFT( cmplx, 240, scratch, 3, factors );
    4222       97824 :     fftf_deinterleave( cmplx, x, y, 240 );
    4223             : 
    4224       97824 :     return;
    4225             : }
    4226             : 
    4227           0 : static void DoRTFT200(
    4228             :     Word32 *x, /* i/o: real part of input and output data Qx      */
    4229             :     Word32 *y  /* i/o: imaginary part of input and output data Qx */
    4230             : )
    4231             : {
    4232             :     Word32 scratch[400], cmplx[400];
    4233           0 :     Word16 factors[2] = { 25, 8 };
    4234           0 :     move16();
    4235           0 :     move16();
    4236             : 
    4237           0 :     fftf_interleave( x, y, cmplx, 200 );
    4238           0 :     pfaDFT( cmplx, 200, scratch, 2, factors );
    4239           0 :     fftf_deinterleave( cmplx, x, y, 200 );
    4240             : 
    4241           0 :     return;
    4242             : }
    4243             : 
    4244           0 : static void DoRTFT100(
    4245             :     Word32 *x, /* i/o: real part of input and output data Qx      */
    4246             :     Word32 *y  /* i/o: imaginary part of input and output data Qx */
    4247             : )
    4248             : {
    4249             :     Word32 scratch[200], cmplx[200];
    4250           0 :     Word16 factors[2] = { 25, 4 };
    4251           0 :     move16();
    4252           0 :     move16();
    4253             : 
    4254           0 :     fftf_interleave( x, y, cmplx, 100 );
    4255           0 :     pfaDFT( cmplx, 100, scratch, 2, factors );
    4256           0 :     fftf_deinterleave( cmplx, x, y, 100 );
    4257             : 
    4258           0 :     return;
    4259             : }
    4260             : 
    4261             : 
    4262      102762 : void DoFFT_fx(
    4263             :     Word32 *re2,        // Qx
    4264             :     Word32 *im2,        // Qx
    4265             :     const Word16 length // Q0
    4266             : )
    4267             : {
    4268      102762 :     SWITCH( length )
    4269             :     {
    4270           0 :         case 600:
    4271           0 :             DoRTFT600( re2, im2 );
    4272           0 :             BREAK;
    4273           0 :         case 480:
    4274           0 :             DoRTFT480_fx( re2, im2 );
    4275           0 :             BREAK;
    4276           0 :         case 400:
    4277           0 :             DoRTFT400( re2, im2 );
    4278           0 :             BREAK;
    4279           0 :         case 320:
    4280           0 :             DoRTFT320_fx( re2, im2 );
    4281           0 :             BREAK;
    4282           0 :         case 256:
    4283           0 :             DoRTFTn_fx_ivas( re2, im2, 256 );
    4284           0 :             BREAK;
    4285       97824 :         case 240:
    4286       97824 :             DoRTFT240( re2, im2 );
    4287       97824 :             BREAK;
    4288           0 :         case 200:
    4289           0 :             DoRTFT200( re2, im2 );
    4290           0 :             BREAK;
    4291        1298 :         case 160:
    4292        1298 :             DoRTFT160_fx( re2, im2 );
    4293        1298 :             BREAK;
    4294           0 :         case 128:
    4295           0 :             DoRTFT128_fx( re2, im2 );
    4296           0 :             BREAK;
    4297           0 :         case 120:
    4298           0 :             DoRTFT120_fx( re2, im2 );
    4299           0 :             BREAK;
    4300           0 :         case 100:
    4301           0 :             DoRTFT100( re2, im2 );
    4302           0 :             BREAK;
    4303        3640 :         case 80:
    4304        3640 :             DoRTFT80_fx( re2, im2 );
    4305        3640 :             BREAK;
    4306           0 :         case 64:
    4307           0 :             DoRTFTn_fx_ivas( re2, im2, 64 );
    4308           0 :             BREAK;
    4309           0 :         case 40:
    4310           0 :             DoRTFT40_fx( re2, im2 );
    4311           0 :             BREAK;
    4312           0 :         case 20:
    4313           0 :             DoRTFT20_fx( re2, im2 );
    4314           0 :             BREAK;
    4315           0 :         default:
    4316           0 :             assert( !"fft is not supported!" );
    4317             :     }
    4318             : 
    4319      102762 :     return;
    4320             : }
    4321             : 
    4322             : /*-----------------------------------------------------------------*
    4323             :  * Low-complexity implementation of FFT
    4324             :  *-----------------------------------------------------------------*/
    4325             : 
    4326           0 : static void fft_len5(
    4327             :     cmplx *x // Qx
    4328             : )
    4329             : {
    4330             :     cmplx y1, y2, y3, y4;
    4331             :     cmplx t;
    4332             : 
    4333           0 :     y1 = CL_add( x[1], x[4] );
    4334           0 :     y4 = CL_sub( x[1], x[4] );
    4335           0 :     y3 = CL_add( x[2], x[3] );
    4336           0 :     y2 = CL_sub( x[2], x[3] );
    4337           0 :     t = CL_scale( CL_sub( y1, y3 ), FFT_C54 ); // Qx
    4338           0 :     y1 = CL_add( y1, y3 );
    4339           0 :     x[0] = CL_add( x[0], y1 );
    4340           0 :     move64();
    4341             : 
    4342           0 :     y1 = CL_add( x[0], CL_shl( CL_scale( y1, FFT_C55 ), 1 ) ); // Qx
    4343           0 :     y3 = CL_sub( y1, t );
    4344           0 :     y1 = CL_add( y1, t );
    4345           0 :     t = CL_scale( CL_add( y4, y2 ), FFT_C51 );
    4346             : 
    4347           0 :     y4 = CL_add( t, CL_shl( CL_scale( y4, FFT_C52 ), 1 ) ); // Qx
    4348           0 :     y2 = CL_add( t, CL_scale( y2, FFT_C53 ) );              // Qx
    4349             : 
    4350           0 :     x[1] = CL_msu_j( y1, y2 );
    4351           0 :     move64();
    4352           0 :     x[4] = CL_mac_j( y1, y2 );
    4353           0 :     move64();
    4354           0 :     x[2] = CL_mac_j( y3, y4 );
    4355           0 :     move64();
    4356           0 :     x[3] = CL_msu_j( y3, y4 );
    4357           0 :     move64();
    4358             : 
    4359           0 :     return;
    4360             : }
    4361             : 
    4362           0 : static void fft_len8(
    4363             :     cmplx *x // Qx
    4364             : )
    4365             : {
    4366             :     cmplx t[8], s[8];
    4367             : 
    4368           0 :     t[0] = CL_add( x[0], x[4] );
    4369           0 :     move64();
    4370           0 :     t[1] = CL_sub( x[0], x[4] );
    4371           0 :     move64();
    4372           0 :     t[2] = CL_add( x[1], x[5] );
    4373           0 :     move64();
    4374           0 :     t[3] = CL_sub( x[1], x[5] );
    4375           0 :     move64();
    4376           0 :     t[4] = CL_add( x[2], x[6] );
    4377           0 :     move64();
    4378           0 :     t[5] = CL_sub( x[2], x[6] );
    4379           0 :     move64();
    4380           0 :     t[6] = CL_add( x[3], x[7] );
    4381           0 :     move64();
    4382           0 :     t[7] = CL_sub( x[3], x[7] );
    4383           0 :     move64();
    4384             : 
    4385           0 :     s[0] = CL_add( t[0], t[4] );
    4386           0 :     move64();
    4387           0 :     s[2] = CL_sub( t[0], t[4] );
    4388           0 :     move64();
    4389           0 :     s[4] = CL_mac_j( t[1], t[5] );
    4390           0 :     move64();
    4391           0 :     s[5] = CL_msu_j( t[1], t[5] );
    4392           0 :     move64();
    4393           0 :     s[1] = CL_add( t[2], t[6] );
    4394           0 :     move64();
    4395           0 :     s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
    4396           0 :     move64();
    4397             : 
    4398           0 :     t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
    4399           0 :     move64();
    4400           0 :     t[1] = CL_sub( t[3], t[7] );
    4401           0 :     move64();
    4402             : 
    4403           0 :     s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 );
    4404           0 :     move64();
    4405           0 :     s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 );
    4406           0 :     move64();
    4407           0 :     s[7] = CL_conjugate( s[7] );
    4408           0 :     move64();
    4409             : 
    4410           0 :     x[0] = CL_add( s[0], s[1] );
    4411           0 :     move64();
    4412           0 :     x[4] = CL_sub( s[0], s[1] );
    4413           0 :     move64();
    4414           0 :     x[2] = CL_sub( s[2], s[3] );
    4415           0 :     move64();
    4416           0 :     x[6] = CL_add( s[2], s[3] );
    4417           0 :     move64();
    4418           0 :     x[3] = CL_add( s[4], s[7] );
    4419           0 :     move64();
    4420           0 :     x[7] = CL_sub( s[4], s[7] );
    4421           0 :     move64();
    4422           0 :     x[1] = CL_add( s[5], s[6] );
    4423           0 :     move64();
    4424           0 :     x[5] = CL_sub( s[5], s[6] );
    4425           0 :     move64();
    4426             : 
    4427           0 :     return;
    4428             : }
    4429             : 
    4430     2492896 : static void fft_len10(
    4431             :     cmplx *x // Qx
    4432             : )
    4433             : {
    4434             :     cmplx t;
    4435             :     cmplx s[4];
    4436             :     cmplx y[10];
    4437             : 
    4438     2492896 :     s[0] = CL_add( x[6], x[4] );
    4439     2492896 :     move64();
    4440     2492896 :     s[3] = CL_sub( x[6], x[4] );
    4441     2492896 :     move64();
    4442     2492896 :     s[2] = CL_add( x[2], x[8] );
    4443     2492896 :     move64();
    4444     2492896 :     s[1] = CL_sub( x[2], x[8] );
    4445     2492896 :     move64();
    4446     2492896 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
    4447     2492896 :     s[0] = CL_add( s[0], s[2] );
    4448     2492896 :     move64();
    4449     2492896 :     y[0] = CL_add( x[0], s[0] );
    4450     2492896 :     move64();
    4451     2492896 :     s[0] = CL_add( y[0], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    4452     2492896 :     move64();
    4453     2492896 :     s[2] = CL_sub( s[0], t );
    4454     2492896 :     move64();
    4455     2492896 :     s[0] = CL_add( s[0], t );
    4456     2492896 :     move64();
    4457     2492896 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); // Qx
    4458     2492896 :     move64();
    4459     2492896 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    4460     2492896 :     move64();
    4461     2492896 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
    4462     2492896 :     move64();
    4463             : 
    4464     2492896 :     y[2] = CL_msu_j( s[0], s[1] );
    4465     2492896 :     move64();
    4466     2492896 :     y[8] = CL_mac_j( s[0], s[1] );
    4467     2492896 :     move64();
    4468     2492896 :     y[4] = CL_mac_j( s[2], s[3] );
    4469     2492896 :     move64();
    4470     2492896 :     y[6] = CL_msu_j( s[2], s[3] );
    4471     2492896 :     move64();
    4472             : 
    4473     2492896 :     s[0] = CL_add( x[1], x[9] );
    4474     2492896 :     move64();
    4475     2492896 :     s[3] = CL_sub( x[1], x[9] );
    4476     2492896 :     move64();
    4477     2492896 :     s[2] = CL_add( x[7], x[3] );
    4478     2492896 :     move64();
    4479     2492896 :     s[1] = CL_sub( x[7], x[3] );
    4480     2492896 :     move64();
    4481     2492896 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
    4482     2492896 :     s[0] = CL_add( s[0], s[2] );
    4483     2492896 :     move64();
    4484     2492896 :     y[1] = CL_add( x[5], s[0] );
    4485     2492896 :     move64();
    4486     2492896 :     s[0] = CL_add( y[1], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    4487     2492896 :     move64();
    4488     2492896 :     s[2] = CL_sub( s[0], t );
    4489     2492896 :     move64();
    4490     2492896 :     s[0] = CL_add( s[0], t );
    4491     2492896 :     move64();
    4492     2492896 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );              // Qx
    4493     2492896 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    4494     2492896 :     move64();
    4495     2492896 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
    4496     2492896 :     move64();
    4497             : 
    4498     2492896 :     y[3] = CL_msu_j( s[0], s[1] );
    4499     2492896 :     move64();
    4500     2492896 :     y[9] = CL_mac_j( s[0], s[1] );
    4501     2492896 :     move64();
    4502     2492896 :     move64();
    4503     2492896 :     y[5] = CL_mac_j( s[2], s[3] );
    4504     2492896 :     move64();
    4505     2492896 :     y[7] = CL_msu_j( s[2], s[3] );
    4506     2492896 :     move64();
    4507             : 
    4508             : 
    4509     2492896 :     x[0] = CL_add( y[0], y[1] );
    4510     2492896 :     move64();
    4511     2492896 :     x[5] = CL_sub( y[0], y[1] );
    4512     2492896 :     move64();
    4513             : 
    4514     2492896 :     x[2] = CL_add( y[2], y[3] );
    4515     2492896 :     move64();
    4516     2492896 :     x[7] = CL_sub( y[2], y[3] );
    4517     2492896 :     move64();
    4518             : 
    4519     2492896 :     x[4] = CL_add( y[4], y[5] );
    4520     2492896 :     move64();
    4521     2492896 :     x[9] = CL_sub( y[4], y[5] );
    4522     2492896 :     move64();
    4523             : 
    4524     2492896 :     x[6] = CL_add( y[6], y[7] );
    4525     2492896 :     move64();
    4526     2492896 :     x[1] = CL_sub( y[6], y[7] );
    4527     2492896 :     move64();
    4528             : 
    4529     2492896 :     x[8] = CL_add( y[8], y[9] );
    4530     2492896 :     move64();
    4531     2492896 :     x[3] = CL_sub( y[8], y[9] );
    4532     2492896 :     move64();
    4533             : 
    4534     2492896 :     return;
    4535             : }
    4536             : 
    4537     3716272 : static void fft_len15(
    4538             :     cmplx *x // Qx
    4539             : )
    4540             : {
    4541             :     cmplx t;
    4542             :     cmplx s[5];
    4543             :     cmplx y[15];
    4544             : 
    4545     3716272 :     s[0] = CL_add( x[3], x[12] );
    4546     3716272 :     move64();
    4547     3716272 :     s[3] = CL_sub( x[3], x[12] );
    4548     3716272 :     move64();
    4549     3716272 :     s[2] = CL_add( x[6], x[9] );
    4550     3716272 :     move64();
    4551     3716272 :     s[1] = CL_sub( x[6], x[9] );
    4552     3716272 :     move64();
    4553     3716272 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
    4554     3716272 :     s[0] = CL_add( s[0], s[2] );
    4555     3716272 :     move64();
    4556     3716272 :     y[0] = CL_add( x[0], s[0] );
    4557     3716272 :     move64();
    4558     3716272 :     s[0] = CL_add( y[0], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    4559     3716272 :     move64();
    4560     3716272 :     s[2] = CL_sub( s[0], t );
    4561     3716272 :     move64();
    4562     3716272 :     s[0] = CL_add( s[0], t );
    4563     3716272 :     move64();
    4564     3716272 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );              // Qx
    4565     3716272 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    4566     3716272 :     move64();
    4567     3716272 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
    4568     3716272 :     move64();
    4569             : 
    4570     3716272 :     y[1] = CL_msu_j( s[0], s[1] );
    4571     3716272 :     move64();
    4572     3716272 :     y[4] = CL_mac_j( s[0], s[1] );
    4573     3716272 :     move64();
    4574     3716272 :     y[2] = CL_mac_j( s[2], s[3] );
    4575     3716272 :     move64();
    4576     3716272 :     y[3] = CL_msu_j( s[2], s[3] );
    4577     3716272 :     move64();
    4578             : 
    4579     3716272 :     s[0] = CL_add( x[8], x[2] );
    4580     3716272 :     move64();
    4581     3716272 :     s[3] = CL_sub( x[8], x[2] );
    4582     3716272 :     move64();
    4583     3716272 :     s[2] = CL_add( x[11], x[14] );
    4584     3716272 :     move64();
    4585     3716272 :     s[1] = CL_sub( x[11], x[14] );
    4586     3716272 :     move64();
    4587     3716272 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
    4588     3716272 :     s[0] = CL_add( s[0], s[2] );
    4589     3716272 :     move64();
    4590     3716272 :     y[5] = CL_add( x[5], s[0] );
    4591     3716272 :     move64();
    4592     3716272 :     s[0] = CL_add( y[5], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    4593     3716272 :     move64();
    4594     3716272 :     s[2] = CL_sub( s[0], t );
    4595     3716272 :     move64();
    4596     3716272 :     s[0] = CL_add( s[0], t );
    4597     3716272 :     move64();
    4598     3716272 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );              // Qx
    4599     3716272 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    4600     3716272 :     move64();
    4601     3716272 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
    4602     3716272 :     move64();
    4603             : 
    4604     3716272 :     y[6] = CL_msu_j( s[0], s[1] );
    4605     3716272 :     move64();
    4606     3716272 :     y[9] = CL_mac_j( s[0], s[1] );
    4607     3716272 :     move64();
    4608     3716272 :     y[7] = CL_mac_j( s[2], s[3] );
    4609     3716272 :     move64();
    4610     3716272 :     y[8] = CL_msu_j( s[2], s[3] );
    4611     3716272 :     move64();
    4612             : 
    4613     3716272 :     s[0] = CL_add( x[13], x[7] );
    4614     3716272 :     move64();
    4615     3716272 :     s[3] = CL_sub( x[13], x[7] );
    4616     3716272 :     move64();
    4617     3716272 :     s[2] = CL_add( x[1], x[4] );
    4618     3716272 :     move64();
    4619     3716272 :     s[1] = CL_sub( x[1], x[4] );
    4620     3716272 :     move64();
    4621     3716272 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
    4622     3716272 :     s[0] = CL_add( s[0], s[2] );
    4623     3716272 :     move64();
    4624     3716272 :     y[10] = CL_add( x[10], s[0] );
    4625     3716272 :     move64();
    4626     3716272 :     s[0] = CL_add( y[10], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    4627     3716272 :     move64();
    4628     3716272 :     s[2] = CL_sub( s[0], t );
    4629     3716272 :     move64();
    4630     3716272 :     s[0] = CL_add( s[0], t );
    4631     3716272 :     move64();
    4632     3716272 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );              // Qx
    4633     3716272 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    4634     3716272 :     move64();
    4635     3716272 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
    4636     3716272 :     move64();
    4637             : 
    4638     3716272 :     y[11] = CL_msu_j( s[0], s[1] );
    4639     3716272 :     move64();
    4640     3716272 :     y[14] = CL_mac_j( s[0], s[1] );
    4641     3716272 :     move64();
    4642     3716272 :     y[12] = CL_mac_j( s[2], s[3] );
    4643     3716272 :     move64();
    4644     3716272 :     y[13] = CL_msu_j( s[2], s[3] );
    4645     3716272 :     move64();
    4646             : 
    4647     3716272 :     s[0] = CL_add( y[5], y[10] );
    4648     3716272 :     move64();
    4649     3716272 :     s[1] = CL_scale( CL_sub( y[5], y[10] ), FFT_C31 ); // Qx
    4650     3716272 :     move64();
    4651     3716272 :     x[0] = CL_add( y[0], s[0] );
    4652     3716272 :     move64();
    4653     3716272 :     s[0] = CL_sub( y[0], CL_shr( s[0], 1 ) );
    4654     3716272 :     move64();
    4655             : 
    4656     3716272 :     x[10] = CL_mac_j( s[0], s[1] );
    4657     3716272 :     move64();
    4658     3716272 :     x[5] = CL_msu_j( s[0], s[1] );
    4659     3716272 :     move64();
    4660             : 
    4661     3716272 :     s[0] = CL_add( y[6], y[11] );
    4662     3716272 :     move64();
    4663     3716272 :     s[1] = CL_scale( CL_sub( y[6], y[11] ), FFT_C31 ); // Qx
    4664     3716272 :     move64();
    4665     3716272 :     x[6] = CL_add( y[1], s[0] );
    4666     3716272 :     move64();
    4667     3716272 :     s[0] = CL_sub( y[1], CL_shr( s[0], 1 ) );
    4668     3716272 :     move64();
    4669             : 
    4670     3716272 :     x[1] = CL_mac_j( s[0], s[1] );
    4671     3716272 :     move64();
    4672     3716272 :     x[11] = CL_msu_j( s[0], s[1] );
    4673     3716272 :     move64();
    4674             : 
    4675     3716272 :     s[0] = CL_add( y[7], y[12] );
    4676     3716272 :     move64();
    4677     3716272 :     s[1] = CL_scale( CL_sub( y[7], y[12] ), FFT_C31 ); // Qx
    4678     3716272 :     move64();
    4679     3716272 :     x[12] = CL_add( y[2], s[0] );
    4680     3716272 :     move64();
    4681     3716272 :     s[0] = CL_sub( y[2], CL_shr( s[0], 1 ) );
    4682     3716272 :     move64();
    4683             : 
    4684     3716272 :     x[7] = CL_mac_j( s[0], s[1] );
    4685     3716272 :     move64();
    4686     3716272 :     x[2] = CL_msu_j( s[0], s[1] );
    4687     3716272 :     move64();
    4688             : 
    4689     3716272 :     s[0] = CL_add( y[8], y[13] );
    4690     3716272 :     move64();
    4691     3716272 :     s[1] = CL_scale( CL_sub( y[8], y[13] ), FFT_C31 ); // Qx
    4692     3716272 :     move64();
    4693     3716272 :     x[3] = CL_add( y[3], s[0] );
    4694     3716272 :     move64();
    4695     3716272 :     s[0] = CL_sub( y[3], CL_shr( s[0], 1 ) );
    4696     3716272 :     move64();
    4697             : 
    4698     3716272 :     x[13] = CL_mac_j( s[0], s[1] );
    4699     3716272 :     move64();
    4700     3716272 :     x[8] = CL_msu_j( s[0], s[1] );
    4701     3716272 :     move64();
    4702             : 
    4703     3716272 :     s[0] = CL_add( y[9], y[14] );
    4704     3716272 :     move64();
    4705     3716272 :     s[1] = CL_scale( CL_sub( y[9], y[14] ), FFT_C31 ); // Qx
    4706     3716272 :     move64();
    4707     3716272 :     x[9] = CL_add( y[4], s[0] );
    4708     3716272 :     move64();
    4709     3716272 :     s[0] = CL_sub( y[4], CL_shr( s[0], 1 ) );
    4710     3716272 :     move64();
    4711             : 
    4712     3716272 :     x[4] = CL_mac_j( s[0], s[1] );
    4713     3716272 :     move64();
    4714     3716272 :     x[14] = CL_msu_j( s[0], s[1] );
    4715     3716272 :     move64();
    4716             : 
    4717     3716272 :     return;
    4718             : }
    4719             : 
    4720    60828086 : static void fft_len16(
    4721             :     cmplx *x // Qx
    4722             : )
    4723             : {
    4724             :     cmplx s[4];
    4725             :     cmplx t[4];
    4726             :     cmplx y[16];
    4727             : 
    4728    60828086 :     s[0] = x[0]; // Qx
    4729    60828086 :     move64();
    4730    60828086 :     s[1] = x[4]; // Qx
    4731    60828086 :     move64();
    4732    60828086 :     s[2] = x[8]; // Qx
    4733    60828086 :     move64();
    4734    60828086 :     s[3] = x[12]; // Qx
    4735    60828086 :     move64();
    4736             : 
    4737    60828086 :     t[0] = CL_add( s[0], s[2] );
    4738    60828086 :     move64();
    4739    60828086 :     t[1] = CL_sub( s[0], s[2] );
    4740    60828086 :     move64();
    4741    60828086 :     t[2] = CL_add( s[1], s[3] );
    4742    60828086 :     move64();
    4743    60828086 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( s[1] ), CL_conjugate( s[3] ) ) );
    4744    60828086 :     move64();
    4745             : 
    4746    60828086 :     y[0] = CL_add( t[0], t[2] );
    4747    60828086 :     move64();
    4748    60828086 :     y[1] = CL_sub( t[1], t[3] );
    4749    60828086 :     move64();
    4750    60828086 :     y[2] = CL_sub( t[0], t[2] );
    4751    60828086 :     move64();
    4752    60828086 :     y[3] = CL_add( t[1], t[3] );
    4753    60828086 :     move64();
    4754             : 
    4755    60828086 :     s[0] = x[1]; // Qx
    4756    60828086 :     move64();
    4757    60828086 :     s[1] = x[5]; // Qx
    4758    60828086 :     move64();
    4759    60828086 :     s[2] = x[9]; // Qx
    4760    60828086 :     move64();
    4761    60828086 :     s[3] = x[13]; // Qx
    4762    60828086 :     move64();
    4763             : 
    4764    60828086 :     t[0] = CL_add( s[0], s[2] );
    4765    60828086 :     move64();
    4766    60828086 :     t[1] = CL_sub( s[0], s[2] );
    4767    60828086 :     move64();
    4768    60828086 :     t[2] = CL_add( s[1], s[3] );
    4769    60828086 :     move64();
    4770    60828086 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( s[1] ), CL_conjugate( s[3] ) ) );
    4771    60828086 :     move64();
    4772             : 
    4773    60828086 :     y[4] = CL_add( t[0], t[2] );
    4774    60828086 :     move64();
    4775    60828086 :     y[5] = CL_sub( t[1], t[3] );
    4776    60828086 :     move64();
    4777    60828086 :     y[6] = CL_sub( t[0], t[2] );
    4778    60828086 :     move64();
    4779    60828086 :     y[7] = CL_add( t[1], t[3] );
    4780    60828086 :     move64();
    4781             : 
    4782    60828086 :     s[0] = x[2]; // Qx
    4783    60828086 :     move64();
    4784    60828086 :     s[1] = x[6]; // Qx
    4785    60828086 :     move64();
    4786    60828086 :     s[2] = x[10]; // Qx
    4787    60828086 :     move64();
    4788    60828086 :     s[3] = x[14]; // Qx
    4789    60828086 :     move64();
    4790             : 
    4791    60828086 :     t[0] = CL_add( s[0], s[2] );
    4792    60828086 :     move64();
    4793    60828086 :     t[1] = CL_sub( s[0], s[2] );
    4794    60828086 :     move64();
    4795    60828086 :     t[2] = CL_add( s[1], s[3] );
    4796    60828086 :     move64();
    4797    60828086 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( s[1] ), CL_conjugate( s[3] ) ) );
    4798    60828086 :     move64();
    4799             : 
    4800    60828086 :     y[8] = CL_add( t[0], t[2] );
    4801    60828086 :     move64();
    4802    60828086 :     y[9] = CL_sub( t[1], t[3] );
    4803    60828086 :     move64();
    4804    60828086 :     y[10] = CL_swap_real_imag( CL_sub( t[0], t[2] ) );
    4805    60828086 :     move64();
    4806    60828086 :     y[10] = CL_conjugate( y[10] );
    4807    60828086 :     move64();
    4808    60828086 :     y[11] = CL_add( t[1], t[3] );
    4809    60828086 :     move64();
    4810             : 
    4811    60828086 :     s[0] = x[3]; // Qx
    4812    60828086 :     move64();
    4813    60828086 :     s[1] = x[7]; // Qx
    4814    60828086 :     move64();
    4815    60828086 :     s[2] = x[11]; // Qx
    4816    60828086 :     move64();
    4817    60828086 :     s[3] = x[15]; // Qx
    4818    60828086 :     move64();
    4819             : 
    4820    60828086 :     t[0] = CL_add( s[0], s[2] );
    4821    60828086 :     move64();
    4822    60828086 :     t[1] = CL_sub( s[0], s[2] );
    4823    60828086 :     move64();
    4824    60828086 :     t[2] = CL_add( s[1], s[3] );
    4825    60828086 :     move64();
    4826    60828086 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( s[1] ), CL_conjugate( s[3] ) ) );
    4827    60828086 :     move64();
    4828             : 
    4829    60828086 :     y[12] = CL_add( t[0], t[2] );
    4830    60828086 :     move64();
    4831    60828086 :     y[13] = CL_sub( t[1], t[3] );
    4832    60828086 :     move64();
    4833    60828086 :     y[14] = CL_sub( t[0], t[2] );
    4834    60828086 :     move64();
    4835    60828086 :     y[15] = CL_add( t[1], t[3] );
    4836    60828086 :     move64();
    4837             : 
    4838    60828086 :     s[0] = CL_scale( y[11], FFT_C162 ); // Qx
    4839    60828086 :     move64();
    4840    60828086 :     y[11] = CL_mac_j( s[0], s[0] );
    4841    60828086 :     move64();
    4842             : 
    4843    60828086 :     s[0] = CL_scale( y[14], FFT_C162 ); // Qx
    4844    60828086 :     move64();
    4845    60828086 :     y[14] = CL_mac_j( s[0], s[0] );
    4846    60828086 :     move64();
    4847             : 
    4848    60828086 :     s[0] = CL_scale( y[6], FFT_C161 ); // Qx
    4849    60828086 :     move64();
    4850    60828086 :     y[6] = CL_mac_j( s[0], s[0] );
    4851    60828086 :     move64();
    4852    60828086 :     y[6] = CL_swap_real_imag( y[6] );
    4853    60828086 :     move64();
    4854    60828086 :     y[6] = CL_conjugate( y[6] );
    4855    60828086 :     move64();
    4856             : 
    4857    60828086 :     s[0] = CL_scale( y[9], FFT_C161 ); // Qx
    4858    60828086 :     move64();
    4859    60828086 :     y[9] = CL_mac_j( s[0], s[0] );
    4860    60828086 :     move64();
    4861    60828086 :     y[9] = CL_swap_real_imag( y[9] );
    4862    60828086 :     move64();
    4863    60828086 :     y[9] = CL_conjugate( y[9] );
    4864    60828086 :     move64();
    4865             : 
    4866    60828086 :     s[0] = CL_scale( y[5], FFT_C163 ); // Qx
    4867    60828086 :     move64();
    4868    60828086 :     s[1] = CL_scale( y[5], FFT_C166 ); // Qx
    4869    60828086 :     move64();
    4870    60828086 :     y[5] = CL_mac_j( s[0], s[1] );
    4871    60828086 :     move64();
    4872             : 
    4873    60828086 :     s[0] = CL_scale( y[7], FFT_C165 ); // Qx
    4874    60828086 :     move64();
    4875    60828086 :     s[1] = CL_scale( y[7], FFT_C164 ); // Qx
    4876    60828086 :     move64();
    4877    60828086 :     y[7] = CL_mac_j( s[0], s[1] );
    4878    60828086 :     move64();
    4879             : 
    4880    60828086 :     s[0] = CL_scale( y[13], FFT_C165 ); // Qx
    4881    60828086 :     move64();
    4882    60828086 :     s[1] = CL_scale( y[13], FFT_C164 ); // Qx
    4883    60828086 :     move64();
    4884    60828086 :     y[13] = CL_mac_j( s[0], s[1] );
    4885    60828086 :     move64();
    4886             : 
    4887    60828086 :     s[0] = CL_scale( y[15], FFT_C164 ); // Qx
    4888    60828086 :     move64();
    4889    60828086 :     s[1] = CL_scale( y[15], FFT_C165 ); // Qx
    4890    60828086 :     move64();
    4891    60828086 :     y[15] = CL_mac_j( s[0], s[1] );
    4892    60828086 :     move64();
    4893             : 
    4894    60828086 :     t[0] = CL_add( y[0], y[8] );
    4895    60828086 :     move64();
    4896    60828086 :     t[1] = CL_sub( y[0], y[8] );
    4897    60828086 :     move64();
    4898    60828086 :     t[2] = CL_add( y[4], y[12] );
    4899    60828086 :     move64();
    4900    60828086 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[4] ), CL_conjugate( y[12] ) ) );
    4901    60828086 :     move64();
    4902             : 
    4903    60828086 :     x[0] = CL_add( t[0], t[2] );
    4904    60828086 :     move64();
    4905    60828086 :     x[4] = CL_sub( t[1], t[3] );
    4906    60828086 :     move64();
    4907    60828086 :     x[8] = CL_sub( t[0], t[2] );
    4908    60828086 :     move64();
    4909    60828086 :     x[12] = CL_add( t[1], t[3] );
    4910    60828086 :     move64();
    4911             : 
    4912    60828086 :     t[0] = CL_add( y[1], y[9] );
    4913    60828086 :     move64();
    4914    60828086 :     t[1] = CL_sub( y[1], y[9] );
    4915    60828086 :     move64();
    4916    60828086 :     t[2] = CL_add( y[5], y[13] );
    4917    60828086 :     move64();
    4918    60828086 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[5] ), CL_conjugate( y[13] ) ) );
    4919    60828086 :     move64();
    4920             : 
    4921    60828086 :     x[1] = CL_add( t[0], t[2] );
    4922    60828086 :     move64();
    4923    60828086 :     x[5] = CL_sub( t[1], t[3] );
    4924    60828086 :     move64();
    4925    60828086 :     x[9] = CL_sub( t[0], t[2] );
    4926    60828086 :     move64();
    4927    60828086 :     x[13] = CL_add( t[1], t[3] );
    4928    60828086 :     move64();
    4929             : 
    4930    60828086 :     t[0] = CL_add( y[2], y[10] );
    4931    60828086 :     move64();
    4932    60828086 :     t[1] = CL_sub( y[2], y[10] );
    4933    60828086 :     move64();
    4934    60828086 :     t[2] = CL_add( y[6], y[14] );
    4935    60828086 :     move64();
    4936    60828086 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[6] ), CL_conjugate( y[14] ) ) );
    4937    60828086 :     move64();
    4938             : 
    4939    60828086 :     x[2] = CL_add( t[0], t[2] );
    4940    60828086 :     move64();
    4941    60828086 :     x[6] = CL_sub( t[1], t[3] );
    4942    60828086 :     move64();
    4943    60828086 :     x[10] = CL_sub( t[0], t[2] );
    4944    60828086 :     move64();
    4945    60828086 :     x[14] = CL_add( t[1], t[3] );
    4946    60828086 :     move64();
    4947             : 
    4948    60828086 :     t[0] = CL_add( y[3], y[11] );
    4949    60828086 :     move64();
    4950    60828086 :     t[1] = CL_sub( y[3], y[11] );
    4951    60828086 :     move64();
    4952    60828086 :     t[2] = CL_add( y[7], y[15] );
    4953    60828086 :     move64();
    4954    60828086 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[7] ), CL_conjugate( y[15] ) ) );
    4955    60828086 :     move64();
    4956             : 
    4957    60828086 :     x[3] = CL_add( t[0], t[2] );
    4958    60828086 :     move64();
    4959    60828086 :     x[7] = CL_sub( t[1], t[3] );
    4960    60828086 :     move64();
    4961    60828086 :     x[11] = CL_sub( t[0], t[2] );
    4962    60828086 :     move64();
    4963    60828086 :     x[15] = CL_add( t[1], t[3] );
    4964    60828086 :     move64();
    4965             : 
    4966    60828086 :     return;
    4967             : }
    4968             : 
    4969    48020792 : static void fft_len20_fx(
    4970             :     cmplx *x // Qx
    4971             : )
    4972             : {
    4973             :     cmplx s[4];
    4974             :     cmplx xx[5];
    4975             :     cmplx t;
    4976             :     cmplx tt[4];
    4977             :     cmplx y[20];
    4978             : 
    4979    48020792 :     xx[0] = x[0]; // Qx
    4980    48020792 :     move64();
    4981    48020792 :     xx[1] = x[16]; // Qx
    4982    48020792 :     move64();
    4983    48020792 :     xx[2] = x[12]; // Qx
    4984    48020792 :     move64();
    4985    48020792 :     xx[3] = x[8]; // Qx
    4986    48020792 :     move64();
    4987    48020792 :     xx[4] = x[4]; // Qx
    4988    48020792 :     move64();
    4989             : 
    4990    48020792 :     s[0] = CL_add( xx[1], xx[4] );
    4991    48020792 :     move64();
    4992    48020792 :     s[3] = CL_sub( xx[1], xx[4] );
    4993    48020792 :     move64();
    4994    48020792 :     s[2] = CL_add( xx[2], xx[3] );
    4995    48020792 :     move64();
    4996    48020792 :     s[1] = CL_sub( xx[2], xx[3] );
    4997    48020792 :     move64();
    4998    48020792 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 );
    4999    48020792 :     s[0] = CL_add( s[0], s[2] );
    5000    48020792 :     move64();
    5001    48020792 :     y[0] = CL_add( xx[0], s[0] );
    5002    48020792 :     move64();
    5003    48020792 :     s[0] = CL_add( y[0], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    5004    48020792 :     move64();
    5005    48020792 :     s[2] = CL_sub( s[0], t );
    5006    48020792 :     move64();
    5007    48020792 :     s[0] = CL_add( s[0], t );
    5008    48020792 :     move64();
    5009    48020792 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
    5010    48020792 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    5011    48020792 :     move64();
    5012    48020792 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) );
    5013    48020792 :     move64();
    5014             : 
    5015    48020792 :     y[4] = CL_msu_j( s[0], s[1] );
    5016    48020792 :     move64();
    5017    48020792 :     y[16] = CL_mac_j( s[0], s[1] );
    5018    48020792 :     move64();
    5019    48020792 :     y[8] = CL_mac_j( s[2], s[3] );
    5020    48020792 :     move64();
    5021    48020792 :     y[12] = CL_msu_j( s[2], s[3] );
    5022    48020792 :     move64();
    5023             : 
    5024    48020792 :     xx[0] = x[5];
    5025    48020792 :     move64();
    5026    48020792 :     xx[1] = x[1];
    5027    48020792 :     move64();
    5028    48020792 :     xx[2] = x[17];
    5029    48020792 :     move64();
    5030    48020792 :     xx[3] = x[13];
    5031    48020792 :     move64();
    5032    48020792 :     xx[4] = x[9];
    5033    48020792 :     move64();
    5034             : 
    5035    48020792 :     s[0] = CL_add( xx[1], xx[4] );
    5036    48020792 :     move64();
    5037    48020792 :     s[3] = CL_sub( xx[1], xx[4] );
    5038    48020792 :     move64();
    5039    48020792 :     s[2] = CL_add( xx[2], xx[3] );
    5040    48020792 :     move64();
    5041    48020792 :     s[1] = CL_sub( xx[2], xx[3] );
    5042    48020792 :     move64();
    5043    48020792 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 );
    5044    48020792 :     s[0] = CL_add( s[0], s[2] );
    5045    48020792 :     move64();
    5046    48020792 :     y[1] = CL_add( xx[0], s[0] );
    5047    48020792 :     move64();
    5048    48020792 :     s[0] = CL_add( y[1], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    5049    48020792 :     move64();
    5050    48020792 :     s[2] = CL_sub( s[0], t );
    5051    48020792 :     move64();
    5052    48020792 :     s[0] = CL_add( s[0], t );
    5053    48020792 :     move64();
    5054    48020792 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
    5055    48020792 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    5056    48020792 :     move64();
    5057    48020792 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) );
    5058    48020792 :     move64();
    5059             : 
    5060    48020792 :     y[5] = CL_msu_j( s[0], s[1] );
    5061    48020792 :     move64();
    5062    48020792 :     y[17] = CL_mac_j( s[0], s[1] );
    5063    48020792 :     move64();
    5064    48020792 :     y[9] = CL_mac_j( s[2], s[3] );
    5065    48020792 :     move64();
    5066    48020792 :     y[13] = CL_msu_j( s[2], s[3] );
    5067    48020792 :     move64();
    5068             : 
    5069    48020792 :     xx[0] = x[10];
    5070    48020792 :     move64();
    5071    48020792 :     xx[1] = x[6];
    5072    48020792 :     move64();
    5073    48020792 :     xx[2] = x[2];
    5074    48020792 :     move64();
    5075    48020792 :     xx[3] = x[18];
    5076    48020792 :     move64();
    5077    48020792 :     xx[4] = x[14];
    5078    48020792 :     move64();
    5079             : 
    5080    48020792 :     s[0] = CL_add( xx[1], xx[4] );
    5081    48020792 :     move64();
    5082    48020792 :     s[3] = CL_sub( xx[1], xx[4] );
    5083    48020792 :     move64();
    5084    48020792 :     s[2] = CL_add( xx[2], xx[3] );
    5085    48020792 :     move64();
    5086    48020792 :     s[1] = CL_sub( xx[2], xx[3] );
    5087    48020792 :     move64();
    5088    48020792 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 );
    5089    48020792 :     s[0] = CL_add( s[0], s[2] );
    5090    48020792 :     move64();
    5091    48020792 :     y[2] = CL_add( xx[0], s[0] );
    5092    48020792 :     move64();
    5093    48020792 :     s[0] = CL_add( y[2], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    5094    48020792 :     move64();
    5095    48020792 :     s[2] = CL_sub( s[0], t );
    5096    48020792 :     move64();
    5097    48020792 :     s[0] = CL_add( s[0], t );
    5098    48020792 :     move64();
    5099    48020792 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
    5100    48020792 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    5101    48020792 :     move64();
    5102    48020792 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) );
    5103    48020792 :     move64();
    5104             : 
    5105    48020792 :     y[6] = CL_msu_j( s[0], s[1] );
    5106    48020792 :     move64();
    5107    48020792 :     y[18] = CL_mac_j( s[0], s[1] );
    5108    48020792 :     move64();
    5109    48020792 :     y[10] = CL_mac_j( s[2], s[3] );
    5110    48020792 :     move64();
    5111    48020792 :     y[14] = CL_msu_j( s[2], s[3] );
    5112    48020792 :     move64();
    5113             : 
    5114    48020792 :     xx[0] = x[15];
    5115    48020792 :     move64();
    5116    48020792 :     xx[1] = x[11];
    5117    48020792 :     move64();
    5118    48020792 :     xx[2] = x[7];
    5119    48020792 :     move64();
    5120    48020792 :     xx[3] = x[3];
    5121    48020792 :     move64();
    5122    48020792 :     xx[4] = x[19];
    5123    48020792 :     move64();
    5124             : 
    5125    48020792 :     s[0] = CL_add( xx[1], xx[4] );
    5126    48020792 :     move64();
    5127    48020792 :     s[3] = CL_sub( xx[1], xx[4] );
    5128    48020792 :     move64();
    5129    48020792 :     s[2] = CL_add( xx[2], xx[3] );
    5130    48020792 :     move64();
    5131    48020792 :     s[1] = CL_sub( xx[2], xx[3] );
    5132    48020792 :     move64();
    5133    48020792 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 );
    5134    48020792 :     s[0] = CL_add( s[0], s[2] );
    5135    48020792 :     move64();
    5136    48020792 :     y[3] = CL_add( xx[0], s[0] );
    5137    48020792 :     move64();
    5138    48020792 :     s[0] = CL_add( y[3], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    5139    48020792 :     move64();
    5140    48020792 :     s[2] = CL_sub( s[0], t );
    5141    48020792 :     move64();
    5142    48020792 :     s[0] = CL_add( s[0], t );
    5143    48020792 :     move64();
    5144    48020792 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
    5145    48020792 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    5146    48020792 :     move64();
    5147    48020792 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) );
    5148    48020792 :     move64();
    5149             : 
    5150    48020792 :     y[7] = CL_msu_j( s[0], s[1] );
    5151    48020792 :     move64();
    5152    48020792 :     y[19] = CL_mac_j( s[0], s[1] );
    5153    48020792 :     move64();
    5154    48020792 :     y[11] = CL_mac_j( s[2], s[3] );
    5155    48020792 :     move64();
    5156    48020792 :     y[15] = CL_msu_j( s[2], s[3] );
    5157    48020792 :     move64();
    5158             : 
    5159    48020792 :     tt[0] = CL_add( y[0], y[2] );
    5160    48020792 :     move64();
    5161    48020792 :     tt[1] = CL_sub( y[0], y[2] );
    5162    48020792 :     move64();
    5163    48020792 :     tt[2] = CL_add( y[1], y[3] );
    5164    48020792 :     move64();
    5165    48020792 :     tt[3] = CL_swap_real_imag( CL_conjugate( CL_sub( y[1], y[3] ) ) );
    5166    48020792 :     move64();
    5167             : 
    5168    48020792 :     x[0] = CL_add( tt[0], tt[2] );
    5169    48020792 :     move64();
    5170    48020792 :     x[5] = CL_sub( tt[1], tt[3] );
    5171    48020792 :     move64();
    5172    48020792 :     x[10] = CL_sub( tt[0], tt[2] );
    5173    48020792 :     move64();
    5174    48020792 :     x[15] = CL_add( tt[1], tt[3] );
    5175    48020792 :     move64();
    5176             : 
    5177    48020792 :     tt[0] = CL_add( y[4], y[6] );
    5178    48020792 :     move64();
    5179    48020792 :     tt[1] = CL_sub( y[4], y[6] );
    5180    48020792 :     move64();
    5181    48020792 :     tt[2] = CL_add( y[5], y[7] );
    5182    48020792 :     move64();
    5183    48020792 :     tt[3] = CL_swap_real_imag( CL_conjugate( CL_sub( y[5], y[7] ) ) );
    5184    48020792 :     move64();
    5185             : 
    5186    48020792 :     x[4] = CL_add( tt[0], tt[2] );
    5187    48020792 :     move64();
    5188    48020792 :     x[9] = CL_sub( tt[1], tt[3] );
    5189    48020792 :     move64();
    5190    48020792 :     x[14] = CL_sub( tt[0], tt[2] );
    5191    48020792 :     move64();
    5192    48020792 :     x[19] = CL_add( tt[1], tt[3] );
    5193    48020792 :     move64();
    5194             : 
    5195    48020792 :     tt[0] = CL_add( y[8], y[10] );
    5196    48020792 :     move64();
    5197    48020792 :     tt[1] = CL_sub( y[8], y[10] );
    5198    48020792 :     move64();
    5199    48020792 :     tt[2] = CL_add( y[9], y[11] );
    5200    48020792 :     move64();
    5201    48020792 :     tt[3] = CL_swap_real_imag( CL_conjugate( CL_sub( y[9], y[11] ) ) );
    5202    48020792 :     move64();
    5203             : 
    5204    48020792 :     x[8] = CL_add( tt[0], tt[2] );
    5205    48020792 :     move64();
    5206    48020792 :     x[13] = CL_sub( tt[1], tt[3] );
    5207    48020792 :     move64();
    5208    48020792 :     x[18] = CL_sub( tt[0], tt[2] );
    5209    48020792 :     move64();
    5210    48020792 :     x[3] = CL_add( tt[1], tt[3] );
    5211    48020792 :     move64();
    5212             : 
    5213    48020792 :     tt[0] = CL_add( y[12], y[14] );
    5214    48020792 :     move64();
    5215    48020792 :     tt[1] = CL_sub( y[12], y[14] );
    5216    48020792 :     move64();
    5217    48020792 :     tt[2] = CL_add( y[13], y[15] );
    5218    48020792 :     move64();
    5219    48020792 :     tt[3] = CL_swap_real_imag( CL_conjugate( CL_sub( y[13], y[15] ) ) );
    5220    48020792 :     move64();
    5221             : 
    5222    48020792 :     x[12] = CL_add( tt[0], tt[2] );
    5223    48020792 :     move64();
    5224    48020792 :     x[17] = CL_sub( tt[1], tt[3] );
    5225    48020792 :     move64();
    5226    48020792 :     x[2] = CL_sub( tt[0], tt[2] );
    5227    48020792 :     move64();
    5228    48020792 :     x[7] = CL_add( tt[1], tt[3] );
    5229    48020792 :     move64();
    5230             : 
    5231    48020792 :     tt[0] = CL_add( y[16], y[18] );
    5232    48020792 :     move64();
    5233    48020792 :     tt[1] = CL_sub( y[16], y[18] );
    5234    48020792 :     move64();
    5235    48020792 :     tt[2] = CL_add( y[17], y[19] );
    5236    48020792 :     move64();
    5237    48020792 :     tt[3] = CL_swap_real_imag( CL_conjugate( CL_sub( y[17], y[19] ) ) );
    5238    48020792 :     move64();
    5239             : 
    5240    48020792 :     x[16] = CL_add( tt[0], tt[2] );
    5241    48020792 :     move64();
    5242    48020792 :     x[1] = CL_sub( tt[1], tt[3] );
    5243    48020792 :     move64();
    5244    48020792 :     x[6] = CL_sub( tt[0], tt[2] );
    5245    48020792 :     move64();
    5246    48020792 :     x[11] = CL_add( tt[1], tt[3] );
    5247    48020792 :     move64();
    5248             : 
    5249    48020792 :     return;
    5250             : }
    5251             : 
    5252   108158768 : static void fft_len30(
    5253             :     cmplx *x // Qx
    5254             : )
    5255             : {
    5256             :     cmplx t;
    5257             :     cmplx s[4];
    5258             :     cmplx xx[15];
    5259             :     cmplx y[15];
    5260             :     cmplx z[30];
    5261             :     cmplx *l, *h;
    5262             : 
    5263   108158768 :     l = &x[0];
    5264   108158768 :     h = &x[15];
    5265             : 
    5266   108158768 :     xx[0] = x[0];
    5267   108158768 :     move64();
    5268   108158768 :     xx[1] = x[18];
    5269   108158768 :     move64();
    5270   108158768 :     xx[2] = x[6];
    5271   108158768 :     move64();
    5272   108158768 :     xx[3] = x[24];
    5273   108158768 :     move64();
    5274   108158768 :     xx[4] = x[12];
    5275   108158768 :     move64();
    5276             : 
    5277   108158768 :     xx[5] = x[20];
    5278   108158768 :     move64();
    5279   108158768 :     xx[6] = x[8];
    5280   108158768 :     move64();
    5281   108158768 :     xx[7] = x[26];
    5282   108158768 :     move64();
    5283   108158768 :     xx[8] = x[14];
    5284   108158768 :     move64();
    5285   108158768 :     xx[9] = x[2];
    5286   108158768 :     move64();
    5287             : 
    5288   108158768 :     xx[10] = x[10];
    5289   108158768 :     move64();
    5290   108158768 :     xx[11] = x[28];
    5291   108158768 :     move64();
    5292   108158768 :     xx[12] = x[16];
    5293   108158768 :     move64();
    5294   108158768 :     xx[13] = x[4];
    5295   108158768 :     move64();
    5296   108158768 :     xx[14] = x[22];
    5297   108158768 :     move64();
    5298             : 
    5299   108158768 :     s[0] = CL_add( xx[1], xx[4] );
    5300   108158768 :     move64();
    5301   108158768 :     s[3] = CL_sub( xx[1], xx[4] );
    5302   108158768 :     move64();
    5303   108158768 :     s[2] = CL_add( xx[2], xx[3] );
    5304   108158768 :     move64();
    5305   108158768 :     s[1] = CL_sub( xx[2], xx[3] );
    5306   108158768 :     move64();
    5307   108158768 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
    5308   108158768 :     s[0] = CL_add( s[0], s[2] );
    5309   108158768 :     move64();
    5310   108158768 :     y[0] = CL_add( xx[0], s[0] );
    5311   108158768 :     s[0] = CL_add( y[0], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    5312   108158768 :     move64();
    5313   108158768 :     s[2] = CL_sub( s[0], t );
    5314   108158768 :     move64();
    5315   108158768 :     s[0] = CL_add( s[0], t );
    5316   108158768 :     move64();
    5317   108158768 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
    5318   108158768 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    5319   108158768 :     move64();
    5320   108158768 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
    5321   108158768 :     move64();
    5322             : 
    5323   108158768 :     y[1] = CL_msu_j( s[0], s[1] );
    5324   108158768 :     move64();
    5325   108158768 :     y[4] = CL_mac_j( s[0], s[1] );
    5326   108158768 :     move64();
    5327   108158768 :     y[2] = CL_mac_j( s[2], s[3] );
    5328   108158768 :     move64();
    5329   108158768 :     y[3] = CL_msu_j( s[2], s[3] );
    5330   108158768 :     move64();
    5331             : 
    5332   108158768 :     s[0] = CL_add( xx[6], xx[9] );
    5333   108158768 :     move64();
    5334   108158768 :     s[3] = CL_sub( xx[6], xx[9] );
    5335   108158768 :     move64();
    5336   108158768 :     s[2] = CL_add( xx[7], xx[8] );
    5337   108158768 :     move64();
    5338   108158768 :     s[1] = CL_sub( xx[7], xx[8] );
    5339   108158768 :     move64();
    5340   108158768 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 );
    5341   108158768 :     s[0] = CL_add( s[0], s[2] );
    5342   108158768 :     move64();
    5343   108158768 :     y[5] = CL_add( xx[5], s[0] );
    5344   108158768 :     move64();
    5345   108158768 :     s[0] = CL_add( y[5], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    5346   108158768 :     move64();
    5347   108158768 :     s[2] = CL_sub( s[0], t );
    5348   108158768 :     move64();
    5349   108158768 :     s[0] = CL_add( s[0], t );
    5350   108158768 :     move64();
    5351   108158768 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
    5352   108158768 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    5353   108158768 :     move64();
    5354   108158768 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
    5355   108158768 :     move64();
    5356             : 
    5357   108158768 :     y[6] = CL_msu_j( s[0], s[1] );
    5358   108158768 :     move64();
    5359   108158768 :     y[9] = CL_mac_j( s[0], s[1] );
    5360   108158768 :     move64();
    5361   108158768 :     y[7] = CL_mac_j( s[2], s[3] );
    5362   108158768 :     move64();
    5363   108158768 :     y[8] = CL_msu_j( s[2], s[3] );
    5364   108158768 :     move64();
    5365             : 
    5366   108158768 :     s[0] = CL_add( xx[11], xx[14] );
    5367   108158768 :     move64();
    5368   108158768 :     s[3] = CL_sub( xx[11], xx[14] );
    5369   108158768 :     move64();
    5370   108158768 :     s[2] = CL_add( xx[12], xx[13] );
    5371   108158768 :     move64();
    5372   108158768 :     s[1] = CL_sub( xx[12], xx[13] );
    5373   108158768 :     move64();
    5374   108158768 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 );
    5375   108158768 :     s[0] = CL_add( s[0], s[2] );
    5376   108158768 :     move64();
    5377   108158768 :     y[10] = CL_add( xx[10], s[0] );
    5378   108158768 :     move64();
    5379   108158768 :     s[0] = CL_add( y[10], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    5380   108158768 :     s[2] = CL_sub( s[0], t );
    5381   108158768 :     move64();
    5382   108158768 :     s[0] = CL_add( s[0], t );
    5383   108158768 :     move64();
    5384   108158768 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
    5385   108158768 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    5386   108158768 :     move64();
    5387   108158768 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) );
    5388   108158768 :     move64();
    5389             : 
    5390   108158768 :     y[11] = CL_msu_j( s[0], s[1] );
    5391   108158768 :     move64();
    5392   108158768 :     y[14] = CL_mac_j( s[0], s[1] );
    5393   108158768 :     move64();
    5394   108158768 :     y[12] = CL_mac_j( s[2], s[3] );
    5395   108158768 :     move64();
    5396   108158768 :     y[13] = CL_msu_j( s[2], s[3] );
    5397   108158768 :     move64();
    5398             : 
    5399   108158768 :     s[0] = CL_add( y[5], y[10] );
    5400   108158768 :     move64();
    5401   108158768 :     s[1] = CL_scale( CL_sub( y[5], y[10] ), FFT_C31 ); // Qx
    5402   108158768 :     move64();
    5403   108158768 :     z[0] = CL_add( y[0], s[0] );
    5404   108158768 :     move64();
    5405   108158768 :     s[0] = CL_sub( y[0], CL_shr( s[0], 1 ) );
    5406   108158768 :     move64();
    5407             : 
    5408   108158768 :     z[10] = CL_mac_j( s[0], s[1] );
    5409   108158768 :     move64();
    5410   108158768 :     z[5] = CL_msu_j( s[0], s[1] );
    5411   108158768 :     move64();
    5412             : 
    5413   108158768 :     s[0] = CL_add( y[6], y[11] );
    5414   108158768 :     move64();
    5415   108158768 :     s[1] = CL_scale( CL_sub( y[6], y[11] ), FFT_C31 ); // Qx
    5416   108158768 :     move64();
    5417   108158768 :     z[6] = CL_add( y[1], s[0] );
    5418   108158768 :     move64();
    5419   108158768 :     s[0] = CL_sub( y[1], CL_shr( s[0], 1 ) );
    5420   108158768 :     move64();
    5421             : 
    5422   108158768 :     z[1] = CL_mac_j( s[0], s[1] );
    5423   108158768 :     move64();
    5424   108158768 :     z[11] = CL_msu_j( s[0], s[1] );
    5425   108158768 :     move64();
    5426             : 
    5427   108158768 :     s[0] = CL_add( y[7], y[12] );
    5428   108158768 :     move64();
    5429   108158768 :     s[1] = CL_scale( CL_sub( y[7], y[12] ), FFT_C31 ); // Qx
    5430   108158768 :     move64();
    5431   108158768 :     z[12] = CL_add( y[2], s[0] );
    5432   108158768 :     move64();
    5433   108158768 :     s[0] = CL_sub( y[2], CL_shr( s[0], 1 ) );
    5434   108158768 :     move64();
    5435             : 
    5436   108158768 :     z[7] = CL_mac_j( s[0], s[1] );
    5437   108158768 :     move64();
    5438   108158768 :     z[2] = CL_msu_j( s[0], s[1] );
    5439   108158768 :     move64();
    5440             : 
    5441   108158768 :     s[0] = CL_add( y[8], y[13] );
    5442   108158768 :     move64();
    5443   108158768 :     s[1] = CL_scale( CL_sub( y[8], y[13] ), FFT_C31 ); // Qx
    5444   108158768 :     move64();
    5445   108158768 :     z[3] = CL_add( y[3], s[0] );
    5446   108158768 :     move64();
    5447   108158768 :     s[0] = CL_sub( y[3], CL_shr( s[0], 1 ) );
    5448   108158768 :     move64();
    5449             : 
    5450   108158768 :     z[13] = CL_mac_j( s[0], s[1] );
    5451   108158768 :     move64();
    5452   108158768 :     z[8] = CL_msu_j( s[0], s[1] );
    5453   108158768 :     move64();
    5454             : 
    5455   108158768 :     s[0] = CL_add( y[9], y[14] );
    5456   108158768 :     move64();
    5457   108158768 :     s[1] = CL_scale( CL_sub( y[9], y[14] ), FFT_C31 ); // Qx
    5458   108158768 :     move64();
    5459   108158768 :     z[9] = CL_add( y[4], s[0] );
    5460   108158768 :     move64();
    5461   108158768 :     s[0] = CL_sub( y[4], CL_shr( s[0], 1 ) );
    5462   108158768 :     move64();
    5463             : 
    5464   108158768 :     z[4] = CL_mac_j( s[0], s[1] );
    5465   108158768 :     move64();
    5466   108158768 :     z[14] = CL_msu_j( s[0], s[1] );
    5467   108158768 :     move64();
    5468             : 
    5469   108158768 :     xx[0] = x[15];
    5470   108158768 :     move64();
    5471   108158768 :     xx[1] = x[3];
    5472   108158768 :     move64();
    5473   108158768 :     xx[2] = x[21];
    5474   108158768 :     move64();
    5475   108158768 :     xx[3] = x[9];
    5476   108158768 :     move64();
    5477   108158768 :     xx[4] = x[27];
    5478   108158768 :     move64();
    5479             : 
    5480   108158768 :     xx[5] = x[5];
    5481   108158768 :     move64();
    5482   108158768 :     xx[6] = x[23];
    5483   108158768 :     move64();
    5484   108158768 :     xx[7] = x[11];
    5485   108158768 :     move64();
    5486   108158768 :     xx[8] = x[29];
    5487   108158768 :     move64();
    5488   108158768 :     xx[9] = x[17];
    5489   108158768 :     move64();
    5490             : 
    5491   108158768 :     xx[10] = x[25];
    5492   108158768 :     move64();
    5493   108158768 :     xx[11] = x[13];
    5494   108158768 :     move64();
    5495   108158768 :     xx[12] = x[1];
    5496   108158768 :     move64();
    5497   108158768 :     xx[13] = x[19];
    5498   108158768 :     move64();
    5499   108158768 :     xx[14] = x[7];
    5500   108158768 :     move64();
    5501             : 
    5502   108158768 :     s[0] = CL_add( xx[1], xx[4] );
    5503   108158768 :     move64();
    5504   108158768 :     s[3] = CL_sub( xx[1], xx[4] );
    5505   108158768 :     move64();
    5506   108158768 :     s[2] = CL_add( xx[2], xx[3] );
    5507   108158768 :     move64();
    5508   108158768 :     s[1] = CL_sub( xx[2], xx[3] );
    5509   108158768 :     move64();
    5510   108158768 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
    5511   108158768 :     s[0] = CL_add( s[0], s[2] );
    5512   108158768 :     move64();
    5513   108158768 :     y[0] = CL_add( xx[0], s[0] );
    5514   108158768 :     move64();
    5515   108158768 :     s[0] = CL_add( y[0], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    5516   108158768 :     move64();
    5517   108158768 :     s[2] = CL_sub( s[0], t );
    5518   108158768 :     move64();
    5519   108158768 :     s[0] = CL_add( s[0], t );
    5520   108158768 :     move64();
    5521   108158768 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );              // Qx
    5522   108158768 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    5523   108158768 :     move64();
    5524   108158768 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
    5525   108158768 :     move64();
    5526             : 
    5527   108158768 :     y[1] = CL_msu_j( s[0], s[1] );
    5528   108158768 :     move64();
    5529   108158768 :     y[4] = CL_mac_j( s[0], s[1] );
    5530   108158768 :     move64();
    5531   108158768 :     y[2] = CL_mac_j( s[2], s[3] );
    5532   108158768 :     move64();
    5533   108158768 :     y[3] = CL_msu_j( s[2], s[3] );
    5534   108158768 :     move64();
    5535             : 
    5536   108158768 :     s[0] = CL_add( xx[6], xx[9] );
    5537   108158768 :     move64();
    5538   108158768 :     s[3] = CL_sub( xx[6], xx[9] );
    5539   108158768 :     move64();
    5540   108158768 :     s[2] = CL_add( xx[7], xx[8] );
    5541   108158768 :     move64();
    5542   108158768 :     s[1] = CL_sub( xx[7], xx[8] );
    5543   108158768 :     move64();
    5544   108158768 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
    5545   108158768 :     s[0] = CL_add( s[0], s[2] );
    5546   108158768 :     move64();
    5547   108158768 :     y[5] = CL_add( xx[5], s[0] );
    5548   108158768 :     move64();
    5549   108158768 :     s[0] = CL_add( y[5], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    5550   108158768 :     move64();
    5551   108158768 :     s[2] = CL_sub( s[0], t );
    5552   108158768 :     move64();
    5553   108158768 :     s[0] = CL_add( s[0], t );
    5554   108158768 :     move64();
    5555   108158768 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );              // Qx
    5556   108158768 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    5557   108158768 :     move64();
    5558   108158768 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
    5559   108158768 :     move64();
    5560             : 
    5561   108158768 :     y[6] = CL_msu_j( s[0], s[1] );
    5562   108158768 :     move64();
    5563   108158768 :     y[9] = CL_mac_j( s[0], s[1] );
    5564   108158768 :     move64();
    5565   108158768 :     y[7] = CL_mac_j( s[2], s[3] );
    5566   108158768 :     move64();
    5567   108158768 :     y[8] = CL_msu_j( s[2], s[3] );
    5568   108158768 :     move64();
    5569             : 
    5570   108158768 :     s[0] = CL_add( xx[11], xx[14] );
    5571   108158768 :     move64();
    5572   108158768 :     s[3] = CL_sub( xx[11], xx[14] );
    5573   108158768 :     move64();
    5574   108158768 :     s[2] = CL_add( xx[12], xx[13] );
    5575   108158768 :     move64();
    5576   108158768 :     s[1] = CL_sub( xx[12], xx[13] );
    5577   108158768 :     move64();
    5578   108158768 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
    5579   108158768 :     s[0] = CL_add( s[0], s[2] );
    5580   108158768 :     move64();
    5581   108158768 :     y[10] = CL_add( xx[10], s[0] );
    5582   108158768 :     move64();
    5583   108158768 :     s[0] = CL_add( y[10], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    5584   108158768 :     move64();
    5585   108158768 :     s[2] = CL_sub( s[0], t );
    5586   108158768 :     move64();
    5587   108158768 :     s[0] = CL_add( s[0], t );
    5588   108158768 :     move64();
    5589   108158768 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );              // Qx
    5590   108158768 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    5591   108158768 :     move64();
    5592   108158768 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
    5593   108158768 :     move64();
    5594             : 
    5595   108158768 :     y[11] = CL_msu_j( s[0], s[1] );
    5596   108158768 :     move64();
    5597   108158768 :     y[14] = CL_mac_j( s[0], s[1] );
    5598   108158768 :     move64();
    5599   108158768 :     y[12] = CL_mac_j( s[2], s[3] );
    5600   108158768 :     move64();
    5601   108158768 :     y[13] = CL_msu_j( s[2], s[3] );
    5602   108158768 :     move64();
    5603             : 
    5604   108158768 :     s[0] = CL_add( y[5], y[10] );
    5605   108158768 :     move64();
    5606   108158768 :     s[1] = CL_scale( CL_sub( y[5], y[10] ), FFT_C31 ); // Qx
    5607   108158768 :     move64();
    5608   108158768 :     z[15] = CL_add( y[0], s[0] );
    5609   108158768 :     move64();
    5610   108158768 :     s[0] = CL_sub( y[0], CL_shr( s[0], 1 ) );
    5611   108158768 :     move64();
    5612             : 
    5613   108158768 :     z[25] = CL_mac_j( s[0], s[1] );
    5614   108158768 :     move64();
    5615   108158768 :     z[20] = CL_msu_j( s[0], s[1] );
    5616   108158768 :     move64();
    5617             : 
    5618   108158768 :     s[0] = CL_add( y[6], y[11] );
    5619   108158768 :     move64();
    5620   108158768 :     s[1] = CL_scale( CL_sub( y[6], y[11] ), FFT_C31 ); // Qx
    5621   108158768 :     move64();
    5622   108158768 :     z[21] = CL_add( y[1], s[0] );
    5623   108158768 :     move64();
    5624   108158768 :     s[0] = CL_sub( y[1], CL_shr( s[0], 1 ) );
    5625   108158768 :     move64();
    5626             : 
    5627   108158768 :     z[16] = CL_mac_j( s[0], s[1] );
    5628   108158768 :     move64();
    5629   108158768 :     z[26] = CL_msu_j( s[0], s[1] );
    5630   108158768 :     move64();
    5631             : 
    5632   108158768 :     s[0] = CL_add( y[7], y[12] );
    5633   108158768 :     move64();
    5634   108158768 :     s[1] = CL_scale( CL_sub( y[7], y[12] ), FFT_C31 ); // Qx
    5635   108158768 :     move64();
    5636   108158768 :     z[27] = CL_add( y[2], s[0] );
    5637   108158768 :     move64();
    5638   108158768 :     s[0] = CL_sub( y[2], CL_shr( s[0], 1 ) );
    5639   108158768 :     move64();
    5640             : 
    5641   108158768 :     z[22] = CL_mac_j( s[0], s[1] );
    5642   108158768 :     move64();
    5643   108158768 :     z[17] = CL_msu_j( s[0], s[1] );
    5644   108158768 :     move64();
    5645             : 
    5646   108158768 :     s[0] = CL_add( y[8], y[13] );
    5647   108158768 :     move64();
    5648   108158768 :     s[1] = CL_scale( CL_sub( y[8], y[13] ), FFT_C31 ); // Qx
    5649   108158768 :     move64();
    5650   108158768 :     z[18] = CL_add( y[3], s[0] );
    5651   108158768 :     move64();
    5652   108158768 :     s[0] = CL_sub( y[3], CL_shr( s[0], 1 ) );
    5653   108158768 :     move64();
    5654             : 
    5655   108158768 :     z[28] = CL_mac_j( s[0], s[1] );
    5656   108158768 :     move64();
    5657   108158768 :     z[23] = CL_msu_j( s[0], s[1] );
    5658   108158768 :     move64();
    5659             : 
    5660   108158768 :     s[0] = CL_add( y[9], y[14] );
    5661   108158768 :     move64();
    5662   108158768 :     s[1] = CL_scale( CL_sub( y[9], y[14] ), FFT_C31 ); // Qx
    5663   108158768 :     move64();
    5664   108158768 :     z[24] = CL_add( y[4], s[0] );
    5665   108158768 :     move64();
    5666   108158768 :     s[0] = CL_sub( y[4], CL_shr( s[0], 1 ) );
    5667   108158768 :     move64();
    5668             : 
    5669   108158768 :     z[19] = CL_mac_j( s[0], s[1] );
    5670   108158768 :     move64();
    5671   108158768 :     z[29] = CL_msu_j( s[0], s[1] );
    5672   108158768 :     move64();
    5673             : 
    5674   108158768 :     s[0] = z[0];
    5675   108158768 :     move64();
    5676   108158768 :     s[1] = z[15];
    5677   108158768 :     move64();
    5678   108158768 :     *l = CL_add( s[0], s[1] );
    5679   108158768 :     move64();
    5680   108158768 :     *h = CL_sub( s[0], s[1] );
    5681   108158768 :     move64();
    5682   108158768 :     l += 1, h += 1;
    5683             : 
    5684   108158768 :     s[0] = z[8];
    5685   108158768 :     move64();
    5686   108158768 :     s[1] = z[23];
    5687   108158768 :     move64();
    5688   108158768 :     *h = CL_add( s[0], s[1] );
    5689   108158768 :     move64();
    5690   108158768 :     *l = CL_sub( s[0], s[1] );
    5691   108158768 :     move64();
    5692   108158768 :     l += 1, h += 1;
    5693             : 
    5694   108158768 :     s[0] = z[1];
    5695   108158768 :     move64();
    5696   108158768 :     s[1] = z[16];
    5697   108158768 :     move64();
    5698   108158768 :     *l = CL_add( s[0], s[1] );
    5699   108158768 :     move64();
    5700   108158768 :     *h = CL_sub( s[0], s[1] );
    5701   108158768 :     move64();
    5702   108158768 :     l += 1, h += 1;
    5703             : 
    5704   108158768 :     s[0] = z[9];
    5705   108158768 :     move64();
    5706   108158768 :     s[1] = z[24];
    5707   108158768 :     move64();
    5708   108158768 :     *h = CL_add( s[0], s[1] );
    5709   108158768 :     move64();
    5710   108158768 :     *l = CL_sub( s[0], s[1] );
    5711   108158768 :     move64();
    5712   108158768 :     l += 1, h += 1;
    5713             : 
    5714   108158768 :     s[0] = z[2];
    5715   108158768 :     move64();
    5716   108158768 :     s[1] = z[17];
    5717   108158768 :     move64();
    5718   108158768 :     *l = CL_add( s[0], s[1] );
    5719   108158768 :     move64();
    5720   108158768 :     *h = CL_sub( s[0], s[1] );
    5721   108158768 :     move64();
    5722   108158768 :     l += 1, h += 1;
    5723             : 
    5724   108158768 :     s[0] = z[10];
    5725   108158768 :     move64();
    5726   108158768 :     s[1] = z[25];
    5727   108158768 :     move64();
    5728   108158768 :     *h = CL_add( s[0], s[1] );
    5729   108158768 :     move64();
    5730   108158768 :     *l = CL_sub( s[0], s[1] );
    5731   108158768 :     move64();
    5732   108158768 :     l += 1, h += 1;
    5733             : 
    5734   108158768 :     s[0] = z[3];
    5735   108158768 :     move64();
    5736   108158768 :     s[1] = z[18];
    5737   108158768 :     move64();
    5738   108158768 :     *l = CL_add( s[0], s[1] );
    5739   108158768 :     move64();
    5740   108158768 :     *h = CL_sub( s[0], s[1] );
    5741   108158768 :     move64();
    5742   108158768 :     l += 1, h += 1;
    5743             : 
    5744   108158768 :     s[0] = z[11];
    5745   108158768 :     move64();
    5746   108158768 :     s[1] = z[26];
    5747   108158768 :     move64();
    5748   108158768 :     *h = CL_add( s[0], s[1] );
    5749   108158768 :     move64();
    5750   108158768 :     *l = CL_sub( s[0], s[1] );
    5751   108158768 :     move64();
    5752   108158768 :     l += 1, h += 1;
    5753             : 
    5754   108158768 :     s[0] = z[4];
    5755   108158768 :     move64();
    5756   108158768 :     s[1] = z[19];
    5757   108158768 :     move64();
    5758   108158768 :     *l = CL_add( s[0], s[1] );
    5759   108158768 :     move64();
    5760   108158768 :     *h = CL_sub( s[0], s[1] );
    5761   108158768 :     move64();
    5762   108158768 :     l += 1, h += 1;
    5763             : 
    5764   108158768 :     s[0] = z[12];
    5765   108158768 :     move64();
    5766   108158768 :     s[1] = z[27];
    5767   108158768 :     move64();
    5768   108158768 :     *h = CL_add( s[0], s[1] );
    5769   108158768 :     move64();
    5770   108158768 :     *l = CL_sub( s[0], s[1] );
    5771   108158768 :     move64();
    5772   108158768 :     l += 1, h += 1;
    5773             : 
    5774   108158768 :     s[0] = z[5];
    5775   108158768 :     move64();
    5776   108158768 :     s[1] = z[20];
    5777   108158768 :     move64();
    5778   108158768 :     *l = CL_add( s[0], s[1] );
    5779   108158768 :     move64();
    5780   108158768 :     *h = CL_sub( s[0], s[1] );
    5781   108158768 :     move64();
    5782   108158768 :     l += 1, h += 1;
    5783             : 
    5784   108158768 :     s[0] = z[13];
    5785   108158768 :     move64();
    5786   108158768 :     s[1] = z[28];
    5787   108158768 :     move64();
    5788   108158768 :     *h = CL_add( s[0], s[1] );
    5789   108158768 :     move64();
    5790   108158768 :     *l = CL_sub( s[0], s[1] );
    5791   108158768 :     move64();
    5792   108158768 :     l += 1, h += 1;
    5793             : 
    5794   108158768 :     s[0] = z[6];
    5795   108158768 :     move64();
    5796   108158768 :     s[1] = z[21];
    5797   108158768 :     move64();
    5798   108158768 :     *l = CL_add( s[0], s[1] );
    5799   108158768 :     move64();
    5800   108158768 :     *h = CL_sub( s[0], s[1] );
    5801   108158768 :     move64();
    5802   108158768 :     l += 1, h += 1;
    5803             : 
    5804   108158768 :     s[0] = z[14];
    5805   108158768 :     move64();
    5806   108158768 :     s[1] = z[29];
    5807   108158768 :     move64();
    5808   108158768 :     *h = CL_add( s[0], s[1] );
    5809   108158768 :     move64();
    5810   108158768 :     *l = CL_sub( s[0], s[1] );
    5811   108158768 :     move64();
    5812   108158768 :     l += 1, h += 1;
    5813             : 
    5814   108158768 :     s[0] = z[7];
    5815   108158768 :     move64();
    5816   108158768 :     s[1] = z[22];
    5817   108158768 :     move64();
    5818   108158768 :     *l = CL_add( s[0], s[1] );
    5819   108158768 :     move64();
    5820   108158768 :     *h = CL_sub( s[0], s[1] );
    5821   108158768 :     move64();
    5822   108158768 :     l += 1, h += 1;
    5823             : 
    5824   108158768 :     return;
    5825             : }
    5826             : 
    5827    27389706 : static void fft_len32(
    5828             :     cmplx *x // Qx
    5829             : )
    5830             : {
    5831             :     cmplx t[8], s[8], xx[8];
    5832             :     cmplx y[32];
    5833             :     cmplx ab;
    5834             : 
    5835    27389706 :     xx[0] = x[0];
    5836    27389706 :     move64();
    5837    27389706 :     xx[1] = x[4];
    5838    27389706 :     move64();
    5839    27389706 :     xx[2] = x[8];
    5840    27389706 :     move64();
    5841    27389706 :     xx[3] = x[12];
    5842    27389706 :     move64();
    5843    27389706 :     xx[4] = x[16];
    5844    27389706 :     move64();
    5845    27389706 :     xx[5] = x[20];
    5846    27389706 :     move64();
    5847    27389706 :     xx[6] = x[24];
    5848    27389706 :     move64();
    5849    27389706 :     xx[7] = x[28];
    5850    27389706 :     move64();
    5851             : 
    5852    27389706 :     t[0] = CL_add( xx[0], xx[4] );
    5853    27389706 :     move64();
    5854    27389706 :     t[1] = CL_sub( xx[0], xx[4] );
    5855    27389706 :     move64();
    5856    27389706 :     t[2] = CL_add( xx[1], xx[5] );
    5857    27389706 :     move64();
    5858    27389706 :     t[3] = CL_sub( xx[1], xx[5] );
    5859    27389706 :     move64();
    5860    27389706 :     t[4] = CL_add( xx[2], xx[6] );
    5861    27389706 :     move64();
    5862    27389706 :     t[5] = CL_sub( xx[2], xx[6] );
    5863    27389706 :     move64();
    5864    27389706 :     t[6] = CL_add( xx[3], xx[7] );
    5865    27389706 :     move64();
    5866    27389706 :     t[7] = CL_sub( xx[3], xx[7] );
    5867    27389706 :     move64();
    5868             : 
    5869    27389706 :     s[0] = CL_add( t[0], t[4] );
    5870    27389706 :     move64();
    5871    27389706 :     s[2] = CL_sub( t[0], t[4] );
    5872    27389706 :     move64();
    5873    27389706 :     s[4] = CL_mac_j( t[1], t[5] );
    5874    27389706 :     move64();
    5875    27389706 :     s[5] = CL_msu_j( t[1], t[5] );
    5876    27389706 :     move64();
    5877    27389706 :     s[1] = CL_add( t[2], t[6] );
    5878    27389706 :     move64();
    5879    27389706 :     s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
    5880    27389706 :     move64();
    5881    27389706 :     t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
    5882    27389706 :     move64();
    5883    27389706 :     t[1] = CL_sub( t[3], t[7] );
    5884    27389706 :     move64();
    5885             : 
    5886             :     {
    5887    27389706 :         s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); // Qx
    5888    27389706 :         move64();
    5889    27389706 :         s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); // Qx
    5890    27389706 :         move64();
    5891    27389706 :         s[7] = CL_conjugate( s[7] );
    5892    27389706 :         move64();
    5893             :     };
    5894             : 
    5895    27389706 :     y[0] = CL_add( s[0], s[1] );
    5896    27389706 :     move64();
    5897    27389706 :     y[4] = CL_sub( s[0], s[1] );
    5898    27389706 :     move64();
    5899    27389706 :     y[2] = CL_sub( s[2], s[3] );
    5900    27389706 :     move64();
    5901    27389706 :     y[6] = CL_add( s[2], s[3] );
    5902    27389706 :     move64();
    5903    27389706 :     y[3] = CL_add( s[4], s[7] );
    5904    27389706 :     move64();
    5905    27389706 :     y[7] = CL_sub( s[4], s[7] );
    5906    27389706 :     move64();
    5907    27389706 :     y[1] = CL_add( s[5], s[6] );
    5908    27389706 :     move64();
    5909    27389706 :     y[5] = CL_sub( s[5], s[6] );
    5910    27389706 :     move64();
    5911             : 
    5912    27389706 :     xx[0] = x[1];
    5913    27389706 :     move64();
    5914    27389706 :     xx[1] = x[5];
    5915    27389706 :     move64();
    5916    27389706 :     xx[2] = x[9];
    5917    27389706 :     move64();
    5918    27389706 :     xx[3] = x[13];
    5919    27389706 :     move64();
    5920    27389706 :     xx[4] = x[17];
    5921    27389706 :     move64();
    5922    27389706 :     xx[5] = x[21];
    5923    27389706 :     move64();
    5924    27389706 :     xx[6] = x[25];
    5925    27389706 :     move64();
    5926    27389706 :     xx[7] = x[29];
    5927    27389706 :     move64();
    5928             : 
    5929    27389706 :     t[0] = CL_add( xx[0], xx[4] );
    5930    27389706 :     move64();
    5931    27389706 :     t[1] = CL_sub( xx[0], xx[4] );
    5932    27389706 :     move64();
    5933    27389706 :     t[2] = CL_add( xx[1], xx[5] );
    5934    27389706 :     move64();
    5935    27389706 :     t[3] = CL_sub( xx[1], xx[5] );
    5936    27389706 :     move64();
    5937    27389706 :     t[4] = CL_add( xx[2], xx[6] );
    5938    27389706 :     move64();
    5939    27389706 :     t[5] = CL_sub( xx[2], xx[6] );
    5940    27389706 :     move64();
    5941    27389706 :     t[6] = CL_add( xx[3], xx[7] );
    5942    27389706 :     move64();
    5943    27389706 :     t[7] = CL_sub( xx[3], xx[7] );
    5944    27389706 :     move64();
    5945             : 
    5946    27389706 :     s[0] = CL_add( t[0], t[4] );
    5947    27389706 :     move64();
    5948    27389706 :     s[2] = CL_sub( t[0], t[4] );
    5949    27389706 :     move64();
    5950    27389706 :     s[4] = CL_mac_j( t[1], t[5] );
    5951    27389706 :     move64();
    5952    27389706 :     s[5] = CL_msu_j( t[1], t[5] );
    5953    27389706 :     move64();
    5954    27389706 :     s[1] = CL_add( t[2], t[6] );
    5955    27389706 :     move64();
    5956    27389706 :     s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
    5957    27389706 :     move64();
    5958    27389706 :     t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
    5959    27389706 :     move64();
    5960    27389706 :     t[1] = CL_sub( t[3], t[7] );
    5961    27389706 :     move64();
    5962             : 
    5963             :     {
    5964    27389706 :         s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 );
    5965    27389706 :         move64();
    5966    27389706 :         s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 );
    5967    27389706 :         move64();
    5968    27389706 :         s[7] = CL_conjugate( s[7] );
    5969    27389706 :         move64();
    5970             :     };
    5971             : 
    5972    27389706 :     y[8] = CL_add( s[0], s[1] );
    5973    27389706 :     move64();
    5974    27389706 :     y[12] = CL_sub( s[0], s[1] );
    5975    27389706 :     move64();
    5976    27389706 :     y[10] = CL_sub( s[2], s[3] );
    5977    27389706 :     move64();
    5978    27389706 :     y[14] = CL_add( s[2], s[3] );
    5979    27389706 :     move64();
    5980    27389706 :     y[11] = CL_add( s[4], s[7] );
    5981    27389706 :     move64();
    5982    27389706 :     y[15] = CL_sub( s[4], s[7] );
    5983    27389706 :     move64();
    5984    27389706 :     y[9] = CL_add( s[5], s[6] );
    5985    27389706 :     move64();
    5986    27389706 :     y[13] = CL_sub( s[5], s[6] );
    5987    27389706 :     move64();
    5988             : 
    5989    27389706 :     xx[0] = x[2];
    5990    27389706 :     move64();
    5991    27389706 :     xx[1] = x[6];
    5992    27389706 :     move64();
    5993    27389706 :     xx[2] = x[10];
    5994    27389706 :     move64();
    5995    27389706 :     xx[3] = x[14];
    5996    27389706 :     move64();
    5997    27389706 :     xx[4] = x[18];
    5998    27389706 :     move64();
    5999    27389706 :     xx[5] = x[22];
    6000    27389706 :     move64();
    6001    27389706 :     xx[6] = x[26];
    6002    27389706 :     move64();
    6003    27389706 :     xx[7] = x[30];
    6004    27389706 :     move64();
    6005             : 
    6006    27389706 :     t[0] = CL_add( xx[0], xx[4] );
    6007    27389706 :     move64();
    6008    27389706 :     t[1] = CL_sub( xx[0], xx[4] );
    6009    27389706 :     move64();
    6010    27389706 :     t[2] = CL_add( xx[1], xx[5] );
    6011    27389706 :     move64();
    6012    27389706 :     t[3] = CL_sub( xx[1], xx[5] );
    6013    27389706 :     move64();
    6014    27389706 :     t[4] = CL_add( xx[2], xx[6] );
    6015    27389706 :     move64();
    6016    27389706 :     t[5] = CL_sub( xx[2], xx[6] );
    6017    27389706 :     move64();
    6018    27389706 :     t[6] = CL_add( xx[3], xx[7] );
    6019    27389706 :     move64();
    6020    27389706 :     t[7] = CL_sub( xx[3], xx[7] );
    6021    27389706 :     move64();
    6022             : 
    6023    27389706 :     s[0] = CL_add( t[0], t[4] );
    6024    27389706 :     move64();
    6025    27389706 :     s[2] = CL_sub( t[0], t[4] );
    6026    27389706 :     move64();
    6027    27389706 :     s[4] = CL_mac_j( t[1], t[5] );
    6028    27389706 :     move64();
    6029    27389706 :     s[5] = CL_msu_j( t[1], t[5] );
    6030    27389706 :     move64();
    6031    27389706 :     s[1] = CL_add( t[2], t[6] );
    6032    27389706 :     move64();
    6033    27389706 :     s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
    6034    27389706 :     move64();
    6035    27389706 :     t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
    6036    27389706 :     move64();
    6037    27389706 :     t[1] = CL_sub( t[3], t[7] );
    6038    27389706 :     move64();
    6039             : 
    6040             :     {
    6041    27389706 :         s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); // Qx
    6042    27389706 :         move64();
    6043    27389706 :         s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); // Qx
    6044    27389706 :         move64();
    6045    27389706 :         s[7] = CL_conjugate( s[7] );
    6046    27389706 :         move64();
    6047             :     };
    6048             : 
    6049    27389706 :     y[16] = CL_add( s[0], s[1] );
    6050    27389706 :     move64();
    6051    27389706 :     y[20] = CL_sub( s[0], s[1] );
    6052    27389706 :     move64();
    6053    27389706 :     y[18] = CL_sub( s[2], s[3] );
    6054    27389706 :     move64();
    6055    27389706 :     y[22] = CL_add( s[2], s[3] );
    6056    27389706 :     move64();
    6057    27389706 :     y[19] = CL_add( s[4], s[7] );
    6058    27389706 :     move64();
    6059    27389706 :     y[23] = CL_sub( s[4], s[7] );
    6060    27389706 :     move64();
    6061    27389706 :     y[17] = CL_add( s[5], s[6] );
    6062    27389706 :     move64();
    6063    27389706 :     y[21] = CL_sub( s[5], s[6] );
    6064    27389706 :     move64();
    6065             : 
    6066    27389706 :     xx[0] = x[3];
    6067    27389706 :     move64();
    6068    27389706 :     xx[1] = x[7];
    6069    27389706 :     move64();
    6070    27389706 :     xx[2] = x[11];
    6071    27389706 :     move64();
    6072    27389706 :     xx[3] = x[15];
    6073    27389706 :     move64();
    6074    27389706 :     xx[4] = x[19];
    6075    27389706 :     move64();
    6076    27389706 :     xx[5] = x[23];
    6077    27389706 :     move64();
    6078    27389706 :     xx[6] = x[27];
    6079    27389706 :     move64();
    6080    27389706 :     xx[7] = x[31];
    6081    27389706 :     move64();
    6082             : 
    6083    27389706 :     t[0] = CL_add( xx[0], xx[4] );
    6084    27389706 :     move64();
    6085    27389706 :     t[1] = CL_sub( xx[0], xx[4] );
    6086    27389706 :     move64();
    6087    27389706 :     t[2] = CL_add( xx[1], xx[5] );
    6088    27389706 :     move64();
    6089    27389706 :     t[3] = CL_sub( xx[1], xx[5] );
    6090    27389706 :     move64();
    6091    27389706 :     t[4] = CL_add( xx[2], xx[6] );
    6092    27389706 :     move64();
    6093    27389706 :     t[5] = CL_sub( xx[2], xx[6] );
    6094    27389706 :     move64();
    6095    27389706 :     t[6] = CL_add( xx[3], xx[7] );
    6096    27389706 :     move64();
    6097    27389706 :     t[7] = CL_sub( xx[3], xx[7] );
    6098    27389706 :     move64();
    6099             : 
    6100    27389706 :     s[0] = CL_add( t[0], t[4] );
    6101    27389706 :     move64();
    6102    27389706 :     s[2] = CL_sub( t[0], t[4] );
    6103    27389706 :     move64();
    6104    27389706 :     s[4] = CL_mac_j( t[1], t[5] );
    6105    27389706 :     move64();
    6106    27389706 :     s[5] = CL_msu_j( t[1], t[5] );
    6107    27389706 :     move64();
    6108    27389706 :     s[1] = CL_add( t[2], t[6] );
    6109    27389706 :     move64();
    6110    27389706 :     s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
    6111    27389706 :     move64();
    6112    27389706 :     t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
    6113    27389706 :     move64();
    6114    27389706 :     t[1] = CL_sub( t[3], t[7] );
    6115    27389706 :     move64();
    6116             : 
    6117             :     {
    6118    27389706 :         s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); // Qx
    6119    27389706 :         move64();
    6120    27389706 :         s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); // Qx
    6121    27389706 :         move64();
    6122    27389706 :         s[7] = CL_conjugate( s[7] );
    6123    27389706 :         move64();
    6124             :     };
    6125             : 
    6126    27389706 :     y[24] = CL_add( s[0], s[1] );
    6127    27389706 :     move64();
    6128    27389706 :     y[28] = CL_sub( s[0], s[1] );
    6129    27389706 :     move64();
    6130    27389706 :     y[26] = CL_sub( s[2], s[3] );
    6131    27389706 :     move64();
    6132    27389706 :     y[30] = CL_add( s[2], s[3] );
    6133    27389706 :     move64();
    6134    27389706 :     y[27] = CL_add( s[4], s[7] );
    6135    27389706 :     move64();
    6136    27389706 :     y[31] = CL_sub( s[4], s[7] );
    6137    27389706 :     move64();
    6138    27389706 :     y[25] = CL_add( s[5], s[6] );
    6139    27389706 :     move64();
    6140    27389706 :     y[29] = CL_sub( s[5], s[6] );
    6141    27389706 :     move64();
    6142             : 
    6143             :     {
    6144    27389706 :         ab = y[9];
    6145    27389706 :         move64();
    6146    27389706 :         y[9] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[0] ), CL_scale( ab, FFT_RotVector_32_fx[1] ) ); // Qx
    6147    27389706 :         move64();
    6148             :     };
    6149             :     {
    6150    27389706 :         ab = y[10];
    6151    27389706 :         move64();
    6152    27389706 :         y[10] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[2] ), CL_scale( ab, FFT_RotVector_32_fx[3] ) ); // Qx
    6153    27389706 :         move64();
    6154             :     };
    6155             :     {
    6156    27389706 :         ab = y[11];
    6157    27389706 :         move64();
    6158    27389706 :         y[11] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[4] ), CL_scale( ab, FFT_RotVector_32_fx[5] ) ); // Qx
    6159    27389706 :         move64();
    6160             :     };
    6161             :     {
    6162    27389706 :         ab = y[12];
    6163    27389706 :         move64();
    6164    27389706 :         y[12] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[6] ), CL_scale( ab, FFT_RotVector_32_fx[7] ) ); // Qx
    6165    27389706 :         move64();
    6166             :     };
    6167             :     {
    6168    27389706 :         ab = y[13];
    6169    27389706 :         move64();
    6170    27389706 :         y[13] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[8] ), CL_scale( ab, FFT_RotVector_32_fx[9] ) ); // Qx
    6171    27389706 :         move64();
    6172             :     };
    6173             :     {
    6174    27389706 :         ab = y[14];
    6175    27389706 :         move64();
    6176    27389706 :         y[14] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[10] ), CL_scale( ab, FFT_RotVector_32_fx[11] ) ); // Qx
    6177    27389706 :         move64();
    6178             :     };
    6179             :     {
    6180    27389706 :         ab = y[15];
    6181    27389706 :         move64();
    6182    27389706 :         y[15] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[12] ), CL_scale( ab, FFT_RotVector_32_fx[13] ) ); // Qx
    6183    27389706 :         move64();
    6184             :     };
    6185             :     {
    6186    27389706 :         ab = y[17];
    6187    27389706 :         move64();
    6188    27389706 :         y[17] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[14] ), CL_scale( ab, FFT_RotVector_32_fx[15] ) );
    6189    27389706 :         move64();
    6190             :     };
    6191             :     {
    6192    27389706 :         ab = y[18];
    6193    27389706 :         move64();
    6194    27389706 :         y[18] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[16] ), CL_scale( ab, FFT_RotVector_32_fx[17] ) );
    6195    27389706 :         move64();
    6196             :     };
    6197             :     {
    6198    27389706 :         ab = y[19];
    6199    27389706 :         move64();
    6200    27389706 :         y[19] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[18] ), CL_scale( ab, FFT_RotVector_32_fx[19] ) );
    6201    27389706 :         move64();
    6202             :     };
    6203             :     {
    6204    27389706 :         ab = y[21];
    6205    27389706 :         move64();
    6206    27389706 :         y[21] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[20] ), CL_scale( ab, FFT_RotVector_32_fx[21] ) );
    6207    27389706 :         move64();
    6208             :     };
    6209             :     {
    6210    27389706 :         ab = y[22];
    6211    27389706 :         move64();
    6212    27389706 :         y[22] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[22] ), CL_scale( ab, FFT_RotVector_32_fx[23] ) );
    6213    27389706 :         move64();
    6214             :     };
    6215             :     {
    6216    27389706 :         ab = y[23];
    6217    27389706 :         move64();
    6218    27389706 :         y[23] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[24] ), CL_scale( ab, FFT_RotVector_32_fx[25] ) );
    6219    27389706 :         move64();
    6220             :     };
    6221             :     {
    6222    27389706 :         ab = y[25];
    6223    27389706 :         move64();
    6224    27389706 :         y[25] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[26] ), CL_scale( ab, FFT_RotVector_32_fx[27] ) );
    6225    27389706 :         move64();
    6226             :     };
    6227             :     {
    6228    27389706 :         ab = y[26];
    6229    27389706 :         move64();
    6230    27389706 :         y[26] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[28] ), CL_scale( ab, FFT_RotVector_32_fx[29] ) );
    6231    27389706 :         move64();
    6232             :     };
    6233             :     {
    6234    27389706 :         ab = y[27];
    6235    27389706 :         move64();
    6236    27389706 :         y[27] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[30] ), CL_scale( ab, FFT_RotVector_32_fx[31] ) );
    6237    27389706 :         move64();
    6238             :     };
    6239             :     {
    6240    27389706 :         ab = y[28];
    6241    27389706 :         move64();
    6242    27389706 :         y[28] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[32] ), CL_scale( ab, FFT_RotVector_32_fx[33] ) );
    6243    27389706 :         move64();
    6244             :     };
    6245             :     {
    6246    27389706 :         ab = y[29];
    6247    27389706 :         move64();
    6248    27389706 :         y[29] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[34] ), CL_scale( ab, FFT_RotVector_32_fx[35] ) );
    6249    27389706 :         move64();
    6250             :     };
    6251             :     {
    6252    27389706 :         ab = y[30];
    6253    27389706 :         move64();
    6254    27389706 :         y[30] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[36] ), CL_scale( ab, FFT_RotVector_32_fx[37] ) );
    6255    27389706 :         move64();
    6256             :     };
    6257             :     {
    6258    27389706 :         ab = y[31];
    6259    27389706 :         move64();
    6260    27389706 :         y[31] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[38] ), CL_scale( ab, FFT_RotVector_32_fx[39] ) );
    6261    27389706 :         move64();
    6262             :     };
    6263             : 
    6264    27389706 :     t[0] = CL_add( y[0], y[16] );
    6265    27389706 :     move64();
    6266    27389706 :     t[1] = CL_sub( y[0], y[16] );
    6267    27389706 :     move64();
    6268    27389706 :     t[2] = CL_add( y[8], y[24] );
    6269    27389706 :     move64();
    6270    27389706 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[8] ), CL_conjugate( y[24] ) ) );
    6271    27389706 :     move64();
    6272             : 
    6273    27389706 :     x[0] = CL_add( t[0], t[2] );
    6274    27389706 :     move64();
    6275    27389706 :     x[8] = CL_sub( t[1], t[3] );
    6276    27389706 :     move64();
    6277    27389706 :     x[16] = CL_sub( t[0], t[2] );
    6278    27389706 :     move64();
    6279    27389706 :     x[24] = CL_add( t[1], t[3] );
    6280    27389706 :     move64();
    6281             : 
    6282    27389706 :     t[0] = CL_add( y[1], y[17] );
    6283    27389706 :     move64();
    6284    27389706 :     t[1] = CL_sub( y[1], y[17] );
    6285    27389706 :     move64();
    6286    27389706 :     t[2] = CL_add( y[9], y[25] );
    6287    27389706 :     move64();
    6288    27389706 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[9] ), CL_conjugate( y[25] ) ) );
    6289    27389706 :     move64();
    6290             : 
    6291    27389706 :     x[1] = CL_add( t[0], t[2] );
    6292    27389706 :     move64();
    6293    27389706 :     x[9] = CL_sub( t[1], t[3] );
    6294    27389706 :     move64();
    6295    27389706 :     x[17] = CL_sub( t[0], t[2] );
    6296    27389706 :     move64();
    6297    27389706 :     x[25] = CL_add( t[1], t[3] );
    6298    27389706 :     move64();
    6299             : 
    6300    27389706 :     t[0] = CL_add( y[2], y[18] );
    6301    27389706 :     move64();
    6302    27389706 :     t[1] = CL_sub( y[2], y[18] );
    6303    27389706 :     move64();
    6304    27389706 :     t[2] = CL_add( y[10], y[26] );
    6305    27389706 :     move64();
    6306    27389706 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[10] ), CL_conjugate( y[26] ) ) );
    6307    27389706 :     move64();
    6308             : 
    6309    27389706 :     x[2] = CL_add( t[0], t[2] );
    6310    27389706 :     move64();
    6311    27389706 :     x[10] = CL_sub( t[1], t[3] );
    6312    27389706 :     move64();
    6313    27389706 :     x[18] = CL_sub( t[0], t[2] );
    6314    27389706 :     move64();
    6315    27389706 :     x[26] = CL_add( t[1], t[3] );
    6316    27389706 :     move64();
    6317             : 
    6318    27389706 :     t[0] = CL_add( y[3], y[19] );
    6319    27389706 :     move64();
    6320    27389706 :     t[1] = CL_sub( y[3], y[19] );
    6321    27389706 :     move64();
    6322    27389706 :     t[2] = CL_add( y[11], y[27] );
    6323    27389706 :     move64();
    6324    27389706 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[11] ), CL_conjugate( y[27] ) ) );
    6325    27389706 :     move64();
    6326             : 
    6327    27389706 :     x[3] = CL_add( t[0], t[2] );
    6328    27389706 :     move64();
    6329    27389706 :     x[11] = CL_sub( t[1], t[3] );
    6330    27389706 :     move64();
    6331    27389706 :     x[19] = CL_sub( t[0], t[2] );
    6332    27389706 :     move64();
    6333    27389706 :     x[27] = CL_add( t[1], t[3] );
    6334    27389706 :     move64();
    6335             : 
    6336    27389706 :     t[0] = CL_msu_j( y[4], y[20] );
    6337    27389706 :     move64();
    6338    27389706 :     t[1] = CL_mac_j( y[4], y[20] );
    6339    27389706 :     move64();
    6340    27389706 :     t[2] = CL_add( y[12], y[28] );
    6341    27389706 :     move64();
    6342    27389706 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[12] ), CL_conjugate( y[28] ) ) );
    6343    27389706 :     move64();
    6344             : 
    6345    27389706 :     x[4] = CL_add( t[0], t[2] );
    6346    27389706 :     move64();
    6347    27389706 :     x[12] = CL_sub( t[1], t[3] );
    6348    27389706 :     move64();
    6349    27389706 :     x[20] = CL_sub( t[0], t[2] );
    6350    27389706 :     move64();
    6351    27389706 :     x[28] = CL_add( t[1], t[3] );
    6352    27389706 :     move64();
    6353             : 
    6354    27389706 :     t[0] = CL_add( y[5], y[21] );
    6355    27389706 :     move64();
    6356    27389706 :     t[1] = CL_sub( y[5], y[21] );
    6357    27389706 :     move64();
    6358    27389706 :     t[2] = CL_add( y[13], y[29] );
    6359    27389706 :     move64();
    6360    27389706 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[13] ), CL_conjugate( y[29] ) ) );
    6361    27389706 :     move64();
    6362             : 
    6363    27389706 :     x[5] = CL_add( t[0], t[2] );
    6364    27389706 :     move64();
    6365    27389706 :     x[13] = CL_sub( t[1], t[3] );
    6366    27389706 :     move64();
    6367    27389706 :     x[21] = CL_sub( t[0], t[2] );
    6368    27389706 :     move64();
    6369    27389706 :     x[29] = CL_add( t[1], t[3] );
    6370    27389706 :     move64();
    6371             : 
    6372    27389706 :     t[0] = CL_add( y[6], y[22] );
    6373    27389706 :     move64();
    6374    27389706 :     t[1] = CL_sub( y[6], y[22] );
    6375    27389706 :     move64();
    6376    27389706 :     t[2] = CL_add( y[14], y[30] );
    6377    27389706 :     move64();
    6378    27389706 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[14] ), CL_conjugate( y[30] ) ) );
    6379    27389706 :     move64();
    6380             : 
    6381    27389706 :     x[6] = CL_add( t[0], t[2] );
    6382    27389706 :     move64();
    6383    27389706 :     x[14] = CL_sub( t[1], t[3] );
    6384    27389706 :     move64();
    6385    27389706 :     x[22] = CL_sub( t[0], t[2] );
    6386    27389706 :     move64();
    6387    27389706 :     x[30] = CL_add( t[1], t[3] );
    6388    27389706 :     move64();
    6389             : 
    6390    27389706 :     t[0] = CL_add( y[7], y[23] );
    6391    27389706 :     move64();
    6392    27389706 :     t[1] = CL_sub( y[7], y[23] );
    6393    27389706 :     move64();
    6394    27389706 :     t[2] = CL_add( y[15], y[31] );
    6395    27389706 :     move64();
    6396    27389706 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[15] ), CL_conjugate( y[31] ) ) );
    6397    27389706 :     move64();
    6398             : 
    6399    27389706 :     x[7] = CL_add( t[0], t[2] );
    6400    27389706 :     move64();
    6401    27389706 :     x[15] = CL_sub( t[1], t[3] );
    6402    27389706 :     move64();
    6403    27389706 :     x[23] = CL_sub( t[0], t[2] );
    6404    27389706 :     move64();
    6405    27389706 :     x[31] = CL_add( t[1], t[3] );
    6406    27389706 :     move64();
    6407             : 
    6408    27389706 :     return;
    6409             : }
    6410             : 
    6411    15369565 : static void fft_lenN(
    6412             :     cmplx *x,        // Qx
    6413             :     const Word16 *W, // Q15
    6414             :     const Word16 len,
    6415             :     const Word16 dim1,
    6416             :     const Word16 dim2,
    6417             :     const Word16 sc,
    6418             :     const Word16 Woff )
    6419             : {
    6420             :     Word16 i, j;
    6421             :     cmplx xx[L_FRAME_MAX];
    6422             : 
    6423   181374885 :     FOR( i = 0; i < dim2; i++ )
    6424             :     {
    6425  4546818008 :         FOR( j = 0; j < dim1; j++ )
    6426             :         {
    6427  4380812688 :             xx[( ( i * dim1 ) + j )].re = x[( i + ( j * dim2 ) )].re; // Qx
    6428  4380812688 :             move64();
    6429  4380812688 :             xx[( ( i * dim1 ) + j )].im = x[( i + ( j * dim2 ) )].im; // Qx
    6430  4380812688 :             move64();
    6431             :         }
    6432             :     }
    6433             : 
    6434    15369565 :     SWITCH( dim1 )
    6435             :     {
    6436           0 :         case 5:
    6437           0 :             FOR( i = 0; i < dim2; i++ )
    6438             :             {
    6439           0 :                 fft_len5( &xx[( i * dim1 )] );
    6440             :             }
    6441           0 :             BREAK;
    6442             : 
    6443           0 :         case 8:
    6444           0 :             FOR( i = 0; i < dim2; i++ )
    6445             :             {
    6446           0 :                 fft_len8( &xx[( i * dim1 )] );
    6447             :             }
    6448           0 :             BREAK;
    6449             : 
    6450      311612 :         case 10:
    6451     2804508 :             FOR( i = 0; i < dim2; i++ )
    6452             :             {
    6453     2492896 :                 fft_len10( &xx[( i * dim1 )] );
    6454             :             }
    6455      311612 :             BREAK;
    6456             : 
    6457      464534 :         case 15:
    6458     4180806 :             FOR( i = 0; i < dim2; i++ )
    6459             :             {
    6460     3716272 :                 fft_len15( &xx[( i * dim1 )] );
    6461             :             }
    6462      464534 :             BREAK;
    6463             : 
    6464      162267 :         case 16:
    6465     1460403 :             FOR( i = 0; i < dim2; i++ )
    6466             :             {
    6467     1298136 :                 fft_len16( &xx[( i * dim1 )] );
    6468             :             }
    6469      162267 :             BREAK;
    6470             : 
    6471     3333669 :         case 20:
    6472    51354461 :             FOR( i = 0; i < dim2; i++ )
    6473             :             {
    6474    48020792 :                 fft_len20_fx( &xx[( i * dim1 )] );
    6475             :             }
    6476     3333669 :             BREAK;
    6477             : 
    6478    10807676 :         case 30:
    6479   118966444 :             FOR( i = 0; i < dim2; i++ )
    6480             :             {
    6481   108158768 :                 fft_len30( &xx[( i * dim1 )] );
    6482             :             }
    6483    10807676 :             BREAK;
    6484             : 
    6485      289807 :         case 32:
    6486     2608263 :             FOR( i = 0; i < dim2; i++ )
    6487             :             {
    6488     2318456 :                 fft_len32( &xx[( i * dim1 )] );
    6489             :             }
    6490      289807 :             BREAK;
    6491             :     }
    6492             : 
    6493    15369565 :     SWITCH( dim2 )
    6494             :     {
    6495             : 
    6496    12002885 :         case 8:
    6497             :         {
    6498             :             cmplx t[8];
    6499             :             cmplx s[8];
    6500             :             cmplx y[8];
    6501             : 
    6502    12002885 :             y[1] = xx[1 * dim1];
    6503    12002885 :             move64();
    6504    12002885 :             y[2] = xx[2 * dim1];
    6505    12002885 :             move64();
    6506    12002885 :             y[3] = xx[3 * dim1];
    6507    12002885 :             move64();
    6508    12002885 :             y[4] = xx[4 * dim1];
    6509    12002885 :             move64();
    6510    12002885 :             y[5] = xx[5 * dim1];
    6511    12002885 :             move64();
    6512    12002885 :             y[6] = xx[6 * dim1];
    6513    12002885 :             move64();
    6514    12002885 :             y[7] = xx[7 * dim1];
    6515    12002885 :             move64();
    6516             : 
    6517    12002885 :             test();
    6518    12002885 :             test();
    6519    12002885 :             IF( EQ_16( dim1, 8 ) || EQ_16( dim1, 16 ) || EQ_16( dim1, 32 ) )
    6520             :             {
    6521    12322170 :                 FOR( i = 0; i < dim1; i++ )
    6522             :                 {
    6523             :                     {
    6524    11870096 :                         y[0] = xx[i];
    6525    11870096 :                         move64();
    6526             :                     };
    6527    11870096 :                     IF( i > 0 )
    6528             :                     {
    6529             :                         {
    6530    11418022 :                             y[1] = CL_mac_j( CL_scale( xx[( i + ( 1 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 1 ) * dim1 ) ) - Woff )] ),
    6531    11418022 :                                              CL_scale( xx[( i + ( 1 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 1 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
    6532    11418022 :                             move64();
    6533             :                         };
    6534             :                         {
    6535    11418022 :                             y[2] = CL_mac_j( CL_scale( xx[( i + ( 2 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 2 ) * dim1 ) ) - Woff )] ),
    6536    11418022 :                                              CL_scale( xx[( i + ( 2 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 2 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
    6537    11418022 :                             move64();
    6538             :                         };
    6539             :                         {
    6540    11418022 :                             y[3] = CL_mac_j( CL_scale( xx[( i + ( 3 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 3 ) * dim1 ) ) - Woff )] ),
    6541    11418022 :                                              CL_scale( xx[( i + ( 3 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 3 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
    6542    11418022 :                             move64();
    6543             :                         };
    6544             :                         {
    6545    11418022 :                             y[4] = CL_mac_j( CL_scale( xx[( i + ( 4 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 4 ) * dim1 ) ) - Woff )] ),
    6546    11418022 :                                              CL_scale( xx[( i + ( 4 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 4 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
    6547    11418022 :                             move64();
    6548             :                         };
    6549             :                         {
    6550    11418022 :                             y[5] = CL_mac_j( CL_scale( xx[( i + ( 5 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 5 ) * dim1 ) ) - Woff )] ),
    6551    11418022 :                                              CL_scale( xx[( i + ( 5 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 5 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
    6552    11418022 :                             move64();
    6553             :                         };
    6554             :                         {
    6555    11418022 :                             y[6] = CL_mac_j( CL_scale( xx[( i + ( 6 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 6 ) * dim1 ) ) - Woff )] ),
    6556    11418022 :                                              CL_scale( xx[( i + ( 6 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 6 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
    6557    11418022 :                             move64();
    6558             :                         };
    6559             :                         {
    6560    11418022 :                             y[7] = CL_mac_j( CL_scale( xx[( i + ( 7 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 7 ) * dim1 ) ) - Woff )] ),
    6561    11418022 :                                              CL_scale( xx[( i + ( 7 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 7 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
    6562    11418022 :                             move64();
    6563             :                         };
    6564             :                     }
    6565             : 
    6566    11870096 :                     t[0] = CL_add( y[0], y[4] );
    6567    11870096 :                     move64();
    6568    11870096 :                     t[1] = CL_sub( y[0], y[4] );
    6569    11870096 :                     move64();
    6570    11870096 :                     t[2] = CL_add( y[1], y[5] );
    6571    11870096 :                     move64();
    6572    11870096 :                     t[3] = CL_sub( y[1], y[5] );
    6573    11870096 :                     move64();
    6574    11870096 :                     t[4] = CL_add( y[2], y[6] );
    6575    11870096 :                     move64();
    6576    11870096 :                     t[5] = CL_sub( y[2], y[6] );
    6577    11870096 :                     move64();
    6578    11870096 :                     t[6] = CL_add( y[3], y[7] );
    6579    11870096 :                     move64();
    6580    11870096 :                     t[7] = CL_sub( y[3], y[7] );
    6581    11870096 :                     move64();
    6582             : 
    6583    11870096 :                     s[0] = CL_add( t[0], t[4] );
    6584    11870096 :                     move64();
    6585    11870096 :                     s[2] = CL_sub( t[0], t[4] );
    6586    11870096 :                     move64();
    6587    11870096 :                     s[4] = CL_mac_j( t[1], t[5] );
    6588    11870096 :                     move64();
    6589    11870096 :                     s[5] = CL_msu_j( t[1], t[5] );
    6590    11870096 :                     move64();
    6591    11870096 :                     s[1] = CL_add( t[2], t[6] );
    6592    11870096 :                     move64();
    6593    11870096 :                     s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
    6594    11870096 :                     move64();
    6595             : 
    6596    11870096 :                     t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
    6597    11870096 :                     move64();
    6598    11870096 :                     t[1] = CL_sub( t[3], t[7] );
    6599    11870096 :                     move64();
    6600             : 
    6601    11870096 :                     s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); // Qx
    6602    11870096 :                     move64();
    6603    11870096 :                     s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); // Qx
    6604    11870096 :                     move64();
    6605    11870096 :                     s[7] = CL_conjugate( s[7] );
    6606    11870096 :                     move64();
    6607             : 
    6608    11870096 :                     x[i] = CL_add( s[0], s[1] );
    6609    11870096 :                     move64();
    6610    11870096 :                     x[( i + ( 1 * dim1 ) )] = CL_add( s[5], s[6] );
    6611    11870096 :                     move64();
    6612    11870096 :                     x[( i + ( 2 * dim1 ) )] = CL_sub( s[2], s[3] );
    6613    11870096 :                     move64();
    6614    11870096 :                     x[( i + ( 3 * dim1 ) )] = CL_add( s[4], s[7] );
    6615    11870096 :                     move64();
    6616    11870096 :                     x[( i + ( 4 * dim1 ) )] = CL_sub( s[0], s[1] );
    6617    11870096 :                     move64();
    6618    11870096 :                     x[( i + ( 5 * dim1 ) )] = CL_sub( s[5], s[6] );
    6619    11870096 :                     move64();
    6620    11870096 :                     x[( i + ( 6 * dim1 ) )] = CL_add( s[2], s[3] );
    6621    11870096 :                     move64();
    6622    11870096 :                     x[( i + ( 7 * dim1 ) )] = CL_sub( s[4], s[7] );
    6623    11870096 :                     move64();
    6624             :                 }
    6625             :             }
    6626             :             ELSE
    6627             :             {
    6628   327937401 :                 FOR( i = 0; i < dim1; i++ )
    6629             :                 {
    6630             :                     {
    6631   316386590 :                         y[0] = xx[i];
    6632   316386590 :                         move64();
    6633             :                     };
    6634   316386590 :                     IF( i > 0 )
    6635             :                     {
    6636             :                         {
    6637   304835779 :                             y[1] = CL_mac_j( CL_scale( xx[( i + ( 1 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 1 ) * dim1 ) << 1 ) ) - Woff )] ),
    6638   304835779 :                                              CL_scale( xx[( i + ( 1 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 1 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
    6639   304835779 :                             move64();
    6640             :                         };
    6641             :                         {
    6642   304835779 :                             y[2] = CL_mac_j( CL_scale( xx[( i + ( 2 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 2 ) * dim1 ) << 1 ) ) - Woff )] ),
    6643   304835779 :                                              CL_scale( xx[( i + ( 2 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 2 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
    6644   304835779 :                             move64();
    6645             :                         };
    6646             :                         {
    6647   304835779 :                             y[3] = CL_mac_j( CL_scale( xx[( i + ( 3 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 3 ) * dim1 ) << 1 ) ) - Woff )] ),
    6648   304835779 :                                              CL_scale( xx[( i + ( 3 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 3 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
    6649   304835779 :                             move64();
    6650             :                         };
    6651             :                         {
    6652   304835779 :                             y[4] = CL_mac_j( CL_scale( xx[( i + ( 4 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 4 ) * dim1 ) << 1 ) ) - Woff )] ),
    6653   304835779 :                                              CL_scale( xx[( i + ( 4 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 4 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
    6654   304835779 :                             move64();
    6655             :                         };
    6656             :                         {
    6657   304835779 :                             y[5] = CL_mac_j( CL_scale( xx[( i + ( 5 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 5 ) * dim1 ) << 1 ) ) - Woff )] ),
    6658   304835779 :                                              CL_scale( xx[( i + ( 5 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 5 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
    6659   304835779 :                             move64();
    6660             :                         };
    6661             :                         {
    6662   304835779 :                             y[6] = CL_mac_j( CL_scale( xx[( i + ( 6 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 6 ) * dim1 ) << 1 ) ) - Woff )] ),
    6663   304835779 :                                              CL_scale( xx[( i + ( 6 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 6 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
    6664   304835779 :                             move64();
    6665             :                         };
    6666             :                         {
    6667   304835779 :                             y[7] = CL_mac_j( CL_scale( xx[( i + ( 7 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 7 ) * dim1 ) << 1 ) ) - Woff )] ),
    6668   304835779 :                                              CL_scale( xx[( i + ( 7 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 7 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
    6669   304835779 :                             move64();
    6670             :                         };
    6671             :                     }
    6672             : 
    6673   316386590 :                     t[0] = CL_add( y[0], y[4] );
    6674   316386590 :                     move64();
    6675   316386590 :                     t[1] = CL_sub( y[0], y[4] );
    6676   316386590 :                     move64();
    6677   316386590 :                     t[2] = CL_add( y[1], y[5] );
    6678   316386590 :                     move64();
    6679   316386590 :                     t[3] = CL_sub( y[1], y[5] );
    6680   316386590 :                     move64();
    6681   316386590 :                     t[4] = CL_add( y[2], y[6] );
    6682   316386590 :                     move64();
    6683   316386590 :                     t[5] = CL_sub( y[2], y[6] );
    6684   316386590 :                     move64();
    6685   316386590 :                     t[6] = CL_add( y[3], y[7] );
    6686   316386590 :                     move64();
    6687   316386590 :                     t[7] = CL_sub( y[3], y[7] );
    6688   316386590 :                     move64();
    6689             : 
    6690   316386590 :                     s[0] = CL_add( t[0], t[4] );
    6691   316386590 :                     move64();
    6692   316386590 :                     s[2] = CL_sub( t[0], t[4] );
    6693   316386590 :                     move64();
    6694   316386590 :                     s[4] = CL_mac_j( t[1], t[5] );
    6695   316386590 :                     move64();
    6696   316386590 :                     s[5] = CL_msu_j( t[1], t[5] );
    6697   316386590 :                     move64();
    6698   316386590 :                     s[1] = CL_add( t[2], t[6] );
    6699   316386590 :                     move64();
    6700   316386590 :                     s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
    6701   316386590 :                     move64();
    6702             : 
    6703   316386590 :                     t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
    6704   316386590 :                     move64();
    6705   316386590 :                     t[1] = CL_sub( t[3], t[7] );
    6706   316386590 :                     move64();
    6707             : 
    6708   316386590 :                     s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); // Qx
    6709   316386590 :                     move64();
    6710   316386590 :                     s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); // Qx
    6711   316386590 :                     move64();
    6712   316386590 :                     s[7] = CL_conjugate( s[7] );
    6713   316386590 :                     move64();
    6714             : 
    6715   316386590 :                     x[i] = CL_add( s[0], s[1] );
    6716   316386590 :                     move64();
    6717   316386590 :                     x[( i + ( 1 * dim1 ) )] = CL_add( s[5], s[6] );
    6718   316386590 :                     move64();
    6719   316386590 :                     x[( i + ( 2 * dim1 ) )] = CL_sub( s[2], s[3] );
    6720   316386590 :                     move64();
    6721   316386590 :                     x[( i + ( 3 * dim1 ) )] = CL_add( s[4], s[7] );
    6722   316386590 :                     move64();
    6723   316386590 :                     x[( i + ( 4 * dim1 ) )] = CL_sub( s[0], s[1] );
    6724   316386590 :                     move64();
    6725   316386590 :                     x[( i + ( 5 * dim1 ) )] = CL_sub( s[5], s[6] );
    6726   316386590 :                     move64();
    6727   316386590 :                     x[( i + ( 6 * dim1 ) )] = CL_add( s[2], s[3] );
    6728   316386590 :                     move64();
    6729   316386590 :                     x[( i + ( 7 * dim1 ) )] = CL_sub( s[4], s[7] );
    6730   316386590 :                     move64();
    6731             :                 }
    6732             :             }
    6733    12002885 :             BREAK;
    6734             :         }
    6735             : 
    6736           0 :         case 10:
    6737             :         {
    6738             :             cmplx y[10];
    6739           0 :             FOR( j = 0; j < dim2; j++ )
    6740             :             {
    6741             :                 {
    6742           0 :                     y[j] = xx[0 + ( j * dim1 )]; /*y[j] = xx[0 + j * dim1];*/
    6743           0 :                     move64();
    6744             :                 };
    6745             :             }
    6746           0 :             fft_len10( &y[0] );
    6747           0 :             FOR( j = 0; j < dim2; j++ )
    6748             :             {
    6749           0 :                 x[0 + ( j * dim1 )] = y[j];
    6750           0 :                 move64();
    6751             :             }
    6752             : 
    6753           0 :             FOR( i = 1; i < dim1; i++ )
    6754             :             {
    6755             :                 {
    6756           0 :                     y[( 0 + 0 )] = xx[i + ( 0 + 0 ) * dim1];
    6757           0 :                     move64();
    6758             :                 }
    6759             : 
    6760           0 :                 FOR( j = 1; j < dim2; j++ )
    6761             :                 {
    6762             :                     {
    6763           0 :                         y[( j + 0 )] = CL_mac_j( CL_scale( xx[( i + ( ( j + 0 ) * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * j ) * dim1 ) ) - Woff )] ),
    6764           0 :                                                  CL_scale( xx[( i + ( ( j + 0 ) * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * j ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
    6765           0 :                         move64();
    6766             :                     }
    6767             :                 }
    6768           0 :                 fft_len10( &y[0] );
    6769           0 :                 FOR( j = 0; j < dim2; j++ )
    6770             :                 {
    6771           0 :                     x[( i + ( j * dim1 ) )] = y[j];
    6772           0 :                     move64();
    6773             :                 }
    6774             :             }
    6775           0 :             BREAK;
    6776             :         }
    6777             : 
    6778     2359470 :         case 16:
    6779             :         {
    6780             :             cmplx y[16];
    6781    40110990 :             FOR( j = 0; j < dim2; j++ )
    6782             :             {
    6783             :                 {
    6784    37751520 :                     y[j] = xx[0 + ( j * dim1 )];
    6785    37751520 :                     move64();
    6786             :                 };
    6787             :             }
    6788             : 
    6789     2359470 :             fft_len16( &y[0] );
    6790    40110990 :             FOR( j = 0; j < dim2; j++ )
    6791             :             {
    6792    37751520 :                 x[0 + ( j * dim1 )] = y[j];
    6793    37751520 :                 move64();
    6794             :             }
    6795             : 
    6796    59529950 :             FOR( i = 1; i < dim1; i++ )
    6797             :             {
    6798             :                 {
    6799    57170480 :                     y[( 0 + 0 )] = xx[i + ( 0 + 0 ) * dim1];
    6800    57170480 :                     move64();
    6801             :                 }
    6802             : 
    6803   914727680 :                 FOR( j = 1; j < dim2; j++ )
    6804             :                 {
    6805             :                     {
    6806   857557200 :                         y[( j + 0 )] = CL_mac_j( CL_scale( xx[( i + ( ( j + 0 ) * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * j ) * dim1 ) ) - Woff )] ),
    6807   857557200 :                                                  CL_scale( xx[( i + ( ( j + 0 ) * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * j ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
    6808   857557200 :                         move64();
    6809             :                     }
    6810             :                 }
    6811    57170480 :                 fft_len16( &y[0] );
    6812   971898160 :                 FOR( j = 0; j < dim2; j++ )
    6813             :                 {
    6814   914727680 :                     x[( i + ( j * dim1 ) )] = y[j];
    6815   914727680 :                     move64();
    6816             :                 }
    6817             :             }
    6818     2359470 :             BREAK;
    6819             :         }
    6820             : 
    6821           0 :         case 20:
    6822             :         {
    6823             :             cmplx y[20];
    6824           0 :             FOR( j = 0; j < dim2; j++ )
    6825             :             {
    6826             :                 {
    6827           0 :                     y[j] = xx[0 + ( j * dim1 )];
    6828           0 :                     move64();
    6829             :                 };
    6830             :             }
    6831           0 :             fft_len20_fx( &y[0] );
    6832           0 :             FOR( j = 0; j < dim2; j++ )
    6833             :             {
    6834           0 :                 x[0 + ( j * dim1 )] = y[j];
    6835           0 :                 move64();
    6836             :             }
    6837             : 
    6838           0 :             FOR( i = 1; i < dim1; i++ )
    6839             :             {
    6840             :                 {
    6841           0 :                     y[( 0 + 0 )] = xx[( i + ( 0 + 0 ) * dim1 )];
    6842           0 :                     move64();
    6843             :                 }
    6844             :                 {
    6845           0 :                     y[( 0 + 1 )] = CL_mac_j( CL_scale( xx[( i + ( ( 0 + 1 ) * dim1 ) )], W[( ( len + ( sc * i ) ) + 0 * dim1 - Woff )] ),
    6846           0 :                                              CL_scale( xx[( i + ( ( 0 + 1 ) * dim1 ) )], W[( ( ( len + ( sc * i ) ) + 0 * dim1 + 1 ) - Woff )] ) ); // Qx
    6847           0 :                     move64();
    6848             :                 }
    6849             : 
    6850           0 :                 FOR( j = 2; j < dim2; j = j + 2 )
    6851             :                 {
    6852             :                     {
    6853           0 :                         y[( j + 0 )] = CL_mac_j( CL_scale( xx[( i + ( ( j + 0 ) * dim1 ) )], W[( ( ( sc * i ) + ( j * dim1 ) ) - Woff )] ),
    6854           0 :                                                  CL_scale( xx[( i + ( ( j + 0 ) * dim1 ) )], W[( ( ( ( sc * i ) + ( j * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
    6855           0 :                         move64();
    6856             :                     }
    6857             :                     {
    6858           0 :                         y[( j + 1 )] = CL_mac_j( CL_scale( xx[( i + ( ( j + 1 ) * dim1 ) )], W[( ( ( len + ( sc * i ) ) + ( j * dim1 ) ) - Woff )] ),
    6859           0 :                                                  CL_scale( xx[( i + ( ( j + 1 ) * dim1 ) )], W[( ( ( ( len + ( sc * i ) ) + ( j * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
    6860           0 :                         move64();
    6861             :                     }
    6862             :                 }
    6863           0 :                 fft_len20_fx( &y[0] );
    6864           0 :                 FOR( j = 0; j < dim2; j++ )
    6865             :                 {
    6866           0 :                     x[i + j * dim1] = y[j];
    6867           0 :                     move64();
    6868             :                 }
    6869             :             }
    6870           0 :             BREAK;
    6871             :         }
    6872             : 
    6873     1007210 :         case 32:
    6874             :         {
    6875             :             cmplx y[32];
    6876    33237930 :             FOR( j = 0; j < dim2; j++ )
    6877             :             {
    6878             :                 {
    6879    32230720 :                     y[j] = xx[0 + j * dim1];
    6880    32230720 :                     move64();
    6881             :                 };
    6882             :             }
    6883     1007210 :             fft_len32( &y[0] );
    6884    33237930 :             FOR( j = 0; j < dim2; j++ )
    6885             :             {
    6886    32230720 :                 x[0 + j * dim1] = y[j];
    6887    32230720 :                 move64();
    6888             :             }
    6889             : 
    6890    25071250 :             FOR( i = 1; i < dim1; i++ )
    6891             :             {
    6892             :                 {
    6893    24064040 :                     y[( 0 + 0 )] = xx[i + ( 0 + 0 ) * dim1];
    6894    24064040 :                     move64();
    6895             :                 }
    6896             :                 {
    6897    24064040 :                     y[( 0 + 1 )] = CL_mac_j( CL_scale( xx[( i + ( ( 0 + 1 ) * dim1 ) )], W[( ( len + ( sc * i ) ) + 0 * dim1 - Woff )] ),
    6898    24064040 :                                              CL_scale( xx[( i + ( ( 0 + 1 ) * dim1 ) )], W[( ( ( len + ( sc * i ) ) + 0 * dim1 + 1 ) - Woff )] ) ); // Qx
    6899    24064040 :                     move64();
    6900             :                 }
    6901             : 
    6902   385024640 :                 FOR( j = 2; j < dim2; j = j + 2 )
    6903             :                 {
    6904             :                     {
    6905   360960600 :                         y[( j + 0 )] = CL_mac_j( CL_scale( xx[( i + ( ( j + 0 ) * dim1 ) )], W[( ( ( sc * i ) + ( j * dim1 ) ) - Woff )] ),
    6906   360960600 :                                                  CL_scale( xx[( i + ( ( j + 0 ) * dim1 ) )], W[( ( ( ( sc * i ) + ( j * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
    6907   360960600 :                         move64();
    6908             :                     }
    6909             :                     {
    6910   360960600 :                         y[( j + 1 )] = CL_mac_j( CL_scale( xx[( i + ( ( j + 1 ) * dim1 ) )], W[( ( ( len + ( sc * i ) ) + ( j * dim1 ) ) - Woff )] ),
    6911   360960600 :                                                  CL_scale( xx[( i + ( ( j + 1 ) * dim1 ) )], W[( ( ( ( len + ( sc * i ) ) + ( j * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
    6912   360960600 :                         move64();
    6913             :                     }
    6914             :                 }
    6915    24064040 :                 fft_len32( &y[0] );
    6916   794113320 :                 FOR( j = 0; j < dim2; j++ )
    6917             :                 {
    6918   770049280 :                     x[( i + ( j * dim1 ) )] = y[j];
    6919   770049280 :                     move64();
    6920             :                 }
    6921             :             }
    6922     1007210 :             BREAK;
    6923             :         }
    6924             :     }
    6925    15369565 :     return;
    6926             : }
    6927             : 
    6928             : /*-----------------------------------------------------------------*
    6929             :  * fft_fx()
    6930             :  *
    6931             :  * Complex-value FFT
    6932             :  *-----------------------------------------------------------------*/
    6933             : 
    6934    15369565 : void fft_fx(
    6935             :     Word32 *re,          /* i/o: real part Qx          */
    6936             :     Word32 *im,          /* i/o: imag part Qx          */
    6937             :     const Word16 length, /* i  : length of fft       */
    6938             :     const Word16 s       /* i  : sign                */
    6939             : )
    6940             : {
    6941             :     cmplx x[960];
    6942             : 
    6943  4396182253 :     FOR( Word16 j = 0; j < length; j++ )
    6944             :     {
    6945  4380812688 :         x[j].re = re[( s * j )];
    6946  4380812688 :         move32();
    6947  4380812688 :         x[j].im = im[( s * j )];
    6948  4380812688 :         move32();
    6949             :     }
    6950             : 
    6951    15369565 :     SWITCH( length )
    6952             :     {
    6953           0 :         case 20:
    6954           0 :             fft_len20_fx( x );
    6955           0 :             BREAK;
    6956           0 :         case 40:
    6957           0 :             fft_lenN( x, FFT_RotVector_640_fx, 640, 5, 8, 8, 40 );
    6958           0 :             BREAK;
    6959           0 :         case 64:
    6960           0 :             fft_lenN( x, FFT_RotVector_256_fx, 256, 8, 8, 8, 64 );
    6961           0 :             BREAK;
    6962      311612 :         case 80:
    6963      311612 :             fft_lenN( x, FFT_RotVector_640_fx, 640, 10, 8, 4, 40 );
    6964      311612 :             BREAK;
    6965           0 :         case 100:
    6966           0 :             fft_lenN( x, FFT_RotVector_400_fx, 400, 10, 10, 4, 40 );
    6967           0 :             BREAK;
    6968      464534 :         case 120:
    6969      464534 :             fft_lenN( x, FFT_RotVector_960_fx, 960, 15, 8, 4, 60 );
    6970      464534 :             BREAK;
    6971      162267 :         case 128:
    6972      162267 :             fft_lenN( x, FFT_RotVector_256_fx, 256, 16, 8, 4, 64 );
    6973      162267 :             BREAK;
    6974     1693749 :         case 160:
    6975     1693749 :             fft_lenN( x, FFT_RotVector_640_fx, 640, 20, 8, 2, 40 );
    6976     1693749 :             BREAK;
    6977           0 :         case 200:
    6978           0 :             fft_lenN( x, FFT_RotVector_400_fx, 400, 20, 10, 2, 40 );
    6979           0 :             BREAK;
    6980     9080916 :         case 240:
    6981     9080916 :             fft_lenN( x, FFT_RotVector_960_fx, 960, 30, 8, 2, 60 );
    6982     9080916 :             BREAK;
    6983      289807 :         case 256:
    6984      289807 :             fft_lenN( x, FFT_RotVector_256_fx, 256, 32, 8, 2, 64 );
    6985      289807 :             BREAK;
    6986     1125415 :         case 320:
    6987     1125415 :             fft_lenN( x, FFT_RotVector_640_fx, 640, 20, 16, 2, 40 );
    6988     1125415 :             BREAK;
    6989           0 :         case 400:
    6990           0 :             fft_lenN( x, FFT_RotVector_400_fx, 400, 20, 20, 2, 40 );
    6991           0 :             BREAK;
    6992     1234055 :         case 480:
    6993     1234055 :             fft_lenN( x, FFT_RotVector_960_fx, 960, 30, 16, 2, 60 );
    6994     1234055 :             BREAK;
    6995           0 :         case 600:
    6996           0 :             fft_lenN( x, FFT_RotVector_600_fx, 600, 30, 20, 2, 60 );
    6997           0 :             BREAK;
    6998      514505 :         case 640:
    6999      514505 :             fft_lenN( x, FFT_RotVector_640_fx, 640, 20, 32, 2, 40 );
    7000      514505 :             BREAK;
    7001      492705 :         case 960:
    7002      492705 :             fft_lenN( x, FFT_RotVector_960_fx, 960, 30, 32, 2, 60 );
    7003      492705 :             BREAK;
    7004           0 :         default:
    7005           0 :             assert( !"fft length is not supported!" );
    7006             :     }
    7007             : 
    7008  4396182253 :     FOR( Word16 j = 0; j < length; j++ )
    7009             :     {
    7010  4380812688 :         re[( s * j )] = x[j].re;
    7011  4380812688 :         move32();
    7012  4380812688 :         im[( s * j )] = x[j].im;
    7013  4380812688 :         move32();
    7014             :     }
    7015             : 
    7016    15369565 :     return;
    7017             : }
    7018             : 
    7019      900430 : void rfft_fx(
    7020             :     Word32 *x,           /* i/o: values Qx                   */
    7021             :     const Word16 *w,     /* i  : window Q15                   */
    7022             :     const Word16 length, /* i  : length of fft             */
    7023             :     const Word16 isign   /* i  : sign                      */
    7024             : )
    7025             : {
    7026             :     Word16 i, sizeOfFft2, sizeOfFft4;
    7027             :     Word32 tmp, t1, t2, t3, t4;
    7028             :     Word16 s1, s2;
    7029             : 
    7030      900430 :     sizeOfFft2 = shr( length, 1 );
    7031      900430 :     sizeOfFft4 = shr( length, 2 );
    7032      900430 :     SWITCH( sizeOfFft2 )
    7033             :     {
    7034       34598 :         case 80:
    7035       34598 :             s1 = 409; //(1/sizeOfFft2).Q15
    7036       34598 :             move16();
    7037       34598 :             s2 = -409;
    7038       34598 :             move16();
    7039       34598 :             BREAK;
    7040       68341 :         case 128:
    7041       68341 :             s1 = 256; //(1/sizeOfFft2).Q15
    7042       68341 :             move16();
    7043       68341 :             s2 = -256;
    7044       68341 :             move16();
    7045       68341 :             BREAK;
    7046      164124 :         case 160:
    7047      164124 :             s1 = 204; //(1/sizeOfFft2).Q15
    7048      164124 :             move16();
    7049      164124 :             s2 = -204;
    7050      164124 :             move16();
    7051      164124 :             BREAK;
    7052         214 :         case 240:
    7053         214 :             s1 = 136; //(1/sizeOfFft2).Q15
    7054         214 :             move16();
    7055         214 :             s2 = -136;
    7056         214 :             move16();
    7057         214 :             BREAK;
    7058       59659 :         case 256:
    7059       59659 :             s1 = 128; //(1/sizeOfFft2).Q15
    7060       59659 :             move16();
    7061       59659 :             s2 = -128;
    7062       59659 :             move16();
    7063       59659 :             BREAK;
    7064      237052 :         case 320:
    7065      237052 :             s1 = 102; //(1/sizeOfFft2).Q15
    7066      237052 :             move16();
    7067      237052 :             s2 = -102;
    7068      237052 :             move16();
    7069      237052 :             BREAK;
    7070       97674 :         case 480:
    7071       97674 :             s1 = 68; //(1/sizeOfFft2).Q15
    7072       97674 :             move16();
    7073       97674 :             s2 = -68;
    7074       97674 :             move16();
    7075       97674 :             BREAK;
    7076      168644 :         case 640:
    7077      168644 :             s1 = 51; //(1/sizeOfFft2).Q15
    7078      168644 :             move16();
    7079      168644 :             s2 = -51;
    7080      168644 :             move16();
    7081      168644 :             BREAK;
    7082       70124 :         case 960:
    7083       70124 :             s1 = 34; //(1/sizeOfFft2).Q15
    7084       70124 :             move16();
    7085       70124 :             s2 = -34;
    7086       70124 :             move16();
    7087       70124 :             BREAK;
    7088           0 :         default:
    7089           0 :             s1 = -1;
    7090           0 :             move16();
    7091           0 :             s2 = -1;
    7092           0 :             move16();
    7093           0 :             printf( "Configuration not supported" );
    7094           0 :             assert( 0 );
    7095             :     }
    7096             : 
    7097      900430 :     SWITCH( isign )
    7098             :     {
    7099             : 
    7100      398485 :         case -1:
    7101             : 
    7102      398485 :             fft_fx( x, x + 1, sizeOfFft2, 2 );
    7103             :             // Qx
    7104      398485 :             tmp = L_add( x[0], x[1] );
    7105      398485 :             x[1] = L_sub( x[0], x[1] ); // Qx
    7106      398485 :             move32();
    7107      398485 :             x[0] = tmp;
    7108      398485 :             move32();
    7109             : 
    7110    74303669 :             FOR( i = 1; i <= sizeOfFft4; i++ )
    7111             :             {
    7112    73905184 :                 t1 = L_sub( x[2 * i], x[( length - ( i << 1 ) )] );                          // Qx
    7113    73905184 :                 t2 = L_add( x[( ( i << 1 ) + 1 )], x[( ( length - ( i << 1 ) ) + 1 )] );     // Qx
    7114    73905184 :                 t3 = L_sub( Mpy_32_16_1( t1, w[i] ), Mpy_32_16_1( t2, w[i + sizeOfFft4] ) ); // Qx
    7115    73905184 :                 t4 = L_add( Mpy_32_16_1( t1, w[i + sizeOfFft4] ), Mpy_32_16_1( t2, w[i] ) ); // Qx
    7116    73905184 :                 t1 = L_add( x[2 * i], x[( length - ( i << 1 ) )] );
    7117    73905184 :                 t2 = L_sub( x[( ( i << 1 ) + 1 )], x[( ( length - ( i << 1 ) ) + 1 )] );
    7118             : 
    7119    73905184 :                 x[2 * i] = Mpy_32_16_1( L_sub( t1, t3 ), 16384 /*0.5.Q15*/ );
    7120    73905184 :                 move32();
    7121    73905184 :                 x[( ( i << 1 ) + 1 )] = Mpy_32_16_1( L_sub( t2, t4 ), 16384 /*0.5.Q15*/ );
    7122    73905184 :                 move32();
    7123    73905184 :                 x[( length - ( i << 1 ) )] = Mpy_32_16_1( L_add( t1, t3 ), 16384 /*0.5.Q15*/ );
    7124    73905184 :                 move32();
    7125    73905184 :                 x[( ( length - ( i << 1 ) ) + 1 )] = Mpy_32_16_1( L_add( t2, t4 ), -16384 /*0.5.Q15*/ );
    7126    73905184 :                 move32();
    7127             :             }
    7128             : 
    7129      398485 :             BREAK;
    7130             : 
    7131      501945 :         case +1:
    7132             : 
    7133      501945 :             tmp = Mpy_32_16_1( L_add( x[0], x[1] ), 16384 /*0.5.Q15*/ );
    7134      501945 :             x[1] = Mpy_32_16_1( L_sub( x[1], x[0] ), 16384 /*0.5.Q15*/ );
    7135      501945 :             move32();
    7136      501945 :             x[0] = tmp;
    7137      501945 :             move32();
    7138             : 
    7139   102142137 :             FOR( i = 1; i <= sizeOfFft4; i++ )
    7140             :             {
    7141   101640192 :                 t1 = L_sub( x[2 * i], x[( length - ( i << 1 ) )] );
    7142   101640192 :                 t2 = L_add( x[( ( i << 1 ) + 1 )], x[( ( length - ( i << 1 ) ) + 1 )] );
    7143   101640192 :                 t3 = L_add( Mpy_32_16_1( t1, w[i] ), Mpy_32_16_1( t2, w[( i + sizeOfFft4 )] ) );
    7144   101640192 :                 t4 = L_sub( Mpy_32_16_1( t2, w[i] ), Mpy_32_16_1( t1, w[( i + sizeOfFft4 )] ) );
    7145   101640192 :                 t1 = L_add( x[2 * i], x[( length - ( i << 1 ) )] );
    7146   101640192 :                 t2 = L_sub( x[( ( i << 1 ) + 1 )], x[( ( length - ( i << 1 ) ) + 1 )] );
    7147             : 
    7148   101640192 :                 x[2 * i] = Mpy_32_16_1( L_sub( t1, t3 ), 16384 /*0.5.Q15*/ ); // Qx
    7149   101640192 :                 move32();
    7150   101640192 :                 x[( ( i << 1 ) + 1 )] = Mpy_32_16_1( L_sub( t4, t2 ), 16384 /*0.5.Q15*/ ); // Qx
    7151   101640192 :                 move32();
    7152   101640192 :                 x[( length - ( i << 1 ) )] = Mpy_32_16_1( L_add( t1, t3 ), 16384 /*0.5.Q15*/ ); // Qx
    7153   101640192 :                 move32();
    7154   101640192 :                 x[( ( length - ( i << 1 ) ) + 1 )] = Mpy_32_16_1( L_add( t2, t4 ), 16384 /*0.5.Q15*/ ); // Qx
    7155   101640192 :                 move32();
    7156             :             }
    7157             : 
    7158      501945 :             fft_fx( x, x + 1, sizeOfFft2, 2 );
    7159             : 
    7160   203782329 :             FOR( i = 0; i < length; i += 2 )
    7161             :             {
    7162   203280384 :                 x[i] = Mpy_32_16_1( x[i], s1 ); // Qx
    7163   203280384 :                 move32();
    7164   203280384 :                 x[i + 1] = Mpy_32_16_1( x[i + 1], s2 ); // Qx
    7165   203280384 :                 move32();
    7166             :             }
    7167             : 
    7168      501945 :             BREAK;
    7169             :     }
    7170             : 
    7171      900430 :     return;
    7172             : }
    7173             : 
    7174             : 
    7175             : #define WMC_TOOL_SKIP
    7176             : 
    7177             : #define SHC( x )  ( (Word16) x )
    7178             : #define FFTC( x ) WORD322WORD16( (Word32) x )
    7179             : 
    7180             : #define C81_FX ( FFTC( 0x5a82799a ) ) /* FL2WORD32( 7.071067811865475e-1) */
    7181             : #define C82_FX ( FFTC( 0xa57d8666 ) ) /* FL2WORD32(-7.071067811865475e-1) */
    7182             : 
    7183             : #define cplxMpy4_8_0( re, im, a, b, c, d )                              \
    7184             :     re = L_shr( L_sub( Mpy_32_16_1( a, c ), Mpy_32_16_1( b, d ) ), 1 ); \
    7185             :     im = L_shr( L_add( Mpy_32_16_1( a, d ), Mpy_32_16_1( b, c ) ), 1 );
    7186             : 
    7187             : #define cplxMpy4_8_1( re, im, a, b ) \
    7188             :     re = L_shr( a, 1 );              \
    7189             :     im = L_shr( b, 1 );
    7190             : 
    7191             : 
    7192             : /**
    7193             :  * \brief    Twiddle factors are unscaled
    7194             :  */
    7195             : /*-----------------------------------------------------------------*
    7196             :  * BASOP_fft8()
    7197             :  *
    7198             :  * Function performs a complex 8-point FFT
    7199             :  * The FFT is performed inplace. The result of the FFT
    7200             :  * is scaled by SCALEFACTOR8 bits.
    7201             :  *
    7202             :  * WOPS with 32x16 bit multiplications: 108 cycles
    7203             :  *-----------------------------------------------------------------*/
    7204             : 
    7205     4673448 : static void BASOP_fft8(
    7206             :     Word32 *re,
    7207             :     Word32 *im,
    7208             :     Word16 s )
    7209             : {
    7210             :     Word32 x00, x01, x02, x03, x04, x05, x06, x07;
    7211             :     Word32 x08, x09, x10, x11, x12, x13, x14, x15;
    7212             :     Word32 t00, t01, t02, t03, t04, t05, t06, t07;
    7213             :     Word32 t08, t09, t10, t11, t12, t13, t14, t15;
    7214             :     Word32 s00, s01, s02, s03, s04, s05, s06, s07;
    7215             :     Word32 s08, s09, s10, s11, s12, s13, s14, s15;
    7216             : 
    7217             : 
    7218             :     /* Pre-additions */
    7219             : 
    7220     4673448 :     x00 = L_shr( re[s * 0], SCALEFACTOR8 );
    7221     4673448 :     x01 = L_shr( im[s * 0], SCALEFACTOR8 );
    7222     4673448 :     x02 = L_shr( re[s * 1], SCALEFACTOR8 );
    7223     4673448 :     x03 = L_shr( im[s * 1], SCALEFACTOR8 );
    7224     4673448 :     x04 = L_shr( re[s * 2], SCALEFACTOR8 );
    7225     4673448 :     x05 = L_shr( im[s * 2], SCALEFACTOR8 );
    7226     4673448 :     x06 = L_shr( re[s * 3], SCALEFACTOR8 );
    7227     4673448 :     x07 = L_shr( im[s * 3], SCALEFACTOR8 );
    7228     4673448 :     x08 = L_shr( re[s * 4], SCALEFACTOR8 );
    7229     4673448 :     x09 = L_shr( im[s * 4], SCALEFACTOR8 );
    7230     4673448 :     x10 = L_shr( re[s * 5], SCALEFACTOR8 );
    7231     4673448 :     x11 = L_shr( im[s * 5], SCALEFACTOR8 );
    7232     4673448 :     x12 = L_shr( re[s * 6], SCALEFACTOR8 );
    7233     4673448 :     x13 = L_shr( im[s * 6], SCALEFACTOR8 );
    7234     4673448 :     x14 = L_shr( re[s * 7], SCALEFACTOR8 );
    7235     4673448 :     x15 = L_shr( im[s * 7], SCALEFACTOR8 );
    7236             : 
    7237     4673448 :     t00 = L_add( x00, x08 );
    7238     4673448 :     t02 = L_sub( x00, x08 );
    7239     4673448 :     t01 = L_add( x01, x09 );
    7240     4673448 :     t03 = L_sub( x01, x09 );
    7241     4673448 :     t04 = L_add( x02, x10 );
    7242     4673448 :     t06 = L_sub( x02, x10 );
    7243     4673448 :     t05 = L_add( x03, x11 );
    7244     4673448 :     t07 = L_sub( x03, x11 );
    7245     4673448 :     t08 = L_add( x04, x12 );
    7246     4673448 :     t10 = L_sub( x04, x12 );
    7247     4673448 :     t09 = L_add( x05, x13 );
    7248     4673448 :     t11 = L_sub( x05, x13 );
    7249     4673448 :     t12 = L_add( x06, x14 );
    7250     4673448 :     t14 = L_sub( x06, x14 );
    7251     4673448 :     t13 = L_add( x07, x15 );
    7252     4673448 :     t15 = L_sub( x07, x15 );
    7253             : 
    7254             :     /* Pre-additions and core multiplications */
    7255             : 
    7256     4673448 :     s00 = L_add( t00, t08 );
    7257     4673448 :     s04 = L_sub( t00, t08 );
    7258     4673448 :     s01 = L_add( t01, t09 );
    7259     4673448 :     s05 = L_sub( t01, t09 );
    7260     4673448 :     s08 = L_sub( t02, t11 );
    7261     4673448 :     s10 = L_add( t02, t11 );
    7262     4673448 :     s09 = L_add( t03, t10 );
    7263     4673448 :     s11 = L_sub( t03, t10 );
    7264     4673448 :     s02 = L_add( t04, t12 );
    7265     4673448 :     s07 = L_sub( t04, t12 );
    7266     4673448 :     s03 = L_add( t05, t13 );
    7267     4673448 :     s06 = L_sub( t13, t05 );
    7268             : 
    7269     4673448 :     t01 = L_add( t06, t14 );
    7270     4673448 :     t02 = L_sub( t06, t14 );
    7271     4673448 :     t00 = L_add( t07, t15 );
    7272     4673448 :     t03 = L_sub( t07, t15 );
    7273             : 
    7274     4673448 :     s12 = Mpy_32_16_1( L_add( t00, t02 ), C81_FX );
    7275     4673448 :     s14 = Mpy_32_16_1( L_sub( t00, t02 ), C81_FX );
    7276     4673448 :     s13 = Mpy_32_16_1( L_sub( t03, t01 ), C81_FX );
    7277     4673448 :     s15 = Mpy_32_16_1( L_add( t01, t03 ), C82_FX );
    7278             : 
    7279             :     /* Post-additions */
    7280             : 
    7281     4673448 :     re[s * 0] = L_add( s00, s02 );
    7282     4673448 :     move32();
    7283     4673448 :     re[s * 4] = L_sub( s00, s02 );
    7284     4673448 :     move32();
    7285     4673448 :     im[s * 0] = L_add( s01, s03 );
    7286     4673448 :     move32();
    7287     4673448 :     im[s * 4] = L_sub( s01, s03 );
    7288     4673448 :     move32();
    7289     4673448 :     re[s * 2] = L_sub( s04, s06 );
    7290     4673448 :     move32();
    7291     4673448 :     re[s * 6] = L_add( s04, s06 );
    7292     4673448 :     move32();
    7293     4673448 :     im[s * 2] = L_sub( s05, s07 );
    7294     4673448 :     move32();
    7295     4673448 :     im[s * 6] = L_add( s05, s07 );
    7296     4673448 :     move32();
    7297     4673448 :     re[i_mult( s, 3 )] = L_add( s08, s14 );
    7298     4673448 :     move32();
    7299     4673448 :     re[i_mult( s, 7 )] = L_sub( s08, s14 );
    7300     4673448 :     move32();
    7301     4673448 :     im[i_mult( s, 3 )] = L_add( s09, s15 );
    7302     4673448 :     move32();
    7303     4673448 :     im[i_mult( s, 7 )] = L_sub( s09, s15 );
    7304     4673448 :     move32();
    7305     4673448 :     re[s * 1] = L_add( s10, s12 );
    7306     4673448 :     move32();
    7307     4673448 :     re[i_mult( s, 5 )] = L_sub( s10, s12 );
    7308     4673448 :     move32();
    7309     4673448 :     im[s * 1] = L_add( s11, s13 );
    7310     4673448 :     move32();
    7311     4673448 :     im[i_mult( s, 5 )] = L_sub( s11, s13 );
    7312     4673448 :     move32();
    7313             : 
    7314     4673448 :     return;
    7315             : }
    7316             : 
    7317             : 
    7318             : /*-----------------------------------------------------------------*
    7319             :  * fftN2()
    7320             :  *
    7321             :  * Combined FFT
    7322             :  *-----------------------------------------------------------------*/
    7323             : 
    7324      584181 : static void BASOP_fftN2(
    7325             :     Word32 *re,      /* i/o: real part                                       */
    7326             :     Word32 *im,      /* i/o: imag part                                       */
    7327             :     const Word16 *W, /* i  : rotation factor                                 */
    7328             :     Word16 dim1,     /* i  : length of fft1                                  */
    7329             :     Word16 dim2,     /* i  : length of fft2                                  */
    7330             :     Word16 sx,       /* i  : stride real and imag part                       */
    7331             :     Word16 sc,       /* i  : stride phase rotation coefficients              */
    7332             :     Word32 *x,       /* tmp: 32-bit workbuffer                               */
    7333             :     Word16 Woff      /* i  : offset for addressing the rotation vector table */
    7334             : )
    7335             : {
    7336             :     Word16 i, j;
    7337             :     Word32 x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, x10, x11, x12, x13, x14, x15;
    7338             :     Word32 t00, t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15;
    7339             :     Word32 s00, s01, s02, s03, s04, s05, s06, s07, s08, s09, s10, s11, s12, s13, s14, s15;
    7340             : 
    7341     5257629 :     FOR( i = 0; i < dim2; i++ )
    7342             :     {
    7343    42061032 :         FOR( j = 0; j < dim1; j++ )
    7344             :         {
    7345    37387584 :             x[2 * i * dim1 + 2 * j] = re[sx * i + sx * j * dim2];
    7346    37387584 :             move32();
    7347    37387584 :             x[2 * i * dim1 + 2 * j + 1] = im[sx * i + sx * j * dim2];
    7348    37387584 :             move32();
    7349             :         }
    7350             :     }
    7351             : 
    7352             :     /* dim1 == 8 */
    7353     5257629 :     FOR( i = 0; i < dim2; i++ )
    7354             :     {
    7355     4673448 :         BASOP_fft8( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 );
    7356             :     }
    7357             : 
    7358             :     /* dim2 == 8 */
    7359     5257629 :     FOR( i = 0; i < dim1; i++ )
    7360             :     {
    7361     4673448 :         cplxMpy4_8_1( x00, x01, x[2 * i + 2 * 0 * dim1], x[2 * i + 2 * 0 * dim1 + 1] );
    7362             : 
    7363     4673448 :         IF( i == 0 )
    7364             :         {
    7365      584181 :             cplxMpy4_8_1( x02, x03, x[add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) ), 1 )] );
    7366      584181 :             cplxMpy4_8_1( x04, x05, x[add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) ), 1 )] );
    7367      584181 :             cplxMpy4_8_1( x06, x07, x[add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) ), 1 )] );
    7368      584181 :             cplxMpy4_8_1( x08, x09, x[add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) ), 1 )] );
    7369      584181 :             cplxMpy4_8_1( x10, x11, x[add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) ), 1 )] );
    7370      584181 :             cplxMpy4_8_1( x12, x13, x[add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) ), 1 )] );
    7371      584181 :             cplxMpy4_8_1( x14, x15, x[add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) ), 1 )] );
    7372             :         }
    7373             :         ELSE
    7374             :         {
    7375     4089267 :             cplxMpy4_8_0( x02, x03, x[add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 1, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 1, dim1 ) ) ), 1 ), Woff )] );
    7376     4089267 :             cplxMpy4_8_0( x04, x05, x[add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 2, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 2, dim1 ) ) ), 1 ), Woff )] );
    7377     4089267 :             cplxMpy4_8_0( x06, x07, x[add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 3, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 3, dim1 ) ) ), 1 ), Woff )] );
    7378     4089267 :             cplxMpy4_8_0( x08, x09, x[add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 4, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 4, dim1 ) ) ), 1 ), Woff )] );
    7379     4089267 :             cplxMpy4_8_0( x10, x11, x[add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 5, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 5, dim1 ) ) ), 1 ), Woff )] );
    7380     4089267 :             cplxMpy4_8_0( x12, x13, x[add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 6, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 6, dim1 ) ) ), 1 ), Woff )] );
    7381     4089267 :             cplxMpy4_8_0( x14, x15, x[add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 7, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 7, dim1 ) ) ), 1 ), Woff )] );
    7382             :         }
    7383     4673448 :         t00 = L_shr( L_add( x00, x08 ), SCALEFACTORN2 - 1 );
    7384     4673448 :         t02 = L_shr( L_sub( x00, x08 ), SCALEFACTORN2 - 1 );
    7385     4673448 :         t01 = L_shr( L_add( x01, x09 ), SCALEFACTORN2 - 1 );
    7386     4673448 :         t03 = L_shr( L_sub( x01, x09 ), SCALEFACTORN2 - 1 );
    7387     4673448 :         t04 = L_shr( L_add( x02, x10 ), SCALEFACTORN2 - 1 );
    7388     4673448 :         t06 = L_sub( x02, x10 );
    7389     4673448 :         t05 = L_shr( L_add( x03, x11 ), SCALEFACTORN2 - 1 );
    7390     4673448 :         t07 = L_sub( x03, x11 );
    7391     4673448 :         t08 = L_shr( L_add( x04, x12 ), SCALEFACTORN2 - 1 );
    7392     4673448 :         t10 = L_shr( L_sub( x04, x12 ), SCALEFACTORN2 - 1 );
    7393     4673448 :         t09 = L_shr( L_add( x05, x13 ), SCALEFACTORN2 - 1 );
    7394     4673448 :         t11 = L_shr( L_sub( x05, x13 ), SCALEFACTORN2 - 1 );
    7395     4673448 :         t12 = L_shr( L_add( x06, x14 ), SCALEFACTORN2 - 1 );
    7396     4673448 :         t14 = L_sub( x06, x14 );
    7397     4673448 :         t13 = L_shr( L_add( x07, x15 ), SCALEFACTORN2 - 1 );
    7398     4673448 :         t15 = L_sub( x07, x15 );
    7399             : 
    7400     4673448 :         s00 = L_add( t00, t08 );
    7401     4673448 :         s04 = L_sub( t00, t08 );
    7402     4673448 :         s01 = L_add( t01, t09 );
    7403     4673448 :         s05 = L_sub( t01, t09 );
    7404     4673448 :         s08 = L_sub( t02, t11 );
    7405     4673448 :         s10 = L_add( t02, t11 );
    7406     4673448 :         s09 = L_add( t03, t10 );
    7407     4673448 :         s11 = L_sub( t03, t10 );
    7408     4673448 :         s02 = L_add( t04, t12 );
    7409     4673448 :         s07 = L_sub( t04, t12 );
    7410     4673448 :         s03 = L_add( t05, t13 );
    7411     4673448 :         s06 = L_sub( t13, t05 );
    7412             : 
    7413     4673448 :         t01 = L_shr( L_add( t06, t14 ), SCALEFACTORN2 - 1 );
    7414     4673448 :         t02 = L_shr( L_sub( t06, t14 ), SCALEFACTORN2 - 1 );
    7415     4673448 :         t00 = L_shr( L_add( t07, t15 ), SCALEFACTORN2 - 1 );
    7416     4673448 :         t03 = L_shr( L_sub( t07, t15 ), SCALEFACTORN2 - 1 );
    7417             : 
    7418     4673448 :         s12 = Mpy_32_16_1( L_add( t00, t02 ), C81_FX );
    7419     4673448 :         s14 = Mpy_32_16_1( L_sub( t00, t02 ), C81_FX );
    7420     4673448 :         s13 = Mpy_32_16_1( L_sub( t03, t01 ), C81_FX );
    7421     4673448 :         s15 = Mpy_32_16_1( L_add( t01, t03 ), C82_FX );
    7422             : 
    7423     4673448 :         re[add( i_mult( sx, i ), i_mult( sx, i_mult( 0, dim1 ) ) )] = L_add( s00, s02 );
    7424     4673448 :         move32();
    7425     4673448 :         im[add( i_mult( sx, i ), i_mult( sx, i_mult( 0, dim1 ) ) )] = L_add( s01, s03 );
    7426     4673448 :         move32();
    7427     4673448 :         re[add( i_mult( sx, i ), i_mult( sx, i_mult( 1, dim1 ) ) )] = L_add( s10, s12 );
    7428     4673448 :         move32();
    7429     4673448 :         im[add( i_mult( sx, i ), i_mult( sx, i_mult( 1, dim1 ) ) )] = L_add( s11, s13 );
    7430     4673448 :         move32();
    7431     4673448 :         re[add( i_mult( sx, i ), i_mult( sx, i_mult( 2, dim1 ) ) )] = L_sub( s04, s06 );
    7432     4673448 :         move32();
    7433     4673448 :         im[add( i_mult( sx, i ), i_mult( sx, i_mult( 2, dim1 ) ) )] = L_sub( s05, s07 );
    7434     4673448 :         move32();
    7435     4673448 :         re[add( i_mult( sx, i ), i_mult( sx, i_mult( 3, dim1 ) ) )] = L_add( s08, s14 );
    7436     4673448 :         move32();
    7437     4673448 :         im[add( i_mult( sx, i ), i_mult( sx, i_mult( 3, dim1 ) ) )] = L_add( s09, s15 );
    7438     4673448 :         move32();
    7439     4673448 :         re[add( i_mult( sx, i ), i_mult( sx, i_mult( 4, dim1 ) ) )] = L_sub( s00, s02 );
    7440     4673448 :         move32();
    7441     4673448 :         im[add( i_mult( sx, i ), i_mult( sx, i_mult( 4, dim1 ) ) )] = L_sub( s01, s03 );
    7442     4673448 :         move32();
    7443     4673448 :         re[add( i_mult( sx, i ), i_mult( sx, i_mult( 5, dim1 ) ) )] = L_sub( s10, s12 );
    7444     4673448 :         move32();
    7445     4673448 :         im[add( i_mult( sx, i ), i_mult( sx, i_mult( 5, dim1 ) ) )] = L_sub( s11, s13 );
    7446     4673448 :         move32();
    7447     4673448 :         re[add( i_mult( sx, i ), i_mult( sx, i_mult( 6, dim1 ) ) )] = L_add( s04, s06 );
    7448     4673448 :         move32();
    7449     4673448 :         im[add( i_mult( sx, i ), i_mult( sx, i_mult( 6, dim1 ) ) )] = L_add( s05, s07 );
    7450     4673448 :         move32();
    7451     4673448 :         re[add( i_mult( sx, i ), i_mult( sx, i_mult( 7, dim1 ) ) )] = L_sub( s08, s14 );
    7452     4673448 :         move32();
    7453     4673448 :         im[add( i_mult( sx, i ), i_mult( sx, i_mult( 7, dim1 ) ) )] = L_sub( s09, s15 );
    7454     4673448 :         move32();
    7455             :     }
    7456             : 
    7457      584181 :     return;
    7458             : }
    7459             : 
    7460             : 
    7461             : /*-----------------------------------------------------------------*
    7462             :  * BASOP_cfft_ivas()
    7463             :  *
    7464             :  * Complex valued FFT
    7465             :  *-----------------------------------------------------------------*/
    7466             : 
    7467      584181 : void BASOP_cfft_ivas(
    7468             :     Word32 *re,   /* i/o: real part                   */
    7469             :     Word32 *im,   /* i/o: imag part                   */
    7470             :     Word16 s,     /* i  : stride real and imag part   */
    7471             :     Word16 *scale /* i  : scalefactor                 */
    7472             : )
    7473             : {
    7474             :     Word32 x[2 * 64];
    7475             : 
    7476             :     /* FFT for len = FDNS_NPTS */
    7477      584181 :     BASOP_fftN2( re, im, RotVector_256, 8, 8, s, 8, x, 64 );
    7478      584181 :     s = add( *scale, SCALEFACTOR64 );
    7479             : 
    7480      584181 :     *scale = s;
    7481      584181 :     move16();
    7482             : 
    7483      584181 :     return;
    7484             : }
    7485             : 
    7486             : #undef WMC_TOOL_SKIP

Generated by: LCOV version 1.14