LCOV - code coverage report
Current view: top level - lib_com - fft_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main @ da9cc8ead0679b4682d329fdff98cf1616159273 Lines: 3583 5271 68.0 %
Date: 2025-10-13 22:24:20 Functions: 44 71 62.0 %

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

Generated by: LCOV version 1.14