LCOV - code coverage report
Current view: top level - lib_com - fft_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main -- dec/rend @ 6c320724ac154bae0b720af82641e0df71ffdfc7 Lines: 3394 5271 64.4 %
Date: 2025-07-01 04:22:09 Functions: 43 71 60.6 %

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

Generated by: LCOV version 1.14