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 @ 3b2f07138c61dcf997bbf4165d0882f794b2995f Lines: 3396 5084 66.8 %
Date: 2025-05-03 01:55:50 Functions: 41 68 60.3 %

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

Generated by: LCOV version 1.14