LCOV - code coverage report
Current view: top level - lib_com - fft_evs.c (source / functions) Hit Total Coverage
Test: Coverage on main @ da9cc8ead0679b4682d329fdff98cf1616159273 Lines: 1384 1422 97.3 %
Date: 2025-10-13 22:24:20 Functions: 11 12 91.7 %

          Line data    Source code
       1             : /*====================================================================================
       2             :     EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
       3             :   ====================================================================================*/
       4             : 
       5             : #include <assert.h>
       6             : #include "prot_fx.h"
       7             : #include "basop_util.h"
       8             : #include "rom_basop_util.h"
       9             : #include "rom_com.h"
      10             : #include "options.h"
      11             : #include "stl.h"
      12             : /************************************************************************/
      13             : /* FFT                                                                  */
      14             : /************************************************************************/
      15             : #define SCALEFACTOR16 ( 5 )
      16             : #define SCALEFACTOR20 ( 5 )
      17             : 
      18             : 
      19             : void fft16_with_cmplx_data( cmplx *pInp, Word16 bsacle );
      20             : 
      21             : /**
      22             :  * \brief Profiling / Precision results
      23             :  *
      24             :  *        Profiling / Precision of complex valued FFTs: BASOP_cfft()
      25             :  *
      26             :  *                       WOPS BASOP  Precision BASOP
      27             :  *        FFT5                   87     16.96
      28             :  *        FFT8                  108     17.04
      29             :  *        FFT10                 194     16.70
      30             :  *        FFT15                 354     16.97
      31             :  *        FFT16                 288     16.62
      32             :  *        FFT20                 368     16.06
      33             :  *        FFT30                 828     16.80
      34             :  *        FFT32                 752     15.45   (cplx mult mit 3 mult und 3 add)
      35             :  *        FFT32                 824     16.07   (cplx mult mit 4 mult und 2 add)
      36             :  *        FFT64  ( 8x 8)      3.129     15.16
      37             :  *        FFT80  (10x 8)      4.385     15.55
      38             :  *        FFT100 (20x 5)      6.518     15.65
      39             :  *        FFT120 (15x 8)      7.029     15.38
      40             :  *        FFT128 (16x 8)      6.777     15.28
      41             :  *        FFT160 (20x 8)      9.033     14.95
      42             :  *        FFT240 (30x 8)     14.961     15.49
      43             :  *        FFT256 (32x 8)     14.905     14.61   (cplx mult mit 3 mult und 3 add)
      44             :  *        FFT256 (32x 8)     15.265     15.04   (cplx mult mit 4 mult und 2 add)
      45             :  *        FFT320 (20x16)     21.517     15.21
      46             :  *
      47             :  *
      48             :  *        Profiling / Precision of real valued FFTs / iFFTs: BASOP_rfft()
      49             :  *
      50             :  *                       WOPS BASOP  Precision BASOP
      51             :  *        rFFT40                955     15.68
      52             :  *        rFFT64               1635     16.17
      53             :  *
      54             :  *        irFFT40              1116     15.36
      55             :  *        irFFT64              1759     15.18
      56             :  *
      57             :  */
      58             : 
      59             : 
      60             : #define Mpy_32_xx Mpy_32_16_1
      61             : 
      62             : #define FFTC( x ) WORD322WORD16( (Word32) x )
      63             : 
      64             : #define C31 ( FFTC( 0x91261468 ) ) /* FL2WORD32( -0.86602540) -sqrt(3)/2 */
      65             : 
      66             : #define C51 ( FFTC( 0x79bc3854 ) ) /* FL2WORD32( 0.95105652)   */
      67             : #define C52 ( FFTC( 0x9d839db0 ) ) /* FL2WORD32(-1.53884180/2) */
      68             : #define C53 ( FFTC( 0xd18053ce ) ) /* FL2WORD32(-0.36327126)   */
      69             : #define C54 ( FFTC( 0x478dde64 ) ) /* FL2WORD32( 0.55901699)   */
      70             : #define C55 ( FFTC( 0xb0000001 ) ) /* FL2WORD32(-1.25/2)       */
      71             : 
      72             : #define C81 ( FFTC( 0x5a82799a ) ) /* FL2WORD32( 7.071067811865475e-1) */
      73             : #define C82 ( FFTC( 0xa57d8666 ) ) /* FL2WORD32(-7.071067811865475e-1) */
      74             : 
      75             : #define C161 ( FFTC( 0x5a82799a ) ) /* FL2WORD32( 7.071067811865475e-1)  INV_SQRT2    */
      76             : #define C162 ( FFTC( 0xa57d8666 ) ) /* FL2WORD32(-7.071067811865475e-1) -INV_SQRT2    */
      77             : 
      78             : #define C163 ( FFTC( 0x7641af3d ) ) /* FL2WORD32( 9.238795325112867e-1)  COS_PI_DIV8  */
      79             : #define C164 ( FFTC( 0x89be50c3 ) ) /* FL2WORD32(-9.238795325112867e-1) -COS_PI_DIV8  */
      80             : 
      81             : #define C165 ( FFTC( 0x30fbc54d ) ) /* FL2WORD32( 3.826834323650898e-1)  COS_3PI_DIV8 */
      82             : #define C166 ( FFTC( 0xcf043ab3 ) ) /* FL2WORD32(-3.826834323650898e-1) -COS_3PI_DIV8 */
      83             : 
      84             : 
      85             : #define cplxMpy4_8_0( re, im, a, b, c, d )                          \
      86             :     re = L_shr( L_sub( Mpy_32_xx( a, c ), Mpy_32_xx( b, d ) ), 1 ); \
      87             :     im = L_shr( L_add( Mpy_32_xx( a, d ), Mpy_32_xx( b, c ) ), 1 );
      88             : 
      89             : #define cplxMpy4_8_1( re, im, a, b ) \
      90             :     re = L_shr( a, 1 );              \
      91             :     im = L_shr( b, 1 );
      92             : 
      93             : 
      94             : /**
      95             :  * \brief    Function performs a complex 5-point FFT
      96             :  *           The FFT is performed inplace. The result of the FFT
      97             :  *           is scaled by SCALEFACTOR5 bits.
      98             :  *
      99             :  *           WOPS with 32x16 bit multiplications:  88 cycles
     100             :  *
     101             :  * \param    [i/o] re    real input / output
     102             :  * \param    [i/o] im    imag input / output
     103             :  * \param    [i  ] s     stride real and imag input / output
     104             :  *
     105             :  * \return   void
     106             :  */
     107      105040 : static void fft5_with_cmplx_data( cmplx *inp /*Qx*/ )
     108             : {
     109             :     cmplx x0, x1, x2, x3, x4;
     110             :     cmplx y1, y2, y3, y4;
     111             :     cmplx t;
     112             : 
     113      105040 :     x0 = CL_shr( inp[0], SCALEFACTOR5 ); // Qx - 4
     114      105040 :     x1 = CL_shr( inp[1], SCALEFACTOR5 ); // Qx - 4
     115      105040 :     x2 = CL_shr( inp[2], SCALEFACTOR5 ); // Qx - 4
     116      105040 :     x3 = CL_shr( inp[3], SCALEFACTOR5 ); // Qx - 4
     117      105040 :     x4 = CL_shr( inp[4], SCALEFACTOR5 ); // Qx - 4
     118             : 
     119      105040 :     y1 = CL_add( x1, x4 );
     120      105040 :     y4 = CL_sub( x1, x4 );
     121      105040 :     y3 = CL_add( x2, x3 );
     122      105040 :     y2 = CL_sub( x2, x3 );
     123      105040 :     t = CL_scale_t( CL_sub( y1, y3 ), C54 );
     124      105040 :     y1 = CL_add( y1, y3 );
     125      105040 :     inp[0] = CL_add( x0, y1 );
     126             : 
     127             :     /* Bit shift left because of the constant C55 which was scaled with the factor 0.5 because of the representation of
     128             :     the values as fracts */
     129      105040 :     y1 = CL_add( inp[0], ( CL_shl( CL_scale_t( y1, C55 ), 1 ) ) );
     130      105040 :     y3 = CL_sub( y1, t );
     131      105040 :     y1 = CL_add( y1, t );
     132             : 
     133      105040 :     t = CL_scale_t( CL_add( y4, y2 ), C51 );
     134             :     /* Bit shift left because of the constant C55 which was scaled with the factor 0.5 because of the representation of
     135             :     the values as fracts */
     136      105040 :     y4 = CL_add( t, CL_shl( CL_scale_t( y4, C52 ), 1 ) );
     137      105040 :     y2 = CL_add( t, CL_scale_t( y2, C53 ) );
     138             : 
     139             : 
     140             :     /* combination */
     141      105040 :     inp[1] = CL_msu_j( y1, y2 );
     142      105040 :     inp[4] = CL_mac_j( y1, y2 );
     143             : 
     144      105040 :     inp[2] = CL_mac_j( y3, y4 );
     145      105040 :     inp[3] = CL_msu_j( y3, y4 );
     146             : 
     147             : #ifdef WMOPS
     148             :     multiCounter[currCounter].CL_move += 5;
     149             : #endif
     150      105040 : }
     151             : 
     152             : /**
     153             :  * \brief    Function performs a complex 8-point FFT
     154             :  *           The FFT is performed inplace. The result of the FFT
     155             :  *           is scaled by SCALEFACTOR8 bits.
     156             :  *
     157             :  *           WOPS with 32x16 bit multiplications: 108 cycles
     158             :  *
     159             :  * \param    [i/o] re    real input / output
     160             :  * \param    [i/o] im    imag input / output
     161             :  * \param    [i  ] s     stride real and imag input / output
     162             :  *
     163             :  * \return   void
     164             :  */
     165     2386128 : static void fft8_with_cmplx_data( cmplx *inp /*Qx*/ )
     166             : {
     167             :     cmplx x0, x1, x2, x3, x4, x5, x6, x7;
     168             :     cmplx s0, s1, s2, s3, s4, s5, s6, s7;
     169             :     cmplx t0, t1, t2, t3, t4, t5, t6, t7;
     170             : 
     171             :     /* Pre-additions */
     172     2386128 :     x0 = CL_shr( inp[0], SCALEFACTOR8 ); // Qx - 4
     173     2386128 :     x1 = CL_shr( inp[1], SCALEFACTOR8 );
     174     2386128 :     x2 = CL_shr( inp[2], SCALEFACTOR8 );
     175     2386128 :     x3 = CL_shr( inp[3], SCALEFACTOR8 );
     176     2386128 :     x4 = CL_shr( inp[4], SCALEFACTOR8 );
     177     2386128 :     x5 = CL_shr( inp[5], SCALEFACTOR8 );
     178     2386128 :     x6 = CL_shr( inp[6], SCALEFACTOR8 );
     179     2386128 :     x7 = CL_shr( inp[7], SCALEFACTOR8 );
     180             : 
     181             :     /* loops are unrolled */
     182             :     {
     183     2386128 :         t0 = CL_add( x0, x4 );
     184     2386128 :         t1 = CL_sub( x0, x4 );
     185             : 
     186     2386128 :         t2 = CL_add( x1, x5 );
     187     2386128 :         t3 = CL_sub( x1, x5 );
     188             : 
     189     2386128 :         t4 = CL_add( x2, x6 );
     190     2386128 :         t5 = CL_sub( x2, x6 );
     191             : 
     192     2386128 :         t6 = CL_add( x3, x7 );
     193     2386128 :         t7 = CL_sub( x3, x7 );
     194             :     }
     195             : 
     196             :     /* Pre-additions and core multiplications */
     197             : 
     198     2386128 :     s0 = CL_add( t0, t4 );
     199     2386128 :     s2 = CL_sub( t0, t4 );
     200             : 
     201     2386128 :     s4 = CL_mac_j( t1, t5 );
     202     2386128 :     s5 = CL_msu_j( t1, t5 );
     203             : 
     204     2386128 :     s1 = CL_add( t2, t6 );
     205     2386128 :     s3 = CL_sub( t2, t6 );
     206     2386128 :     s3 = CL_mul_j( s3 );
     207             : 
     208     2386128 :     t0 = CL_add( t3, t7 );
     209     2386128 :     t1 = CL_sub( t3, t7 );
     210             : 
     211     2386128 :     s6 = CL_scale_t( CL_msu_j( t1, t0 ), C81 );
     212     2386128 :     s7 = CL_dscale_t( CL_swap_real_imag( CL_msu_j( t0, t1 ) ), C81, C82 );
     213             : 
     214             :     /* Post-additions */
     215             : 
     216     2386128 :     inp[0] = CL_add( s0, s1 );
     217     2386128 :     inp[4] = CL_sub( s0, s1 );
     218             : 
     219     2386128 :     inp[2] = CL_sub( s2, s3 );
     220     2386128 :     inp[6] = CL_add( s2, s3 );
     221             : 
     222     2386128 :     inp[3] = CL_add( s4, s7 );
     223     2386128 :     inp[7] = CL_sub( s4, s7 );
     224             : 
     225     2386128 :     inp[1] = CL_add( s5, s6 );
     226     2386128 :     inp[5] = CL_sub( s5, s6 );
     227             : #ifdef WMOPS
     228             :     multiCounter[currCounter].CL_move += 8;
     229             : #endif
     230     2386128 : }
     231             : 
     232             : 
     233             : /**
     234             :  * \brief    Function performs a complex 10-point FFT
     235             :  *           The FFT is performed inplace. The result of the FFT
     236             :  *           is scaled by SCALEFACTOR10 bits.
     237             :  *
     238             :  *           WOPS with 32x16 bit multiplications:  196 cycles
     239             :  *
     240             :  * \param    [i/o] re    real input / output
     241             :  * \param    [i/o] im    imag input / output
     242             :  * \param    [i  ] s     stride real and imag input / output
     243             :  *
     244             :  * \return   void
     245             :  */
     246             : 
     247     1311452 : static void fft10_with_cmplx_data( cmplx *inp_data /*Qx*/ )
     248             : {
     249             :     cmplx r1, r2, r3, r4;
     250             :     cmplx x0, x1, x2, x3, x4, t;
     251             :     cmplx y[10];
     252             : 
     253             :     /* FOR i=0 */
     254             :     {
     255     1311452 :         x0 = CL_shr( inp_data[0], SCALEFACTOR10 ); // Qx - 5
     256     1311452 :         x1 = CL_shr( inp_data[2], SCALEFACTOR10 );
     257     1311452 :         x2 = CL_shr( inp_data[4], SCALEFACTOR10 );
     258     1311452 :         x3 = CL_shr( inp_data[6], SCALEFACTOR10 );
     259     1311452 :         x4 = CL_shr( inp_data[8], SCALEFACTOR10 );
     260             : 
     261     1311452 :         r1 = CL_add( x3, x2 );
     262     1311452 :         r4 = CL_sub( x3, x2 );
     263     1311452 :         r3 = CL_add( x1, x4 );
     264     1311452 :         r2 = CL_sub( x1, x4 );
     265     1311452 :         t = CL_scale_t( CL_sub( r1, r3 ), C54 );
     266     1311452 :         r1 = CL_add( r1, r3 );
     267     1311452 :         y[0] = CL_add( x0, r1 );
     268     1311452 :         r1 = CL_add( y[0], ( CL_shl( CL_scale_t( r1, C55 ), 1 ) ) );
     269     1311452 :         r3 = CL_sub( r1, t );
     270     1311452 :         r1 = CL_add( r1, t );
     271     1311452 :         t = CL_scale_t( ( CL_add( r4, r2 ) ), C51 );
     272     1311452 :         r4 = CL_add( t, CL_shl( CL_scale_t( r4, C52 ), 1 ) );
     273     1311452 :         r2 = CL_add( t, CL_scale_t( r2, C53 ) );
     274             : 
     275             : 
     276     1311452 :         y[2] = CL_msu_j( r1, r2 );
     277     1311452 :         y[8] = CL_mac_j( r1, r2 );
     278     1311452 :         y[4] = CL_mac_j( r3, r4 );
     279     1311452 :         y[6] = CL_msu_j( r3, r4 );
     280             :     }
     281             :     /* FOR i=1 */
     282             :     {
     283     1311452 :         x0 = CL_shr( inp_data[5], SCALEFACTOR10 ); // Qx - 5
     284     1311452 :         x1 = CL_shr( inp_data[1], SCALEFACTOR10 );
     285     1311452 :         x2 = CL_shr( inp_data[3], SCALEFACTOR10 );
     286     1311452 :         x3 = CL_shr( inp_data[7], SCALEFACTOR10 );
     287     1311452 :         x4 = CL_shr( inp_data[9], SCALEFACTOR10 );
     288             : 
     289     1311452 :         r1 = CL_add( x1, x4 );
     290     1311452 :         r4 = CL_sub( x1, x4 );
     291     1311452 :         r3 = CL_add( x3, x2 );
     292     1311452 :         r2 = CL_sub( x3, x2 );
     293     1311452 :         t = CL_scale_t( CL_sub( r1, r3 ), C54 );
     294     1311452 :         r1 = CL_add( r1, r3 );
     295     1311452 :         y[1] = CL_add( x0, r1 );
     296     1311452 :         r1 = CL_add( y[1], ( CL_shl( CL_scale_t( r1, C55 ), 1 ) ) );
     297     1311452 :         r3 = CL_sub( r1, t );
     298     1311452 :         r1 = CL_add( r1, t );
     299     1311452 :         t = CL_scale_t( ( CL_add( r4, r2 ) ), C51 );
     300     1311452 :         r4 = CL_add( t, CL_shl( CL_scale_t( r4, C52 ), 1 ) );
     301     1311452 :         r2 = CL_add( t, CL_scale_t( r2, C53 ) );
     302             : 
     303             : 
     304     1311452 :         y[3] = CL_msu_j( r1, r2 );
     305     1311452 :         y[9] = CL_mac_j( r1, r2 );
     306     1311452 :         y[5] = CL_mac_j( r3, r4 );
     307     1311452 :         y[7] = CL_msu_j( r3, r4 );
     308             :     }
     309             : 
     310             :     /* FOR i=0 */
     311             :     {
     312     1311452 :         inp_data[0] = CL_add( y[0], y[1] );
     313     1311452 :         inp_data[5] = CL_sub( y[0], y[1] );
     314             :     }
     315             :     /* FOR i=2 */
     316             :     {
     317     1311452 :         inp_data[2] = CL_add( y[2], y[3] );
     318     1311452 :         inp_data[7] = CL_sub( y[2], y[3] );
     319             :     }
     320             :     /* FOR i=4 */
     321             :     {
     322     1311452 :         inp_data[4] = CL_add( y[4], y[5] );
     323     1311452 :         inp_data[9] = CL_sub( y[4], y[5] );
     324             :     }
     325             :     /* FOR i=6 */
     326             :     {
     327     1311452 :         inp_data[6] = CL_add( y[6], y[7] );
     328     1311452 :         inp_data[1] = CL_sub( y[6], y[7] );
     329             :     }
     330             :     /* FOR i=8 */
     331             :     {
     332     1311452 :         inp_data[8] = CL_add( y[8], y[9] );
     333     1311452 :         inp_data[3] = CL_sub( y[8], y[9] );
     334             :     }
     335             : 
     336             : #ifdef WMOPS
     337             :     multiCounter[currCounter].CL_move += 10;
     338             : #endif
     339     1311452 : }
     340             : 
     341             : 
     342             : /**
     343             :  * \brief    Function performs a complex 15-point FFT
     344             :  *           The FFT is performed inplace. The result of the FFT
     345             :  *           is scaled by SCALEFACTOR15 bits.
     346             :  *
     347             :  *           WOPS with 32x16 bit multiplications:  354 cycles
     348             :  *
     349             :  * \param    [i/o] re    real input / output
     350             :  * \param    [i/o] im    imag input / output
     351             :  * \param    [i  ] s     stride real and imag input / output
     352             :  *
     353             :  * \return   void
     354             :  */
     355             : 
     356      577008 : static void fft15_with_cmplx_data( cmplx *inp_data /*Qx*/ )
     357             : {
     358             :     cmplx c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14;
     359             :     cmplx c_z0, c_z1, c_z2, c_z3, c_z4, c_z5, c_z6, c_z7, c_z8, c_z9, c_z10, c_z11, c_z12, c_z13, c_z14;
     360             :     cmplx c_y1, c_y2, c_y3, c_y4;
     361             :     cmplx c_t;
     362             : 
     363      577008 :     c0 = CL_shr( inp_data[0], SCALEFACTOR15 ); // Qx - 5
     364      577008 :     c1 = CL_shr( inp_data[3], SCALEFACTOR15 );
     365      577008 :     c2 = CL_shr( inp_data[6], SCALEFACTOR15 );
     366      577008 :     c3 = CL_shr( inp_data[9], SCALEFACTOR15 );
     367      577008 :     c4 = CL_shr( inp_data[12], SCALEFACTOR15 );
     368      577008 :     c5 = CL_shr( inp_data[5], SCALEFACTOR15 );
     369      577008 :     c6 = CL_shr( inp_data[8], SCALEFACTOR15 );
     370      577008 :     c7 = CL_shr( inp_data[11], SCALEFACTOR15 );
     371      577008 :     c8 = CL_shr( inp_data[14], SCALEFACTOR15 );
     372      577008 :     c9 = CL_shr( inp_data[2], SCALEFACTOR15 );
     373      577008 :     c10 = CL_shr( inp_data[10], SCALEFACTOR15 );
     374      577008 :     c11 = CL_shr( inp_data[13], SCALEFACTOR15 );
     375      577008 :     c12 = CL_shr( inp_data[1], SCALEFACTOR15 );
     376      577008 :     c13 = CL_shr( inp_data[4], SCALEFACTOR15 );
     377      577008 :     c14 = CL_shr( inp_data[7], SCALEFACTOR15 );
     378             : 
     379             :     /* 1. FFT5 stage */
     380      577008 :     c_y1 = CL_add( c1, c4 );
     381      577008 :     c_y4 = CL_sub( c1, c4 );
     382      577008 :     c_y3 = CL_add( c2, c3 );
     383      577008 :     c_y2 = CL_sub( c2, c3 );
     384      577008 :     c_t = CL_scale_t( CL_sub( c_y1, c_y3 ), C54 );
     385      577008 :     c_y1 = CL_add( c_y1, c_y3 );
     386      577008 :     c_z0 = CL_add( c0, c_y1 );
     387      577008 :     c_y1 = CL_add( c_z0, ( CL_shl( CL_scale_t( c_y1, C55 ), 1 ) ) );
     388      577008 :     c_y3 = CL_sub( c_y1, c_t );
     389      577008 :     c_y1 = CL_add( c_y1, c_t );
     390      577008 :     c_t = CL_scale_t( CL_add( c_y4, c_y2 ), C51 );
     391      577008 :     c_y4 = CL_add( c_t, CL_shl( CL_scale_t( c_y4, C52 ), 1 ) );
     392      577008 :     c_y2 = CL_add( c_t, CL_scale_t( c_y2, C53 ) );
     393             : 
     394             :     /* combination */
     395      577008 :     c_z1 = CL_msu_j( c_y1, c_y2 );
     396      577008 :     c_z2 = CL_mac_j( c_y3, c_y4 );
     397      577008 :     c_z3 = CL_msu_j( c_y3, c_y4 );
     398      577008 :     c_z4 = CL_mac_j( c_y1, c_y2 );
     399             : 
     400             : 
     401             :     /* 2. FFT5 stage */
     402      577008 :     c_y1 = CL_add( c6, c9 );
     403      577008 :     c_y4 = CL_sub( c6, c9 );
     404      577008 :     c_y3 = CL_add( c7, c8 );
     405      577008 :     c_y2 = CL_sub( c7, c8 );
     406      577008 :     c_t = CL_scale_t( CL_sub( c_y1, c_y3 ), C54 );
     407      577008 :     c_y1 = CL_add( c_y1, c_y3 );
     408      577008 :     c_z5 = CL_add( c5, c_y1 );
     409      577008 :     c_y1 = CL_add( c_z5, ( CL_shl( CL_scale_t( c_y1, C55 ), 1 ) ) );
     410      577008 :     c_y3 = CL_sub( c_y1, c_t );
     411      577008 :     c_y1 = CL_add( c_y1, c_t );
     412      577008 :     c_t = CL_scale_t( CL_add( c_y4, c_y2 ), C51 );
     413      577008 :     c_y4 = CL_add( c_t, CL_shl( CL_scale_t( c_y4, C52 ), 1 ) );
     414      577008 :     c_y2 = CL_add( c_t, CL_scale_t( c_y2, C53 ) );
     415             :     /* combination */
     416      577008 :     c_z6 = CL_msu_j( c_y1, c_y2 );
     417      577008 :     c_z7 = CL_mac_j( c_y3, c_y4 );
     418      577008 :     c_z8 = CL_msu_j( c_y3, c_y4 );
     419      577008 :     c_z9 = CL_mac_j( c_y1, c_y2 );
     420             : 
     421             : 
     422             :     /* 3. FFT5 stage */
     423             : 
     424      577008 :     c_y1 = CL_add( c11, c14 );
     425      577008 :     c_y4 = CL_sub( c11, c14 );
     426      577008 :     c_y3 = CL_add( c12, c13 );
     427      577008 :     c_y2 = CL_sub( c12, c13 );
     428      577008 :     c_t = CL_scale_t( CL_sub( c_y1, c_y3 ), C54 );
     429      577008 :     c_y1 = CL_add( c_y1, c_y3 );
     430      577008 :     c_z10 = CL_add( c10, c_y1 );
     431      577008 :     c_y1 = CL_add( c_z10, ( CL_shl( CL_scale_t( c_y1, C55 ), 1 ) ) );
     432      577008 :     c_y3 = CL_sub( c_y1, c_t );
     433      577008 :     c_y1 = CL_add( c_y1, c_t );
     434      577008 :     c_t = CL_scale_t( CL_add( c_y4, c_y2 ), C51 );
     435      577008 :     c_y4 = CL_add( c_t, CL_shl( CL_scale_t( c_y4, C52 ), 1 ) );
     436      577008 :     c_y2 = CL_add( c_t, CL_scale_t( c_y2, C53 ) );
     437             :     /* combination */
     438      577008 :     c_z11 = CL_msu_j( c_y1, c_y2 );
     439      577008 :     c_z12 = CL_mac_j( c_y3, c_y4 );
     440      577008 :     c_z13 = CL_msu_j( c_y3, c_y4 );
     441      577008 :     c_z14 = CL_mac_j( c_y1, c_y2 );
     442             : 
     443             : 
     444             :     /* 1. FFT3 stage */
     445      577008 :     c_y1 = CL_add( c_z5, c_z10 );
     446      577008 :     c_y2 = CL_scale_t( CL_sub( c_z5, c_z10 ), C31 );
     447      577008 :     inp_data[0] = CL_add( c_z0, c_y1 );
     448      577008 :     c_y1 = CL_sub( c_z0, CL_shr( c_y1, 1 ) );
     449      577008 :     inp_data[10] = CL_mac_j( c_y1, c_y2 );
     450      577008 :     inp_data[5] = CL_msu_j( c_y1, c_y2 );
     451             : 
     452             :     /* 2. FFT3 stage */
     453      577008 :     c_y1 = CL_add( c_z6, c_z11 );
     454      577008 :     c_y2 = CL_scale_t( CL_sub( c_z6, c_z11 ), C31 );
     455      577008 :     inp_data[6] = CL_add( c_z1, c_y1 );
     456      577008 :     c_y1 = CL_sub( c_z1, CL_shr( c_y1, 1 ) );
     457      577008 :     inp_data[1] = CL_mac_j( c_y1, c_y2 );
     458      577008 :     inp_data[11] = CL_msu_j( c_y1, c_y2 );
     459             : 
     460             :     /* 3. FFT3 stage */
     461      577008 :     c_y1 = CL_add( c_z7, c_z12 );
     462      577008 :     c_y2 = CL_scale_t( CL_sub( c_z7, c_z12 ), C31 );
     463      577008 :     inp_data[12] = CL_add( c_z2, c_y1 );
     464      577008 :     c_y1 = CL_sub( c_z2, CL_shr( c_y1, 1 ) );
     465      577008 :     inp_data[7] = CL_mac_j( c_y1, c_y2 );
     466      577008 :     inp_data[2] = CL_msu_j( c_y1, c_y2 );
     467             : 
     468             : 
     469             :     /* 4. FFT3 stage */
     470      577008 :     c_y1 = CL_add( c_z8, c_z13 );
     471      577008 :     c_y2 = CL_scale_t( CL_sub( c_z8, c_z13 ), C31 );
     472      577008 :     inp_data[3] = CL_add( c_z3, c_y1 );
     473      577008 :     c_y1 = CL_sub( c_z3, CL_shr( c_y1, 1 ) );
     474      577008 :     inp_data[13] = CL_mac_j( c_y1, c_y2 );
     475      577008 :     inp_data[8] = CL_msu_j( c_y1, c_y2 );
     476             : 
     477             : 
     478             :     /* 5. FFT3 stage */
     479      577008 :     c_y1 = CL_add( c_z9, c_z14 );
     480      577008 :     c_y2 = CL_scale_t( CL_sub( c_z9, c_z14 ), C31 );
     481      577008 :     inp_data[9] = CL_add( c_z4, c_y1 );
     482      577008 :     c_y1 = CL_sub( c_z4, CL_shr( c_y1, 1 ) );
     483      577008 :     inp_data[4] = CL_mac_j( c_y1, c_y2 );
     484      577008 :     inp_data[14] = CL_msu_j( c_y1, c_y2 );
     485             : 
     486             : #ifdef WMOPS
     487             :     multiCounter[currCounter].CL_move += 15;
     488             : #endif
     489      577008 : }
     490             : 
     491             : 
     492             : /**
     493             :  * \brief    Function performs a complex 16-point FFT
     494             :  *           The FFT is performed inplace. The result of the FFT
     495             :  *           is scaled by SCALEFACTOR16 bits.
     496             :  *
     497             :  *           WOPS with 32x16 bit multiplications (scale on ):  288 cycles
     498             :  *           WOPS with 32x16 bit multiplications (scale off):  256 cycles
     499             :  *
     500             :  * \param    [i/o] re    real input / output Qx
     501             :  * \param    [i/o] im    imag input / output Qx
     502             :  * \param    [i  ] s     stride real and imag input / output
     503             :  *
     504             :  * \return   void
     505             :  */
     506           0 : void fft16( Word32 *re, Word32 *im, Word16 s, Word16 bScale )
     507             : {
     508             :     Word16 i;
     509           0 :     if ( s == 2 )
     510             :     {
     511           0 :         fft16_with_cmplx_data( (cmplx *) re, bScale );
     512             :     }
     513             :     else
     514             :     {
     515             :         cmplx inp_data[16];
     516           0 :         FOR( i = 0; i < 16; i++ )
     517             :         {
     518           0 :             inp_data[i] = CL_form( re[s * i], im[s * i] );
     519           0 :             move64();
     520             :         }
     521           0 :         fft16_with_cmplx_data( inp_data, bScale );
     522           0 :         FOR( i = 0; i < 16; i++ )
     523             :         {
     524           0 :             re[s * i] = CL_Extract_real( inp_data[i] );
     525           0 :             move32();
     526           0 :             im[s * i] = CL_Extract_imag( inp_data[i] );
     527           0 :             move32();
     528             :         }
     529             :     }
     530           0 : }
     531             : 
     532    26904054 : void fft16_with_cmplx_data( cmplx *input /*Qx*/, Word16 bScale )
     533             : {
     534             :     cmplx x0, x1, x2, x3, temp;
     535             :     cmplx t0, t2, t4, t6, t7;
     536             :     cmplx y[16];
     537             : 
     538    26904054 :     IF( bScale )
     539             :     {
     540             :         {
     541     1780200 :             x0 = CL_shr( input[0], SCALEFACTOR16 ); // Qx - 5
     542     1780200 :             x1 = CL_shr( input[4], SCALEFACTOR16 );
     543     1780200 :             x2 = CL_shr( input[8], SCALEFACTOR16 );
     544     1780200 :             x3 = CL_shr( input[12], SCALEFACTOR16 );
     545     1780200 :             t0 = CL_add( x0, x2 );
     546     1780200 :             t2 = CL_sub( x0, x2 );
     547     1780200 :             t4 = CL_add( x1, x3 );
     548     1780200 :             t6 = CL_sub( x1, x3 );
     549     1780200 :             t6 = CL_mul_j( t6 );
     550     1780200 :             y[0] = CL_add( t0, t4 );
     551     1780200 :             y[1] = CL_sub( t2, t6 );
     552     1780200 :             y[2] = CL_sub( t0, t4 );
     553     1780200 :             y[3] = CL_add( t2, t6 );
     554             : 
     555             : 
     556     1780200 :             x0 = CL_shr( input[1], SCALEFACTOR16 ); // Qx - 5
     557     1780200 :             x1 = CL_shr( input[5], SCALEFACTOR16 );
     558     1780200 :             x2 = CL_shr( input[9], SCALEFACTOR16 );
     559     1780200 :             x3 = CL_shr( input[13], SCALEFACTOR16 );
     560     1780200 :             t0 = CL_add( x0, x2 );
     561     1780200 :             t2 = CL_sub( x0, x2 );
     562     1780200 :             t4 = CL_add( x1, x3 );
     563     1780200 :             t6 = CL_sub( x1, x3 );
     564     1780200 :             t6 = CL_mul_j( t6 );
     565     1780200 :             y[4] = CL_add( t0, t4 );
     566     1780200 :             y[5] = CL_sub( t2, t6 );
     567     1780200 :             y[6] = CL_sub( t0, t4 );
     568     1780200 :             y[7] = CL_add( t2, t6 );
     569             : 
     570             : 
     571     1780200 :             x0 = CL_shr( input[2], SCALEFACTOR16 ); // Qx - 5
     572     1780200 :             x1 = CL_shr( input[6], SCALEFACTOR16 );
     573     1780200 :             x2 = CL_shr( input[10], SCALEFACTOR16 );
     574     1780200 :             x3 = CL_shr( input[14], SCALEFACTOR16 );
     575     1780200 :             t0 = CL_add( x0, x2 );
     576     1780200 :             t2 = CL_sub( x0, x2 );
     577     1780200 :             t4 = CL_add( x1, x3 );
     578     1780200 :             t6 = CL_sub( x1, x3 );
     579     1780200 :             t6 = CL_mul_j( t6 );
     580     1780200 :             y[8] = CL_add( t0, t4 );
     581     1780200 :             y[9] = CL_sub( t2, t6 );
     582     1780200 :             y[10] = CL_sub( t4, t0 );
     583     1780200 :             y[10] = CL_mul_j( y[10] );
     584     1780200 :             y[11] = CL_add( t2, t6 );
     585             : 
     586             : 
     587     1780200 :             x0 = CL_shr( input[3], SCALEFACTOR16 ); // Qx - 5
     588     1780200 :             x1 = CL_shr( input[7], SCALEFACTOR16 );
     589     1780200 :             x2 = CL_shr( input[11], SCALEFACTOR16 );
     590     1780200 :             x3 = CL_shr( input[15], SCALEFACTOR16 );
     591     1780200 :             t0 = CL_add( x0, x2 );
     592     1780200 :             t2 = CL_sub( x0, x2 );
     593     1780200 :             t4 = CL_add( x1, x3 );
     594     1780200 :             t6 = CL_sub( x1, x3 );
     595     1780200 :             t6 = CL_mul_j( t6 );
     596     1780200 :             y[12] = CL_add( t0, t4 );
     597     1780200 :             y[13] = CL_sub( t2, t6 );
     598     1780200 :             y[14] = CL_sub( t0, t4 );
     599     1780200 :             y[15] = CL_add( t2, t6 );
     600             :         }
     601             :     }
     602             :     else
     603             :     {
     604             :         {
     605    25123854 :             t0 = CL_add( input[0], input[8] );
     606    25123854 :             t2 = CL_sub( input[0], input[8] );
     607    25123854 :             t4 = CL_add( input[4], input[12] );
     608    25123854 :             t7 = CL_sub( input[4], input[12] );
     609             : 
     610    25123854 :             y[0] = CL_add( t0, t4 );
     611    25123854 :             y[1] = CL_msu_j( t2, t7 );
     612    25123854 :             y[2] = CL_sub( t0, t4 );
     613    25123854 :             y[3] = CL_mac_j( t2, t7 );
     614             :         }
     615             :         /* i=1 */
     616             :         {
     617    25123854 :             t0 = CL_add( input[1], input[9] );
     618    25123854 :             t2 = CL_sub( input[1], input[9] );
     619    25123854 :             t4 = CL_add( input[5], input[13] );
     620    25123854 :             t7 = CL_sub( input[5], input[13] );
     621             : 
     622    25123854 :             y[4] = CL_add( t0, t4 );
     623    25123854 :             y[5] = CL_msu_j( t2, t7 );
     624    25123854 :             y[6] = CL_sub( t0, t4 );
     625    25123854 :             y[7] = CL_mac_j( t2, t7 );
     626             :         }
     627             :         /* i=2 */
     628             :         {
     629    25123854 :             t0 = CL_add( input[2], input[10] );
     630    25123854 :             t2 = CL_sub( input[2], input[10] );
     631    25123854 :             t4 = CL_add( input[6], input[14] );
     632    25123854 :             t7 = CL_sub( input[6], input[14] );
     633             : 
     634    25123854 :             y[8] = CL_add( t0, t4 );
     635    25123854 :             y[9] = CL_msu_j( t2, t7 );
     636    25123854 :             temp = CL_sub( t0, t4 );
     637    25123854 :             y[10] = CL_negate( CL_mul_j( temp ) );
     638    25123854 :             y[11] = CL_mac_j( t2, t7 );
     639             :         }
     640             :         /* i=3 */
     641             :         {
     642    25123854 :             t0 = CL_add( input[3], input[11] );
     643    25123854 :             t2 = CL_sub( input[3], input[11] );
     644    25123854 :             t4 = CL_add( input[7], input[15] );
     645    25123854 :             t7 = CL_sub( input[7], input[15] );
     646             : 
     647    25123854 :             y[12] = CL_add( t0, t4 );
     648    25123854 :             y[13] = CL_msu_j( t2, t7 );
     649    25123854 :             y[14] = CL_sub( t0, t4 );
     650    25123854 :             y[15] = CL_mac_j( t2, t7 );
     651             :         }
     652             :     }
     653             : 
     654    26904054 :     x0 = CL_scale_t( y[11], C162 );
     655    26904054 :     y[11] = CL_mac_j( x0, x0 );
     656             : 
     657    26904054 :     x0 = CL_scale_t( y[14], C162 );
     658    26904054 :     y[14] = CL_mac_j( x0, x0 );
     659             : 
     660    26904054 :     x0 = CL_scale_t( y[6], C161 );
     661    26904054 :     y[6] = CL_msu_j( x0, x0 );
     662             : 
     663    26904054 :     x0 = CL_scale_t( y[9], C161 );
     664    26904054 :     y[9] = CL_msu_j( x0, x0 );
     665             : 
     666    26904054 :     y[5] = CL_mac_j( CL_scale_t( y[5], C163 ), CL_scale_t( y[5], C166 ) );
     667    26904054 :     y[7] = CL_mac_j( CL_scale_t( y[7], C165 ), CL_scale_t( y[7], C164 ) );
     668    26904054 :     y[13] = CL_mac_j( CL_scale_t( y[13], C165 ), CL_scale_t( y[13], C164 ) );
     669    26904054 :     y[15] = CL_mac_j( CL_scale_t( y[15], C164 ), CL_scale_t( y[15], C165 ) );
     670             : 
     671             : 
     672             :     /* i=0 */
     673             :     {
     674    26904054 :         t0 = CL_add( y[0], y[8] );
     675    26904054 :         t2 = CL_sub( y[0], y[8] );
     676    26904054 :         t4 = CL_add( y[4], y[12] );
     677    26904054 :         t7 = CL_sub( y[4], y[12] );
     678             : 
     679    26904054 :         input[0] = CL_add( t0, t4 );
     680    26904054 :         input[4] = CL_msu_j( t2, t7 );
     681    26904054 :         input[8] = CL_sub( t0, t4 );
     682    26904054 :         input[12] = CL_mac_j( t2, t7 );
     683             :     }
     684             :     /* i=1 */
     685             :     {
     686    26904054 :         t0 = CL_add( y[1], y[9] );
     687    26904054 :         t2 = CL_sub( y[1], y[9] );
     688    26904054 :         t4 = CL_add( y[5], y[13] );
     689    26904054 :         t7 = CL_sub( y[5], y[13] );
     690             : 
     691    26904054 :         input[1] = CL_add( t0, t4 );
     692    26904054 :         input[5] = CL_msu_j( t2, t7 );
     693    26904054 :         input[9] = CL_sub( t0, t4 );
     694    26904054 :         input[13] = CL_mac_j( t2, t7 );
     695             :     }
     696             :     /* i=2 */
     697             :     {
     698    26904054 :         t0 = CL_add( y[2], y[10] );
     699    26904054 :         t2 = CL_sub( y[2], y[10] );
     700    26904054 :         t4 = CL_add( y[6], y[14] );
     701    26904054 :         t7 = CL_sub( y[6], y[14] );
     702             : 
     703    26904054 :         input[2] = CL_add( t0, t4 );
     704    26904054 :         input[6] = CL_msu_j( t2, t7 );
     705    26904054 :         input[10] = CL_sub( t0, t4 );
     706    26904054 :         input[14] = CL_mac_j( t2, t7 );
     707             :     }
     708             :     /* i=3 */
     709             :     {
     710    26904054 :         t0 = CL_add( y[3], y[11] );
     711    26904054 :         t2 = CL_sub( y[3], y[11] );
     712    26904054 :         t4 = CL_add( y[7], y[15] );
     713    26904054 :         t7 = CL_sub( y[7], y[15] );
     714             : 
     715    26904054 :         input[3] = CL_add( t0, t4 );
     716    26904054 :         input[7] = CL_msu_j( t2, t7 );
     717    26904054 :         input[11] = CL_sub( t0, t4 );
     718    26904054 :         input[15] = CL_mac_j( t2, t7 );
     719             :     }
     720             : #ifdef WMOPS
     721             :     multiCounter[currCounter].CL_move += 16;
     722             : #endif
     723    26904054 : }
     724             : 
     725             : 
     726             : /**
     727             :  * \brief    Function performs a complex 20-point FFT
     728             :  *           The FFT is performed inplace. The result of the FFT
     729             :  *           is scaled by SCALEFACTOR20 bits.
     730             :  *
     731             :  *           WOPS with 32x16 bit multiplications:  432 cycles
     732             :  *
     733             :  * \param    [i/o] re    real input / output
     734             :  * \param    [i/o] im    imag input / output
     735             :  * \param    [i  ] s     stride real and imag input / output
     736             :  *
     737             :  * \return   void
     738             :  */
     739     6163100 : static void fft20_with_cmplx_data( cmplx *inp_data /*Qx*/ )
     740             : {
     741             :     cmplx r1, r2, r3, r4;
     742             :     cmplx x0, x1, x2, x3, x4;
     743             :     cmplx t, t0, t1, t2, t3;
     744             :     cmplx y[20];
     745             :     cmplx *y0, *y1, *y2, *y3, *y4;
     746             : 
     747     6163100 :     y0 = y;
     748     6163100 :     y1 = &y[4];
     749     6163100 :     y2 = &y[16];
     750     6163100 :     y3 = &y[8];
     751     6163100 :     y4 = &y[12];
     752             : 
     753             :     {
     754     6163100 :         x0 = CL_shr( inp_data[0], SCALEFACTOR20 ); // Qx - 5
     755     6163100 :         x1 = CL_shr( inp_data[16], SCALEFACTOR20 );
     756     6163100 :         x2 = CL_shr( inp_data[12], SCALEFACTOR20 );
     757     6163100 :         x3 = CL_shr( inp_data[8], SCALEFACTOR20 );
     758     6163100 :         x4 = CL_shr( inp_data[4], SCALEFACTOR20 );
     759             : 
     760     6163100 :         r4 = CL_sub( x1, x4 );
     761     6163100 :         r2 = CL_sub( x2, x3 );
     762     6163100 :         r1 = CL_add( x1, x4 );
     763     6163100 :         r3 = CL_add( x2, x3 );
     764     6163100 :         t = CL_scale_t( CL_sub( r1, r3 ), C54 );
     765     6163100 :         r1 = CL_add( r1, r3 );
     766     6163100 :         y0[0] = CL_add( x0, r1 );
     767     6163100 :         r1 = CL_add( y0[0], ( CL_shl( CL_scale_t( r1, C55 ), 1 ) ) );
     768     6163100 :         r3 = CL_sub( r1, t );
     769     6163100 :         r1 = CL_add( r1, t );
     770     6163100 :         t = CL_scale_t( ( CL_add( r4, r2 ) ), C51 );
     771     6163100 :         r4 = CL_add( t, CL_shl( CL_scale_t( r4, C52 ), 1 ) );
     772     6163100 :         r2 = CL_add( t, CL_scale_t( r2, C53 ) );
     773             : 
     774             : 
     775     6163100 :         y1[0] = CL_msu_j( r1, r2 );
     776     6163100 :         y2[0] = CL_mac_j( r1, r2 );
     777     6163100 :         y3[0] = CL_mac_j( r3, r4 );
     778     6163100 :         y4[0] = CL_msu_j( r3, r4 );
     779             :     }
     780             :     {
     781     6163100 :         x0 = CL_shr( inp_data[5], SCALEFACTOR20 ); // Qx - 5
     782     6163100 :         x1 = CL_shr( inp_data[1], SCALEFACTOR20 );
     783     6163100 :         x2 = CL_shr( inp_data[17], SCALEFACTOR20 );
     784     6163100 :         x3 = CL_shr( inp_data[13], SCALEFACTOR20 );
     785     6163100 :         x4 = CL_shr( inp_data[9], SCALEFACTOR20 );
     786             : 
     787     6163100 :         r4 = CL_sub( x1, x4 );
     788     6163100 :         r2 = CL_sub( x2, x3 );
     789     6163100 :         r1 = CL_add( x1, x4 );
     790     6163100 :         r3 = CL_add( x2, x3 );
     791     6163100 :         t = CL_scale_t( CL_sub( r1, r3 ), C54 );
     792     6163100 :         r1 = CL_add( r1, r3 );
     793     6163100 :         y0[1] = CL_add( x0, r1 );
     794     6163100 :         r1 = CL_add( y0[1], ( CL_shl( CL_scale_t( r1, C55 ), 1 ) ) );
     795     6163100 :         r3 = CL_sub( r1, t );
     796     6163100 :         r1 = CL_add( r1, t );
     797     6163100 :         t = CL_scale_t( ( CL_add( r4, r2 ) ), C51 );
     798     6163100 :         r4 = CL_add( t, CL_shl( CL_scale_t( r4, C52 ), 1 ) );
     799     6163100 :         r2 = CL_add( t, CL_scale_t( r2, C53 ) );
     800             : 
     801             : 
     802     6163100 :         y1[1] = CL_msu_j( r1, r2 );
     803     6163100 :         y2[1] = CL_mac_j( r1, r2 );
     804     6163100 :         y3[1] = CL_mac_j( r3, r4 );
     805     6163100 :         y4[1] = CL_msu_j( r3, r4 );
     806             :     }
     807             :     {
     808     6163100 :         x0 = CL_shr( inp_data[10], SCALEFACTOR20 ); // Qx - 5
     809     6163100 :         x1 = CL_shr( inp_data[6], SCALEFACTOR20 );
     810     6163100 :         x2 = CL_shr( inp_data[2], SCALEFACTOR20 );
     811     6163100 :         x3 = CL_shr( inp_data[18], SCALEFACTOR20 );
     812     6163100 :         x4 = CL_shr( inp_data[14], SCALEFACTOR20 );
     813             : 
     814     6163100 :         r4 = CL_sub( x1, x4 );
     815     6163100 :         r2 = CL_sub( x2, x3 );
     816     6163100 :         r1 = CL_add( x1, x4 );
     817     6163100 :         r3 = CL_add( x2, x3 );
     818     6163100 :         t = CL_scale_t( CL_sub( r1, r3 ), C54 );
     819     6163100 :         r1 = CL_add( r1, r3 );
     820     6163100 :         y0[2] = CL_add( x0, r1 );
     821     6163100 :         r1 = CL_add( y0[2], ( CL_shl( CL_scale_t( r1, C55 ), 1 ) ) );
     822     6163100 :         r3 = CL_sub( r1, t );
     823     6163100 :         r1 = CL_add( r1, t );
     824     6163100 :         t = CL_scale_t( ( CL_add( r4, r2 ) ), C51 );
     825     6163100 :         r4 = CL_add( t, CL_shl( CL_scale_t( r4, C52 ), 1 ) );
     826     6163100 :         r2 = CL_add( t, CL_scale_t( r2, C53 ) );
     827             : 
     828             : 
     829     6163100 :         y1[2] = CL_msu_j( r1, r2 );
     830     6163100 :         y2[2] = CL_mac_j( r1, r2 );
     831     6163100 :         y3[2] = CL_mac_j( r3, r4 );
     832     6163100 :         y4[2] = CL_msu_j( r3, r4 );
     833             :     }
     834             :     {
     835     6163100 :         x0 = CL_shr( inp_data[15], SCALEFACTOR20 ); // Qx - 5
     836     6163100 :         x1 = CL_shr( inp_data[11], SCALEFACTOR20 );
     837     6163100 :         x2 = CL_shr( inp_data[7], SCALEFACTOR20 );
     838     6163100 :         x3 = CL_shr( inp_data[3], SCALEFACTOR20 );
     839     6163100 :         x4 = CL_shr( inp_data[19], SCALEFACTOR20 );
     840             : 
     841     6163100 :         r4 = CL_sub( x1, x4 );
     842     6163100 :         r2 = CL_sub( x2, x3 );
     843     6163100 :         r1 = CL_add( x1, x4 );
     844     6163100 :         r3 = CL_add( x2, x3 );
     845     6163100 :         t = CL_scale_t( CL_sub( r1, r3 ), C54 );
     846     6163100 :         r1 = CL_add( r1, r3 );
     847     6163100 :         y0[3] = CL_add( x0, r1 );
     848     6163100 :         r1 = CL_add( y0[3], ( CL_shl( CL_scale_t( r1, C55 ), 1 ) ) );
     849     6163100 :         r3 = CL_sub( r1, t );
     850     6163100 :         r1 = CL_add( r1, t );
     851     6163100 :         t = CL_scale_t( ( CL_add( r4, r2 ) ), C51 );
     852     6163100 :         r4 = CL_add( t, CL_shl( CL_scale_t( r4, C52 ), 1 ) );
     853     6163100 :         r2 = CL_add( t, CL_scale_t( r2, C53 ) );
     854             : 
     855             : 
     856     6163100 :         y1[3] = CL_msu_j( r1, r2 );
     857     6163100 :         y2[3] = CL_mac_j( r1, r2 );
     858     6163100 :         y3[3] = CL_mac_j( r3, r4 );
     859     6163100 :         y4[3] = CL_msu_j( r3, r4 );
     860             :     }
     861             : 
     862             :     {
     863     6163100 :         cmplx *ptr_y = y;
     864             :         {
     865             :             cmplx Cy0, Cy1, Cy2, Cy3;
     866             : 
     867     6163100 :             Cy0 = *ptr_y++;
     868     6163100 :             Cy1 = *ptr_y++;
     869     6163100 :             Cy2 = *ptr_y++;
     870     6163100 :             Cy3 = *ptr_y++;
     871             : 
     872             :             /*  Pre-additions */
     873     6163100 :             t0 = CL_add( Cy0, Cy2 );
     874     6163100 :             t1 = CL_sub( Cy0, Cy2 );
     875     6163100 :             t2 = CL_add( Cy1, Cy3 );
     876     6163100 :             t3 = CL_sub( Cy1, Cy3 );
     877             : 
     878             : 
     879     6163100 :             inp_data[0] = CL_add( t0, t2 );
     880     6163100 :             inp_data[5] = CL_msu_j( t1, t3 );
     881     6163100 :             inp_data[10] = CL_sub( t0, t2 );
     882     6163100 :             inp_data[15] = CL_mac_j( t1, t3 );
     883             :         }
     884             : 
     885             :         {
     886             :             cmplx Cy0, Cy1, Cy2, Cy3;
     887             : 
     888     6163100 :             Cy0 = *ptr_y++;
     889     6163100 :             Cy1 = *ptr_y++;
     890     6163100 :             Cy2 = *ptr_y++;
     891     6163100 :             Cy3 = *ptr_y++;
     892             : 
     893             :             /*  Pre-additions */
     894     6163100 :             t0 = CL_add( Cy0, Cy2 );
     895     6163100 :             t1 = CL_sub( Cy0, Cy2 );
     896     6163100 :             t2 = CL_add( Cy1, Cy3 );
     897     6163100 :             t3 = CL_sub( Cy1, Cy3 );
     898             : 
     899             : 
     900     6163100 :             inp_data[4] = CL_add( t0, t2 );
     901     6163100 :             inp_data[9] = CL_msu_j( t1, t3 );
     902     6163100 :             inp_data[14] = CL_sub( t0, t2 );
     903     6163100 :             inp_data[19] = CL_mac_j( t1, t3 );
     904             :         }
     905             : 
     906             :         {
     907             :             cmplx Cy0, Cy1, Cy2, Cy3;
     908             : 
     909     6163100 :             Cy0 = *ptr_y++;
     910     6163100 :             Cy1 = *ptr_y++;
     911     6163100 :             Cy2 = *ptr_y++;
     912     6163100 :             Cy3 = *ptr_y++;
     913             : 
     914             :             /*  Pre-additions */
     915     6163100 :             t0 = CL_add( Cy0, Cy2 );
     916     6163100 :             t1 = CL_sub( Cy0, Cy2 );
     917     6163100 :             t2 = CL_add( Cy1, Cy3 );
     918     6163100 :             t3 = CL_sub( Cy1, Cy3 );
     919             : 
     920             : 
     921     6163100 :             inp_data[8] = CL_add( t0, t2 );
     922     6163100 :             inp_data[13] = CL_msu_j( t1, t3 );
     923     6163100 :             inp_data[18] = CL_sub( t0, t2 );
     924     6163100 :             inp_data[3] = CL_mac_j( t1, t3 );
     925             :         }
     926             : 
     927             :         {
     928             :             cmplx Cy0, Cy1, Cy2, Cy3;
     929             : 
     930     6163100 :             Cy0 = *ptr_y++;
     931     6163100 :             Cy1 = *ptr_y++;
     932     6163100 :             Cy2 = *ptr_y++;
     933     6163100 :             Cy3 = *ptr_y++;
     934             : 
     935             :             /*  Pre-additions */
     936     6163100 :             t0 = CL_add( Cy0, Cy2 );
     937     6163100 :             t1 = CL_sub( Cy0, Cy2 );
     938     6163100 :             t2 = CL_add( Cy1, Cy3 );
     939     6163100 :             t3 = CL_sub( Cy1, Cy3 );
     940             : 
     941     6163100 :             inp_data[12] = CL_add( t0, t2 );
     942     6163100 :             inp_data[17] = CL_msu_j( t1, t3 );
     943     6163100 :             inp_data[2] = CL_sub( t0, t2 );
     944     6163100 :             inp_data[7] = CL_mac_j( t1, t3 );
     945             :         }
     946             : 
     947             :         {
     948             :             cmplx Cy0, Cy1, Cy2, Cy3;
     949             : 
     950     6163100 :             Cy0 = *ptr_y++;
     951     6163100 :             Cy1 = *ptr_y++;
     952     6163100 :             Cy2 = *ptr_y++;
     953     6163100 :             Cy3 = *ptr_y++;
     954             : 
     955             :             /*  Pre-additions */
     956     6163100 :             t0 = CL_add( Cy0, Cy2 );
     957     6163100 :             t1 = CL_sub( Cy0, Cy2 );
     958     6163100 :             t2 = CL_add( Cy1, Cy3 );
     959     6163100 :             t3 = CL_sub( Cy1, Cy3 );
     960             : 
     961             : 
     962     6163100 :             inp_data[16] = CL_add( t0, t2 );
     963     6163100 :             inp_data[1] = CL_msu_j( t1, t3 );
     964     6163100 :             inp_data[6] = CL_sub( t0, t2 );
     965     6163100 :             inp_data[11] = CL_mac_j( t1, t3 );
     966             :         }
     967             :     }
     968             : #ifdef WMOPS
     969             :     multiCounter[currCounter].CL_move += 20;
     970             : #endif
     971     6163100 : }
     972             : 
     973             : 
     974             : /**
     975             :  * \brief    Function performs a complex 30-point FFT
     976             :  *           The FFT is performed inplace. The result of the FFT
     977             :  *           is scaled by SCALEFACTOR30 bits.
     978             :  *
     979             :  *           WOPS with 32x16 bit multiplications:  828 cycles
     980             :  *
     981             :  * \param    [i/o] re    real input / output
     982             :  * \param    [i/o] im    imag input / output
     983             :  * \param    [i  ] s     stride real and imag input / output
     984             :  *
     985             :  * \return   void
     986             :  */
     987             : 
     988    11981092 : static void fft30_with_cmplx_data( cmplx *inp /*Qx*/ )
     989             : {
     990    11981092 :     cmplx *l = &inp[0];
     991    11981092 :     cmplx *h = &inp[15];
     992             : 
     993             :     cmplx z[30], y[15], x[15], rs1, rs2, rs3, rs4, t;
     994             : 
     995             :     /* 1. FFT15 stage */
     996             : 
     997    11981092 :     x[0] = CL_shr( inp[0], SCALEFACTOR30_1 ); // Qx - 5
     998    11981092 :     x[1] = CL_shr( inp[18], SCALEFACTOR30_1 );
     999    11981092 :     x[2] = CL_shr( inp[6], SCALEFACTOR30_1 );
    1000    11981092 :     x[3] = CL_shr( inp[24], SCALEFACTOR30_1 );
    1001    11981092 :     x[4] = CL_shr( inp[12], SCALEFACTOR30_1 );
    1002             : 
    1003    11981092 :     x[5] = CL_shr( inp[20], SCALEFACTOR30_1 ); // Qx - 5
    1004    11981092 :     x[6] = CL_shr( inp[8], SCALEFACTOR30_1 );
    1005    11981092 :     x[7] = CL_shr( inp[26], SCALEFACTOR30_1 );
    1006    11981092 :     x[8] = CL_shr( inp[14], SCALEFACTOR30_1 );
    1007    11981092 :     x[9] = CL_shr( inp[2], SCALEFACTOR30_1 );
    1008             : 
    1009    11981092 :     x[10] = CL_shr( inp[10], SCALEFACTOR30_1 ); // Qx - 5
    1010    11981092 :     x[11] = CL_shr( inp[28], SCALEFACTOR30_1 );
    1011    11981092 :     x[12] = CL_shr( inp[16], SCALEFACTOR30_1 );
    1012    11981092 :     x[13] = CL_shr( inp[4], SCALEFACTOR30_1 );
    1013    11981092 :     x[14] = CL_shr( inp[22], SCALEFACTOR30_1 );
    1014             : 
    1015             : 
    1016             :     /* 1. FFT5 stage */
    1017    11981092 :     rs1 = CL_add( x[1], x[4] );
    1018    11981092 :     rs4 = CL_sub( x[1], x[4] );
    1019    11981092 :     rs3 = CL_add( x[2], x[3] );
    1020    11981092 :     rs2 = CL_sub( x[2], x[3] );
    1021    11981092 :     t = CL_scale_t( CL_sub( rs1, rs3 ), C54 );
    1022    11981092 :     rs1 = CL_add( rs1, rs3 );
    1023    11981092 :     y[0] = CL_add( x[0], rs1 );
    1024    11981092 :     rs1 = CL_add( y[0], ( CL_shl( CL_scale_t( rs1, C55 ), 1 ) ) );
    1025    11981092 :     rs3 = CL_sub( rs1, t );
    1026    11981092 :     rs1 = CL_add( rs1, t );
    1027    11981092 :     t = CL_scale_t( CL_add( rs4, rs2 ), C51 );
    1028    11981092 :     rs4 = CL_add( t, CL_shl( CL_scale_t( rs4, C52 ), 1 ) );
    1029    11981092 :     rs2 = CL_add( t, CL_scale_t( rs2, C53 ) );
    1030             : 
    1031             :     /* combination */
    1032    11981092 :     y[1] = CL_msu_j( rs1, rs2 );
    1033    11981092 :     y[4] = CL_mac_j( rs1, rs2 );
    1034    11981092 :     y[2] = CL_mac_j( rs3, rs4 );
    1035    11981092 :     y[3] = CL_msu_j( rs3, rs4 );
    1036             : 
    1037             : 
    1038             :     /* 2. FFT5 stage */
    1039    11981092 :     rs1 = CL_add( x[6], x[9] );
    1040    11981092 :     rs4 = CL_sub( x[6], x[9] );
    1041    11981092 :     rs3 = CL_add( x[7], x[8] );
    1042    11981092 :     rs2 = CL_sub( x[7], x[8] );
    1043    11981092 :     t = CL_scale_t( CL_sub( rs1, rs3 ), C54 );
    1044    11981092 :     rs1 = CL_add( rs1, rs3 );
    1045    11981092 :     y[5] = CL_add( x[5], rs1 );
    1046    11981092 :     rs1 = CL_add( y[5], ( CL_shl( CL_scale_t( rs1, C55 ), 1 ) ) );
    1047    11981092 :     rs3 = CL_sub( rs1, t );
    1048    11981092 :     rs1 = CL_add( rs1, t );
    1049    11981092 :     t = CL_scale_t( CL_add( rs4, rs2 ), C51 );
    1050    11981092 :     rs4 = CL_add( t, CL_shl( CL_scale_t( rs4, C52 ), 1 ) );
    1051    11981092 :     rs2 = CL_add( t, CL_scale_t( rs2, C53 ) );
    1052             : 
    1053             :     /* combination */
    1054    11981092 :     y[6] = CL_msu_j( rs1, rs2 );
    1055    11981092 :     y[9] = CL_mac_j( rs1, rs2 );
    1056    11981092 :     y[7] = CL_mac_j( rs3, rs4 );
    1057    11981092 :     y[8] = CL_msu_j( rs3, rs4 );
    1058             : 
    1059             : 
    1060             :     /* 3. FFT5 stage */
    1061    11981092 :     rs1 = CL_add( x[11], x[14] );
    1062    11981092 :     rs4 = CL_sub( x[11], x[14] );
    1063    11981092 :     rs3 = CL_add( x[12], x[13] );
    1064    11981092 :     rs2 = CL_sub( x[12], x[13] );
    1065    11981092 :     t = CL_scale_t( CL_sub( rs1, rs3 ), C54 );
    1066    11981092 :     rs1 = CL_add( rs1, rs3 );
    1067    11981092 :     y[10] = CL_add( x[10], rs1 );
    1068    11981092 :     rs1 = CL_add( y[10], ( CL_shl( CL_scale_t( rs1, C55 ), 1 ) ) );
    1069    11981092 :     rs3 = CL_sub( rs1, t );
    1070    11981092 :     rs1 = CL_add( rs1, t );
    1071    11981092 :     t = CL_scale_t( CL_add( rs4, rs2 ), C51 );
    1072    11981092 :     rs4 = CL_add( t, CL_shl( CL_scale_t( rs4, C52 ), 1 ) );
    1073    11981092 :     rs2 = CL_add( t, CL_scale_t( rs2, C53 ) );
    1074             : 
    1075             :     /* combination */
    1076    11981092 :     y[11] = CL_msu_j( rs1, rs2 );
    1077    11981092 :     y[14] = CL_mac_j( rs1, rs2 );
    1078    11981092 :     y[12] = CL_mac_j( rs3, rs4 );
    1079    11981092 :     y[13] = CL_msu_j( rs3, rs4 );
    1080             :     /*for (i=10; i<15; i++)
    1081             :     {
    1082             :     printf("%d,\t %d,\t",y[i].re, y[i].im);
    1083             :     }
    1084             :     printf("\n\n");*/
    1085             : 
    1086             : 
    1087             :     /* 1. FFT3 stage */
    1088             :     /* real part */
    1089    11981092 :     rs1 = CL_add( y[5], y[10] );
    1090    11981092 :     rs2 = CL_scale_t( CL_sub( y[5], y[10] ), C31 );
    1091    11981092 :     z[0] = CL_add( y[0], rs1 );
    1092    11981092 :     rs1 = CL_sub( y[0], CL_shr( rs1, 1 ) );
    1093             : 
    1094    11981092 :     z[10] = CL_mac_j( rs1, rs2 );
    1095    11981092 :     z[5] = CL_msu_j( rs1, rs2 );
    1096             : 
    1097             :     /* 2. FFT3 stage */
    1098    11981092 :     rs1 = CL_add( y[6], y[11] );
    1099    11981092 :     rs2 = CL_scale_t( CL_sub( y[6], y[11] ), C31 );
    1100    11981092 :     z[6] = CL_add( y[1], rs1 );
    1101    11981092 :     rs1 = CL_sub( y[1], CL_shr( rs1, 1 ) );
    1102             : 
    1103    11981092 :     z[1] = CL_mac_j( rs1, rs2 );
    1104    11981092 :     z[11] = CL_msu_j( rs1, rs2 );
    1105             : 
    1106             : 
    1107             :     /* 3. FFT3 stage */
    1108    11981092 :     rs1 = CL_add( y[7], y[12] );
    1109    11981092 :     rs2 = CL_scale_t( CL_sub( y[7], y[12] ), C31 );
    1110    11981092 :     z[12] = CL_add( y[2], rs1 );
    1111    11981092 :     rs1 = CL_sub( y[2], CL_shr( rs1, 1 ) );
    1112             : 
    1113    11981092 :     z[7] = CL_mac_j( rs1, rs2 );
    1114    11981092 :     z[2] = CL_msu_j( rs1, rs2 );
    1115             : 
    1116             : 
    1117             :     /* 4. FFT3 stage */
    1118    11981092 :     rs1 = CL_add( y[8], y[13] );
    1119    11981092 :     rs2 = CL_scale_t( CL_sub( y[8], y[13] ), C31 );
    1120    11981092 :     z[3] = CL_add( y[3], rs1 );
    1121    11981092 :     rs1 = CL_sub( y[3], CL_shr( rs1, 1 ) );
    1122             : 
    1123    11981092 :     z[13] = CL_mac_j( rs1, rs2 );
    1124    11981092 :     z[8] = CL_msu_j( rs1, rs2 );
    1125             : 
    1126             : 
    1127             :     /* 5. FFT3 stage */
    1128    11981092 :     rs1 = CL_add( y[9], y[14] );
    1129    11981092 :     rs2 = CL_scale_t( CL_sub( y[9], y[14] ), C31 );
    1130    11981092 :     z[9] = CL_add( y[4], rs1 );
    1131    11981092 :     rs1 = CL_sub( y[4], CL_shr( rs1, 1 ) );
    1132             : 
    1133    11981092 :     z[4] = CL_mac_j( rs1, rs2 );
    1134    11981092 :     z[14] = CL_msu_j( rs1, rs2 );
    1135             : 
    1136             :     /*for (i=0; i<15; i++)
    1137             :     printf("%d,\t %d,\t",z[i].re, z[i].im);
    1138             :     printf("\n\n");*/
    1139             : 
    1140             : 
    1141             :     /* 2. FFT15 stage */
    1142             : 
    1143    11981092 :     x[0] = CL_shr( inp[15], SCALEFACTOR30_1 ); // Qx - 5
    1144    11981092 :     x[1] = CL_shr( inp[3], SCALEFACTOR30_1 );
    1145    11981092 :     x[2] = CL_shr( inp[21], SCALEFACTOR30_1 );
    1146    11981092 :     x[3] = CL_shr( inp[9], SCALEFACTOR30_1 );
    1147    11981092 :     x[4] = CL_shr( inp[27], SCALEFACTOR30_1 );
    1148             : 
    1149    11981092 :     x[5] = CL_shr( inp[5], SCALEFACTOR30_1 ); // Qx - 5
    1150    11981092 :     x[6] = CL_shr( inp[23], SCALEFACTOR30_1 );
    1151    11981092 :     x[7] = CL_shr( inp[11], SCALEFACTOR30_1 );
    1152    11981092 :     x[8] = CL_shr( inp[29], SCALEFACTOR30_1 );
    1153    11981092 :     x[9] = CL_shr( inp[17], SCALEFACTOR30_1 );
    1154             : 
    1155    11981092 :     x[10] = CL_shr( inp[25], SCALEFACTOR30_1 ); // Qx - 5
    1156    11981092 :     x[11] = CL_shr( inp[13], SCALEFACTOR30_1 );
    1157    11981092 :     x[12] = CL_shr( inp[1], SCALEFACTOR30_1 );
    1158    11981092 :     x[13] = CL_shr( inp[19], SCALEFACTOR30_1 );
    1159    11981092 :     x[14] = CL_shr( inp[7], SCALEFACTOR30_1 );
    1160             : 
    1161             :     /* 1. FFT5 stage */
    1162    11981092 :     rs1 = CL_add( x[1], x[4] );
    1163    11981092 :     rs4 = CL_sub( x[1], x[4] );
    1164    11981092 :     rs3 = CL_add( x[2], x[3] );
    1165    11981092 :     rs2 = CL_sub( x[2], x[3] );
    1166    11981092 :     t = CL_scale_t( CL_sub( rs1, rs3 ), C54 );
    1167    11981092 :     rs1 = CL_add( rs1, rs3 );
    1168    11981092 :     y[0] = CL_add( x[0], rs1 );
    1169    11981092 :     rs1 = CL_add( y[0], ( CL_shl( CL_scale_t( rs1, C55 ), 1 ) ) );
    1170    11981092 :     rs3 = CL_sub( rs1, t );
    1171    11981092 :     rs1 = CL_add( rs1, t );
    1172    11981092 :     t = CL_scale_t( CL_add( rs4, rs2 ), C51 );
    1173    11981092 :     rs4 = CL_add( t, CL_shl( CL_scale_t( rs4, C52 ), 1 ) );
    1174    11981092 :     rs2 = CL_add( t, CL_scale_t( rs2, C53 ) );
    1175             : 
    1176             :     /* combination */
    1177    11981092 :     y[1] = CL_msu_j( rs1, rs2 );
    1178    11981092 :     y[4] = CL_mac_j( rs1, rs2 );
    1179    11981092 :     y[2] = CL_mac_j( rs3, rs4 );
    1180    11981092 :     y[3] = CL_msu_j( rs3, rs4 );
    1181             : 
    1182             : 
    1183             :     /* 2. FFT5 stage */
    1184    11981092 :     rs1 = CL_add( x[6], x[9] );
    1185    11981092 :     rs4 = CL_sub( x[6], x[9] );
    1186    11981092 :     rs3 = CL_add( x[7], x[8] );
    1187    11981092 :     rs2 = CL_sub( x[7], x[8] );
    1188    11981092 :     t = CL_scale_t( CL_sub( rs1, rs3 ), C54 );
    1189    11981092 :     rs1 = CL_add( rs1, rs3 );
    1190    11981092 :     y[5] = CL_add( x[5], rs1 );
    1191    11981092 :     rs1 = CL_add( y[5], ( CL_shl( CL_scale_t( rs1, C55 ), 1 ) ) );
    1192    11981092 :     rs3 = CL_sub( rs1, t );
    1193    11981092 :     rs1 = CL_add( rs1, t );
    1194    11981092 :     t = CL_scale_t( CL_add( rs4, rs2 ), C51 );
    1195    11981092 :     rs4 = CL_add( t, CL_shl( CL_scale_t( rs4, C52 ), 1 ) );
    1196    11981092 :     rs2 = CL_add( t, CL_scale_t( rs2, C53 ) );
    1197             : 
    1198             :     /* combination */
    1199    11981092 :     y[6] = CL_msu_j( rs1, rs2 );
    1200    11981092 :     y[9] = CL_mac_j( rs1, rs2 );
    1201    11981092 :     y[7] = CL_mac_j( rs3, rs4 );
    1202    11981092 :     y[8] = CL_msu_j( rs3, rs4 );
    1203             : 
    1204             : 
    1205             :     /* 3. FFT5 stage */
    1206    11981092 :     rs1 = CL_add( x[11], x[14] );
    1207    11981092 :     rs4 = CL_sub( x[11], x[14] );
    1208    11981092 :     rs3 = CL_add( x[12], x[13] );
    1209    11981092 :     rs2 = CL_sub( x[12], x[13] );
    1210    11981092 :     t = CL_scale_t( CL_sub( rs1, rs3 ), C54 );
    1211    11981092 :     rs1 = CL_add( rs1, rs3 );
    1212    11981092 :     y[10] = CL_add( x[10], rs1 );
    1213    11981092 :     rs1 = CL_add( y[10], ( CL_shl( CL_scale_t( rs1, C55 ), 1 ) ) );
    1214    11981092 :     rs3 = CL_sub( rs1, t );
    1215    11981092 :     rs1 = CL_add( rs1, t );
    1216    11981092 :     t = CL_scale_t( CL_add( rs4, rs2 ), C51 );
    1217    11981092 :     rs4 = CL_add( t, CL_shl( CL_scale_t( rs4, C52 ), 1 ) );
    1218    11981092 :     rs2 = CL_add( t, CL_scale_t( rs2, C53 ) );
    1219             : 
    1220             :     /* combination */
    1221    11981092 :     y[11] = CL_msu_j( rs1, rs2 );
    1222    11981092 :     y[14] = CL_mac_j( rs1, rs2 );
    1223    11981092 :     y[12] = CL_mac_j( rs3, rs4 );
    1224    11981092 :     y[13] = CL_msu_j( rs3, rs4 );
    1225             :     /*for (i=10; i<15; i++)
    1226             :     {
    1227             :     printf("%d,\t %d,\t",y[i].re, y[i].im);
    1228             :     }
    1229             :     printf("\n\n");*/
    1230             : 
    1231             : 
    1232             :     /* 1. FFT3 stage */
    1233             :     /* real part */
    1234    11981092 :     rs1 = CL_add( y[5], y[10] );
    1235    11981092 :     rs2 = CL_scale_t( CL_sub( y[5], y[10] ), C31 );
    1236    11981092 :     z[15] = CL_add( y[0], rs1 );
    1237    11981092 :     rs1 = CL_sub( y[0], CL_shr( rs1, 1 ) );
    1238             : 
    1239    11981092 :     z[25] = CL_mac_j( rs1, rs2 );
    1240    11981092 :     z[20] = CL_msu_j( rs1, rs2 );
    1241             : 
    1242             :     /* 2. FFT3 stage */
    1243    11981092 :     rs1 = CL_add( y[6], y[11] );
    1244    11981092 :     rs2 = CL_scale_t( CL_sub( y[6], y[11] ), C31 );
    1245    11981092 :     z[21] = CL_add( y[1], rs1 );
    1246    11981092 :     rs1 = CL_sub( y[1], CL_shr( rs1, 1 ) );
    1247             : 
    1248    11981092 :     z[16] = CL_mac_j( rs1, rs2 );
    1249    11981092 :     z[26] = CL_msu_j( rs1, rs2 );
    1250             : 
    1251             : 
    1252             :     /* 3. FFT3 stage */
    1253    11981092 :     rs1 = CL_add( y[7], y[12] );
    1254    11981092 :     rs2 = CL_scale_t( CL_sub( y[7], y[12] ), C31 );
    1255    11981092 :     z[27] = CL_add( y[2], rs1 );
    1256    11981092 :     rs1 = CL_sub( y[2], CL_shr( rs1, 1 ) );
    1257             : 
    1258    11981092 :     z[22] = CL_mac_j( rs1, rs2 );
    1259    11981092 :     z[17] = CL_msu_j( rs1, rs2 );
    1260             : 
    1261             : 
    1262             :     /* 4. FFT3 stage */
    1263    11981092 :     rs1 = CL_add( y[8], y[13] );
    1264    11981092 :     rs2 = CL_scale_t( CL_sub( y[8], y[13] ), C31 );
    1265    11981092 :     z[18] = CL_add( y[3], rs1 );
    1266    11981092 :     rs1 = CL_sub( y[3], CL_shr( rs1, 1 ) );
    1267             : 
    1268    11981092 :     z[28] = CL_mac_j( rs1, rs2 );
    1269    11981092 :     z[23] = CL_msu_j( rs1, rs2 );
    1270             : 
    1271             : 
    1272             :     /* 5. FFT3 stage */
    1273    11981092 :     rs1 = CL_add( y[9], y[14] );
    1274    11981092 :     rs2 = CL_scale_t( CL_sub( y[9], y[14] ), C31 );
    1275    11981092 :     z[24] = CL_add( y[4], rs1 );
    1276    11981092 :     rs1 = CL_sub( y[4], CL_shr( rs1, 1 ) );
    1277             : 
    1278    11981092 :     z[19] = CL_mac_j( rs1, rs2 );
    1279    11981092 :     z[29] = CL_msu_j( rs1, rs2 );
    1280             : 
    1281             :     /*for (i=0; i<30; i++)
    1282             :     printf("%d,\t %d,\t",z[i].re, z[i].im);
    1283             :     printf("\n\n");*/
    1284             : 
    1285             : 
    1286             :     /* 1. FFT2 stage */
    1287    11981092 :     rs1 = CL_shr( z[0], SCALEFACTOR30_2 );
    1288    11981092 :     rs2 = CL_shr( z[15], SCALEFACTOR30_2 );
    1289    11981092 :     *l = CL_add( rs1, rs2 );
    1290    11981092 :     *h = CL_sub( rs1, rs2 );
    1291    11981092 :     l += 1;
    1292    11981092 :     h += 1;
    1293             : 
    1294             :     /* 2. FFT2 stage */
    1295    11981092 :     rs1 = CL_shr( z[8], SCALEFACTOR30_2 );
    1296    11981092 :     rs2 = CL_shr( z[23], SCALEFACTOR30_2 );
    1297    11981092 :     *h = CL_add( rs1, rs2 );
    1298    11981092 :     *l = CL_sub( rs1, rs2 );
    1299    11981092 :     l += 1;
    1300    11981092 :     h += 1;
    1301             : 
    1302             : 
    1303             :     /* 3. FFT2 stage */
    1304    11981092 :     rs1 = CL_shr( z[1], SCALEFACTOR30_2 );
    1305    11981092 :     rs2 = CL_shr( z[16], SCALEFACTOR30_2 );
    1306    11981092 :     *l = CL_add( rs1, rs2 );
    1307    11981092 :     *h = CL_sub( rs1, rs2 );
    1308    11981092 :     l += 1;
    1309    11981092 :     h += 1;
    1310             : 
    1311             : 
    1312             :     /* 4. FFT2 stage */
    1313    11981092 :     rs1 = CL_shr( z[9], SCALEFACTOR30_2 );
    1314    11981092 :     rs2 = CL_shr( z[24], SCALEFACTOR30_2 );
    1315    11981092 :     *h = CL_add( rs1, rs2 );
    1316    11981092 :     *l = CL_sub( rs1, rs2 );
    1317    11981092 :     l += 1;
    1318    11981092 :     h += 1;
    1319             : 
    1320             :     /* 5. FFT2 stage */
    1321    11981092 :     rs1 = CL_shr( z[2], SCALEFACTOR30_2 );
    1322    11981092 :     rs2 = CL_shr( z[17], SCALEFACTOR30_2 );
    1323    11981092 :     *l = CL_add( rs1, rs2 );
    1324    11981092 :     *h = CL_sub( rs1, rs2 );
    1325    11981092 :     l += 1;
    1326    11981092 :     h += 1;
    1327             : 
    1328             :     /* 6. FFT2 stage */
    1329    11981092 :     rs1 = CL_shr( z[10], SCALEFACTOR30_2 );
    1330    11981092 :     rs2 = CL_shr( z[25], SCALEFACTOR30_2 );
    1331    11981092 :     *h = CL_add( rs1, rs2 );
    1332    11981092 :     *l = CL_sub( rs1, rs2 );
    1333    11981092 :     l += 1;
    1334    11981092 :     h += 1;
    1335             : 
    1336             :     /* 7. FFT2 stage */
    1337    11981092 :     rs1 = CL_shr( z[3], SCALEFACTOR30_2 );
    1338    11981092 :     rs2 = CL_shr( z[18], SCALEFACTOR30_2 );
    1339    11981092 :     *l = CL_add( rs1, rs2 );
    1340    11981092 :     *h = CL_sub( rs1, rs2 );
    1341    11981092 :     l += 1;
    1342    11981092 :     h += 1;
    1343             : 
    1344             :     /* 8. FFT2 stage */
    1345    11981092 :     rs1 = CL_shr( z[11], SCALEFACTOR30_2 );
    1346    11981092 :     rs2 = CL_shr( z[26], SCALEFACTOR30_2 );
    1347    11981092 :     *h = CL_add( rs1, rs2 );
    1348    11981092 :     *l = CL_sub( rs1, rs2 );
    1349    11981092 :     l += 1;
    1350    11981092 :     h += 1;
    1351             : 
    1352             :     /* 9. FFT2 stage */
    1353    11981092 :     rs1 = CL_shr( z[4], SCALEFACTOR30_2 );
    1354    11981092 :     rs2 = CL_shr( z[19], SCALEFACTOR30_2 );
    1355    11981092 :     *l = CL_add( rs1, rs2 );
    1356    11981092 :     *h = CL_sub( rs1, rs2 );
    1357    11981092 :     l += 1;
    1358    11981092 :     h += 1;
    1359             : 
    1360             :     /* 10. FFT2 stage */
    1361    11981092 :     rs1 = CL_shr( z[12], SCALEFACTOR30_2 );
    1362    11981092 :     rs2 = CL_shr( z[27], SCALEFACTOR30_2 );
    1363    11981092 :     *h = CL_add( rs1, rs2 );
    1364    11981092 :     *l = CL_sub( rs1, rs2 );
    1365    11981092 :     l += 1;
    1366    11981092 :     h += 1;
    1367             : 
    1368             :     /* 11. FFT2 stage */
    1369    11981092 :     rs1 = CL_shr( z[5], SCALEFACTOR30_2 );
    1370    11981092 :     rs2 = CL_shr( z[20], SCALEFACTOR30_2 );
    1371    11981092 :     *l = CL_add( rs1, rs2 );
    1372    11981092 :     *h = CL_sub( rs1, rs2 );
    1373    11981092 :     l += 1;
    1374    11981092 :     h += 1;
    1375             : 
    1376             :     /* 12. FFT2 stage */
    1377    11981092 :     rs1 = CL_shr( z[13], SCALEFACTOR30_2 );
    1378    11981092 :     rs2 = CL_shr( z[28], SCALEFACTOR30_2 );
    1379    11981092 :     *h = CL_add( rs1, rs2 );
    1380    11981092 :     *l = CL_sub( rs1, rs2 );
    1381    11981092 :     l += 1;
    1382    11981092 :     h += 1;
    1383             : 
    1384             :     /* 13. FFT2 stage */
    1385    11981092 :     rs1 = CL_shr( z[6], SCALEFACTOR30_2 );
    1386    11981092 :     rs2 = CL_shr( z[21], SCALEFACTOR30_2 );
    1387    11981092 :     *l = CL_add( rs1, rs2 );
    1388    11981092 :     *h = CL_sub( rs1, rs2 );
    1389    11981092 :     l += 1;
    1390    11981092 :     h += 1;
    1391             : 
    1392             :     /* 14. FFT2 stage */
    1393    11981092 :     rs1 = CL_shr( z[14], SCALEFACTOR30_2 );
    1394    11981092 :     rs2 = CL_shr( z[29], SCALEFACTOR30_2 );
    1395    11981092 :     *h = CL_add( rs1, rs2 );
    1396    11981092 :     *l = CL_sub( rs1, rs2 );
    1397    11981092 :     l += 1;
    1398    11981092 :     h += 1;
    1399             : 
    1400             :     /* 15. FFT2 stage */
    1401    11981092 :     rs1 = CL_shr( z[7], SCALEFACTOR30_2 );
    1402    11981092 :     rs2 = CL_shr( z[22], SCALEFACTOR30_2 );
    1403    11981092 :     *l = CL_add( rs1, rs2 );
    1404    11981092 :     *h = CL_sub( rs1, rs2 );
    1405    11981092 :     l += 1;
    1406    11981092 :     h += 1;
    1407             : 
    1408             : #ifdef WMOPS
    1409             :     multiCounter[currCounter].CL_move += 30;
    1410             : #endif
    1411    11981092 : }
    1412             : 
    1413             : /**
    1414             :  * \brief    Function performs a complex 32-point FFT
    1415             :  *           The FFT is performed inplace. The result of the FFT
    1416             :  *           is scaled by SCALEFACTOR32 bits.
    1417             :  *
    1418             :  *           WOPS with 32x16 bit multiplications:  752 cycles
    1419             :  *
    1420             :  * \param    [i/o] re    real input / output
    1421             :  * \param    [i/o] im    imag input / output
    1422             :  * \param    [i  ] s     stride real and imag input / output
    1423             :  *
    1424             :  * \return   void
    1425             :  */
    1426             : 
    1427             : 
    1428      130648 : static void fft32_with_cmplx_data( cmplx *inp /*Qx*/ )
    1429             : {
    1430             :     cmplx x[32], y[32], t[32], s[32], temp, temp1;
    1431      130648 :     const cmplx_s *pRotVector_32 = (const cmplx_s *) RotVector_32;
    1432             : 
    1433             :     /* 1. FFT8 stage */
    1434             : 
    1435      130648 :     x[0] = CL_shr( inp[0], SCALEFACTOR32_1 ); // Qx - 5
    1436      130648 :     x[1] = CL_shr( inp[4], SCALEFACTOR32_1 );
    1437      130648 :     x[2] = CL_shr( inp[8], SCALEFACTOR32_1 );
    1438      130648 :     x[3] = CL_shr( inp[12], SCALEFACTOR32_1 );
    1439      130648 :     x[4] = CL_shr( inp[16], SCALEFACTOR32_1 );
    1440      130648 :     x[5] = CL_shr( inp[20], SCALEFACTOR32_1 );
    1441      130648 :     x[6] = CL_shr( inp[24], SCALEFACTOR32_1 );
    1442      130648 :     x[7] = CL_shr( inp[28], SCALEFACTOR32_1 );
    1443             : 
    1444             : 
    1445      130648 :     t[0] = CL_add( x[0], x[4] );
    1446      130648 :     t[1] = CL_sub( x[0], x[4] );
    1447      130648 :     t[2] = CL_add( x[1], x[5] );
    1448      130648 :     t[3] = CL_sub( x[1], x[5] );
    1449      130648 :     t[4] = CL_add( x[2], x[6] );
    1450      130648 :     t[5] = CL_sub( x[2], x[6] );
    1451      130648 :     t[6] = CL_add( x[3], x[7] );
    1452      130648 :     t[7] = CL_sub( x[3], x[7] );
    1453             : 
    1454             :     /* Pre-additions and core multiplications */
    1455             : 
    1456      130648 :     s[0] = CL_add( t[0], t[4] );
    1457      130648 :     s[2] = CL_sub( t[0], t[4] );
    1458      130648 :     s[4] = CL_mac_j( t[1], t[5] );
    1459      130648 :     s[5] = CL_msu_j( t[1], t[5] );
    1460      130648 :     s[1] = CL_add( t[2], t[6] );
    1461      130648 :     s[3] = CL_sub( t[2], t[6] );
    1462      130648 :     s[3] = CL_mul_j( s[3] );
    1463             : 
    1464      130648 :     temp = CL_add( t[3], t[7] );
    1465      130648 :     temp1 = CL_sub( t[3], t[7] );
    1466      130648 :     s[6] = CL_scale_t( CL_msu_j( temp1, temp ), C81 );
    1467      130648 :     s[7] = CL_dscale_t( CL_swap_real_imag( CL_msu_j( temp, temp1 ) ), C81, C82 );
    1468             : 
    1469             : 
    1470      130648 :     y[0] = CL_add( s[0], s[1] );
    1471      130648 :     y[4] = CL_sub( s[0], s[1] );
    1472      130648 :     y[2] = CL_sub( s[2], s[3] );
    1473      130648 :     y[6] = CL_add( s[2], s[3] );
    1474      130648 :     y[3] = CL_add( s[4], s[7] );
    1475      130648 :     y[7] = CL_sub( s[4], s[7] );
    1476      130648 :     y[1] = CL_add( s[5], s[6] );
    1477      130648 :     y[5] = CL_sub( s[5], s[6] );
    1478             : 
    1479             :     /* 2. FFT8 stage */
    1480             : 
    1481      130648 :     x[0] = CL_shr( inp[1], SCALEFACTOR32_1 ); // Qx - 5
    1482      130648 :     x[1] = CL_shr( inp[5], SCALEFACTOR32_1 );
    1483      130648 :     x[2] = CL_shr( inp[9], SCALEFACTOR32_1 );
    1484      130648 :     x[3] = CL_shr( inp[13], SCALEFACTOR32_1 );
    1485      130648 :     x[4] = CL_shr( inp[17], SCALEFACTOR32_1 );
    1486      130648 :     x[5] = CL_shr( inp[21], SCALEFACTOR32_1 );
    1487      130648 :     x[6] = CL_shr( inp[25], SCALEFACTOR32_1 );
    1488      130648 :     x[7] = CL_shr( inp[29], SCALEFACTOR32_1 );
    1489             : 
    1490             : 
    1491      130648 :     t[0] = CL_add( x[0], x[4] );
    1492      130648 :     t[1] = CL_sub( x[0], x[4] );
    1493      130648 :     t[2] = CL_add( x[1], x[5] );
    1494      130648 :     t[3] = CL_sub( x[1], x[5] );
    1495      130648 :     t[4] = CL_add( x[2], x[6] );
    1496      130648 :     t[5] = CL_sub( x[2], x[6] );
    1497      130648 :     t[6] = CL_add( x[3], x[7] );
    1498      130648 :     t[7] = CL_sub( x[3], x[7] );
    1499             : 
    1500             :     /* Pre-additions and core multiplications */
    1501             : 
    1502      130648 :     s[0] = CL_add( t[0], t[4] );
    1503      130648 :     s[2] = CL_sub( t[0], t[4] );
    1504      130648 :     s[4] = CL_mac_j( t[1], t[5] );
    1505      130648 :     s[5] = CL_msu_j( t[1], t[5] );
    1506      130648 :     s[1] = CL_add( t[2], t[6] );
    1507      130648 :     s[3] = CL_sub( t[2], t[6] );
    1508      130648 :     s[3] = CL_mul_j( s[3] );
    1509             : 
    1510      130648 :     temp = CL_add( t[3], t[7] );
    1511      130648 :     temp1 = CL_sub( t[3], t[7] );
    1512      130648 :     s[6] = CL_scale_t( CL_msu_j( temp1, temp ), C81 );
    1513      130648 :     s[7] = CL_dscale_t( CL_swap_real_imag( CL_msu_j( temp, temp1 ) ), C81, C82 );
    1514             : 
    1515             :     /* Post-additions */
    1516             : 
    1517      130648 :     y[8] = CL_add( s[0], s[1] );
    1518      130648 :     y[12] = CL_sub( s[0], s[1] );
    1519      130648 :     y[10] = CL_sub( s[2], s[3] );
    1520      130648 :     y[14] = CL_add( s[2], s[3] );
    1521      130648 :     y[11] = CL_add( s[4], s[7] );
    1522      130648 :     y[15] = CL_sub( s[4], s[7] );
    1523      130648 :     y[9] = CL_add( s[5], s[6] );
    1524      130648 :     y[13] = CL_sub( s[5], s[6] );
    1525             : 
    1526             :     /* 3. FFT8 stage */
    1527             : 
    1528      130648 :     x[0] = CL_shr( inp[2], SCALEFACTOR32_1 ); // Qx - 5
    1529      130648 :     x[1] = CL_shr( inp[6], SCALEFACTOR32_1 );
    1530      130648 :     x[2] = CL_shr( inp[10], SCALEFACTOR32_1 );
    1531      130648 :     x[3] = CL_shr( inp[14], SCALEFACTOR32_1 );
    1532      130648 :     x[4] = CL_shr( inp[18], SCALEFACTOR32_1 );
    1533      130648 :     x[5] = CL_shr( inp[22], SCALEFACTOR32_1 );
    1534      130648 :     x[6] = CL_shr( inp[26], SCALEFACTOR32_1 );
    1535      130648 :     x[7] = CL_shr( inp[30], SCALEFACTOR32_1 );
    1536             : 
    1537             : 
    1538      130648 :     t[0] = CL_add( x[0], x[4] );
    1539      130648 :     t[1] = CL_sub( x[0], x[4] );
    1540      130648 :     t[2] = CL_add( x[1], x[5] );
    1541      130648 :     t[3] = CL_sub( x[1], x[5] );
    1542      130648 :     t[4] = CL_add( x[2], x[6] );
    1543      130648 :     t[5] = CL_sub( x[2], x[6] );
    1544      130648 :     t[6] = CL_add( x[3], x[7] );
    1545      130648 :     t[7] = CL_sub( x[3], x[7] );
    1546             : 
    1547             :     /* Pre-additions and core multiplications */
    1548             : 
    1549      130648 :     s[0] = CL_add( t[0], t[4] );
    1550      130648 :     s[2] = CL_sub( t[0], t[4] );
    1551      130648 :     s[4] = CL_mac_j( t[1], t[5] );
    1552      130648 :     s[5] = CL_msu_j( t[1], t[5] );
    1553      130648 :     s[1] = CL_add( t[2], t[6] );
    1554      130648 :     s[3] = CL_sub( t[2], t[6] );
    1555      130648 :     s[3] = CL_mul_j( s[3] );
    1556             : 
    1557      130648 :     temp = CL_add( t[3], t[7] );
    1558      130648 :     temp1 = CL_sub( t[3], t[7] );
    1559      130648 :     s[6] = CL_scale_t( CL_msu_j( temp1, temp ), C81 );
    1560      130648 :     s[7] = CL_dscale_t( CL_swap_real_imag( CL_msu_j( temp, temp1 ) ), C81, C82 );
    1561             : 
    1562             :     /* Post-additions */
    1563             : 
    1564      130648 :     y[16] = CL_add( s[0], s[1] );
    1565      130648 :     y[20] = CL_sub( s[0], s[1] );
    1566      130648 :     y[18] = CL_sub( s[2], s[3] );
    1567      130648 :     y[22] = CL_add( s[2], s[3] );
    1568      130648 :     y[19] = CL_add( s[4], s[7] );
    1569      130648 :     y[23] = CL_sub( s[4], s[7] );
    1570      130648 :     y[17] = CL_add( s[5], s[6] );
    1571      130648 :     y[21] = CL_sub( s[5], s[6] );
    1572             : 
    1573             :     /* 4. FFT8 stage */
    1574             : 
    1575      130648 :     x[0] = CL_shr( inp[3], SCALEFACTOR32_1 ); // Qx - 5
    1576      130648 :     x[1] = CL_shr( inp[7], SCALEFACTOR32_1 );
    1577      130648 :     x[2] = CL_shr( inp[11], SCALEFACTOR32_1 );
    1578      130648 :     x[3] = CL_shr( inp[15], SCALEFACTOR32_1 );
    1579      130648 :     x[4] = CL_shr( inp[19], SCALEFACTOR32_1 );
    1580      130648 :     x[5] = CL_shr( inp[23], SCALEFACTOR32_1 );
    1581      130648 :     x[6] = CL_shr( inp[27], SCALEFACTOR32_1 );
    1582      130648 :     x[7] = CL_shr( inp[31], SCALEFACTOR32_1 );
    1583             : 
    1584             : 
    1585      130648 :     t[0] = CL_add( x[0], x[4] );
    1586      130648 :     t[1] = CL_sub( x[0], x[4] );
    1587      130648 :     t[2] = CL_add( x[1], x[5] );
    1588      130648 :     t[3] = CL_sub( x[1], x[5] );
    1589      130648 :     t[4] = CL_add( x[2], x[6] );
    1590      130648 :     t[5] = CL_sub( x[2], x[6] );
    1591      130648 :     t[6] = CL_add( x[3], x[7] );
    1592      130648 :     t[7] = CL_sub( x[3], x[7] );
    1593             : 
    1594             : 
    1595             :     /* Pre-additions and core multiplications */
    1596             : 
    1597      130648 :     s[0] = CL_add( t[0], t[4] );
    1598      130648 :     s[2] = CL_sub( t[0], t[4] );
    1599      130648 :     s[4] = CL_mac_j( t[1], t[5] );
    1600      130648 :     s[5] = CL_msu_j( t[1], t[5] );
    1601      130648 :     s[1] = CL_add( t[2], t[6] );
    1602      130648 :     s[3] = CL_sub( t[2], t[6] );
    1603      130648 :     s[3] = CL_mul_j( s[3] );
    1604             : 
    1605      130648 :     temp = CL_add( t[3], t[7] );
    1606      130648 :     temp1 = CL_sub( t[3], t[7] );
    1607      130648 :     s[6] = CL_scale_t( CL_msu_j( temp1, temp ), C81 );
    1608      130648 :     s[7] = CL_dscale_t( CL_swap_real_imag( CL_msu_j( temp, temp1 ) ), C81, C82 );
    1609             : 
    1610             :     /* Post-additions */
    1611             : 
    1612      130648 :     y[24] = CL_add( s[0], s[1] );
    1613      130648 :     y[28] = CL_sub( s[0], s[1] );
    1614      130648 :     y[26] = CL_sub( s[2], s[3] );
    1615      130648 :     y[30] = CL_add( s[2], s[3] );
    1616      130648 :     y[27] = CL_add( s[4], s[7] );
    1617      130648 :     y[31] = CL_sub( s[4], s[7] );
    1618      130648 :     y[25] = CL_add( s[5], s[6] );
    1619      130648 :     y[29] = CL_sub( s[5], s[6] );
    1620             : 
    1621             : 
    1622             :     /* apply twiddle factors */
    1623      130648 :     y[0] = CL_shr( y[0], SCALEFACTOR32_2 );
    1624      130648 :     y[1] = CL_shr( y[1], SCALEFACTOR32_2 );
    1625      130648 :     y[2] = CL_shr( y[2], SCALEFACTOR32_2 );
    1626      130648 :     y[3] = CL_shr( y[3], SCALEFACTOR32_2 );
    1627      130648 :     y[4] = CL_shr( y[4], SCALEFACTOR32_2 );
    1628      130648 :     y[5] = CL_shr( y[5], SCALEFACTOR32_2 );
    1629      130648 :     y[6] = CL_shr( y[6], SCALEFACTOR32_2 );
    1630      130648 :     y[7] = CL_shr( y[7], SCALEFACTOR32_2 );
    1631      130648 :     y[8] = CL_shr( y[8], SCALEFACTOR32_2 );
    1632      130648 :     y[16] = CL_shr( y[16], SCALEFACTOR32_2 );
    1633      130648 :     y[24] = CL_shr( y[24], SCALEFACTOR32_2 );
    1634      130648 :     y[20] = CL_shr( y[20], SCALEFACTOR32_2 );
    1635             : 
    1636             : 
    1637      130648 :     y[9] = CL_mult_32x16( ( CL_shr( y[9], 1 ) ), pRotVector_32[0] );
    1638      130648 :     y[10] = CL_mult_32x16( ( CL_shr( y[10], 1 ) ), pRotVector_32[1] );
    1639      130648 :     y[11] = CL_mult_32x16( ( CL_shr( y[11], 1 ) ), pRotVector_32[2] );
    1640      130648 :     y[12] = CL_mult_32x16( ( CL_shr( y[12], 1 ) ), pRotVector_32[3] );
    1641      130648 :     y[13] = CL_mult_32x16( ( CL_shr( y[13], 1 ) ), pRotVector_32[4] );
    1642      130648 :     y[14] = CL_mult_32x16( ( CL_shr( y[14], 1 ) ), pRotVector_32[5] );
    1643      130648 :     y[15] = CL_mult_32x16( ( CL_shr( y[15], 1 ) ), pRotVector_32[6] );
    1644      130648 :     y[17] = CL_mult_32x16( ( CL_shr( y[17], 1 ) ), pRotVector_32[7] );
    1645      130648 :     y[18] = CL_mult_32x16( ( CL_shr( y[18], 1 ) ), pRotVector_32[8] );
    1646      130648 :     y[19] = CL_mult_32x16( ( CL_shr( y[19], 1 ) ), pRotVector_32[9] );
    1647      130648 :     y[21] = CL_mult_32x16( ( CL_shr( y[21], 1 ) ), pRotVector_32[10] );
    1648      130648 :     y[22] = CL_mult_32x16( ( CL_shr( y[22], 1 ) ), pRotVector_32[11] );
    1649      130648 :     y[23] = CL_mult_32x16( ( CL_shr( y[23], 1 ) ), pRotVector_32[12] );
    1650      130648 :     y[25] = CL_mult_32x16( ( CL_shr( y[25], 1 ) ), pRotVector_32[13] );
    1651      130648 :     y[26] = CL_mult_32x16( ( CL_shr( y[26], 1 ) ), pRotVector_32[14] );
    1652      130648 :     y[27] = CL_mult_32x16( ( CL_shr( y[27], 1 ) ), pRotVector_32[15] );
    1653      130648 :     y[28] = CL_mult_32x16( ( CL_shr( y[28], 1 ) ), pRotVector_32[16] );
    1654      130648 :     y[29] = CL_mult_32x16( ( CL_shr( y[29], 1 ) ), pRotVector_32[17] );
    1655      130648 :     y[30] = CL_mult_32x16( ( CL_shr( y[30], 1 ) ), pRotVector_32[18] );
    1656      130648 :     y[31] = CL_mult_32x16( ( CL_shr( y[31], 1 ) ), pRotVector_32[19] );
    1657             : 
    1658             :     /* 1. FFT4 stage */
    1659             : 
    1660             :     /*  Pre-additions */
    1661      130648 :     t[0] = CL_add( y[0], y[16] );
    1662      130648 :     t[1] = CL_sub( y[0], y[16] );
    1663      130648 :     t[2] = CL_add( y[8], y[24] );
    1664      130648 :     t[3] = CL_mul_j( CL_sub( y[8], y[24] ) );
    1665             : 
    1666             :     /*  Post-additions */
    1667      130648 :     inp[0] = CL_add( t[0], t[2] );
    1668      130648 :     inp[8] = CL_sub( t[1], t[3] );
    1669      130648 :     inp[16] = CL_sub( t[0], t[2] );
    1670      130648 :     inp[24] = CL_add( t[1], t[3] );
    1671             : 
    1672             :     /* 2. FFT4 stage */
    1673             : 
    1674             :     /*  Pre-additions */
    1675      130648 :     t[0] = CL_add( y[1], y[17] );
    1676      130648 :     t[1] = CL_sub( y[1], y[17] );
    1677      130648 :     t[2] = CL_add( y[9], y[25] );
    1678      130648 :     t[3] = CL_mul_j( CL_sub( y[9], y[25] ) );
    1679             : 
    1680             :     /*  Post-additions */
    1681      130648 :     inp[1] = CL_add( t[0], t[2] );
    1682      130648 :     inp[9] = CL_sub( t[1], t[3] );
    1683      130648 :     inp[17] = CL_sub( t[0], t[2] );
    1684      130648 :     inp[25] = CL_add( t[1], t[3] );
    1685             : 
    1686             : 
    1687             :     /* 3. FFT4 stage */
    1688             : 
    1689             :     /*  Pre-additions */
    1690      130648 :     t[0] = CL_add( y[2], y[18] );
    1691      130648 :     t[1] = CL_sub( y[2], y[18] );
    1692      130648 :     t[2] = CL_add( y[10], y[26] );
    1693      130648 :     t[3] = CL_mul_j( CL_sub( y[10], y[26] ) );
    1694             : 
    1695             :     /*  Post-additions */
    1696      130648 :     inp[2] = CL_add( t[0], t[2] );
    1697      130648 :     inp[10] = CL_sub( t[1], t[3] );
    1698      130648 :     inp[18] = CL_sub( t[0], t[2] );
    1699      130648 :     inp[26] = CL_add( t[1], t[3] );
    1700             : 
    1701             : 
    1702             :     /* 4. FFT4 stage */
    1703             : 
    1704             :     /*  Pre-additions */
    1705      130648 :     t[0] = CL_add( y[3], y[19] );
    1706      130648 :     t[1] = CL_sub( y[3], y[19] );
    1707      130648 :     t[2] = CL_add( y[11], y[27] );
    1708      130648 :     t[3] = CL_mul_j( CL_sub( y[11], y[27] ) );
    1709             : 
    1710             : 
    1711             :     /*  Post-additions */
    1712      130648 :     inp[3] = CL_add( t[0], t[2] );
    1713      130648 :     inp[11] = CL_sub( t[1], t[3] );
    1714      130648 :     inp[19] = CL_sub( t[0], t[2] );
    1715      130648 :     inp[27] = CL_add( t[1], t[3] );
    1716             : 
    1717             : 
    1718             :     /* 5. FFT4 stage */
    1719             : 
    1720             :     /*  Pre-additions */
    1721      130648 :     t[0] = CL_msu_j( y[4], y[20] );
    1722      130648 :     t[1] = CL_mac_j( y[4], y[20] );
    1723      130648 :     t[2] = CL_add( y[12], y[28] );
    1724      130648 :     t[3] = CL_mul_j( CL_sub( y[12], y[28] ) );
    1725             : 
    1726             : 
    1727             :     /*  Post-additions */
    1728      130648 :     inp[4] = CL_add( t[0], t[2] );
    1729      130648 :     inp[12] = CL_sub( t[1], t[3] );
    1730      130648 :     inp[20] = CL_sub( t[0], t[2] );
    1731      130648 :     inp[28] = CL_add( t[1], t[3] );
    1732             : 
    1733             : 
    1734             :     /* 6. FFT4 stage */
    1735             : 
    1736             :     /*  Pre-additions */
    1737      130648 :     t[0] = CL_add( y[5], y[21] );
    1738      130648 :     t[1] = CL_sub( y[5], y[21] );
    1739      130648 :     t[2] = CL_add( y[13], y[29] );
    1740      130648 :     t[3] = CL_mul_j( CL_sub( y[13], y[29] ) );
    1741             : 
    1742             : 
    1743             :     /*  Post-additions */
    1744      130648 :     inp[5] = CL_add( t[0], t[2] );
    1745      130648 :     inp[13] = CL_sub( t[1], t[3] );
    1746      130648 :     inp[21] = CL_sub( t[0], t[2] );
    1747      130648 :     inp[29] = CL_add( t[1], t[3] );
    1748             : 
    1749             : 
    1750             :     /* 7. FFT4 stage */
    1751             : 
    1752             :     /*  Pre-additions */
    1753      130648 :     t[0] = CL_add( y[6], y[22] );
    1754      130648 :     t[1] = CL_sub( y[6], y[22] );
    1755      130648 :     t[2] = CL_add( y[14], y[30] );
    1756      130648 :     t[3] = CL_mul_j( CL_sub( y[14], y[30] ) );
    1757             : 
    1758             : 
    1759             :     /*  Post-additions */
    1760      130648 :     inp[6] = CL_add( t[0], t[2] );
    1761      130648 :     inp[14] = CL_sub( t[1], t[3] );
    1762      130648 :     inp[22] = CL_sub( t[0], t[2] );
    1763      130648 :     inp[30] = CL_add( t[1], t[3] );
    1764             : 
    1765             : 
    1766             :     /* 8. FFT4 stage */
    1767             : 
    1768             :     /*  Pre-additions */
    1769      130648 :     t[0] = CL_add( y[7], y[23] );
    1770      130648 :     t[1] = CL_sub( y[7], y[23] );
    1771      130648 :     t[2] = CL_add( y[15], y[31] );
    1772      130648 :     t[3] = CL_mul_j( CL_sub( y[15], y[31] ) );
    1773             : 
    1774             : 
    1775             :     /*  Post-additions */
    1776      130648 :     inp[7] = CL_add( t[0], t[2] );
    1777      130648 :     inp[15] = CL_sub( t[1], t[3] );
    1778      130648 :     inp[23] = CL_sub( t[0], t[2] );
    1779      130648 :     inp[31] = CL_add( t[1], t[3] );
    1780             : 
    1781             : #ifdef WMOPS
    1782             :     multiCounter[currCounter].CL_move += 32;
    1783             : #endif
    1784      130648 : }
    1785             : 
    1786             : 
    1787             : /**
    1788             :  * \brief Combined FFT
    1789             :  *
    1790             :  * \param    [i/o] re     real part
    1791             :  * \param    [i/o] im     imag part
    1792             :  * \param    [i  ] W      rotation factor
    1793             :  * \param    [i  ] len    length of fft
    1794             :  * \param    [i  ] dim1   length of fft1
    1795             :  * \param    [i  ] dim2   length of fft2
    1796             :  * \param    [i  ] sx     stride real and imag part
    1797             :  * \param    [i  ] sc     stride phase rotation coefficients
    1798             :  * \param    [tmp] x      32-bit workbuffer of length=2*len
    1799             :  * \param    [i  ] Woff   offset for addressing the rotation vector table
    1800             :  *
    1801             :  * \return void
    1802             :  */
    1803             : 
    1804     1895399 : static void fftN2(
    1805             :     cmplx *__restrict pComplexBuf,
    1806             :     const Word16 *__restrict W,
    1807             :     Word16 len,
    1808             :     Word16 dim1,
    1809             :     Word16 dim2,
    1810             :     Word16 sc,
    1811             :     Word32 *x,
    1812             :     Word16 Woff )
    1813             : {
    1814             :     Word16 i, j;
    1815     1895399 :     cmplx *x_cmplx = (cmplx *) x;
    1816             : 
    1817     1895399 :     assert( len == ( dim1 * dim2 ) );
    1818     1895399 :     assert( ( dim1 == 3 ) || ( dim1 == 5 ) || ( dim1 == 8 ) || ( dim1 == 10 ) || ( dim1 == 15 ) || ( dim1 == 16 ) || ( dim1 == 20 ) || ( dim1 == 30 ) || ( dim1 == 32 ) );
    1819     1895399 :     assert( ( dim2 == 4 ) || ( dim2 == 8 ) || ( dim2 == 10 ) || ( dim2 == 12 ) || ( dim2 == 16 ) || ( dim2 == 20 ) );
    1820             : 
    1821    24685019 :     FOR( i = 0; i < dim2; i++ )
    1822             :     {
    1823   552627188 :         FOR( j = 0; j < dim1; j++ )
    1824             :         {
    1825   529837568 :             x_cmplx[i * dim1 + j] = pComplexBuf[i + j * dim2];
    1826             : #ifdef WMOPS
    1827             :             multiCounter[currCounter].CL_move++;
    1828             : #endif
    1829             :         }
    1830             :     }
    1831             : 
    1832     1895399 :     SWITCH( dim1 )
    1833             :     {
    1834       13130 :         case 5:
    1835      118170 :             FOR( i = 0; i < dim2; i++ )
    1836             :             {
    1837      105040 :                 fft5_with_cmplx_data( &x_cmplx[i * dim1] );
    1838             :             }
    1839       13130 :             BREAK;
    1840      290238 :         case 8:
    1841     2612142 :             FOR( i = 0; i < dim2; i++ )
    1842             :             {
    1843     2321904 :                 fft8_with_cmplx_data( &x_cmplx[i * dim1] );
    1844             :             }
    1845      290238 :             BREAK;
    1846       83752 :         case 10:
    1847      753768 :             FOR( i = 0; i < dim2; i++ )
    1848             :             {
    1849      670016 :                 fft10_with_cmplx_data( &x_cmplx[i * dim1] );
    1850             :             }
    1851       83752 :             BREAK;
    1852             : 
    1853       72126 :         case 15:
    1854      649134 :             FOR( i = 0; i < dim2; i++ )
    1855             :             {
    1856      577008 :                 fft15_with_cmplx_data( &x_cmplx[i * dim1] );
    1857             :             }
    1858       72126 :             BREAK;
    1859      222525 :         case 16:
    1860     2002725 :             FOR( i = 0; i < dim2; i++ )
    1861             :             {
    1862     1780200 :                 fft16_with_cmplx_data( &x_cmplx[i * dim1], 1 );
    1863             :             }
    1864      222525 :             BREAK;
    1865      445413 :         case 20:
    1866     5788033 :             FOR( i = 0; i < dim2; i++ )
    1867             :             {
    1868     5342620 :                 fft20_with_cmplx_data( &x_cmplx[i * dim1] );
    1869             :             }
    1870      445413 :             BREAK;
    1871      751884 :         case 30:
    1872    12614068 :             FOR( i = 0; i < dim2; i++ )
    1873             :             {
    1874    11862184 :                 fft30_with_cmplx_data( &x_cmplx[i * dim1] );
    1875             :             }
    1876      751884 :             BREAK;
    1877       16331 :         case 32:
    1878      146979 :             FOR( i = 0; i < dim2; i++ )
    1879             :             {
    1880      130648 :                 fft32_with_cmplx_data( &x_cmplx[i * dim1] );
    1881             :             }
    1882       16331 :             BREAK;
    1883             :     }
    1884             : 
    1885     1895399 :     SWITCH( dim2 )
    1886             :     {
    1887      937153 :         case 8:
    1888             :         {
    1889             :             cmplx y0, y1, y2, y3, y4, y5, y6, y7;
    1890             :             cmplx t0, t1, t2, t3, t4, t5, t6, t7;
    1891             :             cmplx s0, s1, s2, s3, s4, s5, s6, s7;
    1892             : 
    1893      937153 :             i = 0;
    1894      937153 :             move16();
    1895             :             {
    1896      937153 :                 y0 = CL_shr( x_cmplx[i + 0 * dim1], 1 );
    1897      937153 :                 y1 = CL_shr( x_cmplx[i + 1 * dim1], 1 );
    1898      937153 :                 y2 = CL_shr( x_cmplx[i + 2 * dim1], 1 );
    1899      937153 :                 y3 = CL_shr( x_cmplx[i + 3 * dim1], 1 );
    1900      937153 :                 y4 = CL_shr( x_cmplx[i + 4 * dim1], 1 );
    1901      937153 :                 y5 = CL_shr( x_cmplx[i + 5 * dim1], 1 );
    1902      937153 :                 y6 = CL_shr( x_cmplx[i + 6 * dim1], 1 );
    1903      937153 :                 y7 = CL_shr( x_cmplx[i + 7 * dim1], 1 );
    1904             : 
    1905      937153 :                 t0 = CL_shr( CL_add( y0, y4 ), SCALEFACTORN2 - 1 );
    1906      937153 :                 t1 = CL_shr( CL_sub( y0, y4 ), SCALEFACTORN2 - 1 );
    1907      937153 :                 t2 = CL_shr( CL_add( y1, y5 ), SCALEFACTORN2 - 1 );
    1908      937153 :                 t3 = CL_sub( y1, y5 );
    1909      937153 :                 t4 = CL_shr( CL_add( y2, y6 ), SCALEFACTORN2 - 1 );
    1910      937153 :                 t5 = CL_shr( CL_sub( y2, y6 ), SCALEFACTORN2 - 1 );
    1911      937153 :                 t6 = CL_shr( CL_add( y3, y7 ), SCALEFACTORN2 - 1 );
    1912      937153 :                 t7 = CL_sub( y3, y7 );
    1913             : 
    1914             : 
    1915      937153 :                 s0 = CL_add( t0, t4 );
    1916      937153 :                 s2 = CL_sub( t0, t4 );
    1917      937153 :                 s4 = CL_mac_j( t1, t5 );
    1918      937153 :                 s5 = CL_msu_j( t1, t5 );
    1919      937153 :                 s1 = CL_add( t2, t6 );
    1920      937153 :                 s3 = CL_mul_j( CL_sub( t2, t6 ) );
    1921      937153 :                 t0 = CL_shr( CL_add( t3, t7 ), SCALEFACTORN2 - 1 );
    1922      937153 :                 t1 = CL_shr( CL_sub( t3, t7 ), SCALEFACTORN2 - 1 );
    1923      937153 :                 s6 = CL_scale_t( CL_msu_j( t1, t0 ), C81 );
    1924      937153 :                 s7 = CL_dscale_t( CL_swap_real_imag( CL_msu_j( t0, t1 ) ), C81, C82 );
    1925             : 
    1926      937153 :                 pComplexBuf[i + 0 * dim1] = CL_add( s0, s1 );
    1927      937153 :                 pComplexBuf[i + 1 * dim1] = CL_add( s5, s6 );
    1928      937153 :                 pComplexBuf[i + 2 * dim1] = CL_sub( s2, s3 );
    1929      937153 :                 pComplexBuf[i + 3 * dim1] = CL_add( s4, s7 );
    1930      937153 :                 pComplexBuf[i + 4 * dim1] = CL_sub( s0, s1 );
    1931      937153 :                 pComplexBuf[i + 5 * dim1] = CL_sub( s5, s6 );
    1932      937153 :                 pComplexBuf[i + 6 * dim1] = CL_add( s2, s3 );
    1933      937153 :                 pComplexBuf[i + 7 * dim1] = CL_sub( s4, s7 );
    1934             :             }
    1935             : 
    1936             : 
    1937    13488166 :             FOR( i = 1; i < dim1; i++ )
    1938             :             {
    1939    12551013 :                 y0 = CL_shr( x_cmplx[i + 0 * dim1], 1 );
    1940    12551013 :                 y1 = CL_shr( CL_mult_32x16( x_cmplx[i + 1 * dim1], *(const cmplx_s *) &W[sc * i + sc * 1 * dim1 - Woff] ), 1 );
    1941    12551013 :                 y2 = CL_shr( CL_mult_32x16( x_cmplx[i + 2 * dim1], *(const cmplx_s *) &W[sc * i + sc * 2 * dim1 - Woff] ), 1 );
    1942    12551013 :                 y3 = CL_shr( CL_mult_32x16( x_cmplx[i + 3 * dim1], *(const cmplx_s *) &W[sc * i + sc * 3 * dim1 - Woff] ), 1 );
    1943    12551013 :                 y4 = CL_shr( CL_mult_32x16( x_cmplx[i + 4 * dim1], *(const cmplx_s *) &W[sc * i + sc * 4 * dim1 - Woff] ), 1 );
    1944    12551013 :                 y5 = CL_shr( CL_mult_32x16( x_cmplx[i + 5 * dim1], *(const cmplx_s *) &W[sc * i + sc * 5 * dim1 - Woff] ), 1 );
    1945    12551013 :                 y6 = CL_shr( CL_mult_32x16( x_cmplx[i + 6 * dim1], *(const cmplx_s *) &W[sc * i + sc * 6 * dim1 - Woff] ), 1 );
    1946    12551013 :                 y7 = CL_shr( CL_mult_32x16( x_cmplx[i + 7 * dim1], *(const cmplx_s *) &W[sc * i + sc * 7 * dim1 - Woff] ), 1 );
    1947             : 
    1948    12551013 :                 t0 = CL_shr( CL_add( y0, y4 ), SCALEFACTORN2 - 1 );
    1949    12551013 :                 t1 = CL_shr( CL_sub( y0, y4 ), SCALEFACTORN2 - 1 );
    1950    12551013 :                 t2 = CL_shr( CL_add( y1, y5 ), SCALEFACTORN2 - 1 );
    1951    12551013 :                 t3 = CL_sub( y1, y5 );
    1952    12551013 :                 t4 = CL_shr( CL_add( y2, y6 ), SCALEFACTORN2 - 1 );
    1953    12551013 :                 t5 = CL_shr( CL_sub( y2, y6 ), SCALEFACTORN2 - 1 );
    1954    12551013 :                 t6 = CL_shr( CL_add( y3, y7 ), SCALEFACTORN2 - 1 );
    1955    12551013 :                 t7 = CL_sub( y3, y7 );
    1956             : 
    1957             : 
    1958    12551013 :                 s0 = CL_add( t0, t4 );
    1959    12551013 :                 s2 = CL_sub( t0, t4 );
    1960    12551013 :                 s4 = CL_mac_j( t1, t5 );
    1961    12551013 :                 s5 = CL_msu_j( t1, t5 );
    1962    12551013 :                 s1 = CL_add( t2, t6 );
    1963    12551013 :                 s3 = CL_mul_j( CL_sub( t2, t6 ) );
    1964    12551013 :                 t0 = CL_shr( CL_add( t3, t7 ), SCALEFACTORN2 - 1 );
    1965    12551013 :                 t1 = CL_shr( CL_sub( t3, t7 ), SCALEFACTORN2 - 1 );
    1966    12551013 :                 s6 = CL_scale_t( CL_msu_j( t1, t0 ), C81 );
    1967    12551013 :                 s7 = CL_dscale_t( CL_swap_real_imag( CL_msu_j( t0, t1 ) ), C81, C82 );
    1968             : 
    1969    12551013 :                 pComplexBuf[i + 0 * dim1] = CL_add( s0, s1 );
    1970    12551013 :                 pComplexBuf[i + 1 * dim1] = CL_add( s5, s6 );
    1971    12551013 :                 pComplexBuf[i + 2 * dim1] = CL_sub( s2, s3 );
    1972    12551013 :                 pComplexBuf[i + 3 * dim1] = CL_add( s4, s7 );
    1973    12551013 :                 pComplexBuf[i + 4 * dim1] = CL_sub( s0, s1 );
    1974    12551013 :                 pComplexBuf[i + 5 * dim1] = CL_sub( s5, s6 );
    1975    12551013 :                 pComplexBuf[i + 6 * dim1] = CL_add( s2, s3 );
    1976    12551013 :                 pComplexBuf[i + 7 * dim1] = CL_sub( s4, s7 );
    1977             :             }
    1978             : 
    1979      937153 :             BREAK;
    1980             :         }
    1981             : 
    1982       24590 :         case 10:
    1983             :         {
    1984             :             cmplx y[20];
    1985             :             {
    1986      270490 :                 FOR( j = 0; j < dim2; j++ )
    1987             :                 {
    1988      245900 :                     y[j] = CL_move( x_cmplx[j * dim1] );
    1989             :                 }
    1990       24590 :                 fft10_with_cmplx_data( &y[0] );
    1991      270490 :                 FOR( j = 0; j < dim2; j++ )
    1992             :                 {
    1993      245900 :                     pComplexBuf[j * dim1] = y[j];
    1994             :                 }
    1995      491800 :                 FOR( i = 1; i < dim1; i++ )
    1996             :                 {
    1997      467210 :                     y[0] = CL_move( x_cmplx[i] );
    1998     4672100 :                     FOR( j = 1; j < dim2; j++ )
    1999             :                     {
    2000     4204890 :                         y[j] = CL_mult_32x16( x_cmplx[i + j * dim1], *(const cmplx_s *) &W[sc * i + sc * j * dim1 - Woff] );
    2001             :                     }
    2002      467210 :                     fft10_with_cmplx_data( &y[0] );
    2003     5139310 :                     FOR( j = 0; j < dim2; j++ )
    2004             :                     {
    2005     4672100 :                         pComplexBuf[i + j * dim1] = y[j];
    2006             :                     }
    2007             :                 }
    2008             :             }
    2009       24590 :             BREAK;
    2010             :         }
    2011      906656 :         case 16:
    2012             :         {
    2013             :             cmplx y[20];
    2014             : 
    2015    15413152 :             FOR( j = 0; j < dim2; j++ )
    2016             :             {
    2017    14506496 :                 y[j] = CL_shr( x_cmplx[0 + j * dim1], SCALEFACTOR16 );
    2018             :             }
    2019      906656 :             fft16_with_cmplx_data( &y[0], 0 );
    2020             : 
    2021    15413152 :             FOR( j = 0; j < dim2; j++ )
    2022             :             {
    2023    14506496 :                 pComplexBuf[j * dim1] = y[j];
    2024             :             }
    2025    25120290 :             FOR( i = 1; i < dim1; i++ )
    2026             :             {
    2027    24213634 :                 y[0] = CL_shr( x_cmplx[i + ( 0 + 0 ) * dim1], SCALEFACTOR16 );
    2028    24213634 :                 y[1] = CL_shr( CL_mult_32x16( x_cmplx[i + dim1], *(const cmplx_s *) &W[len + sc * i + 0 * dim1 - Woff] ), SCALEFACTOR16 );
    2029             : 
    2030   193709072 :                 FOR( j = 2; j < dim2; j = j + 2 )
    2031             :                 {
    2032   169495438 :                     y[( j + 0 )] = CL_shr( CL_mult_32x16( x_cmplx[i + ( j + 0 ) * dim1], *(const cmplx_s *) &W[sc * i + j * dim1 - Woff] ), SCALEFACTOR16 );
    2033   169495438 :                     y[( j + 1 )] = CL_shr( CL_mult_32x16( x_cmplx[i + ( j + 1 ) * dim1], *(const cmplx_s *) &W[len + sc * i + j * dim1 - Woff] ), SCALEFACTOR16 );
    2034             :                 }
    2035    24213634 :                 fft16_with_cmplx_data( &y[0], 0 );
    2036   411631778 :                 FOR( j = 0; j < dim2; j++ )
    2037             :                 {
    2038   387418144 :                     pComplexBuf[i + j * dim1] = y[j];
    2039             :                 }
    2040             :             }
    2041             :         }
    2042      906656 :             BREAK;
    2043             : 
    2044       27000 :         case 20:
    2045             : 
    2046       27000 :             assert( dim1 == 20 || dim1 == 30 ); /* cplxMpy4_10_0 contains shift values hardcoded FOR 20x10 */
    2047       27000 :             IF( EQ_16( dim1, 20 ) )
    2048             :             {
    2049             :                 cmplx y[20];
    2050      116592 :                 FOR( j = 0; j < dim2; j++ )
    2051             :                 {
    2052      111040 :                     y[j] = CL_move( x_cmplx[j * dim1] );
    2053             :                 }
    2054        5552 :                 fft20_with_cmplx_data( &y[0] );
    2055      116592 :                 FOR( j = 0; j < dim2; j++ )
    2056             :                 {
    2057      111040 :                     pComplexBuf[j * dim1] = y[j];
    2058             :                 }
    2059      111040 :                 FOR( i = 1; i < dim1; i++ )
    2060             :                 {
    2061      105488 :                     y[0] = CL_move( x_cmplx[i] );
    2062      105488 :                     y[1] = CL_mult_32x16( x_cmplx[i + dim1], *(const cmplx_s *) &W[len + sc * i + 0 * dim1 - Woff] );
    2063     1054880 :                     FOR( j = 2; j < dim2; j = j + 2 )
    2064             :                     {
    2065             : 
    2066      949392 :                         y[j + 0] = CL_mult_32x16( x_cmplx[i + ( j + 0 ) * dim1], *(const cmplx_s *) &W[sc * i + j * dim1 - Woff] );
    2067      949392 :                         y[j + 1] = CL_mult_32x16( x_cmplx[i + ( j + 1 ) * dim1], *(const cmplx_s *) &W[len + sc * i + j * dim1 - Woff] );
    2068             :                     }
    2069      105488 :                     fft20_with_cmplx_data( &y[0] );
    2070     2215248 :                     FOR( j = 0; j < dim2; j++ )
    2071             :                     {
    2072     2109760 :                         pComplexBuf[i + j * dim1] = y[j];
    2073             :                     }
    2074             :                 }
    2075             :             }
    2076             :             ELSE
    2077             :             {
    2078             :                 cmplx y[20];
    2079      450408 :                 FOR( j = 0; j < dim2; j++ )
    2080             :                 {
    2081      428960 :                     y[j] = CL_shl( x_cmplx[j * dim1], ( SCALEFACTOR30 - SCALEFACTOR20 ) );
    2082             :                 }
    2083       21448 :                 fft20_with_cmplx_data( &y[0] );
    2084      450408 :                 FOR( j = 0; j < dim2; j++ )
    2085             :                 {
    2086      428960 :                     pComplexBuf[j * dim1] = y[j];
    2087             :                 }
    2088      643440 :                 FOR( i = 1; i < dim1; i++ )
    2089             :                 {
    2090      621992 :                     y[0] = CL_shl( x_cmplx[i], ( SCALEFACTOR30 - SCALEFACTOR20 ) );
    2091      621992 :                     y[1] = CL_shl( CL_mult_32x16( x_cmplx[i + dim1], *(const cmplx_s *) &W[len + sc * i + 0 * dim1 - Woff] ), ( SCALEFACTOR30 - SCALEFACTOR20 ) );
    2092     6219920 :                     FOR( j = 2; j < dim2; j = j + 2 )
    2093             :                     {
    2094             : 
    2095     5597928 :                         y[j + 0] = CL_shl( CL_mult_32x16( x_cmplx[i + ( j + 0 ) * dim1], *(const cmplx_s *) &W[sc * i + j * dim1 - Woff] ), ( SCALEFACTOR30 - SCALEFACTOR20 ) );
    2096     5597928 :                         y[j + 1] = CL_shl( CL_mult_32x16( x_cmplx[i + ( j + 1 ) * dim1], *(const cmplx_s *) &W[len + sc * i + j * dim1 - Woff] ), ( SCALEFACTOR30 - SCALEFACTOR20 ) );
    2097             :                     }
    2098      621992 :                     fft20_with_cmplx_data( &y[0] );
    2099    13061832 :                     FOR( j = 0; j < dim2; j++ )
    2100             :                     {
    2101    12439840 :                         pComplexBuf[i + j * dim1] = y[j];
    2102             :                     }
    2103             :                 }
    2104             :             }
    2105       27000 :             BREAK;
    2106             :     }
    2107             : #ifdef WMOPS
    2108             :     multiCounter[currCounter].CL_move += len;
    2109             : #endif
    2110     1895399 : }
    2111             : 
    2112             : 
    2113             : /**
    2114             :  * \brief Complex valued FFT
    2115             :  *
    2116             :  * \param    [i/o] re          real part
    2117             :  * \param    [i/o] im          imag part
    2118             :  * \param    [i  ] sizeOfFft   length of fft
    2119             :  * \param    [i  ] s           stride real and imag part
    2120             :  * \param    [i  ] scale       scalefactor
    2121             :  *
    2122             :  * \return void
    2123             :  */
    2124     2294167 : void BASOP_cfft( cmplx *pComplexBuf, Word16 sizeOfFft, Word16 *scale, Word32 x[2 * BASOP_CFFT_MAX_LENGTH] )
    2125             : {
    2126             :     Word16 s;
    2127     2294167 :     s = 0;
    2128     2294167 :     move16();
    2129     2294167 :     SWITCH( sizeOfFft )
    2130             :     {
    2131           0 :         case 5:
    2132           0 :             fft5_with_cmplx_data( pComplexBuf );
    2133           0 :             s = add( *scale, SCALEFACTOR5 );
    2134           0 :             BREAK;
    2135             : 
    2136       64224 :         case 8:
    2137       64224 :             fft8_with_cmplx_data( pComplexBuf );
    2138       64224 :             s = add( *scale, SCALEFACTOR8 );
    2139       64224 :             BREAK;
    2140             : 
    2141      149636 :         case 10:
    2142      149636 :             fft10_with_cmplx_data( pComplexBuf );
    2143      149636 :             s = add( *scale, SCALEFACTOR10 );
    2144      149636 :             BREAK;
    2145             : 
    2146           0 :         case 16:
    2147           0 :             fft16_with_cmplx_data( pComplexBuf, 1 );
    2148           0 :             s = add( *scale, SCALEFACTOR16 );
    2149           0 :             BREAK;
    2150             : 
    2151       66000 :         case 20:
    2152       66000 :             fft20_with_cmplx_data( pComplexBuf );
    2153       66000 :             s = add( *scale, SCALEFACTOR20 );
    2154       66000 :             BREAK;
    2155             : 
    2156      118908 :         case 30:
    2157      118908 :             fft30_with_cmplx_data( pComplexBuf );
    2158      118908 :             s = add( *scale, SCALEFACTOR30 );
    2159      118908 :             BREAK;
    2160             : 
    2161           0 :         case 32:
    2162           0 :             fft32_with_cmplx_data( pComplexBuf );
    2163           0 :             s = add( *scale, SCALEFACTOR32 );
    2164           0 :             BREAK;
    2165             : 
    2166       13130 :         case 40:
    2167             :         {
    2168       13130 :             fftN2( pComplexBuf, RotVector_320, 40, 5, 8, 8, x, 40 );
    2169       13130 :             s = add( *scale, SCALEFACTOR40 );
    2170       13130 :             BREAK;
    2171             :         }
    2172             : 
    2173      290238 :         case 64:
    2174             :         {
    2175      290238 :             fftN2( pComplexBuf, RotVector_256, 64, 8, 8, 8, x, 64 );
    2176      290238 :             s = add( *scale, SCALEFACTOR64 );
    2177      290238 :             BREAK;
    2178             :         }
    2179             : 
    2180       83752 :         case 80:
    2181             :         {
    2182       83752 :             fftN2( pComplexBuf, RotVector_320, 80, 10, 8, 4, x, 40 );
    2183       83752 :             s = add( *scale, SCALEFACTOR80 );
    2184       83752 :             BREAK;
    2185             :         }
    2186           0 :         case 100:
    2187             :         {
    2188           0 :             fftN2( pComplexBuf, RotVector_400, 100, 10, 10, 4, x, 40 );
    2189           0 :             s = add( *scale, SCALEFACTOR100 );
    2190           0 :             BREAK;
    2191             :         }
    2192       72126 :         case 120:
    2193             :         {
    2194       72126 :             fftN2( pComplexBuf, RotVector_480, 120, 15, 8, 4, x, 60 );
    2195       72126 :             s = add( *scale, SCALEFACTOR120 );
    2196       72126 :             BREAK;
    2197             :         }
    2198             : 
    2199      222525 :         case 128:
    2200             :         {
    2201      222525 :             fftN2( pComplexBuf, RotVector_256, 128, 16, 8, 4, x, 64 );
    2202      222525 :             s = add( *scale, SCALEFACTOR128 );
    2203      222525 :             BREAK;
    2204             :         }
    2205             : 
    2206      207332 :         case 160:
    2207             :         {
    2208      207332 :             fftN2( pComplexBuf, RotVector_320, 160, 20, 8, 2, x, 40 );
    2209      207332 :             s = add( *scale, SCALEFACTOR160 );
    2210      207332 :             BREAK;
    2211             :         }
    2212             : 
    2213       24590 :         case 200:
    2214             :         {
    2215       24590 :             fftN2( pComplexBuf, RotVector_400, 200, 20, 10, 2, x, 40 );
    2216       24590 :             s = add( *scale, SCALEFACTOR200 );
    2217       24590 :             BREAK;
    2218             :         }
    2219             : 
    2220       31719 :         case 240:
    2221             :         {
    2222       31719 :             fftN2( pComplexBuf, RotVector_480, 240, 30, 8, 2, x, 60 );
    2223       31719 :             s = add( *scale, SCALEFACTOR240 );
    2224       31719 :             BREAK;
    2225             :         }
    2226             : 
    2227       16331 :         case 256:
    2228             :         {
    2229       16331 :             fftN2( pComplexBuf, RotVector_256, 256, 32, 8, 2, x, 64 );
    2230       16331 :             s = add( *scale, SCALEFACTOR256 );
    2231       16331 :             BREAK;
    2232             :         }
    2233             : 
    2234      207939 :         case 320:
    2235             :         {
    2236      207939 :             fftN2( pComplexBuf, RotVector_320, 320, 20, 16, 2, x, 40 );
    2237      207939 :             s = add( *scale, SCALEFACTOR320 );
    2238      207939 :             BREAK;
    2239             :         }
    2240             : 
    2241        5552 :         case 400:
    2242             :         {
    2243        5552 :             fftN2( pComplexBuf, RotVector_400, 400, 20, 20, 2, x, 40 );
    2244        5552 :             s = add( *scale, SCALEFACTOR400 );
    2245        5552 :             BREAK;
    2246             :         }
    2247             : 
    2248      698717 :         case 480:
    2249             :         {
    2250      698717 :             fftN2( pComplexBuf, RotVector_480, 480, 30, 16, 2, x, 60 );
    2251      698717 :             s = add( *scale, SCALEFACTOR480 );
    2252      698717 :             BREAK;
    2253             :         }
    2254       21448 :         case 600:
    2255             :         {
    2256       21448 :             fftN2( pComplexBuf, RotVector_600, 600, 30, 20, 2, x, 60 );
    2257       21448 :             s = add( *scale, SCALEFACTOR600 );
    2258       21448 :             BREAK;
    2259             :         }
    2260           0 :         default:
    2261           0 :             assert( 0 );
    2262             :     }
    2263     2294167 :     *scale = s;
    2264     2294167 :     move16();
    2265     2294167 : }
    2266             : 
    2267             : 
    2268             : #define RFFT_TWIDDLE1( x, t1, t2, t3, t4, w1, w2, xb0, xb1, xt0, xt1 ) \
    2269             :     {                                                                  \
    2270             :         xb0 = L_shr( x[2 * i + 0], 2 );                                \
    2271             :         xb1 = L_shr( x[2 * i + 1], 2 );                                \
    2272             :         xt0 = L_shr( x[sizeOfFft - 2 * i + 0], 2 );                    \
    2273             :         xt1 = L_shr( x[sizeOfFft - 2 * i + 1], 2 );                    \
    2274             :         t1 = L_sub( xb0, xt0 );                                        \
    2275             :         t2 = L_add( xb1, xt1 );                                        \
    2276             :         t3 = L_sub( Mpy_32_16_1( t1, w1 ), Mpy_32_16_1( t2, w2 ) );    \
    2277             :         t4 = L_add( Mpy_32_16_1( t1, w2 ), Mpy_32_16_1( t2, w1 ) );    \
    2278             :         t1 = L_add( xb0, xt0 );                                        \
    2279             :         t2 = L_sub( xb1, xt1 );                                        \
    2280             :     }
    2281             : 
    2282             : #define RFFT_TWIDDLE2( x, t1, t2, t3, t4, w1, w2, xb0, xb1, xt0, xt1 ) \
    2283             :     {                                                                  \
    2284             :         xb0 = L_shr( x[2 * i + 0], 2 );                                \
    2285             :         xb1 = L_shr( x[2 * i + 1], 2 );                                \
    2286             :         xt0 = L_shr( x[sizeOfFft - 2 * i + 0], 2 );                    \
    2287             :         xt1 = L_shr( x[sizeOfFft - 2 * i + 1], 2 );                    \
    2288             :         t1 = L_sub( xb0, xt0 );                                        \
    2289             :         t2 = L_add( xb1, xt1 );                                        \
    2290             :         t3 = L_add( Mpy_32_16_1( t1, w1 ), Mpy_32_16_1( t2, w2 ) );    \
    2291             :         t4 = L_sub( Mpy_32_16_1( t2, w1 ), Mpy_32_16_1( t1, w2 ) );    \
    2292             :         t1 = L_add( xb0, xt0 );                                        \
    2293             :         t2 = L_sub( xb1, xt1 );                                        \
    2294             :     }
    2295             : 
    2296             : /**
    2297             :  * \brief Real valued FFT
    2298             :  *
    2299             :  *        forward rFFT (isign == -1):
    2300             :  *        The input vector contains sizeOfFft real valued time samples. The output vector contains sizeOfFft/2 complex valued
    2301             :  *        spectral values. The spectral values resides interleaved in the output vector. x[1] contains re[sizeOfFft], because
    2302             :  *        x[1] is zero by default. This allows use of sizeOfFft length buffer instead of sizeOfFft+1.
    2303             :  *
    2304             :  *        inverse rFFT (isign == +1):
    2305             :  *        The input vector contains sizeOfFft complex valued spectral values. The output vector contains sizeOfFft real valued
    2306             :  *        time samples. The spectral values resides interleaved in the input vector. x[1] contains re[sizeOfFft].
    2307             :  *        (see also forward rFFT)
    2308             :  *
    2309             :  * \param    [i/o] x           real input / real and imag output interleaved
    2310             :  * \param    [i  ] sizeOfFft   length of fft
    2311             :  * \param    [i  ] scale       scalefactor
    2312             :  * \param    [i  ] isign       forward (-1) / backward (+1)
    2313             :  *
    2314             :  * \return void
    2315             :  */
    2316       34670 : void BASOP_rfft( Word32 *x, Word16 sizeOfFft, Word16 *scale, Word16 isign )
    2317             : {
    2318       34670 :     Word16 i, s = 0, sizeOfFft2, sizeOfFft4, sizeOfFft8, wstride; /* clear s to calm down compiler */
    2319             :     Word32 t1, t2, t3, t4, xb0, xb1, xt0, xt1;
    2320             :     const PWord16 *w1;
    2321             :     Word16 c1;
    2322             :     Word16 c2;
    2323             :     Word32 workBuffer[2 * BASOP_CFFT_MAX_LENGTH];
    2324             : 
    2325             : 
    2326       34670 :     sizeOfFft2 = shr( sizeOfFft, 1 );
    2327       34670 :     sizeOfFft4 = shr( sizeOfFft, 2 );
    2328       34670 :     sizeOfFft8 = shr( sizeOfFft, 3 );
    2329             : 
    2330       34670 :     BASOP_getTables( NULL, &w1, &wstride, sizeOfFft2 );
    2331             : 
    2332       34670 :     SWITCH( isign )
    2333             :     {
    2334          18 :         case -1:
    2335             : 
    2336          18 :             BASOP_cfft( (cmplx *) x, sizeOfFft2, scale, workBuffer );
    2337             : 
    2338          18 :             xb0 = L_shr( x[0], 1 );
    2339          18 :             xb1 = L_shr( x[1], 1 );
    2340          18 :             x[0] = L_add( xb0, xb1 );
    2341          18 :             move32();
    2342          18 :             x[1] = L_sub( xb0, xb1 );
    2343          18 :             move32();
    2344             : 
    2345        1312 :             FOR( i = 1; i < sizeOfFft8; i++ )
    2346             :             {
    2347        1294 :                 RFFT_TWIDDLE1( x, t1, t2, t3, t4, w1[i * wstride].v.im, w1[i * wstride].v.re, xb0, xb1, xt0, xt1 )
    2348        1294 :                 x[2 * i] = L_sub( t1, t3 );
    2349        1294 :                 move32();
    2350        1294 :                 x[2 * i + 1] = L_sub( t2, t4 );
    2351        1294 :                 move32();
    2352        1294 :                 x[sizeOfFft - 2 * i] = L_add( t1, t3 );
    2353        1294 :                 move32();
    2354        1294 :                 x[sizeOfFft - 2 * i + 1] = L_negate( L_add( t2, t4 ) );
    2355        1294 :                 move32();
    2356             :             }
    2357             : 
    2358        1330 :             FOR( i = sizeOfFft8; i < sizeOfFft4; i++ )
    2359             :             {
    2360        1312 :                 RFFT_TWIDDLE1( x, t1, t2, t3, t4, w1[( sizeOfFft4 - i ) * wstride].v.re, w1[( sizeOfFft4 - i ) * wstride].v.im, xb0, xb1, xt0, xt1 )
    2361        1312 :                 x[2 * i] = L_sub( t1, t3 );
    2362        1312 :                 move32();
    2363        1312 :                 x[2 * i + 1] = L_sub( t2, t4 );
    2364        1312 :                 move32();
    2365        1312 :                 x[sizeOfFft - 2 * i] = L_add( t1, t3 );
    2366        1312 :                 move32();
    2367        1312 :                 x[sizeOfFft - 2 * i + 1] = L_negate( L_add( t2, t4 ) );
    2368        1312 :                 move32();
    2369             :             }
    2370             : 
    2371          18 :             x[sizeOfFft - 2 * i] = L_shr( x[2 * i + 0], 1 );
    2372          18 :             move32();
    2373          18 :             x[sizeOfFft - 2 * i + 1] = L_negate( L_shr( x[2 * i + 1], 1 ) );
    2374          18 :             move32();
    2375             : 
    2376          18 :             *scale = add( *scale, 1 );
    2377          18 :             move16();
    2378          18 :             BREAK;
    2379             : 
    2380       34652 :         case +1:
    2381             : 
    2382       34652 :             xb0 = L_shr( x[0], 2 );
    2383       34652 :             xb1 = L_shr( x[1], 2 );
    2384       34652 :             x[0] = L_add( xb0, xb1 );
    2385       34652 :             move32();
    2386       34652 :             x[1] = L_sub( xb1, xb0 );
    2387       34652 :             move32();
    2388             : 
    2389     2513152 :             FOR( i = 1; i < sizeOfFft8; i++ )
    2390             :             {
    2391     2478500 :                 RFFT_TWIDDLE2( x, t1, t2, t3, t4, w1[i * wstride].v.im, w1[i * wstride].v.re, xb0, xb1, xt0, xt1 )
    2392             : 
    2393     2478500 :                 x[2 * i] = L_sub( t1, t3 );
    2394     2478500 :                 move32();
    2395     2478500 :                 x[2 * i + 1] = L_sub( t4, t2 );
    2396     2478500 :                 move32();
    2397     2478500 :                 x[sizeOfFft - 2 * i] = L_add( t1, t3 );
    2398     2478500 :                 move32();
    2399     2478500 :                 x[sizeOfFft - 2 * i + 1] = L_add( t2, t4 );
    2400     2478500 :                 move32();
    2401             :             }
    2402             : 
    2403     2547804 :             FOR( i = sizeOfFft8; i < sizeOfFft4; i++ )
    2404             :             {
    2405     2513152 :                 RFFT_TWIDDLE2( x, t1, t2, t3, t4, w1[( sizeOfFft4 - i ) * wstride].v.re, w1[( sizeOfFft4 - i ) * wstride].v.im, xb0, xb1, xt0, xt1 )
    2406             : 
    2407     2513152 :                 x[2 * i] = L_sub( t1, t3 );
    2408     2513152 :                 move32();
    2409     2513152 :                 x[2 * i + 1] = L_sub( t4, t2 );
    2410     2513152 :                 move32();
    2411     2513152 :                 x[sizeOfFft - 2 * i] = L_add( t1, t3 );
    2412     2513152 :                 move32();
    2413     2513152 :                 x[sizeOfFft - 2 * i + 1] = L_add( t2, t4 );
    2414     2513152 :                 move32();
    2415             :             }
    2416             : 
    2417       34652 :             x[sizeOfFft - 2 * i] = L_shr( x[2 * i + 0], 1 );
    2418       34652 :             move32();
    2419       34652 :             x[sizeOfFft - 2 * i + 1] = L_shr( x[2 * i + 1], 1 );
    2420       34652 :             move32();
    2421             : 
    2422       34652 :             BASOP_cfft( (cmplx *) x, sizeOfFft2, scale, workBuffer );
    2423             : 
    2424       34652 :             SWITCH( sizeOfFft )
    2425             :             {
    2426       18464 :                 case 40:
    2427             :                 case 80:
    2428             :                 case 320:
    2429             :                 case 640:
    2430       18464 :                     c1 = FFTC( 0x66666680 );
    2431       18464 :                     move16();
    2432       18464 :                     c2 = FFTC( 0x99999980 );
    2433       18464 :                     move16();
    2434     5926944 :                     FOR( i = 0; i < sizeOfFft2; i++ )
    2435             :                     {
    2436     5908480 :                         x[2 * i] = Mpy_32_xx( x[2 * i], c1 );
    2437     5908480 :                         move32();
    2438     5908480 :                         x[2 * i + 1] = Mpy_32_xx( x[2 * i + 1], c2 );
    2439     5908480 :                         move32();
    2440             :                     }
    2441       18464 :                     BREAK;
    2442             : 
    2443       16188 :                 case 64:
    2444             :                 case 256:
    2445             :                 case 512:
    2446     4160316 :                     FOR( i = 0; i < sizeOfFft2; i++ )
    2447             :                     {
    2448     4144128 :                         x[2 * i + 1] = L_negate( x[2 * i + 1] );
    2449     4144128 :                         move32();
    2450             :                     }
    2451       16188 :                     BREAK;
    2452             : 
    2453           0 :                 default:
    2454           0 :                     assert( 0 );
    2455             :             }
    2456             : 
    2457       34652 :             SWITCH( sizeOfFft )
    2458             :             {
    2459           0 :                 case 64:
    2460           0 :                     s = add( *scale, 2 - 6 );
    2461           0 :                     BREAK;
    2462             : 
    2463       16188 :                 case 512:
    2464       16188 :                     s = add( *scale, 2 - 9 );
    2465       16188 :                     BREAK;
    2466             : 
    2467       18464 :                 case 640:
    2468       18464 :                     s = add( *scale, 2 - 9 );
    2469       18464 :                     BREAK;
    2470             : 
    2471           0 :                 default:
    2472           0 :                     assert( 0 );
    2473             :             }
    2474       34652 :             *scale = s;
    2475       34652 :             move16();
    2476       34652 :             BREAK;
    2477             :     }
    2478       34670 : }

Generated by: LCOV version 1.14