LCOV - code coverage report
Current view: top level - lib_com - fft_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main -- dec/rend @ 4c82f1d24d39d0296b18d775f18a006f4c7d024b Lines: 3207 5084 63.1 %
Date: 2025-05-17 01:59:02 Functions: 40 68 58.8 %

          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       12096 : 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       12096 :     in1 = Idx[0];
     991       12096 :     move16();
     992       12096 :     in2 = Idx[32];
     993       12096 :     move16();
     994       12096 :     in3 = Idx[64];
     995       12096 :     move16();
     996       12096 :     in4 = Idx[96];
     997       12096 :     move16();
     998       12096 :     in5 = Idx[128];
     999       12096 :     move16();
    1000             : 
    1001       12096 :     fi1 = zRe[in1]; // Qx
    1002       12096 :     move32();
    1003       12096 :     fi2 = zIm[in1]; // Qx
    1004       12096 :     move32();
    1005       12096 :     fo3 = zRe[in2]; // Qx
    1006       12096 :     move32();
    1007       12096 :     fo4 = zRe[in5]; // Qx
    1008       12096 :     move32();
    1009       12096 :     fo6 = zRe[in3]; // Qx
    1010       12096 :     move32();
    1011       12096 :     fo7 = zRe[in4]; // Qx
    1012       12096 :     move32();
    1013             : 
    1014       12096 :     fo5 = L_add( fo3, fo4 );
    1015       12096 :     fo8 = L_add( fo6, fo7 );
    1016       12096 :     fi3 = L_add( fo5, fo8 );
    1017       12096 :     fi4 = L_sub( fo6, fo7 );
    1018       12096 :     fi5 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); // Qx
    1019       12096 :     fi6 = L_sub( fo3, fo4 );
    1020             : 
    1021       12096 :     fo3 = zIm[in2];
    1022       12096 :     move32();
    1023       12096 :     fo4 = zIm[in5];
    1024       12096 :     move32();
    1025       12096 :     fo6 = zIm[in3];
    1026       12096 :     move32();
    1027       12096 :     fo7 = zIm[in4];
    1028       12096 :     move32();
    1029             : 
    1030       12096 :     fo5 = L_add( fo3, fo4 );
    1031       12096 :     fo8 = L_add( fo6, fo7 );
    1032       12096 :     fi7 = L_sub( fo3, fo4 );
    1033       12096 :     fi8 = L_add( fo5, fo8 );
    1034       12096 :     fo1 = L_sub( fo6, fo7 );
    1035       12096 :     fo2 = Mpy_32_16_1( L_sub( fo5, fo8 ), FFT_15PONIT_WNK1 ); // Qx
    1036             : 
    1037       12096 :     zRe[in1] = L_add( fi1, fi3 );
    1038       12096 :     move32();
    1039       12096 :     zIm[in1] = L_add( fi2, fi8 );
    1040       12096 :     move32();
    1041             : 
    1042       12096 :     fo3 = L_add( Mpy_32_16_1( fi7, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fo1, FFT_15PONIT_WNK3 ) ); // Qx
    1043       12096 :     fo4 = L_sub( Mpy_32_16_1( fo1, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi7, FFT_15PONIT_WNK3 ) ); // Qx
    1044       12096 :     fo7 = L_sub( fi1, L_shr( fi3, 2 ) );
    1045       12096 :     fo5 = L_add( fi5, fo7 );
    1046       12096 :     fo6 = L_sub( fo7, fi5 );
    1047             : 
    1048       12096 :     zRe[in2] = L_add( fo6, fo4 );
    1049       12096 :     move32();
    1050       12096 :     zRe[in3] = L_add( fo5, fo3 );
    1051       12096 :     move32();
    1052       12096 :     zRe[in4] = L_sub( fo5, fo3 );
    1053       12096 :     move32();
    1054       12096 :     zRe[in5] = L_sub( fo6, fo4 );
    1055       12096 :     move32();
    1056             : 
    1057       12096 :     fo3 = L_add( Mpy_32_16_1( fi6, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi4, FFT_15PONIT_WNK3 ) ); // Qx
    1058       12096 :     fo4 = L_sub( Mpy_32_16_1( fi4, FFT_15PONIT_WNK2 ), Mpy_32_16_1( fi6, FFT_15PONIT_WNK3 ) ); // Qx
    1059       12096 :     fo7 = L_sub( fi2, L_shr( fi8, 2 ) );
    1060       12096 :     fo5 = L_add( fo2, fo7 );
    1061       12096 :     fo6 = L_sub( fo7, fo2 );
    1062             : 
    1063       12096 :     zIm[in2] = L_sub( fo6, fo4 );
    1064       12096 :     move32();
    1065       12096 :     zIm[in3] = L_sub( fo5, fo3 );
    1066       12096 :     move32();
    1067       12096 :     zIm[in4] = L_add( fo3, fo5 );
    1068       12096 :     move32();
    1069       12096 :     zIm[in5] = L_add( fo4, fo6 );
    1070       12096 :     move32();
    1071             : 
    1072       12096 :     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        1890 : 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       62370 :     FOR( i = 0; i < 32; i++ )
    1172             :     {
    1173       60480 :         id = Idx[i];
    1174       60480 :         move16();
    1175       60480 :         z[2 * i] = x[id]; // Qx
    1176       60480 :         move32();
    1177       60480 :         z[( ( i << 1 ) + 1 )] = y[id]; // Qx
    1178       60480 :         move32();
    1179             :     }
    1180             : 
    1181        1890 :     cdftForw( 64, z, Ip_fft32, w_fft32_fx );
    1182             : 
    1183       62370 :     FOR( i = 0; i < 32; i++ )
    1184             :     {
    1185       60480 :         jd = Odx_fft32_5[i];
    1186       60480 :         move16();
    1187       60480 :         id = Idx[jd];
    1188       60480 :         move16();
    1189       60480 :         x[id] = z[2 * i]; // Qx
    1190       60480 :         move32();
    1191       60480 :         y[id] = z[( ( i << 1 ) + 1 )]; // Qx
    1192       60480 :         move32();
    1193             :     }
    1194             : 
    1195        1890 :     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         378 : 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        2268 :     FOR( j = 0; j < 5; j++ )
    1628             :     {
    1629        1890 :         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       12474 :     FOR( j = 0; j < 32; j++ )
    1634             :     {
    1635       12096 :         fft5_32( x, y, Idx_dortft160 + j );
    1636             :     }
    1637             : 
    1638         378 :     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     1101596 : 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     1101596 :     bitrv2_SR( n, ip + 2, a );
    1801             : 
    1802             :     /* Do FFT */
    1803     1101596 :     cftfsub( n, a, w );
    1804     1101596 : }
    1805             : 
    1806             : /*-----------------------------------------------------------------*
    1807             :  * bitrv2_SR()
    1808             :  * Bit reversal
    1809             :  *-----------------------------------------------------------------*/
    1810             : 
    1811     1101596 : 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     1101596 :     IF( EQ_16( n, 64 ) )
    1822             :     {
    1823        1890 :         m = 4;
    1824        1890 :         move16();
    1825        1890 :         l = -1;
    1826        1890 :         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     1101596 :     m2 = shl( m, 1 );
    1858             : 
    1859     1101596 :     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    11125512 :         FOR( k = 1; k < m; k++ )
    1962             :         {
    1963    93824730 :             FOR( j = 0; j < k; j++ )
    1964             :             {
    1965    83395980 :                 j1 = add( shl( j, 1 ), ip[k] );
    1966    83395980 :                 k1 = add( shl( k, 1 ), ip[j] );
    1967    83395980 :                 xr = a[j1];
    1968    83395980 :                 move32();
    1969    83395980 :                 xi = a[j1 + 1];
    1970    83395980 :                 move32();
    1971    83395980 :                 yr = a[k1];
    1972    83395980 :                 move32();
    1973    83395980 :                 yi = a[k1 + 1];
    1974    83395980 :                 move32();
    1975    83395980 :                 a[j1] = yr;
    1976    83395980 :                 move32();
    1977    83395980 :                 a[j1 + 1] = yi;
    1978    83395980 :                 move32();
    1979    83395980 :                 a[k1] = xr;
    1980    83395980 :                 move32();
    1981    83395980 :                 a[k1 + 1] = xi;
    1982    83395980 :                 move32();
    1983    83395980 :                 j1 = add( j1, m2 );
    1984    83395980 :                 k1 = add( k1, m2 );
    1985    83395980 :                 xr = a[j1];
    1986    83395980 :                 move32();
    1987    83395980 :                 xi = a[j1 + 1];
    1988    83395980 :                 move32();
    1989    83395980 :                 yr = a[k1];
    1990    83395980 :                 move32();
    1991    83395980 :                 yi = a[k1 + 1];
    1992    83395980 :                 move32();
    1993    83395980 :                 a[j1] = yr;
    1994    83395980 :                 move32();
    1995    83395980 :                 a[j1 + 1] = yi;
    1996    83395980 :                 move32();
    1997    83395980 :                 a[k1] = xr;
    1998    83395980 :                 move32();
    1999    83395980 :                 a[k1 + 1] = xi;
    2000    83395980 :                 move32();
    2001             :             }
    2002             :         }
    2003             :     }
    2004             : 
    2005     1101596 :     return;
    2006             : }
    2007             : 
    2008             : /*-----------------------------------------------------------------*
    2009             :  * cftfsub()
    2010             :  * Complex Discrete Fourier Transform
    2011             :  *-----------------------------------------------------------------*/
    2012             : 
    2013     1101596 : 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     1101596 :     l = 2;
    2023     1101596 :     move16();
    2024             : 
    2025     1101596 :     IF( GT_16( n, 8 ) )
    2026             :     {
    2027     1101596 :         cft1st( n, a, w );
    2028             : 
    2029     1101596 :         l = 8;
    2030     1101596 :         move16();
    2031             : 
    2032     3586660 :         WHILE( ( ( l << 2 ) < n ) )
    2033             :         {
    2034     2485064 :             cftmdl( n, l, a, w );
    2035     2485064 :             l = shl( l, 2 );
    2036             :         }
    2037             :     }
    2038             : 
    2039     1101596 :     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   178614234 :         FOR( j = 0; j < l; j += 2 )
    2075             :         {
    2076   177917472 :             j1 = add( j, l );
    2077   177917472 :             x0r = L_sub( a[j], a[j1] );
    2078   177917472 :             x0i = L_sub( a[j + 1], a[j1 + 1] );
    2079   177917472 :             a[j] = L_add( a[j], a[j1] );
    2080   177917472 :             move32();
    2081   177917472 :             a[j + 1] = L_add( a[j + 1], a[j1 + 1] );
    2082   177917472 :             move32();
    2083   177917472 :             a[j1] = x0r;
    2084   177917472 :             move32();
    2085   177917472 :             a[j1 + 1] = x0i;
    2086   177917472 :             move32();
    2087             :         }
    2088             :     }
    2089             : 
    2090     1101596 :     return;
    2091             : }
    2092             : 
    2093             : /*-----------------------------------------------------------------*
    2094             :  * cft1st()
    2095             :  * Subfunction of Complex Discrete Fourier Transform
    2096             :  *-----------------------------------------------------------------*/
    2097             : 
    2098     1101596 : 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     1101596 :     x0r = L_add( a[0], a[2] ); // Qx
    2109     1101596 :     x0i = L_add( a[1], a[3] ); // Qx
    2110     1101596 :     x1r = L_sub( a[0], a[2] ); // Qx
    2111     1101596 :     x1i = L_sub( a[1], a[3] ); // Qx
    2112     1101596 :     x2r = L_add( a[4], a[6] ); // Qx
    2113     1101596 :     x2i = L_add( a[5], a[7] ); // Qx
    2114     1101596 :     x3r = L_sub( a[4], a[6] ); // Qx
    2115     1101596 :     x3i = L_sub( a[5], a[7] ); // Qx
    2116     1101596 :     a[0] = L_add( x0r, x2r );
    2117     1101596 :     move32();
    2118     1101596 :     a[1] = L_add( x0i, x2i );
    2119     1101596 :     move32();
    2120     1101596 :     a[4] = L_sub( x0r, x2r );
    2121     1101596 :     move32();
    2122     1101596 :     a[5] = L_sub( x0i, x2i );
    2123     1101596 :     move32();
    2124     1101596 :     a[2] = L_sub( x1r, x3i );
    2125     1101596 :     move32();
    2126     1101596 :     a[3] = L_add( x1i, x3r );
    2127     1101596 :     move32();
    2128     1101596 :     a[6] = L_add( x1r, x3i );
    2129     1101596 :     move32();
    2130     1101596 :     a[7] = L_sub( x1i, x3r );
    2131     1101596 :     move32();
    2132     1101596 :     wk1r = w[2];
    2133     1101596 :     x0r = L_add( a[8], a[10] );
    2134     1101596 :     x0i = L_add( a[9], a[11] );
    2135     1101596 :     x1r = L_sub( a[8], a[10] );
    2136     1101596 :     x1i = L_sub( a[9], a[11] );
    2137     1101596 :     x2r = L_add( a[12], a[14] );
    2138     1101596 :     x2i = L_add( a[13], a[15] );
    2139     1101596 :     x3r = L_sub( a[12], a[14] );
    2140     1101596 :     x3i = L_sub( a[13], a[15] );
    2141     1101596 :     a[8] = L_add( x0r, x2r );
    2142     1101596 :     move32();
    2143     1101596 :     a[9] = L_add( x0i, x2i );
    2144     1101596 :     move32();
    2145     1101596 :     a[12] = L_sub( x2i, x0i );
    2146     1101596 :     move32();
    2147     1101596 :     a[13] = L_sub( x0r, x2r );
    2148     1101596 :     move32();
    2149     1101596 :     x0r = L_sub( x1r, x3i );
    2150     1101596 :     x0i = L_add( x1i, x3r );
    2151     1101596 :     a[10] = Mpy_32_16_1( L_sub( x0r, x0i ), wk1r );
    2152     1101596 :     move32();
    2153     1101596 :     a[11] = Mpy_32_16_1( L_add( x0r, x0i ), wk1r );
    2154     1101596 :     move32();
    2155     1101596 :     x0r = L_add( x3i, x1r );
    2156     1101596 :     x0i = L_sub( x3r, x1i );
    2157     1101596 :     a[14] = Mpy_32_16_1( L_sub( x0i, x0r ), wk1r );
    2158     1101596 :     move32();
    2159     1101596 :     a[15] = Mpy_32_16_1( L_add( x0i, x0r ), wk1r );
    2160     1101596 :     move32();
    2161     1101596 :     k1 = 0;
    2162     1101596 :     move16();
    2163             : 
    2164    47895016 :     FOR( j = 16; j < n; j += 16 )
    2165             :     {
    2166    46793420 :         k1 = add( k1, 2 );
    2167    46793420 :         k2 = shl( k1, 1 );
    2168    46793420 :         wk2r = w[k1];
    2169    46793420 :         move16();
    2170    46793420 :         wk2i = w[k1 + 1];
    2171    46793420 :         move16();
    2172    46793420 :         wk1r = w[k2];
    2173    46793420 :         move16();
    2174    46793420 :         wk1i = w[k2 + 1];
    2175    46793420 :         move16();
    2176    46793420 :         wtmp = mult_r( wk2i, wk1i );
    2177    46793420 :         wk3r = sub( wk1r, wtmp );
    2178    46793420 :         wk3r = sub( wk3r, wtmp );
    2179    46793420 :         wtmp = mult_r( wk2i, wk1r );
    2180    46793420 :         wk3i = sub( wtmp, wk1i );
    2181    46793420 :         wk3i = add( wtmp, wk3i );
    2182    46793420 :         x0r = L_add( a[j], a[j + 2] );
    2183    46793420 :         x0i = L_add( a[j + 1], a[j + 3] );
    2184    46793420 :         x1r = L_sub( a[j], a[j + 2] );
    2185    46793420 :         x1i = L_sub( a[j + 1], a[j + 3] );
    2186    46793420 :         x2r = L_add( a[j + 4], a[j + 6] );
    2187    46793420 :         x2i = L_add( a[j + 5], a[j + 7] );
    2188    46793420 :         x3r = L_sub( a[j + 4], a[j + 6] );
    2189    46793420 :         x3i = L_sub( a[j + 5], a[j + 7] );
    2190    46793420 :         a[j] = L_add( x0r, x2r );
    2191    46793420 :         move32();
    2192    46793420 :         a[j + 1] = L_add( x0i, x2i );
    2193    46793420 :         move32();
    2194    46793420 :         x0r = L_sub( x0r, x2r );
    2195    46793420 :         x0i = L_sub( x0i, x2i );
    2196    46793420 :         a[j + 4] = L_sub( Mpy_32_16_1( x0r, wk2r ), Mpy_32_16_1( x0i, wk2i ) );
    2197    46793420 :         move32();
    2198    46793420 :         a[j + 5] = L_add( Mpy_32_16_1( x0i, wk2r ), Mpy_32_16_1( x0r, wk2i ) );
    2199    46793420 :         move32();
    2200    46793420 :         x0r = L_sub( x1r, x3i );
    2201    46793420 :         x0i = L_add( x1i, x3r );
    2202    46793420 :         a[j + 2] = L_sub( Mpy_32_16_1( x0r, wk1r ), Mpy_32_16_1( x0i, wk1i ) );
    2203    46793420 :         move32();
    2204    46793420 :         a[j + 3] = L_add( Mpy_32_16_1( x0i, wk1r ), Mpy_32_16_1( x0r, wk1i ) );
    2205    46793420 :         move32();
    2206    46793420 :         x0r = L_add( x1r, x3i );
    2207    46793420 :         x0i = L_sub( x1i, x3r );
    2208    46793420 :         a[j + 6] = L_sub( Mpy_32_16_1( x0r, wk3r ), Mpy_32_16_1( x0i, wk3i ) );
    2209    46793420 :         move32();
    2210    46793420 :         a[j + 7] = L_add( Mpy_32_16_1( x0i, wk3r ), Mpy_32_16_1( x0r, wk3i ) );
    2211    46793420 :         move32();
    2212    46793420 :         wk1r = w[k2 + 2];
    2213    46793420 :         move16();
    2214    46793420 :         wk1i = w[k2 + 3];
    2215    46793420 :         move16();
    2216    46793420 :         wtmp = mult_r( wk2r, wk1i );
    2217    46793420 :         wk3r = sub( wk1r, wtmp );
    2218    46793420 :         wk3r = sub( wk3r, wtmp );
    2219    46793420 :         wtmp = mult_r( wk2r, wk1r );
    2220    46793420 :         wk3i = sub( wtmp, wk1i );
    2221    46793420 :         wk3i = add( wtmp, wk3i );
    2222    46793420 :         x0r = L_add( a[j + 8], a[j + 10] );
    2223    46793420 :         x0i = L_add( a[j + 9], a[j + 11] );
    2224    46793420 :         x1r = L_sub( a[j + 8], a[j + 10] );
    2225    46793420 :         x1i = L_sub( a[j + 9], a[j + 11] );
    2226    46793420 :         x2r = L_add( a[j + 12], a[j + 14] );
    2227    46793420 :         x2i = L_add( a[j + 13], a[j + 15] );
    2228    46793420 :         x3r = L_sub( a[j + 12], a[j + 14] );
    2229    46793420 :         x3i = L_sub( a[j + 13], a[j + 15] );
    2230    46793420 :         a[j + 8] = L_add( x0r, x2r );
    2231    46793420 :         move32();
    2232    46793420 :         a[j + 9] = L_add( x0i, x2i );
    2233    46793420 :         move32();
    2234    46793420 :         x0r = L_sub( x0r, x2r );
    2235    46793420 :         x0i = L_sub( x0i, x2i );
    2236    46793420 :         a[j + 12] = L_negate( L_add( Mpy_32_16_1( x0r, wk2i ), Mpy_32_16_1( x0i, wk2r ) ) );
    2237    46793420 :         move32();
    2238    46793420 :         a[j + 13] = L_sub( Mpy_32_16_1( x0r, wk2r ), Mpy_32_16_1( x0i, wk2i ) );
    2239    46793420 :         move32();
    2240    46793420 :         x0r = L_sub( x1r, x3i );
    2241    46793420 :         x0i = L_add( x1i, x3r );
    2242    46793420 :         a[j + 10] = L_sub( Mpy_32_16_1( x0r, wk1r ), Mpy_32_16_1( x0i, wk1i ) );
    2243    46793420 :         move32();
    2244    46793420 :         a[j + 11] = L_add( Mpy_32_16_1( x0i, wk1r ), Mpy_32_16_1( x0r, wk1i ) );
    2245    46793420 :         x0r = L_add( x1r, x3i );
    2246    46793420 :         x0i = L_sub( x1i, x3r );
    2247    46793420 :         a[j + 14] = L_sub( Mpy_32_16_1( x0r, wk3r ), Mpy_32_16_1( x0i, wk3i ) );
    2248    46793420 :         move32();
    2249    46793420 :         a[j + 15] = L_add( Mpy_32_16_1( x0i, wk3r ), Mpy_32_16_1( x0r, wk3i ) );
    2250    46793420 :         move32();
    2251             :     }
    2252             : 
    2253     1101596 :     return;
    2254             : }
    2255             : 
    2256             : /*-----------------------------------------------------------------*
    2257             :  * cftmdl()
    2258             :  * Subfunction of Complex Discrete Fourier Transform
    2259             :  *-----------------------------------------------------------------*/
    2260             : 
    2261     2485064 : 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     2485064 :     m = shl( l, 2 );
    2273    62599192 :     FOR( j = 0; j < l; j += 2 )
    2274             :     {
    2275    60114128 :         j1 = add( j, l );
    2276    60114128 :         j2 = add( j1, l );
    2277    60114128 :         j3 = add( j2, l );
    2278    60114128 :         x0r = L_add( a[j], a[j1] );          // Qx
    2279    60114128 :         x0i = L_add( a[j + 1], a[j1 + 1] );  // Qx
    2280    60114128 :         x1r = L_sub( a[j], a[j1] );          // Qx
    2281    60114128 :         x1i = L_sub( a[j + 1], a[j1 + 1] );  // Qx
    2282    60114128 :         x2r = L_add( a[j2], a[j3] );         // Qx
    2283    60114128 :         x2i = L_add( a[j2 + 1], a[j3 + 1] ); // Qx
    2284    60114128 :         x3r = L_sub( a[j2], a[j3] );         // Qx
    2285    60114128 :         x3i = L_sub( a[j2 + 1], a[j3 + 1] ); // Qx
    2286    60114128 :         a[j] = L_add( x0r, x2r );
    2287    60114128 :         move32();
    2288    60114128 :         a[j + 1] = L_add( x0i, x2i );
    2289    60114128 :         move32();
    2290    60114128 :         a[j2] = L_sub( x0r, x2r );
    2291    60114128 :         move32();
    2292    60114128 :         a[j2 + 1] = L_sub( x0i, x2i );
    2293    60114128 :         move32();
    2294    60114128 :         a[j1] = L_sub( x1r, x3i );
    2295    60114128 :         move32();
    2296    60114128 :         a[j1 + 1] = L_add( x1i, x3r );
    2297    60114128 :         move32();
    2298    60114128 :         a[j3] = L_add( x1r, x3i );
    2299    60114128 :         move32();
    2300    60114128 :         a[j3 + 1] = L_sub( x1i, x3r );
    2301    60114128 :         move32();
    2302             :     }
    2303             : 
    2304     2485064 :     wk1r = w[2];
    2305     2485064 :     move16();
    2306    62599192 :     FOR( j = m; j < l + m; j += 2 )
    2307             :     {
    2308    60114128 :         j1 = add( j, l );
    2309    60114128 :         j2 = add( j1, l );
    2310    60114128 :         j3 = add( j2, l );
    2311    60114128 :         x0r = L_add( a[j], a[j1] );
    2312    60114128 :         x0i = L_add( a[j + 1], a[j1 + 1] );
    2313    60114128 :         x1r = L_sub( a[j], a[j1] );
    2314    60114128 :         x1i = L_sub( a[j + 1], a[j1 + 1] );
    2315    60114128 :         x2r = L_add( a[j2], a[j3] );
    2316    60114128 :         x2i = L_add( a[j2 + 1], a[j3 + 1] );
    2317    60114128 :         x3r = L_sub( a[j2], a[j3] );
    2318    60114128 :         x3i = L_sub( a[j2 + 1], a[j3 + 1] );
    2319    60114128 :         a[j] = L_add( x0r, x2r );
    2320    60114128 :         move32();
    2321    60114128 :         a[j + 1] = L_add( x0i, x2i );
    2322    60114128 :         move32();
    2323    60114128 :         a[j2] = L_sub( x2i, x0i );
    2324    60114128 :         move32();
    2325    60114128 :         a[j2 + 1] = L_sub( x0r, x2r );
    2326    60114128 :         move32();
    2327    60114128 :         x0r = L_sub( x1r, x3i );
    2328    60114128 :         x0i = L_add( x1i, x3r );
    2329    60114128 :         a[j1] = Mpy_32_16_1( L_sub( x0r, x0i ), wk1r );
    2330    60114128 :         move32();
    2331    60114128 :         a[j1 + 1] = Mpy_32_16_1( L_add( x0r, x0i ), wk1r );
    2332    60114128 :         move32();
    2333    60114128 :         x0r = L_add( x3i, x1r );
    2334    60114128 :         x0i = L_sub( x3r, x1i );
    2335    60114128 :         a[j3] = Mpy_32_16_1( L_sub( x0i, x0r ), wk1r );
    2336    60114128 :         move32();
    2337    60114128 :         a[j3 + 1] = Mpy_32_16_1( L_add( x0i, x0r ), wk1r );
    2338    60114128 :         move32();
    2339             :     }
    2340             : 
    2341     2485064 :     k1 = 0;
    2342     2485064 :     move16();
    2343     2485064 :     m2 = shl( m, 1 );
    2344    15462862 :     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     2485064 :     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     8262720 : static void butterfly(
    3476             :     const Word32 a, // Qx
    3477             :     const Word32 b, // Qx
    3478             :     Word32 *aPlusb, // Qx
    3479             :     Word32 *aMinusb // Qx
    3480             : )
    3481             : {
    3482     8262720 :     *aPlusb = L_add( a, b );
    3483     8262720 :     move32();
    3484     8262720 :     *aMinusb = L_sub( a, b );
    3485     8262720 :     move32();
    3486             : 
    3487     8262720 :     return;
    3488             : }
    3489             : 
    3490     5508480 : 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     5508480 :     re1 = pInOut[0];
    3502     5508480 :     move32();
    3503     5508480 :     im1 = pInOut[1];
    3504     5508480 :     move32();
    3505     5508480 :     re2 = pInOut[2];
    3506     5508480 :     move32();
    3507     5508480 :     im2 = pInOut[3];
    3508     5508480 :     move32();
    3509     5508480 :     pInOut[0] = L_add( re1, re2 );
    3510     5508480 :     move32();
    3511     5508480 :     pInOut[1] = L_add( im1, im2 );
    3512     5508480 :     move32();
    3513             : 
    3514     5508480 :     pInOut[2] = L_sub( re1, re2 );
    3515     5508480 :     move32();
    3516     5508480 :     pInOut[3] = L_sub( im1, im2 );
    3517     5508480 :     move32();
    3518             : 
    3519     5508480 :     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     3672320 : 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     3672320 :     re1 = pInOut[0]; // Qx
    3535     3672320 :     move32();
    3536     3672320 :     im1 = pInOut[1]; // Qx
    3537     3672320 :     move32();
    3538     3672320 :     re2 = pInOut[2]; // Qx
    3539     3672320 :     move32();
    3540     3672320 :     im2 = pInOut[3]; // Qx
    3541     3672320 :     move32();
    3542     3672320 :     re3 = pInOut[4]; // Qx
    3543     3672320 :     move32();
    3544     3672320 :     im3 = pInOut[5]; // Qx
    3545     3672320 :     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     3672320 :     tmp1 = L_add( re2, re3 );
    3554     3672320 :     tmp3 = L_add( im2, im3 );
    3555     3672320 :     tmp2 = L_sub( re2, re3 );
    3556     3672320 :     tmp4 = L_sub( im2, im3 );
    3557     3672320 :     pInOut[0] = L_add( re1, tmp1 );
    3558     3672320 :     move32();
    3559     3672320 :     pInOut[1] = L_add( im1, tmp3 );
    3560     3672320 :     move32();
    3561     3672320 :     pInOut[2] = L_sub( re1, L_sub( Mpy_32_16_1( tmp1, C31 ), Mpy_32_16_1( tmp4, C32 ) ) ); // Qx
    3562     3672320 :     move32();
    3563     3672320 :     pInOut[4] = L_sub( re1, L_add( Mpy_32_16_1( tmp1, C31 ), Mpy_32_16_1( tmp4, C32 ) ) ); // Qx
    3564     3672320 :     move32();
    3565             : 
    3566     3672320 :     pInOut[3] = L_sub( im1, L_add( Mpy_32_16_1( tmp2, C32 ), Mpy_32_16_1( tmp3, C31 ) ) ); // Qx
    3567     3672320 :     move32();
    3568     3672320 :     pInOut[5] = L_add( im1, L_sub( Mpy_32_16_1( tmp2, C32 ), Mpy_32_16_1( tmp3, C31 ) ) ); // Qx
    3569     3672320 :     move32();
    3570     3672320 : }
    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     2203392 : static void fft5(
    3645             :     cmplx *pInOut /*Qx*/ )
    3646             : {
    3647             :     cmplx x[5];
    3648             :     cmplx t[4];
    3649             : 
    3650     2203392 :     x[0] = pInOut[0];
    3651     2203392 :     move32();
    3652     2203392 :     x[1] = pInOut[1];
    3653     2203392 :     move32();
    3654     2203392 :     x[2] = pInOut[2];
    3655     2203392 :     move32();
    3656     2203392 :     x[3] = pInOut[3];
    3657     2203392 :     move32();
    3658     2203392 :     x[4] = pInOut[4];
    3659     2203392 :     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     2203392 :     t[0] = CL_add( x[1], x[4] );
    3670     2203392 :     move32();
    3671     2203392 :     t[1] = CL_sub( x[1], x[4] );
    3672     2203392 :     move32();
    3673     2203392 :     t[2] = CL_add( x[2], x[3] );
    3674     2203392 :     move32();
    3675     2203392 :     t[3] = CL_sub( x[2], x[3] );
    3676     2203392 :     move32();
    3677             : 
    3678             : 
    3679     2203392 :     pInOut[0] = CL_add( x[0], CL_add( t[0], t[2] ) );
    3680     2203392 :     move32();
    3681             : 
    3682     2203392 :     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     2203392 :     move32();
    3684     2203392 :     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     2203392 :     move32();
    3686     2203392 :     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     2203392 :     move32();
    3688     2203392 :     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     2203392 :     move32();
    3690             : 
    3691     2203392 :     return;
    3692             : }
    3693             : 
    3694             : static const Word16 C81 = 0x5a82; /* 0.707106781186548f cos(PI/4);   Q15*/
    3695             : 
    3696     1377120 : 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     1377120 :     re0 = pInOut[0];
    3709     1377120 :     move32();
    3710     1377120 :     im0 = pInOut[1];
    3711     1377120 :     move32();
    3712     1377120 :     re4 = pInOut[8];
    3713     1377120 :     move32();
    3714     1377120 :     im4 = pInOut[9];
    3715     1377120 :     move32();
    3716     1377120 :     butterfly( pInOut[1 * 2], pInOut[7 * 2], &re1_7p, &re1_7m );
    3717     1377120 :     butterfly( pInOut[1 * 2 + 1], pInOut[7 * 2 + 1], &im1_7p, &im1_7m );
    3718     1377120 :     butterfly( pInOut[2 * 2], pInOut[6 * 2], &re2_6p, &re2_6m );
    3719     1377120 :     butterfly( pInOut[2 * 2 + 1], pInOut[6 * 2 + 1], &im2_6p, &im2_6m );
    3720     1377120 :     butterfly( pInOut[3 * 2], pInOut[5 * 2], &re3_5p, &re3_5m );
    3721     1377120 :     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     1377120 :     pInOut[0] = L_add( L_add( L_add( L_add( re0, re4 ), re1_7p ), re2_6p ), re3_5p );
    3734     1377120 :     move32();
    3735     1377120 :     pInOut[1] = L_add( L_add( L_add( L_add( im0, im4 ), im1_7p ), im2_6p ), im3_5p );
    3736     1377120 :     move32();
    3737             : 
    3738     1377120 :     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     1377120 :     move32();
    3740     1377120 :     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     1377120 :     move32();
    3742             : 
    3743     1377120 :     pInOut[4] = L_sub( L_add( L_add( L_sub( re0, re2_6p ), re4 ), im1_7m ), im3_5m );
    3744     1377120 :     move32();
    3745     1377120 :     pInOut[5] = L_add( L_sub( L_add( L_sub( im0, im2_6p ), im4 ), re1_7m ), re3_5m );
    3746     1377120 :     move32();
    3747             : 
    3748     1377120 :     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     1377120 :     move32();
    3750     1377120 :     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     1377120 :     move32();
    3752             : 
    3753     1377120 :     pInOut[8] = L_add( L_sub( L_add( L_sub( re0, re1_7p ), re2_6p ), re3_5p ), re4 );
    3754     1377120 :     move32();
    3755     1377120 :     pInOut[9] = L_add( L_sub( L_add( L_sub( im0, im1_7p ), im2_6p ), im3_5p ), im4 );
    3756     1377120 :     move32();
    3757             : 
    3758     1377120 :     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     1377120 :     move32();
    3760     1377120 :     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     1377120 :     move32();
    3762             : 
    3763     1377120 :     pInOut[12] = L_add( L_sub( L_add( L_sub( re0, re2_6p ), re4 ), im1_7m ), im3_5m );
    3764     1377120 :     move32();
    3765     1377120 :     pInOut[13] = L_sub( L_add( L_add( L_sub( im0, im2_6p ), im4 ), re1_7m ), re3_5m );
    3766     1377120 :     move32();
    3767             : 
    3768     1377120 :     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     1377120 :     move32();
    3770     1377120 :     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     1377120 :     move32();
    3772             : 
    3773     1377120 :     return;
    3774             : }
    3775             : 
    3776     1377120 : static void nextFFT(
    3777             :     Word32 *x, /*Qx*/
    3778             :     const Word16 length /*Qx*/ )
    3779             : {
    3780             :     cmplx val[5];
    3781     1377120 :     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     1377120 :         case 8:
    3810     1377120 :             fft8_2( x );
    3811     1377120 :             BREAK;
    3812           0 :         default:
    3813           0 :             assert( !"length not supported" );
    3814             :             BREAK;
    3815             :     }
    3816             : 
    3817     1377120 :     return;
    3818             : }
    3819             : 
    3820             : static const Word16 CTFFTfactors[] = { 9, 8, 7, 5, 4, 3, 2, 0 };
    3821             : 
    3822      688560 : static __inline Word16 findFactor(
    3823             :     const Word16 length )
    3824             : {
    3825      688560 :     Word16 i = 0;
    3826      688560 :     move16();
    3827      688560 :     Word16 factor = 0;
    3828      688560 :     move16();
    3829             : 
    3830     1377120 :     WHILE( CTFFTfactors[i] != 0 )
    3831             :     {
    3832     1377120 :         IF( ( length % CTFFTfactors[i] ) == 0 )
    3833             :         {
    3834      688560 :             factor = CTFFTfactors[i];
    3835      688560 :             move16();
    3836      688560 :             BREAK;
    3837             :         }
    3838      688560 :         i += 1;
    3839             :     }
    3840      688560 :     return factor;
    3841             : }
    3842             : 
    3843      688560 : 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      688560 :     const Word16 *ptr_sin = &sin_twiddle_table_25_5_5[0]; // Q15
    3851      688560 :     const Word16 *ptr_cos = &cos_twiddle_table_25_5_5[0]; // Q15
    3852             : 
    3853      688560 :     test();
    3854      688560 :     test();
    3855      688560 :     test();
    3856      688560 :     test();
    3857      688560 :     IF( EQ_16( length, 16 ) && EQ_16( n1, 8 ) && EQ_16( n2, 2 ) )
    3858             :     {
    3859      688560 :         ptr_sin = &sin_twiddle_table_16_8_2[0]; // Q15
    3860      688560 :         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     5508480 :     FOR( i = 1; i < n1; i++ )
    3868             :     {
    3869     9639840 :         FOR( ii = 1; ii < n2; ii++ )
    3870             :         {
    3871             :             Word32 xRe, xIm;
    3872     4819920 :             xRe = x[( ( ( ( i * n2 ) + ii ) ) << 1 )];                                                                                                         // Qx
    3873     4819920 :             xIm = x[( ( ( ( ( i * n2 ) + ii ) ) << 1 ) + 1 )];                                                                                                 // Qx
    3874     4819920 :             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     4819920 :             move32();
    3876     4819920 :             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     4819920 :             move32();
    3878             :         }
    3879             :     }
    3880      688560 :     return;
    3881             : }
    3882             : 
    3883    12072752 : 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    12072752 :     Word16 cnt = 0;
    3893    12072752 :     move16();
    3894             :     Word32 *src, *dest;
    3895             :     cmplx val[5];
    3896             : 
    3897    12072752 :     SWITCH( length )
    3898             :     {
    3899           0 :         case 1:
    3900           0 :             BREAK;
    3901     5508480 :         case 2:
    3902     5508480 :             fft2( x );
    3903     5508480 :             BREAK;
    3904     3672320 :         case 3:
    3905     3672320 :             fft3_2( x );
    3906     3672320 :             BREAK;
    3907           0 :         case 4:
    3908           0 :             fft4( x );
    3909           0 :             BREAK;
    3910     2203392 :         case 5:
    3911    13220352 :             FOR( i = 0; i < 5; i++ )
    3912             :             {
    3913    11016960 :                 val[i].re = x[2 * i]; // Qx
    3914    11016960 :                 move32();
    3915    11016960 :                 val[i].im = x[( ( i << 1 ) + 1 )]; // Qx
    3916    11016960 :                 move32();
    3917             :             }
    3918     2203392 :             fft5( val );
    3919    13220352 :             FOR( i = 0; i < 5; i++ )
    3920             :             {
    3921    11016960 :                 x[2 * i] = val[i].re;
    3922    11016960 :                 move32();
    3923    11016960 :                 x[( ( i << 1 ) + 1 )] = val[i].im;
    3924    11016960 :                 move32();
    3925             :             }
    3926     2203392 :             BREAK;
    3927           0 :         case 8:
    3928           0 :             fft8_2( x );
    3929           0 :             BREAK;
    3930      688560 :         default:
    3931             :         {
    3932      688560 :             factor = findFactor( length );
    3933             : 
    3934      688560 :             IF( ( factor > 0 ) && GT_16( idiv1616( length, factor ), 1 ) )
    3935             :             {
    3936      688560 :                 n1 = factor;
    3937      688560 :                 move16();
    3938      688560 :                 n2 = idiv1616( length, factor );
    3939             : 
    3940             :                 /* DATA Resorting for stage1 */
    3941      688560 :                 dest = scratch; // Qx
    3942     6197040 :                 FOR( i = 0; i < 2 * n1; i += 2 )
    3943             :                 {
    3944     5508480 :                     src = x + i;
    3945    16525440 :                     FOR( ii = 0; ii < n2; ii++ )
    3946             :                     {
    3947             :                         /* *dest++ = x[2*(i+ii*n1)]; */
    3948             :                         /* *dest++ = x[2*(i+ii*n1)+1]; */
    3949    11016960 :                         *dest++ = *src;
    3950    11016960 :                         move32();
    3951    11016960 :                         *dest++ = *( src + 1 );
    3952    11016960 :                         move32();
    3953    11016960 :                         src += 2 * n1;
    3954             :                     }
    3955             :                 }
    3956      688560 :                 src = scratch; // Qx
    3957      688560 :                 dest = x;
    3958    11705520 :                 FOR( i = 0; i < length; i++ )
    3959             :                 {
    3960    11016960 :                     *dest++ = *src++;
    3961    11016960 :                     move32();
    3962    11016960 :                     *dest++ = *src++;
    3963    11016960 :                     move32();
    3964             :                 }
    3965             :                 /* perform n1 ffts of length n2 */
    3966     6197040 :                 FOR( i = 0; i < n1; i++ )
    3967             :                 {
    3968     5508480 :                     cooleyTukeyFFT( x + shl( i_mult( i, n2 ), 1 ), n2, scratch + shl( i_mult( i, n2 ), 1 ) );
    3969             :                 }
    3970             :                 /*data twiddeling */
    3971      688560 :                 twiddle( x, length, n1, n2 );
    3972             :                 /* DATA Resorting for stage2 */
    3973      688560 :                 cnt = 0;
    3974      688560 :                 move16();
    3975     2065680 :                 FOR( i = 0; i < n2; i++ )
    3976             :                 {
    3977    12394080 :                     FOR( ii = 0; ii < n1; ii++ )
    3978             :                     {
    3979    11016960 :                         scratch[2 * cnt] = x[( ( i + ( ii * n2 ) ) << 1 )];
    3980    11016960 :                         move32();
    3981    11016960 :                         scratch[( ( cnt << 1 ) + 1 )] = x[( ( ( i + ( ii * n2 ) ) << 1 ) + 1 )];
    3982    11016960 :                         move32();
    3983    11016960 :                         cnt = add( cnt, 1 );
    3984             :                     }
    3985             :                 }
    3986             :                 /* perform n2 ffts of length n1 */
    3987     2065680 :                 FOR( i = 0; i < n2; i++ )
    3988             :                 {
    3989     1377120 :                     nextFFT( scratch + shl( i_mult( i, n1 ), 1 ), n1 );
    3990             :                 }
    3991      688560 :                 cnt = 0;
    3992      688560 :                 move16();
    3993     6197040 :                 FOR( i = 0; i < n1; i++ )
    3994             :                 {
    3995    16525440 :                     FOR( ii = 0; ii < n2; ii++ )
    3996             :                     {
    3997    11016960 :                         x[2 * cnt] = scratch[( ( i + ( ii * n1 ) ) << 1 )];
    3998    11016960 :                         move32();
    3999    11016960 :                         x[( ( cnt << 1 ) + 1 )] = scratch[( ( ( i + ( ii * n1 ) ) << 1 ) + 1 )];
    4000    11016960 :                         move32();
    4001    11016960 :                         cnt = add( cnt, 1 );
    4002             :                     }
    4003             :                 }
    4004             :             }
    4005             :             ELSE
    4006             :             {
    4007           0 :                 assert( !"length not supported" );
    4008             :             }
    4009             :         }
    4010             :     }
    4011             : 
    4012    12072752 :     return;
    4013             : }
    4014             : 
    4015     4452688 : 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     4452688 :     IF( GT_16( numFactors, 1 ) )
    4026             :     {
    4027      780368 :         Word32 *tmp = scratch1;
    4028      780368 :         Word16 n1_inv = 1, n2_inv = 1;
    4029      780368 :         move16();
    4030      780368 :         move16();
    4031      780368 :         Word16 n2 = factor[0 /*idx*/];
    4032      780368 :         move16();
    4033      780368 :         Word16 n1 = idiv1616( length, n2 );
    4034             :         Word16 idx, incr;
    4035             : 
    4036     2157488 :         WHILE( ( ( n1_inv * n1 ) % n2 ) != 1 )
    4037             :         {
    4038     1377120 :             n1_inv = add( n1_inv, 1 );
    4039             :         }
    4040     1514832 :         WHILE( ( ( n2_inv * n2 ) % n1 ) != 1 )
    4041             :         {
    4042      734464 :             n2_inv = add( n2_inv, 1 );
    4043             :         }
    4044      780368 :         idx = 0;
    4045      780368 :         move16();
    4046      780368 :         incr = ( n1 * n1_inv );
    4047      780368 :         move16();
    4048      780368 :         cnt = 0;
    4049      780368 :         move16();
    4050     3672320 :         FOR( i = 0; i < n1; i++ )
    4051             :         {
    4052    22033920 :             FOR( ii = 0; ii < n2 - 1; ii++ )
    4053             :             {
    4054    19141968 :                 tmp[cnt] = x[2 * idx];
    4055    19141968 :                 move32();
    4056    19141968 :                 cnt = add( cnt, 1 );
    4057    19141968 :                 tmp[cnt] = x[( ( idx << 1 ) + 1 )]; // Qx
    4058    19141968 :                 move32();
    4059    19141968 :                 cnt = add( cnt, 1 );
    4060             : 
    4061    19141968 :                 idx = add( idx, incr );
    4062             : 
    4063    19141968 :                 IF( GT_16( idx, length ) )
    4064             :                 {
    4065    12577696 :                     idx = sub( idx, length );
    4066             :                 }
    4067             :             }
    4068     2891952 :             tmp[cnt] = x[2 * idx]; // Qx
    4069     2891952 :             move32();
    4070     2891952 :             cnt = add( cnt, 1 );
    4071     2891952 :             tmp[cnt] = x[( ( idx << 1 ) + 1 )]; // Qx
    4072     2891952 :             move32();
    4073     2891952 :             cnt = add( cnt, 1 );
    4074     2891952 :             idx = add( idx, 1 );
    4075             :         }
    4076     3672320 :         FOR( cnt = 0; cnt < length; cnt += n2 )
    4077             :         {
    4078     2891952 :             cooleyTukeyFFT( tmp + 2 * cnt, n2, x + 2 * cnt );
    4079             :         }
    4080     3672320 :         FOR( cnt = 0; cnt < n1; cnt++ )
    4081             :         {
    4082    24925872 :             FOR( i = 0; i < n2; i++ )
    4083             :             {
    4084    22033920 :                 x[( ( cnt + ( i * n1 ) ) << 1 )] = tmp[( ( ( cnt * n2 ) + i ) << 1 )];
    4085    22033920 :                 move32();
    4086    22033920 :                 x[( ( ( cnt + ( i * n1 ) ) << 1 ) + 1 )] = tmp[( ( ( ( cnt * n2 ) + i ) << 1 ) + 1 )];
    4087    22033920 :                 move32();
    4088             :             }
    4089             :         }
    4090     5187152 :         FOR( cnt = 0; cnt < length; cnt += n1 )
    4091             :         {
    4092     4406784 :             pfaDFT( x + 2 * cnt, n1, tmp, sub( numFactors, 1 ), &factor[1] );
    4093             :         }
    4094      780368 :         idx = 0;
    4095      780368 :         move16();
    4096      780368 :         cnt = 0;
    4097      780368 :         move16();
    4098     5187152 :         FOR( i = 0; i < n2; i++ )
    4099             :         {
    4100     4406784 :             idx = i_mult( i, n1 );
    4101    26440704 :             FOR( ii = 0; ii < n1; ii++ )
    4102             :             {
    4103    22033920 :                 tmp[2 * idx] = x[cnt];
    4104    22033920 :                 move32();
    4105    22033920 :                 cnt = add( cnt, 1 );
    4106    22033920 :                 tmp[( ( idx << 1 ) + 1 )] = x[cnt];
    4107    22033920 :                 move32();
    4108    22033920 :                 cnt = add( cnt, 1 );
    4109    22033920 :                 idx = add( idx, n2 );
    4110             : 
    4111    22033920 :                 IF( GT_16( idx, length ) )
    4112             :                 {
    4113     3626416 :                     idx = sub( idx, length );
    4114             :                 }
    4115             :             }
    4116             :         }
    4117    22814288 :         FOR( cnt = 0; cnt < length; cnt++ )
    4118             :         {
    4119    22033920 :             x[2 * cnt] = tmp[2 * cnt];
    4120    22033920 :             move32();
    4121    22033920 :             x[( ( cnt << 1 ) + 1 )] = tmp[( ( cnt << 1 ) + 1 )];
    4122    22033920 :             move32();
    4123             :         }
    4124             :     }
    4125             :     ELSE
    4126             :     {
    4127     3672320 :         cooleyTukeyFFT( x, length, scratch1 );
    4128             :     }
    4129             : 
    4130     4452688 :     return;
    4131             : }
    4132             : 
    4133       45904 : static void fftf_interleave(
    4134             :     Word32 *re,      // Qx
    4135             :     Word32 *im,      // Qx
    4136             :     Word32 *out,     // Qx
    4137             :     const Word16 len // Q0
    4138             : )
    4139             : {
    4140       45904 :     Word16 i = 0;
    4141       45904 :     move16();
    4142             : 
    4143    11062864 :     FOR( i = 0; i < len; i++ )
    4144             :     {
    4145    11016960 :         *out++ = *re++;
    4146    11016960 :         move32();
    4147    11016960 :         *out++ = *im++;
    4148    11016960 :         move32();
    4149             :     }
    4150             : 
    4151       45904 :     return;
    4152             : }
    4153             : 
    4154       45904 : static void fftf_deinterleave(
    4155             :     Word32 *in,      // Qx
    4156             :     Word32 *re,      // Qx
    4157             :     Word32 *im,      // Qx
    4158             :     const Word16 len // Q0
    4159             : )
    4160             : {
    4161       45904 :     Word16 i = 0;
    4162       45904 :     move16();
    4163             : 
    4164    11062864 :     FOR( i = 0; i < len; i++ )
    4165             :     {
    4166    11016960 :         *re++ = *in++;
    4167    11016960 :         move32();
    4168    11016960 :         *im++ = *in++;
    4169    11016960 :         move32();
    4170             :     }
    4171             : 
    4172       45904 :     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       45904 : 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       45904 :     Word16 factors[3] = { 16, 5, 3 };
    4218       45904 :     move16();
    4219       45904 :     move16();
    4220       45904 :     move16();
    4221             : 
    4222       45904 :     fftf_interleave( x, y, cmplx, 240 );
    4223       45904 :     pfaDFT( cmplx, 240, scratch, 3, factors );
    4224       45904 :     fftf_deinterleave( cmplx, x, y, 240 );
    4225             : 
    4226       45904 :     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       49922 : void DoFFT_fx(
    4265             :     Word32 *re2,        // Qx
    4266             :     Word32 *im2,        // Qx
    4267             :     const Word16 length // Q0
    4268             : )
    4269             : {
    4270       49922 :     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       45904 :         case 240:
    4288       45904 :             DoRTFT240( re2, im2 );
    4289       45904 :             BREAK;
    4290           0 :         case 200:
    4291           0 :             DoRTFT200( re2, im2 );
    4292           0 :             BREAK;
    4293         378 :         case 160:
    4294         378 :             DoRTFT160_fx( re2, im2 );
    4295         378 :             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       49922 :     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      674080 : static void fft_len10(
    4433             :     cmplx *x // Qx
    4434             : )
    4435             : {
    4436             :     cmplx t;
    4437             :     cmplx s[4];
    4438             :     cmplx y[10];
    4439             : 
    4440      674080 :     s[0] = CL_add( x[6], x[4] );
    4441      674080 :     move64();
    4442      674080 :     s[3] = CL_sub( x[6], x[4] );
    4443      674080 :     move64();
    4444      674080 :     s[2] = CL_add( x[2], x[8] );
    4445      674080 :     move64();
    4446      674080 :     s[1] = CL_sub( x[2], x[8] );
    4447      674080 :     move64();
    4448      674080 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
    4449      674080 :     s[0] = CL_add( s[0], s[2] );
    4450      674080 :     move64();
    4451      674080 :     y[0] = CL_add( x[0], s[0] );
    4452      674080 :     move64();
    4453      674080 :     s[0] = CL_add( y[0], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    4454      674080 :     move64();
    4455      674080 :     s[2] = CL_sub( s[0], t );
    4456      674080 :     move64();
    4457      674080 :     s[0] = CL_add( s[0], t );
    4458      674080 :     move64();
    4459      674080 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 ); // Qx
    4460      674080 :     move64();
    4461      674080 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    4462      674080 :     move64();
    4463      674080 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
    4464      674080 :     move64();
    4465             : 
    4466      674080 :     y[2] = CL_msu_j( s[0], s[1] );
    4467      674080 :     move64();
    4468      674080 :     y[8] = CL_mac_j( s[0], s[1] );
    4469      674080 :     move64();
    4470      674080 :     y[4] = CL_mac_j( s[2], s[3] );
    4471      674080 :     move64();
    4472      674080 :     y[6] = CL_msu_j( s[2], s[3] );
    4473      674080 :     move64();
    4474             : 
    4475      674080 :     s[0] = CL_add( x[1], x[9] );
    4476      674080 :     move64();
    4477      674080 :     s[3] = CL_sub( x[1], x[9] );
    4478      674080 :     move64();
    4479      674080 :     s[2] = CL_add( x[7], x[3] );
    4480      674080 :     move64();
    4481      674080 :     s[1] = CL_sub( x[7], x[3] );
    4482      674080 :     move64();
    4483      674080 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
    4484      674080 :     s[0] = CL_add( s[0], s[2] );
    4485      674080 :     move64();
    4486      674080 :     y[1] = CL_add( x[5], s[0] );
    4487      674080 :     move64();
    4488      674080 :     s[0] = CL_add( y[1], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    4489      674080 :     move64();
    4490      674080 :     s[2] = CL_sub( s[0], t );
    4491      674080 :     move64();
    4492      674080 :     s[0] = CL_add( s[0], t );
    4493      674080 :     move64();
    4494      674080 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );              // Qx
    4495      674080 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    4496      674080 :     move64();
    4497      674080 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
    4498      674080 :     move64();
    4499             : 
    4500      674080 :     y[3] = CL_msu_j( s[0], s[1] );
    4501      674080 :     move64();
    4502      674080 :     y[9] = CL_mac_j( s[0], s[1] );
    4503      674080 :     move64();
    4504      674080 :     move64();
    4505      674080 :     y[5] = CL_mac_j( s[2], s[3] );
    4506      674080 :     move64();
    4507      674080 :     y[7] = CL_msu_j( s[2], s[3] );
    4508      674080 :     move64();
    4509             : 
    4510             : 
    4511      674080 :     x[0] = CL_add( y[0], y[1] );
    4512      674080 :     move64();
    4513      674080 :     x[5] = CL_sub( y[0], y[1] );
    4514      674080 :     move64();
    4515             : 
    4516      674080 :     x[2] = CL_add( y[2], y[3] );
    4517      674080 :     move64();
    4518      674080 :     x[7] = CL_sub( y[2], y[3] );
    4519      674080 :     move64();
    4520             : 
    4521      674080 :     x[4] = CL_add( y[4], y[5] );
    4522      674080 :     move64();
    4523      674080 :     x[9] = CL_sub( y[4], y[5] );
    4524      674080 :     move64();
    4525             : 
    4526      674080 :     x[6] = CL_add( y[6], y[7] );
    4527      674080 :     move64();
    4528      674080 :     x[1] = CL_sub( y[6], y[7] );
    4529      674080 :     move64();
    4530             : 
    4531      674080 :     x[8] = CL_add( y[8], y[9] );
    4532      674080 :     move64();
    4533      674080 :     x[3] = CL_sub( y[8], y[9] );
    4534      674080 :     move64();
    4535             : 
    4536      674080 :     return;
    4537             : }
    4538             : 
    4539           0 : static void fft_len15(
    4540             :     cmplx *x // Qx
    4541             : )
    4542             : {
    4543             :     cmplx t;
    4544             :     cmplx s[5];
    4545             :     cmplx y[15];
    4546             : 
    4547           0 :     s[0] = CL_add( x[3], x[12] );
    4548           0 :     move64();
    4549           0 :     s[3] = CL_sub( x[3], x[12] );
    4550           0 :     move64();
    4551           0 :     s[2] = CL_add( x[6], x[9] );
    4552           0 :     move64();
    4553           0 :     s[1] = CL_sub( x[6], x[9] );
    4554           0 :     move64();
    4555           0 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
    4556           0 :     s[0] = CL_add( s[0], s[2] );
    4557           0 :     move64();
    4558           0 :     y[0] = CL_add( x[0], s[0] );
    4559           0 :     move64();
    4560           0 :     s[0] = CL_add( y[0], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    4561           0 :     move64();
    4562           0 :     s[2] = CL_sub( s[0], t );
    4563           0 :     move64();
    4564           0 :     s[0] = CL_add( s[0], t );
    4565           0 :     move64();
    4566           0 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );              // Qx
    4567           0 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    4568           0 :     move64();
    4569           0 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
    4570           0 :     move64();
    4571             : 
    4572           0 :     y[1] = CL_msu_j( s[0], s[1] );
    4573           0 :     move64();
    4574           0 :     y[4] = CL_mac_j( s[0], s[1] );
    4575           0 :     move64();
    4576           0 :     y[2] = CL_mac_j( s[2], s[3] );
    4577           0 :     move64();
    4578           0 :     y[3] = CL_msu_j( s[2], s[3] );
    4579           0 :     move64();
    4580             : 
    4581           0 :     s[0] = CL_add( x[8], x[2] );
    4582           0 :     move64();
    4583           0 :     s[3] = CL_sub( x[8], x[2] );
    4584           0 :     move64();
    4585           0 :     s[2] = CL_add( x[11], x[14] );
    4586           0 :     move64();
    4587           0 :     s[1] = CL_sub( x[11], x[14] );
    4588           0 :     move64();
    4589           0 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
    4590           0 :     s[0] = CL_add( s[0], s[2] );
    4591           0 :     move64();
    4592           0 :     y[5] = CL_add( x[5], s[0] );
    4593           0 :     move64();
    4594           0 :     s[0] = CL_add( y[5], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    4595           0 :     move64();
    4596           0 :     s[2] = CL_sub( s[0], t );
    4597           0 :     move64();
    4598           0 :     s[0] = CL_add( s[0], t );
    4599           0 :     move64();
    4600           0 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );              // Qx
    4601           0 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    4602           0 :     move64();
    4603           0 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
    4604           0 :     move64();
    4605             : 
    4606           0 :     y[6] = CL_msu_j( s[0], s[1] );
    4607           0 :     move64();
    4608           0 :     y[9] = CL_mac_j( s[0], s[1] );
    4609           0 :     move64();
    4610           0 :     y[7] = CL_mac_j( s[2], s[3] );
    4611           0 :     move64();
    4612           0 :     y[8] = CL_msu_j( s[2], s[3] );
    4613           0 :     move64();
    4614             : 
    4615           0 :     s[0] = CL_add( x[13], x[7] );
    4616           0 :     move64();
    4617           0 :     s[3] = CL_sub( x[13], x[7] );
    4618           0 :     move64();
    4619           0 :     s[2] = CL_add( x[1], x[4] );
    4620           0 :     move64();
    4621           0 :     s[1] = CL_sub( x[1], x[4] );
    4622           0 :     move64();
    4623           0 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
    4624           0 :     s[0] = CL_add( s[0], s[2] );
    4625           0 :     move64();
    4626           0 :     y[10] = CL_add( x[10], s[0] );
    4627           0 :     move64();
    4628           0 :     s[0] = CL_add( y[10], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    4629           0 :     move64();
    4630           0 :     s[2] = CL_sub( s[0], t );
    4631           0 :     move64();
    4632           0 :     s[0] = CL_add( s[0], t );
    4633           0 :     move64();
    4634           0 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );              // Qx
    4635           0 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    4636           0 :     move64();
    4637           0 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
    4638           0 :     move64();
    4639             : 
    4640           0 :     y[11] = CL_msu_j( s[0], s[1] );
    4641           0 :     move64();
    4642           0 :     y[14] = CL_mac_j( s[0], s[1] );
    4643           0 :     move64();
    4644           0 :     y[12] = CL_mac_j( s[2], s[3] );
    4645           0 :     move64();
    4646           0 :     y[13] = CL_msu_j( s[2], s[3] );
    4647           0 :     move64();
    4648             : 
    4649           0 :     s[0] = CL_add( y[5], y[10] );
    4650           0 :     move64();
    4651           0 :     s[1] = CL_scale( CL_sub( y[5], y[10] ), FFT_C31 ); // Qx
    4652           0 :     move64();
    4653           0 :     x[0] = CL_add( y[0], s[0] );
    4654           0 :     move64();
    4655           0 :     s[0] = CL_sub( y[0], CL_shr( s[0], 1 ) );
    4656           0 :     move64();
    4657             : 
    4658           0 :     x[10] = CL_mac_j( s[0], s[1] );
    4659           0 :     move64();
    4660           0 :     x[5] = CL_msu_j( s[0], s[1] );
    4661           0 :     move64();
    4662             : 
    4663           0 :     s[0] = CL_add( y[6], y[11] );
    4664           0 :     move64();
    4665           0 :     s[1] = CL_scale( CL_sub( y[6], y[11] ), FFT_C31 ); // Qx
    4666           0 :     move64();
    4667           0 :     x[6] = CL_add( y[1], s[0] );
    4668           0 :     move64();
    4669           0 :     s[0] = CL_sub( y[1], CL_shr( s[0], 1 ) );
    4670           0 :     move64();
    4671             : 
    4672           0 :     x[1] = CL_mac_j( s[0], s[1] );
    4673           0 :     move64();
    4674           0 :     x[11] = CL_msu_j( s[0], s[1] );
    4675           0 :     move64();
    4676             : 
    4677           0 :     s[0] = CL_add( y[7], y[12] );
    4678           0 :     move64();
    4679           0 :     s[1] = CL_scale( CL_sub( y[7], y[12] ), FFT_C31 ); // Qx
    4680           0 :     move64();
    4681           0 :     x[12] = CL_add( y[2], s[0] );
    4682           0 :     move64();
    4683           0 :     s[0] = CL_sub( y[2], CL_shr( s[0], 1 ) );
    4684           0 :     move64();
    4685             : 
    4686           0 :     x[7] = CL_mac_j( s[0], s[1] );
    4687           0 :     move64();
    4688           0 :     x[2] = CL_msu_j( s[0], s[1] );
    4689           0 :     move64();
    4690             : 
    4691           0 :     s[0] = CL_add( y[8], y[13] );
    4692           0 :     move64();
    4693           0 :     s[1] = CL_scale( CL_sub( y[8], y[13] ), FFT_C31 ); // Qx
    4694           0 :     move64();
    4695           0 :     x[3] = CL_add( y[3], s[0] );
    4696           0 :     move64();
    4697           0 :     s[0] = CL_sub( y[3], CL_shr( s[0], 1 ) );
    4698           0 :     move64();
    4699             : 
    4700           0 :     x[13] = CL_mac_j( s[0], s[1] );
    4701           0 :     move64();
    4702           0 :     x[8] = CL_msu_j( s[0], s[1] );
    4703           0 :     move64();
    4704             : 
    4705           0 :     s[0] = CL_add( y[9], y[14] );
    4706           0 :     move64();
    4707           0 :     s[1] = CL_scale( CL_sub( y[9], y[14] ), FFT_C31 ); // Qx
    4708           0 :     move64();
    4709           0 :     x[9] = CL_add( y[4], s[0] );
    4710           0 :     move64();
    4711           0 :     s[0] = CL_sub( y[4], CL_shr( s[0], 1 ) );
    4712           0 :     move64();
    4713             : 
    4714           0 :     x[4] = CL_mac_j( s[0], s[1] );
    4715           0 :     move64();
    4716           0 :     x[14] = CL_msu_j( s[0], s[1] );
    4717           0 :     move64();
    4718             : 
    4719           0 :     return;
    4720             : }
    4721             : 
    4722     5487024 : 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     5487024 :     s[0] = x[0]; // Qx
    4732     5487024 :     move64();
    4733     5487024 :     s[1] = x[4]; // Qx
    4734     5487024 :     move64();
    4735     5487024 :     s[2] = x[8]; // Qx
    4736     5487024 :     move64();
    4737     5487024 :     s[3] = x[12]; // Qx
    4738     5487024 :     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     5487024 :     t[0] = CL_add( s[0], s[2] );
    4751     5487024 :     move64();
    4752     5487024 :     t[1] = CL_sub( s[0], s[2] );
    4753     5487024 :     move64();
    4754     5487024 :     t[2] = CL_add( s[1], s[3] );
    4755     5487024 :     move64();
    4756     5487024 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( s[1] ), CL_conjugate( s[3] ) ) );
    4757     5487024 :     move64();
    4758             : 
    4759     5487024 :     y[0] = CL_add( t[0], t[2] );
    4760     5487024 :     move64();
    4761     5487024 :     y[1] = CL_sub( t[1], t[3] );
    4762     5487024 :     move64();
    4763     5487024 :     y[2] = CL_sub( t[0], t[2] );
    4764     5487024 :     move64();
    4765     5487024 :     y[3] = CL_add( t[1], t[3] );
    4766     5487024 :     move64();
    4767             : 
    4768             : #ifdef OPT_STEREO_32KBPS_V1
    4769     5487024 :     s[0] = x[1]; // Qx
    4770     5487024 :     move64();
    4771     5487024 :     s[1] = x[5]; // Qx
    4772     5487024 :     move64();
    4773     5487024 :     s[2] = x[9]; // Qx
    4774     5487024 :     move64();
    4775     5487024 :     s[3] = x[13]; // Qx
    4776     5487024 :     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     5487024 :     t[0] = CL_add( s[0], s[2] );
    4789     5487024 :     move64();
    4790     5487024 :     t[1] = CL_sub( s[0], s[2] );
    4791     5487024 :     move64();
    4792     5487024 :     t[2] = CL_add( s[1], s[3] );
    4793     5487024 :     move64();
    4794     5487024 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( s[1] ), CL_conjugate( s[3] ) ) );
    4795     5487024 :     move64();
    4796             : 
    4797     5487024 :     y[4] = CL_add( t[0], t[2] );
    4798     5487024 :     move64();
    4799     5487024 :     y[5] = CL_sub( t[1], t[3] );
    4800     5487024 :     move64();
    4801     5487024 :     y[6] = CL_sub( t[0], t[2] );
    4802     5487024 :     move64();
    4803     5487024 :     y[7] = CL_add( t[1], t[3] );
    4804     5487024 :     move64();
    4805             : 
    4806             : #ifdef OPT_STEREO_32KBPS_V1
    4807     5487024 :     s[0] = x[2]; // Qx
    4808     5487024 :     move64();
    4809     5487024 :     s[1] = x[6]; // Qx
    4810     5487024 :     move64();
    4811     5487024 :     s[2] = x[10]; // Qx
    4812     5487024 :     move64();
    4813     5487024 :     s[3] = x[14]; // Qx
    4814     5487024 :     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     5487024 :     t[0] = CL_add( s[0], s[2] );
    4827     5487024 :     move64();
    4828     5487024 :     t[1] = CL_sub( s[0], s[2] );
    4829     5487024 :     move64();
    4830     5487024 :     t[2] = CL_add( s[1], s[3] );
    4831     5487024 :     move64();
    4832     5487024 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( s[1] ), CL_conjugate( s[3] ) ) );
    4833     5487024 :     move64();
    4834             : 
    4835     5487024 :     y[8] = CL_add( t[0], t[2] );
    4836     5487024 :     move64();
    4837     5487024 :     y[9] = CL_sub( t[1], t[3] );
    4838     5487024 :     move64();
    4839     5487024 :     y[10] = CL_swap_real_imag( CL_sub( t[0], t[2] ) );
    4840     5487024 :     move64();
    4841     5487024 :     y[10] = CL_conjugate( y[10] );
    4842     5487024 :     move64();
    4843     5487024 :     y[11] = CL_add( t[1], t[3] );
    4844     5487024 :     move64();
    4845             : 
    4846             : #ifdef OPT_STEREO_32KBPS_V1
    4847     5487024 :     s[0] = x[3]; // Qx
    4848     5487024 :     move64();
    4849     5487024 :     s[1] = x[7]; // Qx
    4850     5487024 :     move64();
    4851     5487024 :     s[2] = x[11]; // Qx
    4852     5487024 :     move64();
    4853     5487024 :     s[3] = x[15]; // Qx
    4854     5487024 :     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     5487024 :     t[0] = CL_add( s[0], s[2] );
    4867     5487024 :     move64();
    4868     5487024 :     t[1] = CL_sub( s[0], s[2] );
    4869     5487024 :     move64();
    4870     5487024 :     t[2] = CL_add( s[1], s[3] );
    4871     5487024 :     move64();
    4872     5487024 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( s[1] ), CL_conjugate( s[3] ) ) );
    4873     5487024 :     move64();
    4874             : 
    4875     5487024 :     y[12] = CL_add( t[0], t[2] );
    4876     5487024 :     move64();
    4877     5487024 :     y[13] = CL_sub( t[1], t[3] );
    4878     5487024 :     move64();
    4879     5487024 :     y[14] = CL_sub( t[0], t[2] );
    4880     5487024 :     move64();
    4881     5487024 :     y[15] = CL_add( t[1], t[3] );
    4882     5487024 :     move64();
    4883             : 
    4884     5487024 :     s[0] = CL_scale( y[11], FFT_C162 ); // Qx
    4885     5487024 :     move64();
    4886     5487024 :     y[11] = CL_mac_j( s[0], s[0] );
    4887     5487024 :     move64();
    4888             : 
    4889     5487024 :     s[0] = CL_scale( y[14], FFT_C162 ); // Qx
    4890     5487024 :     move64();
    4891     5487024 :     y[14] = CL_mac_j( s[0], s[0] );
    4892     5487024 :     move64();
    4893             : 
    4894     5487024 :     s[0] = CL_scale( y[6], FFT_C161 ); // Qx
    4895     5487024 :     move64();
    4896     5487024 :     y[6] = CL_mac_j( s[0], s[0] );
    4897     5487024 :     move64();
    4898     5487024 :     y[6] = CL_swap_real_imag( y[6] );
    4899     5487024 :     move64();
    4900     5487024 :     y[6] = CL_conjugate( y[6] );
    4901     5487024 :     move64();
    4902             : 
    4903     5487024 :     s[0] = CL_scale( y[9], FFT_C161 ); // Qx
    4904     5487024 :     move64();
    4905     5487024 :     y[9] = CL_mac_j( s[0], s[0] );
    4906     5487024 :     move64();
    4907     5487024 :     y[9] = CL_swap_real_imag( y[9] );
    4908     5487024 :     move64();
    4909     5487024 :     y[9] = CL_conjugate( y[9] );
    4910     5487024 :     move64();
    4911             : 
    4912     5487024 :     s[0] = CL_scale( y[5], FFT_C163 ); // Qx
    4913     5487024 :     move64();
    4914     5487024 :     s[1] = CL_scale( y[5], FFT_C166 ); // Qx
    4915     5487024 :     move64();
    4916     5487024 :     y[5] = CL_mac_j( s[0], s[1] );
    4917     5487024 :     move64();
    4918             : 
    4919     5487024 :     s[0] = CL_scale( y[7], FFT_C165 ); // Qx
    4920     5487024 :     move64();
    4921     5487024 :     s[1] = CL_scale( y[7], FFT_C164 ); // Qx
    4922     5487024 :     move64();
    4923     5487024 :     y[7] = CL_mac_j( s[0], s[1] );
    4924     5487024 :     move64();
    4925             : 
    4926     5487024 :     s[0] = CL_scale( y[13], FFT_C165 ); // Qx
    4927     5487024 :     move64();
    4928     5487024 :     s[1] = CL_scale( y[13], FFT_C164 ); // Qx
    4929     5487024 :     move64();
    4930     5487024 :     y[13] = CL_mac_j( s[0], s[1] );
    4931     5487024 :     move64();
    4932             : 
    4933     5487024 :     s[0] = CL_scale( y[15], FFT_C164 ); // Qx
    4934     5487024 :     move64();
    4935     5487024 :     s[1] = CL_scale( y[15], FFT_C165 ); // Qx
    4936     5487024 :     move64();
    4937     5487024 :     y[15] = CL_mac_j( s[0], s[1] );
    4938     5487024 :     move64();
    4939             : 
    4940     5487024 :     t[0] = CL_add( y[0], y[8] );
    4941     5487024 :     move64();
    4942     5487024 :     t[1] = CL_sub( y[0], y[8] );
    4943     5487024 :     move64();
    4944     5487024 :     t[2] = CL_add( y[4], y[12] );
    4945     5487024 :     move64();
    4946     5487024 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[4] ), CL_conjugate( y[12] ) ) );
    4947     5487024 :     move64();
    4948             : 
    4949     5487024 :     x[0] = CL_add( t[0], t[2] );
    4950     5487024 :     move64();
    4951     5487024 :     x[4] = CL_sub( t[1], t[3] );
    4952     5487024 :     move64();
    4953     5487024 :     x[8] = CL_sub( t[0], t[2] );
    4954     5487024 :     move64();
    4955     5487024 :     x[12] = CL_add( t[1], t[3] );
    4956     5487024 :     move64();
    4957             : 
    4958     5487024 :     t[0] = CL_add( y[1], y[9] );
    4959     5487024 :     move64();
    4960     5487024 :     t[1] = CL_sub( y[1], y[9] );
    4961     5487024 :     move64();
    4962     5487024 :     t[2] = CL_add( y[5], y[13] );
    4963     5487024 :     move64();
    4964     5487024 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[5] ), CL_conjugate( y[13] ) ) );
    4965     5487024 :     move64();
    4966             : 
    4967     5487024 :     x[1] = CL_add( t[0], t[2] );
    4968     5487024 :     move64();
    4969     5487024 :     x[5] = CL_sub( t[1], t[3] );
    4970     5487024 :     move64();
    4971     5487024 :     x[9] = CL_sub( t[0], t[2] );
    4972     5487024 :     move64();
    4973     5487024 :     x[13] = CL_add( t[1], t[3] );
    4974     5487024 :     move64();
    4975             : 
    4976     5487024 :     t[0] = CL_add( y[2], y[10] );
    4977     5487024 :     move64();
    4978     5487024 :     t[1] = CL_sub( y[2], y[10] );
    4979     5487024 :     move64();
    4980     5487024 :     t[2] = CL_add( y[6], y[14] );
    4981     5487024 :     move64();
    4982     5487024 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[6] ), CL_conjugate( y[14] ) ) );
    4983     5487024 :     move64();
    4984             : 
    4985     5487024 :     x[2] = CL_add( t[0], t[2] );
    4986     5487024 :     move64();
    4987     5487024 :     x[6] = CL_sub( t[1], t[3] );
    4988     5487024 :     move64();
    4989     5487024 :     x[10] = CL_sub( t[0], t[2] );
    4990     5487024 :     move64();
    4991     5487024 :     x[14] = CL_add( t[1], t[3] );
    4992     5487024 :     move64();
    4993             : 
    4994     5487024 :     t[0] = CL_add( y[3], y[11] );
    4995     5487024 :     move64();
    4996     5487024 :     t[1] = CL_sub( y[3], y[11] );
    4997     5487024 :     move64();
    4998     5487024 :     t[2] = CL_add( y[7], y[15] );
    4999     5487024 :     move64();
    5000     5487024 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[7] ), CL_conjugate( y[15] ) ) );
    5001     5487024 :     move64();
    5002             : 
    5003     5487024 :     x[3] = CL_add( t[0], t[2] );
    5004     5487024 :     move64();
    5005     5487024 :     x[7] = CL_sub( t[1], t[3] );
    5006     5487024 :     move64();
    5007     5487024 :     x[11] = CL_sub( t[0], t[2] );
    5008     5487024 :     move64();
    5009     5487024 :     x[15] = CL_add( t[1], t[3] );
    5010     5487024 :     move64();
    5011             : 
    5012     5487024 :     return;
    5013             : }
    5014             : 
    5015     3240104 : 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     3240104 :     xx[0] = x[0]; // Qx
    5027     3240104 :     move64();
    5028     3240104 :     xx[1] = x[16]; // Qx
    5029     3240104 :     move64();
    5030     3240104 :     xx[2] = x[12]; // Qx
    5031     3240104 :     move64();
    5032     3240104 :     xx[3] = x[8]; // Qx
    5033     3240104 :     move64();
    5034     3240104 :     xx[4] = x[4]; // Qx
    5035     3240104 :     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     3240104 :     s[0] = CL_add( xx[1], xx[4] );
    5050     3240104 :     move64();
    5051     3240104 :     s[3] = CL_sub( xx[1], xx[4] );
    5052     3240104 :     move64();
    5053     3240104 :     s[2] = CL_add( xx[2], xx[3] );
    5054     3240104 :     move64();
    5055     3240104 :     s[1] = CL_sub( xx[2], xx[3] );
    5056     3240104 :     move64();
    5057     3240104 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 );
    5058     3240104 :     s[0] = CL_add( s[0], s[2] );
    5059     3240104 :     move64();
    5060     3240104 :     y[0] = CL_add( xx[0], s[0] );
    5061     3240104 :     move64();
    5062     3240104 :     s[0] = CL_add( y[0], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    5063     3240104 :     move64();
    5064     3240104 :     s[2] = CL_sub( s[0], t );
    5065     3240104 :     move64();
    5066     3240104 :     s[0] = CL_add( s[0], t );
    5067     3240104 :     move64();
    5068     3240104 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
    5069     3240104 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    5070     3240104 :     move64();
    5071     3240104 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) );
    5072     3240104 :     move64();
    5073             : 
    5074     3240104 :     y[4] = CL_msu_j( s[0], s[1] );
    5075     3240104 :     move64();
    5076     3240104 :     y[16] = CL_mac_j( s[0], s[1] );
    5077     3240104 :     move64();
    5078     3240104 :     y[8] = CL_mac_j( s[2], s[3] );
    5079     3240104 :     move64();
    5080     3240104 :     y[12] = CL_msu_j( s[2], s[3] );
    5081     3240104 :     move64();
    5082             : 
    5083             : #ifdef OPT_STEREO_32KBPS_V1
    5084     3240104 :     xx[0] = x[5];
    5085     3240104 :     move64();
    5086     3240104 :     xx[1] = x[1];
    5087     3240104 :     move64();
    5088     3240104 :     xx[2] = x[17];
    5089     3240104 :     move64();
    5090     3240104 :     xx[3] = x[13];
    5091     3240104 :     move64();
    5092     3240104 :     xx[4] = x[9];
    5093     3240104 :     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     3240104 :     s[0] = CL_add( xx[1], xx[4] );
    5108     3240104 :     move64();
    5109     3240104 :     s[3] = CL_sub( xx[1], xx[4] );
    5110     3240104 :     move64();
    5111     3240104 :     s[2] = CL_add( xx[2], xx[3] );
    5112     3240104 :     move64();
    5113     3240104 :     s[1] = CL_sub( xx[2], xx[3] );
    5114     3240104 :     move64();
    5115     3240104 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 );
    5116     3240104 :     s[0] = CL_add( s[0], s[2] );
    5117     3240104 :     move64();
    5118     3240104 :     y[1] = CL_add( xx[0], s[0] );
    5119     3240104 :     move64();
    5120     3240104 :     s[0] = CL_add( y[1], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    5121     3240104 :     move64();
    5122     3240104 :     s[2] = CL_sub( s[0], t );
    5123     3240104 :     move64();
    5124     3240104 :     s[0] = CL_add( s[0], t );
    5125     3240104 :     move64();
    5126     3240104 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
    5127     3240104 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    5128     3240104 :     move64();
    5129     3240104 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) );
    5130     3240104 :     move64();
    5131             : 
    5132     3240104 :     y[5] = CL_msu_j( s[0], s[1] );
    5133     3240104 :     move64();
    5134     3240104 :     y[17] = CL_mac_j( s[0], s[1] );
    5135     3240104 :     move64();
    5136     3240104 :     y[9] = CL_mac_j( s[2], s[3] );
    5137     3240104 :     move64();
    5138     3240104 :     y[13] = CL_msu_j( s[2], s[3] );
    5139     3240104 :     move64();
    5140             : 
    5141             : #ifdef OPT_STEREO_32KBPS_V1
    5142     3240104 :     xx[0] = x[10];
    5143     3240104 :     move64();
    5144     3240104 :     xx[1] = x[6];
    5145     3240104 :     move64();
    5146     3240104 :     xx[2] = x[2];
    5147     3240104 :     move64();
    5148     3240104 :     xx[3] = x[18];
    5149     3240104 :     move64();
    5150     3240104 :     xx[4] = x[14];
    5151     3240104 :     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     3240104 :     s[0] = CL_add( xx[1], xx[4] );
    5166     3240104 :     move64();
    5167     3240104 :     s[3] = CL_sub( xx[1], xx[4] );
    5168     3240104 :     move64();
    5169     3240104 :     s[2] = CL_add( xx[2], xx[3] );
    5170     3240104 :     move64();
    5171     3240104 :     s[1] = CL_sub( xx[2], xx[3] );
    5172     3240104 :     move64();
    5173     3240104 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 );
    5174     3240104 :     s[0] = CL_add( s[0], s[2] );
    5175     3240104 :     move64();
    5176     3240104 :     y[2] = CL_add( xx[0], s[0] );
    5177     3240104 :     move64();
    5178     3240104 :     s[0] = CL_add( y[2], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    5179     3240104 :     move64();
    5180     3240104 :     s[2] = CL_sub( s[0], t );
    5181     3240104 :     move64();
    5182     3240104 :     s[0] = CL_add( s[0], t );
    5183     3240104 :     move64();
    5184     3240104 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
    5185     3240104 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    5186     3240104 :     move64();
    5187     3240104 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) );
    5188     3240104 :     move64();
    5189             : 
    5190     3240104 :     y[6] = CL_msu_j( s[0], s[1] );
    5191     3240104 :     move64();
    5192     3240104 :     y[18] = CL_mac_j( s[0], s[1] );
    5193     3240104 :     move64();
    5194     3240104 :     y[10] = CL_mac_j( s[2], s[3] );
    5195     3240104 :     move64();
    5196     3240104 :     y[14] = CL_msu_j( s[2], s[3] );
    5197     3240104 :     move64();
    5198             : 
    5199             : #ifdef OPT_STEREO_32KBPS_V1
    5200     3240104 :     xx[0] = x[15];
    5201     3240104 :     move64();
    5202     3240104 :     xx[1] = x[11];
    5203     3240104 :     move64();
    5204     3240104 :     xx[2] = x[7];
    5205     3240104 :     move64();
    5206     3240104 :     xx[3] = x[3];
    5207     3240104 :     move64();
    5208     3240104 :     xx[4] = x[19];
    5209     3240104 :     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     3240104 :     s[0] = CL_add( xx[1], xx[4] );
    5224     3240104 :     move64();
    5225     3240104 :     s[3] = CL_sub( xx[1], xx[4] );
    5226     3240104 :     move64();
    5227     3240104 :     s[2] = CL_add( xx[2], xx[3] );
    5228     3240104 :     move64();
    5229     3240104 :     s[1] = CL_sub( xx[2], xx[3] );
    5230     3240104 :     move64();
    5231     3240104 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 );
    5232     3240104 :     s[0] = CL_add( s[0], s[2] );
    5233     3240104 :     move64();
    5234     3240104 :     y[3] = CL_add( xx[0], s[0] );
    5235     3240104 :     move64();
    5236     3240104 :     s[0] = CL_add( y[3], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    5237     3240104 :     move64();
    5238     3240104 :     s[2] = CL_sub( s[0], t );
    5239     3240104 :     move64();
    5240     3240104 :     s[0] = CL_add( s[0], t );
    5241     3240104 :     move64();
    5242     3240104 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
    5243     3240104 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    5244     3240104 :     move64();
    5245     3240104 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) );
    5246     3240104 :     move64();
    5247             : 
    5248     3240104 :     y[7] = CL_msu_j( s[0], s[1] );
    5249     3240104 :     move64();
    5250     3240104 :     y[19] = CL_mac_j( s[0], s[1] );
    5251     3240104 :     move64();
    5252     3240104 :     y[11] = CL_mac_j( s[2], s[3] );
    5253     3240104 :     move64();
    5254     3240104 :     y[15] = CL_msu_j( s[2], s[3] );
    5255     3240104 :     move64();
    5256             : 
    5257     3240104 :     tt[0] = CL_add( y[0], y[2] );
    5258     3240104 :     move64();
    5259     3240104 :     tt[1] = CL_sub( y[0], y[2] );
    5260     3240104 :     move64();
    5261     3240104 :     tt[2] = CL_add( y[1], y[3] );
    5262     3240104 :     move64();
    5263     3240104 :     tt[3] = CL_swap_real_imag( CL_conjugate( CL_sub( y[1], y[3] ) ) );
    5264     3240104 :     move64();
    5265             : 
    5266     3240104 :     x[0] = CL_add( tt[0], tt[2] );
    5267     3240104 :     move64();
    5268     3240104 :     x[5] = CL_sub( tt[1], tt[3] );
    5269     3240104 :     move64();
    5270     3240104 :     x[10] = CL_sub( tt[0], tt[2] );
    5271     3240104 :     move64();
    5272     3240104 :     x[15] = CL_add( tt[1], tt[3] );
    5273     3240104 :     move64();
    5274             : 
    5275     3240104 :     tt[0] = CL_add( y[4], y[6] );
    5276     3240104 :     move64();
    5277     3240104 :     tt[1] = CL_sub( y[4], y[6] );
    5278     3240104 :     move64();
    5279     3240104 :     tt[2] = CL_add( y[5], y[7] );
    5280     3240104 :     move64();
    5281     3240104 :     tt[3] = CL_swap_real_imag( CL_conjugate( CL_sub( y[5], y[7] ) ) );
    5282     3240104 :     move64();
    5283             : 
    5284     3240104 :     x[4] = CL_add( tt[0], tt[2] );
    5285     3240104 :     move64();
    5286     3240104 :     x[9] = CL_sub( tt[1], tt[3] );
    5287     3240104 :     move64();
    5288     3240104 :     x[14] = CL_sub( tt[0], tt[2] );
    5289     3240104 :     move64();
    5290     3240104 :     x[19] = CL_add( tt[1], tt[3] );
    5291     3240104 :     move64();
    5292             : 
    5293     3240104 :     tt[0] = CL_add( y[8], y[10] );
    5294     3240104 :     move64();
    5295     3240104 :     tt[1] = CL_sub( y[8], y[10] );
    5296     3240104 :     move64();
    5297     3240104 :     tt[2] = CL_add( y[9], y[11] );
    5298     3240104 :     move64();
    5299     3240104 :     tt[3] = CL_swap_real_imag( CL_conjugate( CL_sub( y[9], y[11] ) ) );
    5300     3240104 :     move64();
    5301             : 
    5302     3240104 :     x[8] = CL_add( tt[0], tt[2] );
    5303     3240104 :     move64();
    5304     3240104 :     x[13] = CL_sub( tt[1], tt[3] );
    5305     3240104 :     move64();
    5306     3240104 :     x[18] = CL_sub( tt[0], tt[2] );
    5307     3240104 :     move64();
    5308     3240104 :     x[3] = CL_add( tt[1], tt[3] );
    5309     3240104 :     move64();
    5310             : 
    5311     3240104 :     tt[0] = CL_add( y[12], y[14] );
    5312     3240104 :     move64();
    5313     3240104 :     tt[1] = CL_sub( y[12], y[14] );
    5314     3240104 :     move64();
    5315     3240104 :     tt[2] = CL_add( y[13], y[15] );
    5316     3240104 :     move64();
    5317     3240104 :     tt[3] = CL_swap_real_imag( CL_conjugate( CL_sub( y[13], y[15] ) ) );
    5318     3240104 :     move64();
    5319             : 
    5320     3240104 :     x[12] = CL_add( tt[0], tt[2] );
    5321     3240104 :     move64();
    5322     3240104 :     x[17] = CL_sub( tt[1], tt[3] );
    5323     3240104 :     move64();
    5324     3240104 :     x[2] = CL_sub( tt[0], tt[2] );
    5325     3240104 :     move64();
    5326     3240104 :     x[7] = CL_add( tt[1], tt[3] );
    5327     3240104 :     move64();
    5328             : 
    5329     3240104 :     tt[0] = CL_add( y[16], y[18] );
    5330     3240104 :     move64();
    5331     3240104 :     tt[1] = CL_sub( y[16], y[18] );
    5332     3240104 :     move64();
    5333     3240104 :     tt[2] = CL_add( y[17], y[19] );
    5334     3240104 :     move64();
    5335     3240104 :     tt[3] = CL_swap_real_imag( CL_conjugate( CL_sub( y[17], y[19] ) ) );
    5336     3240104 :     move64();
    5337             : 
    5338     3240104 :     x[16] = CL_add( tt[0], tt[2] );
    5339     3240104 :     move64();
    5340     3240104 :     x[1] = CL_sub( tt[1], tt[3] );
    5341     3240104 :     move64();
    5342     3240104 :     x[6] = CL_sub( tt[0], tt[2] );
    5343     3240104 :     move64();
    5344     3240104 :     x[11] = CL_add( tt[1], tt[3] );
    5345     3240104 :     move64();
    5346             : 
    5347     3240104 :     return;
    5348             : }
    5349             : 
    5350    55752752 : 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    55752752 :     l = &x[0];
    5362    55752752 :     h = &x[15];
    5363             : 
    5364    55752752 :     xx[0] = x[0];
    5365    55752752 :     move64();
    5366    55752752 :     xx[1] = x[18];
    5367    55752752 :     move64();
    5368    55752752 :     xx[2] = x[6];
    5369    55752752 :     move64();
    5370    55752752 :     xx[3] = x[24];
    5371    55752752 :     move64();
    5372    55752752 :     xx[4] = x[12];
    5373    55752752 :     move64();
    5374             : 
    5375    55752752 :     xx[5] = x[20];
    5376    55752752 :     move64();
    5377    55752752 :     xx[6] = x[8];
    5378    55752752 :     move64();
    5379    55752752 :     xx[7] = x[26];
    5380    55752752 :     move64();
    5381    55752752 :     xx[8] = x[14];
    5382    55752752 :     move64();
    5383    55752752 :     xx[9] = x[2];
    5384    55752752 :     move64();
    5385             : 
    5386    55752752 :     xx[10] = x[10];
    5387    55752752 :     move64();
    5388    55752752 :     xx[11] = x[28];
    5389    55752752 :     move64();
    5390    55752752 :     xx[12] = x[16];
    5391    55752752 :     move64();
    5392    55752752 :     xx[13] = x[4];
    5393    55752752 :     move64();
    5394    55752752 :     xx[14] = x[22];
    5395    55752752 :     move64();
    5396             : 
    5397    55752752 :     s[0] = CL_add( xx[1], xx[4] );
    5398    55752752 :     move64();
    5399    55752752 :     s[3] = CL_sub( xx[1], xx[4] );
    5400    55752752 :     move64();
    5401    55752752 :     s[2] = CL_add( xx[2], xx[3] );
    5402    55752752 :     move64();
    5403    55752752 :     s[1] = CL_sub( xx[2], xx[3] );
    5404    55752752 :     move64();
    5405    55752752 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
    5406    55752752 :     s[0] = CL_add( s[0], s[2] );
    5407    55752752 :     move64();
    5408    55752752 :     y[0] = CL_add( xx[0], s[0] );
    5409    55752752 :     s[0] = CL_add( y[0], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    5410    55752752 :     move64();
    5411    55752752 :     s[2] = CL_sub( s[0], t );
    5412    55752752 :     move64();
    5413    55752752 :     s[0] = CL_add( s[0], t );
    5414    55752752 :     move64();
    5415    55752752 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
    5416    55752752 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    5417    55752752 :     move64();
    5418    55752752 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
    5419    55752752 :     move64();
    5420             : 
    5421    55752752 :     y[1] = CL_msu_j( s[0], s[1] );
    5422    55752752 :     move64();
    5423    55752752 :     y[4] = CL_mac_j( s[0], s[1] );
    5424    55752752 :     move64();
    5425    55752752 :     y[2] = CL_mac_j( s[2], s[3] );
    5426    55752752 :     move64();
    5427    55752752 :     y[3] = CL_msu_j( s[2], s[3] );
    5428    55752752 :     move64();
    5429             : 
    5430    55752752 :     s[0] = CL_add( xx[6], xx[9] );
    5431    55752752 :     move64();
    5432    55752752 :     s[3] = CL_sub( xx[6], xx[9] );
    5433    55752752 :     move64();
    5434    55752752 :     s[2] = CL_add( xx[7], xx[8] );
    5435    55752752 :     move64();
    5436    55752752 :     s[1] = CL_sub( xx[7], xx[8] );
    5437    55752752 :     move64();
    5438    55752752 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 );
    5439    55752752 :     s[0] = CL_add( s[0], s[2] );
    5440    55752752 :     move64();
    5441    55752752 :     y[5] = CL_add( xx[5], s[0] );
    5442    55752752 :     move64();
    5443    55752752 :     s[0] = CL_add( y[5], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    5444    55752752 :     move64();
    5445    55752752 :     s[2] = CL_sub( s[0], t );
    5446    55752752 :     move64();
    5447    55752752 :     s[0] = CL_add( s[0], t );
    5448    55752752 :     move64();
    5449    55752752 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
    5450    55752752 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    5451    55752752 :     move64();
    5452    55752752 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
    5453    55752752 :     move64();
    5454             : 
    5455    55752752 :     y[6] = CL_msu_j( s[0], s[1] );
    5456    55752752 :     move64();
    5457    55752752 :     y[9] = CL_mac_j( s[0], s[1] );
    5458    55752752 :     move64();
    5459    55752752 :     y[7] = CL_mac_j( s[2], s[3] );
    5460    55752752 :     move64();
    5461    55752752 :     y[8] = CL_msu_j( s[2], s[3] );
    5462    55752752 :     move64();
    5463             : 
    5464    55752752 :     s[0] = CL_add( xx[11], xx[14] );
    5465    55752752 :     move64();
    5466    55752752 :     s[3] = CL_sub( xx[11], xx[14] );
    5467    55752752 :     move64();
    5468    55752752 :     s[2] = CL_add( xx[12], xx[13] );
    5469    55752752 :     move64();
    5470    55752752 :     s[1] = CL_sub( xx[12], xx[13] );
    5471    55752752 :     move64();
    5472    55752752 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 );
    5473    55752752 :     s[0] = CL_add( s[0], s[2] );
    5474    55752752 :     move64();
    5475    55752752 :     y[10] = CL_add( xx[10], s[0] );
    5476    55752752 :     move64();
    5477    55752752 :     s[0] = CL_add( y[10], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    5478    55752752 :     s[2] = CL_sub( s[0], t );
    5479    55752752 :     move64();
    5480    55752752 :     s[0] = CL_add( s[0], t );
    5481    55752752 :     move64();
    5482    55752752 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );
    5483    55752752 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    5484    55752752 :     move64();
    5485    55752752 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) );
    5486    55752752 :     move64();
    5487             : 
    5488    55752752 :     y[11] = CL_msu_j( s[0], s[1] );
    5489    55752752 :     move64();
    5490    55752752 :     y[14] = CL_mac_j( s[0], s[1] );
    5491    55752752 :     move64();
    5492    55752752 :     y[12] = CL_mac_j( s[2], s[3] );
    5493    55752752 :     move64();
    5494    55752752 :     y[13] = CL_msu_j( s[2], s[3] );
    5495    55752752 :     move64();
    5496             : 
    5497    55752752 :     s[0] = CL_add( y[5], y[10] );
    5498    55752752 :     move64();
    5499    55752752 :     s[1] = CL_scale( CL_sub( y[5], y[10] ), FFT_C31 ); // Qx
    5500    55752752 :     move64();
    5501    55752752 :     z[0] = CL_add( y[0], s[0] );
    5502    55752752 :     move64();
    5503    55752752 :     s[0] = CL_sub( y[0], CL_shr( s[0], 1 ) );
    5504    55752752 :     move64();
    5505             : 
    5506    55752752 :     z[10] = CL_mac_j( s[0], s[1] );
    5507    55752752 :     move64();
    5508    55752752 :     z[5] = CL_msu_j( s[0], s[1] );
    5509    55752752 :     move64();
    5510             : 
    5511    55752752 :     s[0] = CL_add( y[6], y[11] );
    5512    55752752 :     move64();
    5513    55752752 :     s[1] = CL_scale( CL_sub( y[6], y[11] ), FFT_C31 ); // Qx
    5514    55752752 :     move64();
    5515    55752752 :     z[6] = CL_add( y[1], s[0] );
    5516    55752752 :     move64();
    5517    55752752 :     s[0] = CL_sub( y[1], CL_shr( s[0], 1 ) );
    5518    55752752 :     move64();
    5519             : 
    5520    55752752 :     z[1] = CL_mac_j( s[0], s[1] );
    5521    55752752 :     move64();
    5522    55752752 :     z[11] = CL_msu_j( s[0], s[1] );
    5523    55752752 :     move64();
    5524             : 
    5525    55752752 :     s[0] = CL_add( y[7], y[12] );
    5526    55752752 :     move64();
    5527    55752752 :     s[1] = CL_scale( CL_sub( y[7], y[12] ), FFT_C31 ); // Qx
    5528    55752752 :     move64();
    5529    55752752 :     z[12] = CL_add( y[2], s[0] );
    5530    55752752 :     move64();
    5531    55752752 :     s[0] = CL_sub( y[2], CL_shr( s[0], 1 ) );
    5532    55752752 :     move64();
    5533             : 
    5534    55752752 :     z[7] = CL_mac_j( s[0], s[1] );
    5535    55752752 :     move64();
    5536    55752752 :     z[2] = CL_msu_j( s[0], s[1] );
    5537    55752752 :     move64();
    5538             : 
    5539    55752752 :     s[0] = CL_add( y[8], y[13] );
    5540    55752752 :     move64();
    5541    55752752 :     s[1] = CL_scale( CL_sub( y[8], y[13] ), FFT_C31 ); // Qx
    5542    55752752 :     move64();
    5543    55752752 :     z[3] = CL_add( y[3], s[0] );
    5544    55752752 :     move64();
    5545    55752752 :     s[0] = CL_sub( y[3], CL_shr( s[0], 1 ) );
    5546    55752752 :     move64();
    5547             : 
    5548    55752752 :     z[13] = CL_mac_j( s[0], s[1] );
    5549    55752752 :     move64();
    5550    55752752 :     z[8] = CL_msu_j( s[0], s[1] );
    5551    55752752 :     move64();
    5552             : 
    5553    55752752 :     s[0] = CL_add( y[9], y[14] );
    5554    55752752 :     move64();
    5555    55752752 :     s[1] = CL_scale( CL_sub( y[9], y[14] ), FFT_C31 ); // Qx
    5556    55752752 :     move64();
    5557    55752752 :     z[9] = CL_add( y[4], s[0] );
    5558    55752752 :     move64();
    5559    55752752 :     s[0] = CL_sub( y[4], CL_shr( s[0], 1 ) );
    5560    55752752 :     move64();
    5561             : 
    5562    55752752 :     z[4] = CL_mac_j( s[0], s[1] );
    5563    55752752 :     move64();
    5564    55752752 :     z[14] = CL_msu_j( s[0], s[1] );
    5565    55752752 :     move64();
    5566             : 
    5567    55752752 :     xx[0] = x[15];
    5568    55752752 :     move64();
    5569    55752752 :     xx[1] = x[3];
    5570    55752752 :     move64();
    5571    55752752 :     xx[2] = x[21];
    5572    55752752 :     move64();
    5573    55752752 :     xx[3] = x[9];
    5574    55752752 :     move64();
    5575    55752752 :     xx[4] = x[27];
    5576    55752752 :     move64();
    5577             : 
    5578    55752752 :     xx[5] = x[5];
    5579    55752752 :     move64();
    5580    55752752 :     xx[6] = x[23];
    5581    55752752 :     move64();
    5582    55752752 :     xx[7] = x[11];
    5583    55752752 :     move64();
    5584    55752752 :     xx[8] = x[29];
    5585    55752752 :     move64();
    5586    55752752 :     xx[9] = x[17];
    5587    55752752 :     move64();
    5588             : 
    5589    55752752 :     xx[10] = x[25];
    5590    55752752 :     move64();
    5591    55752752 :     xx[11] = x[13];
    5592    55752752 :     move64();
    5593    55752752 :     xx[12] = x[1];
    5594    55752752 :     move64();
    5595    55752752 :     xx[13] = x[19];
    5596    55752752 :     move64();
    5597    55752752 :     xx[14] = x[7];
    5598    55752752 :     move64();
    5599             : 
    5600    55752752 :     s[0] = CL_add( xx[1], xx[4] );
    5601    55752752 :     move64();
    5602    55752752 :     s[3] = CL_sub( xx[1], xx[4] );
    5603    55752752 :     move64();
    5604    55752752 :     s[2] = CL_add( xx[2], xx[3] );
    5605    55752752 :     move64();
    5606    55752752 :     s[1] = CL_sub( xx[2], xx[3] );
    5607    55752752 :     move64();
    5608    55752752 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
    5609    55752752 :     s[0] = CL_add( s[0], s[2] );
    5610    55752752 :     move64();
    5611    55752752 :     y[0] = CL_add( xx[0], s[0] );
    5612    55752752 :     move64();
    5613    55752752 :     s[0] = CL_add( y[0], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    5614    55752752 :     move64();
    5615    55752752 :     s[2] = CL_sub( s[0], t );
    5616    55752752 :     move64();
    5617    55752752 :     s[0] = CL_add( s[0], t );
    5618    55752752 :     move64();
    5619    55752752 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );              // Qx
    5620    55752752 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    5621    55752752 :     move64();
    5622    55752752 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
    5623    55752752 :     move64();
    5624             : 
    5625    55752752 :     y[1] = CL_msu_j( s[0], s[1] );
    5626    55752752 :     move64();
    5627    55752752 :     y[4] = CL_mac_j( s[0], s[1] );
    5628    55752752 :     move64();
    5629    55752752 :     y[2] = CL_mac_j( s[2], s[3] );
    5630    55752752 :     move64();
    5631    55752752 :     y[3] = CL_msu_j( s[2], s[3] );
    5632    55752752 :     move64();
    5633             : 
    5634    55752752 :     s[0] = CL_add( xx[6], xx[9] );
    5635    55752752 :     move64();
    5636    55752752 :     s[3] = CL_sub( xx[6], xx[9] );
    5637    55752752 :     move64();
    5638    55752752 :     s[2] = CL_add( xx[7], xx[8] );
    5639    55752752 :     move64();
    5640    55752752 :     s[1] = CL_sub( xx[7], xx[8] );
    5641    55752752 :     move64();
    5642    55752752 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
    5643    55752752 :     s[0] = CL_add( s[0], s[2] );
    5644    55752752 :     move64();
    5645    55752752 :     y[5] = CL_add( xx[5], s[0] );
    5646    55752752 :     move64();
    5647    55752752 :     s[0] = CL_add( y[5], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    5648    55752752 :     move64();
    5649    55752752 :     s[2] = CL_sub( s[0], t );
    5650    55752752 :     move64();
    5651    55752752 :     s[0] = CL_add( s[0], t );
    5652    55752752 :     move64();
    5653    55752752 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );              // Qx
    5654    55752752 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    5655    55752752 :     move64();
    5656    55752752 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
    5657    55752752 :     move64();
    5658             : 
    5659    55752752 :     y[6] = CL_msu_j( s[0], s[1] );
    5660    55752752 :     move64();
    5661    55752752 :     y[9] = CL_mac_j( s[0], s[1] );
    5662    55752752 :     move64();
    5663    55752752 :     y[7] = CL_mac_j( s[2], s[3] );
    5664    55752752 :     move64();
    5665    55752752 :     y[8] = CL_msu_j( s[2], s[3] );
    5666    55752752 :     move64();
    5667             : 
    5668    55752752 :     s[0] = CL_add( xx[11], xx[14] );
    5669    55752752 :     move64();
    5670    55752752 :     s[3] = CL_sub( xx[11], xx[14] );
    5671    55752752 :     move64();
    5672    55752752 :     s[2] = CL_add( xx[12], xx[13] );
    5673    55752752 :     move64();
    5674    55752752 :     s[1] = CL_sub( xx[12], xx[13] );
    5675    55752752 :     move64();
    5676    55752752 :     t = CL_scale( CL_sub( s[0], s[2] ), FFT_C54 ); // Qx
    5677    55752752 :     s[0] = CL_add( s[0], s[2] );
    5678    55752752 :     move64();
    5679    55752752 :     y[10] = CL_add( xx[10], s[0] );
    5680    55752752 :     move64();
    5681    55752752 :     s[0] = CL_add( y[10], CL_shl( CL_scale( s[0], FFT_C55 ), 1 ) ); // Qx
    5682    55752752 :     move64();
    5683    55752752 :     s[2] = CL_sub( s[0], t );
    5684    55752752 :     move64();
    5685    55752752 :     s[0] = CL_add( s[0], t );
    5686    55752752 :     move64();
    5687    55752752 :     t = CL_scale( CL_add( s[3], s[1] ), FFT_C51 );              // Qx
    5688    55752752 :     s[3] = CL_add( t, CL_shl( CL_scale( s[3], FFT_C52 ), 1 ) ); // Qx
    5689    55752752 :     move64();
    5690    55752752 :     s[1] = CL_add( t, CL_scale( s[1], FFT_C53 ) ); // Qx
    5691    55752752 :     move64();
    5692             : 
    5693    55752752 :     y[11] = CL_msu_j( s[0], s[1] );
    5694    55752752 :     move64();
    5695    55752752 :     y[14] = CL_mac_j( s[0], s[1] );
    5696    55752752 :     move64();
    5697    55752752 :     y[12] = CL_mac_j( s[2], s[3] );
    5698    55752752 :     move64();
    5699    55752752 :     y[13] = CL_msu_j( s[2], s[3] );
    5700    55752752 :     move64();
    5701             : 
    5702    55752752 :     s[0] = CL_add( y[5], y[10] );
    5703    55752752 :     move64();
    5704    55752752 :     s[1] = CL_scale( CL_sub( y[5], y[10] ), FFT_C31 ); // Qx
    5705    55752752 :     move64();
    5706    55752752 :     z[15] = CL_add( y[0], s[0] );
    5707    55752752 :     move64();
    5708    55752752 :     s[0] = CL_sub( y[0], CL_shr( s[0], 1 ) );
    5709    55752752 :     move64();
    5710             : 
    5711    55752752 :     z[25] = CL_mac_j( s[0], s[1] );
    5712    55752752 :     move64();
    5713    55752752 :     z[20] = CL_msu_j( s[0], s[1] );
    5714    55752752 :     move64();
    5715             : 
    5716    55752752 :     s[0] = CL_add( y[6], y[11] );
    5717    55752752 :     move64();
    5718    55752752 :     s[1] = CL_scale( CL_sub( y[6], y[11] ), FFT_C31 ); // Qx
    5719    55752752 :     move64();
    5720    55752752 :     z[21] = CL_add( y[1], s[0] );
    5721    55752752 :     move64();
    5722    55752752 :     s[0] = CL_sub( y[1], CL_shr( s[0], 1 ) );
    5723    55752752 :     move64();
    5724             : 
    5725    55752752 :     z[16] = CL_mac_j( s[0], s[1] );
    5726    55752752 :     move64();
    5727    55752752 :     z[26] = CL_msu_j( s[0], s[1] );
    5728    55752752 :     move64();
    5729             : 
    5730    55752752 :     s[0] = CL_add( y[7], y[12] );
    5731    55752752 :     move64();
    5732    55752752 :     s[1] = CL_scale( CL_sub( y[7], y[12] ), FFT_C31 ); // Qx
    5733    55752752 :     move64();
    5734    55752752 :     z[27] = CL_add( y[2], s[0] );
    5735    55752752 :     move64();
    5736    55752752 :     s[0] = CL_sub( y[2], CL_shr( s[0], 1 ) );
    5737    55752752 :     move64();
    5738             : 
    5739    55752752 :     z[22] = CL_mac_j( s[0], s[1] );
    5740    55752752 :     move64();
    5741    55752752 :     z[17] = CL_msu_j( s[0], s[1] );
    5742    55752752 :     move64();
    5743             : 
    5744    55752752 :     s[0] = CL_add( y[8], y[13] );
    5745    55752752 :     move64();
    5746    55752752 :     s[1] = CL_scale( CL_sub( y[8], y[13] ), FFT_C31 ); // Qx
    5747    55752752 :     move64();
    5748    55752752 :     z[18] = CL_add( y[3], s[0] );
    5749    55752752 :     move64();
    5750    55752752 :     s[0] = CL_sub( y[3], CL_shr( s[0], 1 ) );
    5751    55752752 :     move64();
    5752             : 
    5753    55752752 :     z[28] = CL_mac_j( s[0], s[1] );
    5754    55752752 :     move64();
    5755    55752752 :     z[23] = CL_msu_j( s[0], s[1] );
    5756    55752752 :     move64();
    5757             : 
    5758    55752752 :     s[0] = CL_add( y[9], y[14] );
    5759    55752752 :     move64();
    5760    55752752 :     s[1] = CL_scale( CL_sub( y[9], y[14] ), FFT_C31 ); // Qx
    5761    55752752 :     move64();
    5762    55752752 :     z[24] = CL_add( y[4], s[0] );
    5763    55752752 :     move64();
    5764    55752752 :     s[0] = CL_sub( y[4], CL_shr( s[0], 1 ) );
    5765    55752752 :     move64();
    5766             : 
    5767    55752752 :     z[19] = CL_mac_j( s[0], s[1] );
    5768    55752752 :     move64();
    5769    55752752 :     z[29] = CL_msu_j( s[0], s[1] );
    5770    55752752 :     move64();
    5771             : 
    5772    55752752 :     s[0] = z[0];
    5773    55752752 :     move64();
    5774    55752752 :     s[1] = z[15];
    5775    55752752 :     move64();
    5776    55752752 :     *l = CL_add( s[0], s[1] );
    5777    55752752 :     move64();
    5778    55752752 :     *h = CL_sub( s[0], s[1] );
    5779    55752752 :     move64();
    5780    55752752 :     l += 1, h += 1;
    5781             : 
    5782    55752752 :     s[0] = z[8];
    5783    55752752 :     move64();
    5784    55752752 :     s[1] = z[23];
    5785    55752752 :     move64();
    5786    55752752 :     *h = CL_add( s[0], s[1] );
    5787    55752752 :     move64();
    5788    55752752 :     *l = CL_sub( s[0], s[1] );
    5789    55752752 :     move64();
    5790    55752752 :     l += 1, h += 1;
    5791             : 
    5792    55752752 :     s[0] = z[1];
    5793    55752752 :     move64();
    5794    55752752 :     s[1] = z[16];
    5795    55752752 :     move64();
    5796    55752752 :     *l = CL_add( s[0], s[1] );
    5797    55752752 :     move64();
    5798    55752752 :     *h = CL_sub( s[0], s[1] );
    5799    55752752 :     move64();
    5800    55752752 :     l += 1, h += 1;
    5801             : 
    5802    55752752 :     s[0] = z[9];
    5803    55752752 :     move64();
    5804    55752752 :     s[1] = z[24];
    5805    55752752 :     move64();
    5806    55752752 :     *h = CL_add( s[0], s[1] );
    5807    55752752 :     move64();
    5808    55752752 :     *l = CL_sub( s[0], s[1] );
    5809    55752752 :     move64();
    5810    55752752 :     l += 1, h += 1;
    5811             : 
    5812    55752752 :     s[0] = z[2];
    5813    55752752 :     move64();
    5814    55752752 :     s[1] = z[17];
    5815    55752752 :     move64();
    5816    55752752 :     *l = CL_add( s[0], s[1] );
    5817    55752752 :     move64();
    5818    55752752 :     *h = CL_sub( s[0], s[1] );
    5819    55752752 :     move64();
    5820    55752752 :     l += 1, h += 1;
    5821             : 
    5822    55752752 :     s[0] = z[10];
    5823    55752752 :     move64();
    5824    55752752 :     s[1] = z[25];
    5825    55752752 :     move64();
    5826    55752752 :     *h = CL_add( s[0], s[1] );
    5827    55752752 :     move64();
    5828    55752752 :     *l = CL_sub( s[0], s[1] );
    5829    55752752 :     move64();
    5830    55752752 :     l += 1, h += 1;
    5831             : 
    5832    55752752 :     s[0] = z[3];
    5833    55752752 :     move64();
    5834    55752752 :     s[1] = z[18];
    5835    55752752 :     move64();
    5836    55752752 :     *l = CL_add( s[0], s[1] );
    5837    55752752 :     move64();
    5838    55752752 :     *h = CL_sub( s[0], s[1] );
    5839    55752752 :     move64();
    5840    55752752 :     l += 1, h += 1;
    5841             : 
    5842    55752752 :     s[0] = z[11];
    5843    55752752 :     move64();
    5844    55752752 :     s[1] = z[26];
    5845    55752752 :     move64();
    5846    55752752 :     *h = CL_add( s[0], s[1] );
    5847    55752752 :     move64();
    5848    55752752 :     *l = CL_sub( s[0], s[1] );
    5849    55752752 :     move64();
    5850    55752752 :     l += 1, h += 1;
    5851             : 
    5852    55752752 :     s[0] = z[4];
    5853    55752752 :     move64();
    5854    55752752 :     s[1] = z[19];
    5855    55752752 :     move64();
    5856    55752752 :     *l = CL_add( s[0], s[1] );
    5857    55752752 :     move64();
    5858    55752752 :     *h = CL_sub( s[0], s[1] );
    5859    55752752 :     move64();
    5860    55752752 :     l += 1, h += 1;
    5861             : 
    5862    55752752 :     s[0] = z[12];
    5863    55752752 :     move64();
    5864    55752752 :     s[1] = z[27];
    5865    55752752 :     move64();
    5866    55752752 :     *h = CL_add( s[0], s[1] );
    5867    55752752 :     move64();
    5868    55752752 :     *l = CL_sub( s[0], s[1] );
    5869    55752752 :     move64();
    5870    55752752 :     l += 1, h += 1;
    5871             : 
    5872    55752752 :     s[0] = z[5];
    5873    55752752 :     move64();
    5874    55752752 :     s[1] = z[20];
    5875    55752752 :     move64();
    5876    55752752 :     *l = CL_add( s[0], s[1] );
    5877    55752752 :     move64();
    5878    55752752 :     *h = CL_sub( s[0], s[1] );
    5879    55752752 :     move64();
    5880    55752752 :     l += 1, h += 1;
    5881             : 
    5882    55752752 :     s[0] = z[13];
    5883    55752752 :     move64();
    5884    55752752 :     s[1] = z[28];
    5885    55752752 :     move64();
    5886    55752752 :     *h = CL_add( s[0], s[1] );
    5887    55752752 :     move64();
    5888    55752752 :     *l = CL_sub( s[0], s[1] );
    5889    55752752 :     move64();
    5890    55752752 :     l += 1, h += 1;
    5891             : 
    5892    55752752 :     s[0] = z[6];
    5893    55752752 :     move64();
    5894    55752752 :     s[1] = z[21];
    5895    55752752 :     move64();
    5896    55752752 :     *l = CL_add( s[0], s[1] );
    5897    55752752 :     move64();
    5898    55752752 :     *h = CL_sub( s[0], s[1] );
    5899    55752752 :     move64();
    5900    55752752 :     l += 1, h += 1;
    5901             : 
    5902    55752752 :     s[0] = z[14];
    5903    55752752 :     move64();
    5904    55752752 :     s[1] = z[29];
    5905    55752752 :     move64();
    5906    55752752 :     *h = CL_add( s[0], s[1] );
    5907    55752752 :     move64();
    5908    55752752 :     *l = CL_sub( s[0], s[1] );
    5909    55752752 :     move64();
    5910    55752752 :     l += 1, h += 1;
    5911             : 
    5912    55752752 :     s[0] = z[7];
    5913    55752752 :     move64();
    5914    55752752 :     s[1] = z[22];
    5915    55752752 :     move64();
    5916    55752752 :     *l = CL_add( s[0], s[1] );
    5917    55752752 :     move64();
    5918    55752752 :     *h = CL_sub( s[0], s[1] );
    5919    55752752 :     move64();
    5920    55752752 :     l += 1, h += 1;
    5921             : 
    5922    55752752 :     return;
    5923             : }
    5924             : 
    5925       20580 : 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       20580 :     xx[0] = x[0];
    5934       20580 :     move64();
    5935       20580 :     xx[1] = x[4];
    5936       20580 :     move64();
    5937       20580 :     xx[2] = x[8];
    5938       20580 :     move64();
    5939       20580 :     xx[3] = x[12];
    5940       20580 :     move64();
    5941       20580 :     xx[4] = x[16];
    5942       20580 :     move64();
    5943       20580 :     xx[5] = x[20];
    5944       20580 :     move64();
    5945       20580 :     xx[6] = x[24];
    5946       20580 :     move64();
    5947       20580 :     xx[7] = x[28];
    5948       20580 :     move64();
    5949             : 
    5950       20580 :     t[0] = CL_add( xx[0], xx[4] );
    5951       20580 :     move64();
    5952       20580 :     t[1] = CL_sub( xx[0], xx[4] );
    5953       20580 :     move64();
    5954       20580 :     t[2] = CL_add( xx[1], xx[5] );
    5955       20580 :     move64();
    5956       20580 :     t[3] = CL_sub( xx[1], xx[5] );
    5957       20580 :     move64();
    5958       20580 :     t[4] = CL_add( xx[2], xx[6] );
    5959       20580 :     move64();
    5960       20580 :     t[5] = CL_sub( xx[2], xx[6] );
    5961       20580 :     move64();
    5962       20580 :     t[6] = CL_add( xx[3], xx[7] );
    5963       20580 :     move64();
    5964       20580 :     t[7] = CL_sub( xx[3], xx[7] );
    5965       20580 :     move64();
    5966             : 
    5967       20580 :     s[0] = CL_add( t[0], t[4] );
    5968       20580 :     move64();
    5969       20580 :     s[2] = CL_sub( t[0], t[4] );
    5970       20580 :     move64();
    5971       20580 :     s[4] = CL_mac_j( t[1], t[5] );
    5972       20580 :     move64();
    5973       20580 :     s[5] = CL_msu_j( t[1], t[5] );
    5974       20580 :     move64();
    5975       20580 :     s[1] = CL_add( t[2], t[6] );
    5976       20580 :     move64();
    5977       20580 :     s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
    5978       20580 :     move64();
    5979       20580 :     t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
    5980       20580 :     move64();
    5981       20580 :     t[1] = CL_sub( t[3], t[7] );
    5982       20580 :     move64();
    5983             : 
    5984             :     {
    5985       20580 :         s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); // Qx
    5986       20580 :         move64();
    5987       20580 :         s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); // Qx
    5988       20580 :         move64();
    5989       20580 :         s[7] = CL_conjugate( s[7] );
    5990       20580 :         move64();
    5991             :     };
    5992             : 
    5993       20580 :     y[0] = CL_add( s[0], s[1] );
    5994       20580 :     move64();
    5995       20580 :     y[4] = CL_sub( s[0], s[1] );
    5996       20580 :     move64();
    5997       20580 :     y[2] = CL_sub( s[2], s[3] );
    5998       20580 :     move64();
    5999       20580 :     y[6] = CL_add( s[2], s[3] );
    6000       20580 :     move64();
    6001       20580 :     y[3] = CL_add( s[4], s[7] );
    6002       20580 :     move64();
    6003       20580 :     y[7] = CL_sub( s[4], s[7] );
    6004       20580 :     move64();
    6005       20580 :     y[1] = CL_add( s[5], s[6] );
    6006       20580 :     move64();
    6007       20580 :     y[5] = CL_sub( s[5], s[6] );
    6008       20580 :     move64();
    6009             : 
    6010       20580 :     xx[0] = x[1];
    6011       20580 :     move64();
    6012       20580 :     xx[1] = x[5];
    6013       20580 :     move64();
    6014       20580 :     xx[2] = x[9];
    6015       20580 :     move64();
    6016       20580 :     xx[3] = x[13];
    6017       20580 :     move64();
    6018       20580 :     xx[4] = x[17];
    6019       20580 :     move64();
    6020       20580 :     xx[5] = x[21];
    6021       20580 :     move64();
    6022       20580 :     xx[6] = x[25];
    6023       20580 :     move64();
    6024       20580 :     xx[7] = x[29];
    6025       20580 :     move64();
    6026             : 
    6027       20580 :     t[0] = CL_add( xx[0], xx[4] );
    6028       20580 :     move64();
    6029       20580 :     t[1] = CL_sub( xx[0], xx[4] );
    6030       20580 :     move64();
    6031       20580 :     t[2] = CL_add( xx[1], xx[5] );
    6032       20580 :     move64();
    6033       20580 :     t[3] = CL_sub( xx[1], xx[5] );
    6034       20580 :     move64();
    6035       20580 :     t[4] = CL_add( xx[2], xx[6] );
    6036       20580 :     move64();
    6037       20580 :     t[5] = CL_sub( xx[2], xx[6] );
    6038       20580 :     move64();
    6039       20580 :     t[6] = CL_add( xx[3], xx[7] );
    6040       20580 :     move64();
    6041       20580 :     t[7] = CL_sub( xx[3], xx[7] );
    6042       20580 :     move64();
    6043             : 
    6044       20580 :     s[0] = CL_add( t[0], t[4] );
    6045       20580 :     move64();
    6046       20580 :     s[2] = CL_sub( t[0], t[4] );
    6047       20580 :     move64();
    6048       20580 :     s[4] = CL_mac_j( t[1], t[5] );
    6049       20580 :     move64();
    6050       20580 :     s[5] = CL_msu_j( t[1], t[5] );
    6051       20580 :     move64();
    6052       20580 :     s[1] = CL_add( t[2], t[6] );
    6053       20580 :     move64();
    6054       20580 :     s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
    6055       20580 :     move64();
    6056       20580 :     t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
    6057       20580 :     move64();
    6058       20580 :     t[1] = CL_sub( t[3], t[7] );
    6059       20580 :     move64();
    6060             : 
    6061             :     {
    6062       20580 :         s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 );
    6063       20580 :         move64();
    6064       20580 :         s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 );
    6065       20580 :         move64();
    6066       20580 :         s[7] = CL_conjugate( s[7] );
    6067       20580 :         move64();
    6068             :     };
    6069             : 
    6070       20580 :     y[8] = CL_add( s[0], s[1] );
    6071       20580 :     move64();
    6072       20580 :     y[12] = CL_sub( s[0], s[1] );
    6073       20580 :     move64();
    6074       20580 :     y[10] = CL_sub( s[2], s[3] );
    6075       20580 :     move64();
    6076       20580 :     y[14] = CL_add( s[2], s[3] );
    6077       20580 :     move64();
    6078       20580 :     y[11] = CL_add( s[4], s[7] );
    6079       20580 :     move64();
    6080       20580 :     y[15] = CL_sub( s[4], s[7] );
    6081       20580 :     move64();
    6082       20580 :     y[9] = CL_add( s[5], s[6] );
    6083       20580 :     move64();
    6084       20580 :     y[13] = CL_sub( s[5], s[6] );
    6085       20580 :     move64();
    6086             : 
    6087       20580 :     xx[0] = x[2];
    6088       20580 :     move64();
    6089       20580 :     xx[1] = x[6];
    6090       20580 :     move64();
    6091       20580 :     xx[2] = x[10];
    6092       20580 :     move64();
    6093       20580 :     xx[3] = x[14];
    6094       20580 :     move64();
    6095       20580 :     xx[4] = x[18];
    6096       20580 :     move64();
    6097       20580 :     xx[5] = x[22];
    6098       20580 :     move64();
    6099       20580 :     xx[6] = x[26];
    6100       20580 :     move64();
    6101       20580 :     xx[7] = x[30];
    6102       20580 :     move64();
    6103             : 
    6104       20580 :     t[0] = CL_add( xx[0], xx[4] );
    6105       20580 :     move64();
    6106       20580 :     t[1] = CL_sub( xx[0], xx[4] );
    6107       20580 :     move64();
    6108       20580 :     t[2] = CL_add( xx[1], xx[5] );
    6109       20580 :     move64();
    6110       20580 :     t[3] = CL_sub( xx[1], xx[5] );
    6111       20580 :     move64();
    6112       20580 :     t[4] = CL_add( xx[2], xx[6] );
    6113       20580 :     move64();
    6114       20580 :     t[5] = CL_sub( xx[2], xx[6] );
    6115       20580 :     move64();
    6116       20580 :     t[6] = CL_add( xx[3], xx[7] );
    6117       20580 :     move64();
    6118       20580 :     t[7] = CL_sub( xx[3], xx[7] );
    6119       20580 :     move64();
    6120             : 
    6121       20580 :     s[0] = CL_add( t[0], t[4] );
    6122       20580 :     move64();
    6123       20580 :     s[2] = CL_sub( t[0], t[4] );
    6124       20580 :     move64();
    6125       20580 :     s[4] = CL_mac_j( t[1], t[5] );
    6126       20580 :     move64();
    6127       20580 :     s[5] = CL_msu_j( t[1], t[5] );
    6128       20580 :     move64();
    6129       20580 :     s[1] = CL_add( t[2], t[6] );
    6130       20580 :     move64();
    6131       20580 :     s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
    6132       20580 :     move64();
    6133       20580 :     t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
    6134       20580 :     move64();
    6135       20580 :     t[1] = CL_sub( t[3], t[7] );
    6136       20580 :     move64();
    6137             : 
    6138             :     {
    6139       20580 :         s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); // Qx
    6140       20580 :         move64();
    6141       20580 :         s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); // Qx
    6142       20580 :         move64();
    6143       20580 :         s[7] = CL_conjugate( s[7] );
    6144       20580 :         move64();
    6145             :     };
    6146             : 
    6147       20580 :     y[16] = CL_add( s[0], s[1] );
    6148       20580 :     move64();
    6149       20580 :     y[20] = CL_sub( s[0], s[1] );
    6150       20580 :     move64();
    6151       20580 :     y[18] = CL_sub( s[2], s[3] );
    6152       20580 :     move64();
    6153       20580 :     y[22] = CL_add( s[2], s[3] );
    6154       20580 :     move64();
    6155       20580 :     y[19] = CL_add( s[4], s[7] );
    6156       20580 :     move64();
    6157       20580 :     y[23] = CL_sub( s[4], s[7] );
    6158       20580 :     move64();
    6159       20580 :     y[17] = CL_add( s[5], s[6] );
    6160       20580 :     move64();
    6161       20580 :     y[21] = CL_sub( s[5], s[6] );
    6162       20580 :     move64();
    6163             : 
    6164       20580 :     xx[0] = x[3];
    6165       20580 :     move64();
    6166       20580 :     xx[1] = x[7];
    6167       20580 :     move64();
    6168       20580 :     xx[2] = x[11];
    6169       20580 :     move64();
    6170       20580 :     xx[3] = x[15];
    6171       20580 :     move64();
    6172       20580 :     xx[4] = x[19];
    6173       20580 :     move64();
    6174       20580 :     xx[5] = x[23];
    6175       20580 :     move64();
    6176       20580 :     xx[6] = x[27];
    6177       20580 :     move64();
    6178       20580 :     xx[7] = x[31];
    6179       20580 :     move64();
    6180             : 
    6181       20580 :     t[0] = CL_add( xx[0], xx[4] );
    6182       20580 :     move64();
    6183       20580 :     t[1] = CL_sub( xx[0], xx[4] );
    6184       20580 :     move64();
    6185       20580 :     t[2] = CL_add( xx[1], xx[5] );
    6186       20580 :     move64();
    6187       20580 :     t[3] = CL_sub( xx[1], xx[5] );
    6188       20580 :     move64();
    6189       20580 :     t[4] = CL_add( xx[2], xx[6] );
    6190       20580 :     move64();
    6191       20580 :     t[5] = CL_sub( xx[2], xx[6] );
    6192       20580 :     move64();
    6193       20580 :     t[6] = CL_add( xx[3], xx[7] );
    6194       20580 :     move64();
    6195       20580 :     t[7] = CL_sub( xx[3], xx[7] );
    6196       20580 :     move64();
    6197             : 
    6198       20580 :     s[0] = CL_add( t[0], t[4] );
    6199       20580 :     move64();
    6200       20580 :     s[2] = CL_sub( t[0], t[4] );
    6201       20580 :     move64();
    6202       20580 :     s[4] = CL_mac_j( t[1], t[5] );
    6203       20580 :     move64();
    6204       20580 :     s[5] = CL_msu_j( t[1], t[5] );
    6205       20580 :     move64();
    6206       20580 :     s[1] = CL_add( t[2], t[6] );
    6207       20580 :     move64();
    6208       20580 :     s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
    6209       20580 :     move64();
    6210       20580 :     t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
    6211       20580 :     move64();
    6212       20580 :     t[1] = CL_sub( t[3], t[7] );
    6213       20580 :     move64();
    6214             : 
    6215             :     {
    6216       20580 :         s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); // Qx
    6217       20580 :         move64();
    6218       20580 :         s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); // Qx
    6219       20580 :         move64();
    6220       20580 :         s[7] = CL_conjugate( s[7] );
    6221       20580 :         move64();
    6222             :     };
    6223             : 
    6224       20580 :     y[24] = CL_add( s[0], s[1] );
    6225       20580 :     move64();
    6226       20580 :     y[28] = CL_sub( s[0], s[1] );
    6227       20580 :     move64();
    6228       20580 :     y[26] = CL_sub( s[2], s[3] );
    6229       20580 :     move64();
    6230       20580 :     y[30] = CL_add( s[2], s[3] );
    6231       20580 :     move64();
    6232       20580 :     y[27] = CL_add( s[4], s[7] );
    6233       20580 :     move64();
    6234       20580 :     y[31] = CL_sub( s[4], s[7] );
    6235       20580 :     move64();
    6236       20580 :     y[25] = CL_add( s[5], s[6] );
    6237       20580 :     move64();
    6238       20580 :     y[29] = CL_sub( s[5], s[6] );
    6239       20580 :     move64();
    6240             : 
    6241             :     {
    6242       20580 :         ab = y[9];
    6243       20580 :         move64();
    6244       20580 :         y[9] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[0] ), CL_scale( ab, FFT_RotVector_32_fx[1] ) ); // Qx
    6245       20580 :         move64();
    6246             :     };
    6247             :     {
    6248       20580 :         ab = y[10];
    6249       20580 :         move64();
    6250       20580 :         y[10] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[2] ), CL_scale( ab, FFT_RotVector_32_fx[3] ) ); // Qx
    6251       20580 :         move64();
    6252             :     };
    6253             :     {
    6254       20580 :         ab = y[11];
    6255       20580 :         move64();
    6256       20580 :         y[11] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[4] ), CL_scale( ab, FFT_RotVector_32_fx[5] ) ); // Qx
    6257       20580 :         move64();
    6258             :     };
    6259             :     {
    6260       20580 :         ab = y[12];
    6261       20580 :         move64();
    6262       20580 :         y[12] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[6] ), CL_scale( ab, FFT_RotVector_32_fx[7] ) ); // Qx
    6263       20580 :         move64();
    6264             :     };
    6265             :     {
    6266       20580 :         ab = y[13];
    6267       20580 :         move64();
    6268       20580 :         y[13] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[8] ), CL_scale( ab, FFT_RotVector_32_fx[9] ) ); // Qx
    6269       20580 :         move64();
    6270             :     };
    6271             :     {
    6272       20580 :         ab = y[14];
    6273       20580 :         move64();
    6274       20580 :         y[14] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[10] ), CL_scale( ab, FFT_RotVector_32_fx[11] ) ); // Qx
    6275       20580 :         move64();
    6276             :     };
    6277             :     {
    6278       20580 :         ab = y[15];
    6279       20580 :         move64();
    6280       20580 :         y[15] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[12] ), CL_scale( ab, FFT_RotVector_32_fx[13] ) ); // Qx
    6281       20580 :         move64();
    6282             :     };
    6283             :     {
    6284       20580 :         ab = y[17];
    6285       20580 :         move64();
    6286       20580 :         y[17] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[14] ), CL_scale( ab, FFT_RotVector_32_fx[15] ) );
    6287       20580 :         move64();
    6288             :     };
    6289             :     {
    6290       20580 :         ab = y[18];
    6291       20580 :         move64();
    6292       20580 :         y[18] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[16] ), CL_scale( ab, FFT_RotVector_32_fx[17] ) );
    6293       20580 :         move64();
    6294             :     };
    6295             :     {
    6296       20580 :         ab = y[19];
    6297       20580 :         move64();
    6298       20580 :         y[19] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[18] ), CL_scale( ab, FFT_RotVector_32_fx[19] ) );
    6299       20580 :         move64();
    6300             :     };
    6301             :     {
    6302       20580 :         ab = y[21];
    6303       20580 :         move64();
    6304       20580 :         y[21] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[20] ), CL_scale( ab, FFT_RotVector_32_fx[21] ) );
    6305       20580 :         move64();
    6306             :     };
    6307             :     {
    6308       20580 :         ab = y[22];
    6309       20580 :         move64();
    6310       20580 :         y[22] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[22] ), CL_scale( ab, FFT_RotVector_32_fx[23] ) );
    6311       20580 :         move64();
    6312             :     };
    6313             :     {
    6314       20580 :         ab = y[23];
    6315       20580 :         move64();
    6316       20580 :         y[23] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[24] ), CL_scale( ab, FFT_RotVector_32_fx[25] ) );
    6317       20580 :         move64();
    6318             :     };
    6319             :     {
    6320       20580 :         ab = y[25];
    6321       20580 :         move64();
    6322       20580 :         y[25] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[26] ), CL_scale( ab, FFT_RotVector_32_fx[27] ) );
    6323       20580 :         move64();
    6324             :     };
    6325             :     {
    6326       20580 :         ab = y[26];
    6327       20580 :         move64();
    6328       20580 :         y[26] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[28] ), CL_scale( ab, FFT_RotVector_32_fx[29] ) );
    6329       20580 :         move64();
    6330             :     };
    6331             :     {
    6332       20580 :         ab = y[27];
    6333       20580 :         move64();
    6334       20580 :         y[27] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[30] ), CL_scale( ab, FFT_RotVector_32_fx[31] ) );
    6335       20580 :         move64();
    6336             :     };
    6337             :     {
    6338       20580 :         ab = y[28];
    6339       20580 :         move64();
    6340       20580 :         y[28] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[32] ), CL_scale( ab, FFT_RotVector_32_fx[33] ) );
    6341       20580 :         move64();
    6342             :     };
    6343             :     {
    6344       20580 :         ab = y[29];
    6345       20580 :         move64();
    6346       20580 :         y[29] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[34] ), CL_scale( ab, FFT_RotVector_32_fx[35] ) );
    6347       20580 :         move64();
    6348             :     };
    6349             :     {
    6350       20580 :         ab = y[30];
    6351       20580 :         move64();
    6352       20580 :         y[30] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[36] ), CL_scale( ab, FFT_RotVector_32_fx[37] ) );
    6353       20580 :         move64();
    6354             :     };
    6355             :     {
    6356       20580 :         ab = y[31];
    6357       20580 :         move64();
    6358       20580 :         y[31] = CL_mac_j( CL_scale( ab, FFT_RotVector_32_fx[38] ), CL_scale( ab, FFT_RotVector_32_fx[39] ) );
    6359       20580 :         move64();
    6360             :     };
    6361             : 
    6362       20580 :     t[0] = CL_add( y[0], y[16] );
    6363       20580 :     move64();
    6364       20580 :     t[1] = CL_sub( y[0], y[16] );
    6365       20580 :     move64();
    6366       20580 :     t[2] = CL_add( y[8], y[24] );
    6367       20580 :     move64();
    6368       20580 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[8] ), CL_conjugate( y[24] ) ) );
    6369       20580 :     move64();
    6370             : 
    6371       20580 :     x[0] = CL_add( t[0], t[2] );
    6372       20580 :     move64();
    6373       20580 :     x[8] = CL_sub( t[1], t[3] );
    6374       20580 :     move64();
    6375       20580 :     x[16] = CL_sub( t[0], t[2] );
    6376       20580 :     move64();
    6377       20580 :     x[24] = CL_add( t[1], t[3] );
    6378       20580 :     move64();
    6379             : 
    6380       20580 :     t[0] = CL_add( y[1], y[17] );
    6381       20580 :     move64();
    6382       20580 :     t[1] = CL_sub( y[1], y[17] );
    6383       20580 :     move64();
    6384       20580 :     t[2] = CL_add( y[9], y[25] );
    6385       20580 :     move64();
    6386       20580 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[9] ), CL_conjugate( y[25] ) ) );
    6387       20580 :     move64();
    6388             : 
    6389       20580 :     x[1] = CL_add( t[0], t[2] );
    6390       20580 :     move64();
    6391       20580 :     x[9] = CL_sub( t[1], t[3] );
    6392       20580 :     move64();
    6393       20580 :     x[17] = CL_sub( t[0], t[2] );
    6394       20580 :     move64();
    6395       20580 :     x[25] = CL_add( t[1], t[3] );
    6396       20580 :     move64();
    6397             : 
    6398       20580 :     t[0] = CL_add( y[2], y[18] );
    6399       20580 :     move64();
    6400       20580 :     t[1] = CL_sub( y[2], y[18] );
    6401       20580 :     move64();
    6402       20580 :     t[2] = CL_add( y[10], y[26] );
    6403       20580 :     move64();
    6404       20580 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[10] ), CL_conjugate( y[26] ) ) );
    6405       20580 :     move64();
    6406             : 
    6407       20580 :     x[2] = CL_add( t[0], t[2] );
    6408       20580 :     move64();
    6409       20580 :     x[10] = CL_sub( t[1], t[3] );
    6410       20580 :     move64();
    6411       20580 :     x[18] = CL_sub( t[0], t[2] );
    6412       20580 :     move64();
    6413       20580 :     x[26] = CL_add( t[1], t[3] );
    6414       20580 :     move64();
    6415             : 
    6416       20580 :     t[0] = CL_add( y[3], y[19] );
    6417       20580 :     move64();
    6418       20580 :     t[1] = CL_sub( y[3], y[19] );
    6419       20580 :     move64();
    6420       20580 :     t[2] = CL_add( y[11], y[27] );
    6421       20580 :     move64();
    6422       20580 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[11] ), CL_conjugate( y[27] ) ) );
    6423       20580 :     move64();
    6424             : 
    6425       20580 :     x[3] = CL_add( t[0], t[2] );
    6426       20580 :     move64();
    6427       20580 :     x[11] = CL_sub( t[1], t[3] );
    6428       20580 :     move64();
    6429       20580 :     x[19] = CL_sub( t[0], t[2] );
    6430       20580 :     move64();
    6431       20580 :     x[27] = CL_add( t[1], t[3] );
    6432       20580 :     move64();
    6433             : 
    6434       20580 :     t[0] = CL_msu_j( y[4], y[20] );
    6435       20580 :     move64();
    6436       20580 :     t[1] = CL_mac_j( y[4], y[20] );
    6437       20580 :     move64();
    6438       20580 :     t[2] = CL_add( y[12], y[28] );
    6439       20580 :     move64();
    6440       20580 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[12] ), CL_conjugate( y[28] ) ) );
    6441       20580 :     move64();
    6442             : 
    6443       20580 :     x[4] = CL_add( t[0], t[2] );
    6444       20580 :     move64();
    6445       20580 :     x[12] = CL_sub( t[1], t[3] );
    6446       20580 :     move64();
    6447       20580 :     x[20] = CL_sub( t[0], t[2] );
    6448       20580 :     move64();
    6449       20580 :     x[28] = CL_add( t[1], t[3] );
    6450       20580 :     move64();
    6451             : 
    6452       20580 :     t[0] = CL_add( y[5], y[21] );
    6453       20580 :     move64();
    6454       20580 :     t[1] = CL_sub( y[5], y[21] );
    6455       20580 :     move64();
    6456       20580 :     t[2] = CL_add( y[13], y[29] );
    6457       20580 :     move64();
    6458       20580 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[13] ), CL_conjugate( y[29] ) ) );
    6459       20580 :     move64();
    6460             : 
    6461       20580 :     x[5] = CL_add( t[0], t[2] );
    6462       20580 :     move64();
    6463       20580 :     x[13] = CL_sub( t[1], t[3] );
    6464       20580 :     move64();
    6465       20580 :     x[21] = CL_sub( t[0], t[2] );
    6466       20580 :     move64();
    6467       20580 :     x[29] = CL_add( t[1], t[3] );
    6468       20580 :     move64();
    6469             : 
    6470       20580 :     t[0] = CL_add( y[6], y[22] );
    6471       20580 :     move64();
    6472       20580 :     t[1] = CL_sub( y[6], y[22] );
    6473       20580 :     move64();
    6474       20580 :     t[2] = CL_add( y[14], y[30] );
    6475       20580 :     move64();
    6476       20580 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[14] ), CL_conjugate( y[30] ) ) );
    6477       20580 :     move64();
    6478             : 
    6479       20580 :     x[6] = CL_add( t[0], t[2] );
    6480       20580 :     move64();
    6481       20580 :     x[14] = CL_sub( t[1], t[3] );
    6482       20580 :     move64();
    6483       20580 :     x[22] = CL_sub( t[0], t[2] );
    6484       20580 :     move64();
    6485       20580 :     x[30] = CL_add( t[1], t[3] );
    6486       20580 :     move64();
    6487             : 
    6488       20580 :     t[0] = CL_add( y[7], y[23] );
    6489       20580 :     move64();
    6490       20580 :     t[1] = CL_sub( y[7], y[23] );
    6491       20580 :     move64();
    6492       20580 :     t[2] = CL_add( y[15], y[31] );
    6493       20580 :     move64();
    6494       20580 :     t[3] = CL_swap_real_imag( CL_sub( CL_conjugate( y[15] ), CL_conjugate( y[31] ) ) );
    6495       20580 :     move64();
    6496             : 
    6497       20580 :     x[7] = CL_add( t[0], t[2] );
    6498       20580 :     move64();
    6499       20580 :     x[15] = CL_sub( t[1], t[3] );
    6500       20580 :     move64();
    6501       20580 :     x[23] = CL_sub( t[0], t[2] );
    6502       20580 :     move64();
    6503       20580 :     x[31] = CL_add( t[1], t[3] );
    6504       20580 :     move64();
    6505             : 
    6506       20580 :     return;
    6507             : }
    6508             : 
    6509     7324048 : 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    67537808 :     FOR( i = 0; i < dim2; i++ )
    6522             :     {
    6523  1813089024 :         FOR( j = 0; j < dim1; j++ )
    6524             :         {
    6525  1752875264 :             xx[( ( i * dim1 ) + j )].re = x[( i + ( j * dim2 ) )].re; // Qx
    6526  1752875264 :             move64();
    6527  1752875264 :             xx[( ( i * dim1 ) + j )].im = x[( i + ( j * dim2 ) )].im; // Qx
    6528  1752875264 :             move64();
    6529             :         }
    6530             :     }
    6531             : 
    6532     7324048 :     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       84260 :         case 10:
    6549      758340 :             FOR( i = 0; i < dim2; i++ )
    6550             :             {
    6551      674080 :                 fft_len10( &xx[( i * dim1 )] );
    6552             :             }
    6553       84260 :             BREAK;
    6554             : 
    6555           0 :         case 15:
    6556           0 :             FOR( i = 0; i < dim2; i++ )
    6557             :             {
    6558           0 :                 fft_len15( &xx[( i * dim1 )] );
    6559             :             }
    6560           0 :             BREAK;
    6561             : 
    6562       68348 :         case 16:
    6563      615132 :             FOR( i = 0; i < dim2; i++ )
    6564             :             {
    6565      546784 :                 fft_len16( &xx[( i * dim1 )] );
    6566             :             }
    6567       68348 :             BREAK;
    6568             : 
    6569      297183 :         case 20:
    6570     3537287 :             FOR( i = 0; i < dim2; i++ )
    6571             :             {
    6572     3240104 :                 fft_len20_fx( &xx[( i * dim1 )] );
    6573             :             }
    6574      297183 :             BREAK;
    6575             : 
    6576     6874252 :         case 30:
    6577    62627004 :             FOR( i = 0; i < dim2; i++ )
    6578             :             {
    6579    55752752 :                 fft_len30( &xx[( i * dim1 )] );
    6580             :             }
    6581     6874252 :             BREAK;
    6582             : 
    6583           5 :         case 32:
    6584          45 :             FOR( i = 0; i < dim2; i++ )
    6585             :             {
    6586          40 :                 fft_len32( &xx[( i * dim1 )] );
    6587             :             }
    6588           5 :             BREAK;
    6589             :     }
    6590             : 
    6591     7324048 :     SWITCH( dim2 )
    6592             :     {
    6593             : 
    6594     7123324 :         case 8:
    6595             :         {
    6596             :             cmplx t[8];
    6597             :             cmplx s[8];
    6598             :             cmplx y[8];
    6599             : 
    6600             : #ifdef OPT_STEREO_32KBPS_V1
    6601     7123324 :             y[1] = xx[1 * dim1];
    6602     7123324 :             move64();
    6603     7123324 :             y[2] = xx[2 * dim1];
    6604     7123324 :             move64();
    6605     7123324 :             y[3] = xx[3 * dim1];
    6606     7123324 :             move64();
    6607     7123324 :             y[4] = xx[4 * dim1];
    6608     7123324 :             move64();
    6609     7123324 :             y[5] = xx[5 * dim1];
    6610     7123324 :             move64();
    6611     7123324 :             y[6] = xx[6 * dim1];
    6612     7123324 :             move64();
    6613     7123324 :             y[7] = xx[7 * dim1];
    6614     7123324 :             move64();
    6615             : 
    6616     7123324 :             test();
    6617     7123324 :             test();
    6618     7123324 :             IF( EQ_16( dim1, 8 ) || EQ_16( dim1, 16 ) || EQ_16( dim1, 32 ) )
    6619             :             {
    6620     1162081 :                 FOR( i = 0; i < dim1; i++ )
    6621             :                 {
    6622             :                     {
    6623     1093728 :                         y[0] = xx[i];
    6624     1093728 :                         move64();
    6625             :                     };
    6626     1093728 :                     IF( i > 0 )
    6627             :                     {
    6628             :                         {
    6629     1025375 :                             y[1] = CL_mac_j( CL_scale( xx[( i + ( 1 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 1 ) * dim1 ) ) - Woff )] ),
    6630     1025375 :                                              CL_scale( xx[( i + ( 1 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 1 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
    6631     1025375 :                             move64();
    6632             :                         };
    6633             :                         {
    6634     1025375 :                             y[2] = CL_mac_j( CL_scale( xx[( i + ( 2 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 2 ) * dim1 ) ) - Woff )] ),
    6635     1025375 :                                              CL_scale( xx[( i + ( 2 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 2 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
    6636     1025375 :                             move64();
    6637             :                         };
    6638             :                         {
    6639     1025375 :                             y[3] = CL_mac_j( CL_scale( xx[( i + ( 3 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 3 ) * dim1 ) ) - Woff )] ),
    6640     1025375 :                                              CL_scale( xx[( i + ( 3 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 3 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
    6641     1025375 :                             move64();
    6642             :                         };
    6643             :                         {
    6644     1025375 :                             y[4] = CL_mac_j( CL_scale( xx[( i + ( 4 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 4 ) * dim1 ) ) - Woff )] ),
    6645     1025375 :                                              CL_scale( xx[( i + ( 4 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 4 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
    6646     1025375 :                             move64();
    6647             :                         };
    6648             :                         {
    6649     1025375 :                             y[5] = CL_mac_j( CL_scale( xx[( i + ( 5 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 5 ) * dim1 ) ) - Woff )] ),
    6650     1025375 :                                              CL_scale( xx[( i + ( 5 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 5 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
    6651     1025375 :                             move64();
    6652             :                         };
    6653             :                         {
    6654     1025375 :                             y[6] = CL_mac_j( CL_scale( xx[( i + ( 6 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 6 ) * dim1 ) ) - Woff )] ),
    6655     1025375 :                                              CL_scale( xx[( i + ( 6 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 6 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
    6656     1025375 :                             move64();
    6657             :                         };
    6658             :                         {
    6659     1025375 :                             y[7] = CL_mac_j( CL_scale( xx[( i + ( 7 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 7 ) * dim1 ) ) - Woff )] ),
    6660     1025375 :                                              CL_scale( xx[( i + ( 7 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 7 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
    6661     1025375 :                             move64();
    6662             :                         };
    6663             :                     }
    6664             : 
    6665     1093728 :                     t[0] = CL_add( y[0], y[4] );
    6666     1093728 :                     move64();
    6667     1093728 :                     t[1] = CL_sub( y[0], y[4] );
    6668     1093728 :                     move64();
    6669     1093728 :                     t[2] = CL_add( y[1], y[5] );
    6670     1093728 :                     move64();
    6671     1093728 :                     t[3] = CL_sub( y[1], y[5] );
    6672     1093728 :                     move64();
    6673     1093728 :                     t[4] = CL_add( y[2], y[6] );
    6674     1093728 :                     move64();
    6675     1093728 :                     t[5] = CL_sub( y[2], y[6] );
    6676     1093728 :                     move64();
    6677     1093728 :                     t[6] = CL_add( y[3], y[7] );
    6678     1093728 :                     move64();
    6679     1093728 :                     t[7] = CL_sub( y[3], y[7] );
    6680     1093728 :                     move64();
    6681             : 
    6682     1093728 :                     s[0] = CL_add( t[0], t[4] );
    6683     1093728 :                     move64();
    6684     1093728 :                     s[2] = CL_sub( t[0], t[4] );
    6685     1093728 :                     move64();
    6686     1093728 :                     s[4] = CL_mac_j( t[1], t[5] );
    6687     1093728 :                     move64();
    6688     1093728 :                     s[5] = CL_msu_j( t[1], t[5] );
    6689     1093728 :                     move64();
    6690     1093728 :                     s[1] = CL_add( t[2], t[6] );
    6691     1093728 :                     move64();
    6692     1093728 :                     s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
    6693     1093728 :                     move64();
    6694             : 
    6695     1093728 :                     t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
    6696     1093728 :                     move64();
    6697     1093728 :                     t[1] = CL_sub( t[3], t[7] );
    6698     1093728 :                     move64();
    6699             : 
    6700     1093728 :                     s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); // Qx
    6701     1093728 :                     move64();
    6702     1093728 :                     s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); // Qx
    6703     1093728 :                     move64();
    6704     1093728 :                     s[7] = CL_conjugate( s[7] );
    6705     1093728 :                     move64();
    6706             : 
    6707     1093728 :                     x[i] = CL_add( s[0], s[1] );
    6708     1093728 :                     move64();
    6709     1093728 :                     x[( i + ( 1 * dim1 ) )] = CL_add( s[5], s[6] );
    6710     1093728 :                     move64();
    6711     1093728 :                     x[( i + ( 2 * dim1 ) )] = CL_sub( s[2], s[3] );
    6712     1093728 :                     move64();
    6713     1093728 :                     x[( i + ( 3 * dim1 ) )] = CL_add( s[4], s[7] );
    6714     1093728 :                     move64();
    6715     1093728 :                     x[( i + ( 4 * dim1 ) )] = CL_sub( s[0], s[1] );
    6716     1093728 :                     move64();
    6717     1093728 :                     x[( i + ( 5 * dim1 ) )] = CL_sub( s[5], s[6] );
    6718     1093728 :                     move64();
    6719     1093728 :                     x[( i + ( 6 * dim1 ) )] = CL_add( s[2], s[3] );
    6720     1093728 :                     move64();
    6721     1093728 :                     x[( i + ( 7 * dim1 ) )] = CL_sub( s[4], s[7] );
    6722     1093728 :                     move64();
    6723             :                 }
    6724             :             }
    6725             :             ELSE
    6726             :             {
    6727   215108011 :                 FOR( i = 0; i < dim1; i++ )
    6728             :                 {
    6729             :                     {
    6730   208053040 :                         y[0] = xx[i];
    6731   208053040 :                         move64();
    6732             :                     };
    6733   208053040 :                     IF( i > 0 )
    6734             :                     {
    6735             :                         {
    6736   200998069 :                             y[1] = CL_mac_j( CL_scale( xx[( i + ( 1 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 1 ) * dim1 ) << 1 ) ) - Woff )] ),
    6737   200998069 :                                              CL_scale( xx[( i + ( 1 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 1 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
    6738   200998069 :                             move64();
    6739             :                         };
    6740             :                         {
    6741   200998069 :                             y[2] = CL_mac_j( CL_scale( xx[( i + ( 2 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 2 ) * dim1 ) << 1 ) ) - Woff )] ),
    6742   200998069 :                                              CL_scale( xx[( i + ( 2 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 2 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
    6743   200998069 :                             move64();
    6744             :                         };
    6745             :                         {
    6746   200998069 :                             y[3] = CL_mac_j( CL_scale( xx[( i + ( 3 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 3 ) * dim1 ) << 1 ) ) - Woff )] ),
    6747   200998069 :                                              CL_scale( xx[( i + ( 3 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 3 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
    6748   200998069 :                             move64();
    6749             :                         };
    6750             :                         {
    6751   200998069 :                             y[4] = CL_mac_j( CL_scale( xx[( i + ( 4 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 4 ) * dim1 ) << 1 ) ) - Woff )] ),
    6752   200998069 :                                              CL_scale( xx[( i + ( 4 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 4 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
    6753   200998069 :                             move64();
    6754             :                         };
    6755             :                         {
    6756   200998069 :                             y[5] = CL_mac_j( CL_scale( xx[( i + ( 5 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 5 ) * dim1 ) << 1 ) ) - Woff )] ),
    6757   200998069 :                                              CL_scale( xx[( i + ( 5 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 5 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
    6758   200998069 :                             move64();
    6759             :                         };
    6760             :                         {
    6761   200998069 :                             y[6] = CL_mac_j( CL_scale( xx[( i + ( 6 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 6 ) * dim1 ) << 1 ) ) - Woff )] ),
    6762   200998069 :                                              CL_scale( xx[( i + ( 6 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 6 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
    6763   200998069 :                             move64();
    6764             :                         };
    6765             :                         {
    6766   200998069 :                             y[7] = CL_mac_j( CL_scale( xx[( i + ( 7 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 7 ) * dim1 ) << 1 ) ) - Woff )] ),
    6767   200998069 :                                              CL_scale( xx[( i + ( 7 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 7 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx
    6768   200998069 :                             move64();
    6769             :                         };
    6770             :                     }
    6771             : 
    6772   208053040 :                     t[0] = CL_add( y[0], y[4] );
    6773   208053040 :                     move64();
    6774   208053040 :                     t[1] = CL_sub( y[0], y[4] );
    6775   208053040 :                     move64();
    6776   208053040 :                     t[2] = CL_add( y[1], y[5] );
    6777   208053040 :                     move64();
    6778   208053040 :                     t[3] = CL_sub( y[1], y[5] );
    6779   208053040 :                     move64();
    6780   208053040 :                     t[4] = CL_add( y[2], y[6] );
    6781   208053040 :                     move64();
    6782   208053040 :                     t[5] = CL_sub( y[2], y[6] );
    6783   208053040 :                     move64();
    6784   208053040 :                     t[6] = CL_add( y[3], y[7] );
    6785   208053040 :                     move64();
    6786   208053040 :                     t[7] = CL_sub( y[3], y[7] );
    6787   208053040 :                     move64();
    6788             : 
    6789   208053040 :                     s[0] = CL_add( t[0], t[4] );
    6790   208053040 :                     move64();
    6791   208053040 :                     s[2] = CL_sub( t[0], t[4] );
    6792   208053040 :                     move64();
    6793   208053040 :                     s[4] = CL_mac_j( t[1], t[5] );
    6794   208053040 :                     move64();
    6795   208053040 :                     s[5] = CL_msu_j( t[1], t[5] );
    6796   208053040 :                     move64();
    6797   208053040 :                     s[1] = CL_add( t[2], t[6] );
    6798   208053040 :                     move64();
    6799   208053040 :                     s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) );
    6800   208053040 :                     move64();
    6801             : 
    6802   208053040 :                     t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) );
    6803   208053040 :                     move64();
    6804   208053040 :                     t[1] = CL_sub( t[3], t[7] );
    6805   208053040 :                     move64();
    6806             : 
    6807   208053040 :                     s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); // Qx
    6808   208053040 :                     move64();
    6809   208053040 :                     s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); // Qx
    6810   208053040 :                     move64();
    6811   208053040 :                     s[7] = CL_conjugate( s[7] );
    6812   208053040 :                     move64();
    6813             : 
    6814   208053040 :                     x[i] = CL_add( s[0], s[1] );
    6815   208053040 :                     move64();
    6816   208053040 :                     x[( i + ( 1 * dim1 ) )] = CL_add( s[5], s[6] );
    6817   208053040 :                     move64();
    6818   208053040 :                     x[( i + ( 2 * dim1 ) )] = CL_sub( s[2], s[3] );
    6819   208053040 :                     move64();
    6820   208053040 :                     x[( i + ( 3 * dim1 ) )] = CL_add( s[4], s[7] );
    6821   208053040 :                     move64();
    6822   208053040 :                     x[( i + ( 4 * dim1 ) )] = CL_sub( s[0], s[1] );
    6823   208053040 :                     move64();
    6824   208053040 :                     x[( i + ( 5 * dim1 ) )] = CL_sub( s[5], s[6] );
    6825   208053040 :                     move64();
    6826   208053040 :                     x[( i + ( 6 * dim1 ) )] = CL_add( s[2], s[3] );
    6827   208053040 :                     move64();
    6828   208053040 :                     x[( i + ( 7 * dim1 ) )] = CL_sub( s[4], s[7] );
    6829   208053040 :                     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     7123324 :             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      199750 :         case 16:
    7160             :         {
    7161             :             cmplx y[16];
    7162     3395750 :             FOR( j = 0; j < dim2; j++ )
    7163             :             {
    7164             :                 {
    7165     3196000 :                     y[j] = xx[0 + ( j * dim1 )];
    7166     3196000 :                     move64();
    7167             :                 };
    7168             :             }
    7169             : 
    7170      199750 :             fft_len16( &y[0] );
    7171     3395750 :             FOR( j = 0; j < dim2; j++ )
    7172             :             {
    7173     3196000 :                 x[0 + ( j * dim1 )] = y[j];
    7174     3196000 :                 move64();
    7175             :             }
    7176             : 
    7177     4940240 :             FOR( i = 1; i < dim1; i++ )
    7178             :             {
    7179             :                 {
    7180     4740490 :                     y[( 0 + 0 )] = xx[i + ( 0 + 0 ) * dim1];
    7181     4740490 :                     move64();
    7182             :                 }
    7183             : 
    7184    75847840 :                 FOR( j = 1; j < dim2; j++ )
    7185             :                 {
    7186             :                     {
    7187    71107350 :                         y[( j + 0 )] = CL_mac_j( CL_scale( xx[( i + ( ( j + 0 ) * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * j ) * dim1 ) ) - Woff )] ),
    7188    71107350 :                                                  CL_scale( xx[( i + ( ( j + 0 ) * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * j ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
    7189    71107350 :                         move64();
    7190             :                     }
    7191             :                 }
    7192     4740490 :                 fft_len16( &y[0] );
    7193    80588330 :                 FOR( j = 0; j < dim2; j++ )
    7194             :                 {
    7195    75847840 :                     x[( i + ( j * dim1 ) )] = y[j];
    7196    75847840 :                     move64();
    7197             :                 }
    7198             :             }
    7199      199750 :             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         974 :         case 32:
    7255             :         {
    7256             :             cmplx y[32];
    7257       32142 :             FOR( j = 0; j < dim2; j++ )
    7258             :             {
    7259             :                 {
    7260       31168 :                     y[j] = xx[0 + j * dim1];
    7261       31168 :                     move64();
    7262             :                 };
    7263             :             }
    7264         974 :             fft_len32( &y[0] );
    7265       32142 :             FOR( j = 0; j < dim2; j++ )
    7266             :             {
    7267       31168 :                 x[0 + j * dim1] = y[j];
    7268       31168 :                 move64();
    7269             :             }
    7270             : 
    7271       20540 :             FOR( i = 1; i < dim1; i++ )
    7272             :             {
    7273             :                 {
    7274       19566 :                     y[( 0 + 0 )] = xx[i + ( 0 + 0 ) * dim1];
    7275       19566 :                     move64();
    7276             :                 }
    7277             :                 {
    7278       19566 :                     y[( 0 + 1 )] = CL_mac_j( CL_scale( xx[( i + ( ( 0 + 1 ) * dim1 ) )], W[( ( len + ( sc * i ) ) + 0 * dim1 - Woff )] ),
    7279       19566 :                                              CL_scale( xx[( i + ( ( 0 + 1 ) * dim1 ) )], W[( ( ( len + ( sc * i ) ) + 0 * dim1 + 1 ) - Woff )] ) ); // Qx
    7280       19566 :                     move64();
    7281             :                 }
    7282             : 
    7283      313056 :                 FOR( j = 2; j < dim2; j = j + 2 )
    7284             :                 {
    7285             :                     {
    7286      293490 :                         y[( j + 0 )] = CL_mac_j( CL_scale( xx[( i + ( ( j + 0 ) * dim1 ) )], W[( ( ( sc * i ) + ( j * dim1 ) ) - Woff )] ),
    7287      293490 :                                                  CL_scale( xx[( i + ( ( j + 0 ) * dim1 ) )], W[( ( ( ( sc * i ) + ( j * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
    7288      293490 :                         move64();
    7289             :                     }
    7290             :                     {
    7291      293490 :                         y[( j + 1 )] = CL_mac_j( CL_scale( xx[( i + ( ( j + 1 ) * dim1 ) )], W[( ( ( len + ( sc * i ) ) + ( j * dim1 ) ) - Woff )] ),
    7292      293490 :                                                  CL_scale( xx[( i + ( ( j + 1 ) * dim1 ) )], W[( ( ( ( len + ( sc * i ) ) + ( j * dim1 ) ) + 1 ) - Woff )] ) ); // Qx
    7293      293490 :                         move64();
    7294             :                     }
    7295             :                 }
    7296       19566 :                 fft_len32( &y[0] );
    7297      645678 :                 FOR( j = 0; j < dim2; j++ )
    7298             :                 {
    7299      626112 :                     x[( i + ( j * dim1 ) )] = y[j];
    7300      626112 :                     move64();
    7301             :                 }
    7302             :             }
    7303         974 :             BREAK;
    7304             :         }
    7305             :     }
    7306     7324048 :     return;
    7307             : }
    7308             : 
    7309             : /*-----------------------------------------------------------------*
    7310             :  * fft_fx()
    7311             :  *
    7312             :  * Complex-value FFT
    7313             :  *-----------------------------------------------------------------*/
    7314             : 
    7315     7324048 : 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  1760199312 :     FOR( Word16 j = 0; j < length; j++ )
    7325             :     {
    7326  1752875264 :         x[j].re = re[( s * j )];
    7327  1752875264 :         move32();
    7328  1752875264 :         x[j].im = im[( s * j )];
    7329  1752875264 :         move32();
    7330             :     }
    7331             : 
    7332     7324048 :     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       84260 :         case 80:
    7344       84260 :             fft_lenN( x, FFT_RotVector_640_fx, 640, 10, 8, 4, 40 );
    7345       84260 :             BREAK;
    7346           0 :         case 100:
    7347           0 :             fft_lenN( x, FFT_RotVector_400_fx, 400, 10, 10, 4, 40 );
    7348           0 :             BREAK;
    7349           0 :         case 120:
    7350           0 :             fft_lenN( x, FFT_RotVector_960_fx, 960, 15, 8, 4, 60 );
    7351           0 :             BREAK;
    7352       68348 :         case 128:
    7353       68348 :             fft_lenN( x, FFT_RotVector_256_fx, 256, 16, 8, 4, 64 );
    7354       68348 :             BREAK;
    7355      191089 :         case 160:
    7356      191089 :             fft_lenN( x, FFT_RotVector_640_fx, 640, 20, 8, 2, 40 );
    7357      191089 :             BREAK;
    7358           0 :         case 200:
    7359           0 :             fft_lenN( x, FFT_RotVector_400_fx, 400, 20, 10, 2, 40 );
    7360           0 :             BREAK;
    7361     6779622 :         case 240:
    7362     6779622 :             fft_lenN( x, FFT_RotVector_960_fx, 960, 30, 8, 2, 60 );
    7363     6779622 :             BREAK;
    7364           5 :         case 256:
    7365           5 :             fft_lenN( x, FFT_RotVector_256_fx, 256, 32, 8, 2, 64 );
    7366           5 :             BREAK;
    7367      105226 :         case 320:
    7368      105226 :             fft_lenN( x, FFT_RotVector_640_fx, 640, 20, 16, 2, 40 );
    7369      105226 :             BREAK;
    7370           0 :         case 400:
    7371           0 :             fft_lenN( x, FFT_RotVector_400_fx, 400, 20, 20, 2, 40 );
    7372           0 :             BREAK;
    7373       94524 :         case 480:
    7374       94524 :             fft_lenN( x, FFT_RotVector_960_fx, 960, 30, 16, 2, 60 );
    7375       94524 :             BREAK;
    7376           0 :         case 600:
    7377           0 :             fft_lenN( x, FFT_RotVector_600_fx, 600, 30, 20, 2, 60 );
    7378           0 :             BREAK;
    7379         868 :         case 640:
    7380         868 :             fft_lenN( x, FFT_RotVector_640_fx, 640, 20, 32, 2, 40 );
    7381         868 :             BREAK;
    7382         106 :         case 960:
    7383         106 :             fft_lenN( x, FFT_RotVector_960_fx, 960, 30, 32, 2, 60 );
    7384         106 :             BREAK;
    7385           0 :         default:
    7386           0 :             assert( !"fft length is not supported!" );
    7387             :     }
    7388             : 
    7389  1760199312 :     FOR( Word16 j = 0; j < length; j++ )
    7390             :     {
    7391  1752875264 :         re[( s * j )] = x[j].re;
    7392  1752875264 :         move32();
    7393  1752875264 :         im[( s * j )] = x[j].im;
    7394  1752875264 :         move32();
    7395             :     }
    7396             : 
    7397     7324048 :     return;
    7398             : }
    7399             : 
    7400      445959 : 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      445959 :     sizeOfFft2 = shr( length, 1 );
    7412      445959 :     sizeOfFft4 = shr( length, 2 );
    7413      445959 :     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      143942 :         case 160:
    7428      143942 :             s1 = 204; //(1/sizeOfFft2).Q15
    7429      143942 :             move16();
    7430      143942 :             s2 = -204;
    7431      143942 :             move16();
    7432      143942 :             BREAK;
    7433           0 :         case 240:
    7434           0 :             s1 = 136; //(1/sizeOfFft2).Q15
    7435           0 :             move16();
    7436           0 :             s2 = -136;
    7437           0 :             move16();
    7438           0 :             BREAK;
    7439           0 :         case 256:
    7440           0 :             s1 = 128; //(1/sizeOfFft2).Q15
    7441           0 :             move16();
    7442           0 :             s2 = -128;
    7443           0 :             move16();
    7444           0 :             BREAK;
    7445      104554 :         case 320:
    7446      104554 :             s1 = 102; //(1/sizeOfFft2).Q15
    7447      104554 :             move16();
    7448      104554 :             s2 = -102;
    7449      104554 :             move16();
    7450      104554 :             BREAK;
    7451       94524 :         case 480:
    7452       94524 :             s1 = 68; //(1/sizeOfFft2).Q15
    7453       94524 :             move16();
    7454       94524 :             s2 = -68;
    7455       94524 :             move16();
    7456       94524 :             BREAK;
    7457           0 :         case 640:
    7458           0 :             s1 = 51; //(1/sizeOfFft2).Q15
    7459           0 :             move16();
    7460           0 :             s2 = -51;
    7461           0 :             move16();
    7462           0 :             BREAK;
    7463           0 :         case 960:
    7464           0 :             s1 = 34; //(1/sizeOfFft2).Q15
    7465           0 :             move16();
    7466           0 :             s2 = -34;
    7467           0 :             move16();
    7468           0 :             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      445959 :     SWITCH( isign )
    7479             :     {
    7480             : 
    7481      245587 :         case -1:
    7482             : 
    7483      245587 :             fft_fx( x, x + 1, sizeOfFft2, 2 );
    7484             :             // Qx
    7485      245587 :             tmp = L_add( x[0], x[1] );
    7486      245587 :             x[1] = L_sub( x[0], x[1] ); // Qx
    7487      245587 :             move32();
    7488      245587 :             x[0] = tmp;
    7489      245587 :             move32();
    7490             : 
    7491    23271411 :             FOR( i = 1; i <= sizeOfFft4; i++ )
    7492             :             {
    7493    23025824 :                 t1 = L_sub( x[2 * i], x[( length - ( i << 1 ) )] );                          // Qx
    7494    23025824 :                 t2 = L_add( x[( ( i << 1 ) + 1 )], x[( ( length - ( i << 1 ) ) + 1 )] );     // Qx
    7495    23025824 :                 t3 = L_sub( Mpy_32_16_1( t1, w[i] ), Mpy_32_16_1( t2, w[i + sizeOfFft4] ) ); // Qx
    7496    23025824 :                 t4 = L_add( Mpy_32_16_1( t1, w[i + sizeOfFft4] ), Mpy_32_16_1( t2, w[i] ) ); // Qx
    7497    23025824 :                 t1 = L_add( x[2 * i], x[( length - ( i << 1 ) )] );
    7498    23025824 :                 t2 = L_sub( x[( ( i << 1 ) + 1 )], x[( ( length - ( i << 1 ) ) + 1 )] );
    7499             : 
    7500    23025824 :                 x[2 * i] = Mpy_32_16_1( L_sub( t1, t3 ), 16384 /*0.5.Q15*/ );
    7501    23025824 :                 move32();
    7502    23025824 :                 x[( ( i << 1 ) + 1 )] = Mpy_32_16_1( L_sub( t2, t4 ), 16384 /*0.5.Q15*/ );
    7503    23025824 :                 move32();
    7504    23025824 :                 x[( length - ( i << 1 ) )] = Mpy_32_16_1( L_add( t1, t3 ), 16384 /*0.5.Q15*/ );
    7505    23025824 :                 move32();
    7506             : #ifdef OPT_STEREO_32KBPS_V1
    7507    23025824 :                 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    23025824 :                 move32();
    7512             :             }
    7513             : 
    7514      245587 :             BREAK;
    7515             : 
    7516      200372 :         case +1:
    7517             : 
    7518      200372 :             tmp = Mpy_32_16_1( L_add( x[0], x[1] ), 16384 /*0.5.Q15*/ );
    7519      200372 :             x[1] = Mpy_32_16_1( L_sub( x[1], x[0] ), 16384 /*0.5.Q15*/ );
    7520      200372 :             move32();
    7521      200372 :             x[0] = tmp;
    7522      200372 :             move32();
    7523             : 
    7524    33862052 :             FOR( i = 1; i <= sizeOfFft4; i++ )
    7525             :             {
    7526    33661680 :                 t1 = L_sub( x[2 * i], x[( length - ( i << 1 ) )] );
    7527    33661680 :                 t2 = L_add( x[( ( i << 1 ) + 1 )], x[( ( length - ( i << 1 ) ) + 1 )] );
    7528    33661680 :                 t3 = L_add( Mpy_32_16_1( t1, w[i] ), Mpy_32_16_1( t2, w[( i + sizeOfFft4 )] ) );
    7529    33661680 :                 t4 = L_sub( Mpy_32_16_1( t2, w[i] ), Mpy_32_16_1( t1, w[( i + sizeOfFft4 )] ) );
    7530    33661680 :                 t1 = L_add( x[2 * i], x[( length - ( i << 1 ) )] );
    7531    33661680 :                 t2 = L_sub( x[( ( i << 1 ) + 1 )], x[( ( length - ( i << 1 ) ) + 1 )] );
    7532             : 
    7533    33661680 :                 x[2 * i] = Mpy_32_16_1( L_sub( t1, t3 ), 16384 /*0.5.Q15*/ ); // Qx
    7534    33661680 :                 move32();
    7535    33661680 :                 x[( ( i << 1 ) + 1 )] = Mpy_32_16_1( L_sub( t4, t2 ), 16384 /*0.5.Q15*/ ); // Qx
    7536    33661680 :                 move32();
    7537    33661680 :                 x[( length - ( i << 1 ) )] = Mpy_32_16_1( L_add( t1, t3 ), 16384 /*0.5.Q15*/ ); // Qx
    7538    33661680 :                 move32();
    7539    33661680 :                 x[( ( length - ( i << 1 ) ) + 1 )] = Mpy_32_16_1( L_add( t2, t4 ), 16384 /*0.5.Q15*/ ); // Qx
    7540    33661680 :                 move32();
    7541             :             }
    7542             : 
    7543      200372 :             fft_fx( x, x + 1, sizeOfFft2, 2 );
    7544             : 
    7545    67523732 :             FOR( i = 0; i < length; i += 2 )
    7546             :             {
    7547    67323360 :                 x[i] = Mpy_32_16_1( x[i], s1 ); // Qx
    7548    67323360 :                 move32();
    7549    67323360 :                 x[i + 1] = Mpy_32_16_1( x[i + 1], s2 ); // Qx
    7550    67323360 :                 move32();
    7551             :             }
    7552             : 
    7553      200372 :             BREAK;
    7554             :     }
    7555             : 
    7556      445959 :     return;
    7557             : }

Generated by: LCOV version 1.14