Patch by Alexander Chemeris removing medfilter from the VS2005 build
[speexdsp.git] / tmv / kiss_fft_tm.h
1 /* Copyright (C) 2007 Hong Zhiqian */\r
2 /**\r
3    @file kiss_fft_tm.h\r
4    @author Hong Zhiqian\r
5    @brief Various compatibility routines for Speex (TriMedia version)\r
6 */\r
7 /*\r
8    Redistribution and use in source and binary forms, with or without\r
9    modification, are permitted provided that the following conditions\r
10    are met:\r
11    \r
12    - Redistributions of source code must retain the above copyright\r
13    notice, this list of conditions and the following disclaimer.\r
14    \r
15    - Redistributions in binary form must reproduce the above copyright\r
16    notice, this list of conditions and the following disclaimer in the\r
17    documentation and/or other materials provided with the distribution.\r
18    \r
19    - Neither the name of the Xiph.org Foundation nor the names of its\r
20    contributors may be used to endorse or promote products derived from\r
21    this software without specific prior written permission.\r
22    \r
23    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
24    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
25    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
26    A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR\r
27    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r
28    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
29    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\r
30    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
31    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r
32    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r
33    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
34 */\r
35 \r
36 #include "_kiss_fft_guts_tm.h"\r
37 \r
38 #ifdef TM_ASM\r
39 \r
40 #include "profile_tm.h"\r
41 \r
42 #ifdef FIXED_POINT\r
43 \r
44 #define OVERRIDE_KFBFLY2\r
45 static void kf_bfly2(\r
46                 kiss_fft_cpx            *Fout,\r
47         const int                       fstride,\r
48         const kiss_fft_cfg      st,\r
49         int                                     m\r
50         )\r
51 {\r
52         register int * restrict Fout2;\r
53     register int * restrict tw1 = (int*)st->twiddles;\r
54     register int i, j;\r
55         register int _inv = !st->inverse;\r
56     \r
57         Fout2 = (int*)Fout + m;\r
58         \r
59         for ( i=0,j=0 ; i<m ; ++i,j+=4,tw1+=fstride )\r
60         {       register int tw_10, ff_10, f2_10;\r
61 \r
62                 ff_10   = ld32x(Fout, i);\r
63                 f2_10   = ld32x(Fout2, i);\r
64                 tw_10   = ld32(tw1);\r
65                 \r
66                 if ( _inv ) \r
67                 {       TM_SHR(f2_10, f2_10, 1);\r
68                         TM_SHR(ff_10, ff_10, 1);\r
69                 }\r
70 \r
71                 TM_MUL(tw_10, tw_10, f2_10);\r
72                 TM_SUB(f2_10, ff_10, tw_10);\r
73                 TM_ADD(ff_10, ff_10, tw_10);\r
74 \r
75                 st32d(j, Fout2, f2_10);\r
76                 st32d(j,  Fout, ff_10);\r
77         }\r
78 }\r
79 \r
80 #define OVERRIDE_KFBFLY4\r
81 static void kf_bfly4(\r
82         kiss_fft_cpx            *Fout,\r
83         const int                       fstride,\r
84         const kiss_fft_cfg      st,\r
85         const int                       m\r
86         )\r
87 {\r
88     register int * restrict tw1;\r
89         register int * restrict tw2;\r
90         register int * restrict tw3;\r
91         register int * restrict Fout1;\r
92         register int * restrict Fout2;\r
93         register int * restrict Fout3;\r
94         register int i, j;\r
95         register int fstride2, fstride3;\r
96         register int _inv = !st->inverse;\r
97 \r
98         tw3  = tw2 = tw1 = (int*)st->twiddles;\r
99         fstride2 = fstride << 1;\r
100         fstride3 = fstride * 3;\r
101 \r
102         Fout1 = (int*)Fout + m;\r
103         Fout2 = (int*)Fout + (m << 1);\r
104         Fout3 = (int*)Fout + (m *  3);\r
105 \r
106 \r
107         for ( i=0,j=0 ; i<m ; ++i,j+=4,tw1+=fstride,tw2+=fstride2,tw3+=fstride3 )\r
108         {       register int sc0, sc1, sc2, sc3, sc4, sc5;\r
109                 register int ff0;\r
110 \r
111                 sc0   = ld32x(Fout1,i);\r
112                 sc3   = ld32(tw1);\r
113                 sc1   = ld32x(Fout2, i);\r
114                 sc4   = ld32(tw2);                      \r
115                 sc2   = ld32x(Fout3, i);\r
116                 sc5   = ld32(tw3);\r
117                 ff0   = ld32x(Fout,i);\r
118                 \r
119                 if ( _inv )\r
120                 {\r
121                         TM_ADD(sc0, sc0, 0x00020002);\r
122                         TM_ADD(sc1, sc1, 0x00020002);\r
123                         TM_ADD(sc2, sc2, 0x00020002);\r
124                         TM_ADD(ff0, ff0, 0x00020002);\r
125                         TM_SHR(sc0, sc0, 2);\r
126                         TM_SHR(sc1, sc1, 2);\r
127                         TM_SHR(sc2, sc2, 2);\r
128                         TM_SHR(ff0, ff0, 2);\r
129                 }\r
130 \r
131                 TM_MUL(sc0, sc0, sc3);\r
132                 TM_MUL(sc1, sc1, sc4);\r
133                 TM_MUL(sc2, sc2, sc5);\r
134                 TM_SUB(sc5, ff0, sc1);\r
135                 TM_ADD(ff0, ff0, sc1);\r
136                 TM_ADD(sc3, sc0, sc2);\r
137                 TM_SUB(sc4, sc0, sc2);\r
138                 TM_SUB(sc1, ff0, sc3);\r
139                 TM_ADD(ff0, ff0, sc3);\r
140                 \r
141                 st32d(j, Fout2, sc1);\r
142                 st32d(j, Fout,  ff0);\r
143 \r
144                 sc5 = funshift2(sc5, sc5);\r
145                 \r
146                 if ( _inv )\r
147                 {       TM_ADD(ff0, sc5, sc4);\r
148                         TM_SUB(sc1, sc5, sc4);\r
149                 } else\r
150                 {       TM_ADD(sc1, sc5, sc4);\r
151                         TM_SUB(ff0, sc5, sc4);\r
152                 }\r
153 \r
154                 sc0 = funshift2(sc1, ff0);\r
155                 sc2 = funshift2(ff0, sc1);\r
156 \r
157                 st32d(j, Fout1, sc0);\r
158                 st32d(j, Fout3, sc2);\r
159         }\r
160 }\r
161 \r
162 \r
163 #define OVERRIDE_KFBFLY3\r
164 static void kf_bfly3(\r
165          kiss_fft_cpx   *Fout,\r
166          const int              fstride,\r
167          const                  kiss_fft_cfg st,\r
168          int                    m\r
169          )\r
170 {\r
171     register int * restrict tw1;\r
172         register int * restrict tw2;\r
173         register int * restrict Fout1;\r
174         register int * restrict Fout2;\r
175     register int epi;\r
176         register int i, j;\r
177         register int fstride2;\r
178         register int _inv = !st->inverse;\r
179 \r
180     tw1  = tw2 = (int*)st->twiddles;\r
181         Fout1 = (int*)Fout + m;\r
182         Fout2 = (int*)Fout + (m << 1);\r
183         epi = tw1[fstride*m];\r
184     epi = pack16lsb(epi,epi);\r
185         fstride2 = fstride << 1;\r
186 \r
187          for ( i=0,j=0 ; i<m ; ++i,j+=4,tw1+=fstride,tw2+=fstride2 )\r
188          {      register int sc0, sc1, sc2, sc3, sc4, sc5;\r
189                 register int ff0;\r
190 \r
191                 sc1 = ld32x(Fout1,i);\r
192                 sc2 = ld32x(Fout2,i);\r
193                 sc3 = ld32(tw1);\r
194                 sc4 = ld32(tw2);\r
195                 ff0 = ld32x(Fout,i);\r
196                 \r
197                 if ( _inv )\r
198                 {\r
199                         TM_DIV(sc1, sc1, 3);\r
200                         TM_DIV(sc2, sc2, 3);\r
201                         TM_DIV(ff0, ff0, 3);\r
202                 }\r
203 \r
204                 TM_MUL(sc1, sc1,  sc3);\r
205                 TM_MUL(sc2, sc2,  sc4);\r
206                 TM_ADD(sc3, sc1,  sc2);\r
207                 TM_SUB(sc0, sc1,  sc2);\r
208                 TM_SHR(sc4, sc3,    1);\r
209                 TM_SUB(sc1, ff0,  sc4);\r
210 \r
211                 sc0 = dspidualmul(sc0, epi);\r
212                 sc0 = funshift2(sc0, sc0);\r
213 \r
214                 TM_ADD(ff0, ff0, sc3);\r
215                 TM_ADD(sc4, sc1, sc0);\r
216                 TM_SUB(sc5, sc1, sc0);\r
217 \r
218                 sc1 = funshift2(sc4, sc5);\r
219                 sc2 = funshift2(sc5, sc4);\r
220                 sc2 = funshift2(sc2, sc2);\r
221 \r
222                 st32d(j, Fout1, sc1);\r
223                 st32d(j, Fout,  ff0);\r
224                 st32d(j, Fout2, sc2);\r
225          }\r
226 }\r
227 \r
228 \r
229 #define OVERRIDE_KFBFLY5\r
230 static void kf_bfly5(\r
231         kiss_fft_cpx            *Fout,\r
232         const int                       fstride,\r
233         const kiss_fft_cfg      st,\r
234         int m\r
235         )\r
236 {   \r
237     register int * restrict tw1;\r
238         register int * restrict tw2;\r
239         register int * restrict tw3;\r
240         register int * restrict tw4;\r
241         register int * restrict Fout1;\r
242         register int * restrict Fout2;\r
243         register int * restrict Fout3;\r
244         register int * restrict Fout4;\r
245         register int fstride2, fstride3, fstride4;\r
246         register int i, j;\r
247         register int yab_msb, yab_lsb, yba_msb, yba_lsb;\r
248         register int _inv = !st->inverse;\r
249 \r
250 \r
251     Fout1=(int*)Fout+m;\r
252     Fout2=(int*)Fout+(m<<1);\r
253     Fout3=(int*)Fout+(3 *m);\r
254     Fout4=(int*)Fout+(m<<2);\r
255 \r
256     tw1 = tw2 = tw3 = tw4 = (int*)st->twiddles;\r
257 \r
258         i = tw1[fstride*m];\r
259     yab_lsb = tw1[fstride*(m<<1)];\r
260         yab_msb = pack16msb(i, yab_lsb);\r
261         yab_lsb = pack16lsb(i, yab_lsb);\r
262         yba_msb = funshift2(-sex16(yab_msb), yab_msb);\r
263         yba_lsb = funshift2(yab_lsb, yab_lsb);\r
264 \r
265         fstride2 = fstride << 1;\r
266         fstride3 = fstride *  3;\r
267         fstride4 = fstride << 2;\r
268 \r
269         for ( i=0,j=0 ; i<m ; ++i,j+=4,tw1+=fstride,tw2+=fstride2,tw3+=fstride3,tw4+=fstride4 )\r
270         {       register int sc0, sc1, sc2, sc3, sc4, sc5, sc6;\r
271                 register int sc7, sc8, sc9, sc10, sc11, sc12;\r
272                 register int ff0, sc78_msb, sc78_lsb, sc90_msb, sc90_lsb;\r
273 \r
274                 sc0 = ld32x(Fout,i);\r
275                 sc1 = ld32x(Fout1,i);\r
276                 sc2 = ld32x(Fout2,i);\r
277                 sc3 = ld32x(Fout3,i);\r
278                 sc4 = ld32x(Fout4,i);\r
279                 sc5 = ld32(tw1);\r
280                 sc6 = ld32(tw2);\r
281                 sc7 = ld32(tw3);\r
282                 sc8 = ld32(tw4);\r
283 \r
284                 if ( _inv )\r
285                 {\r
286                         TM_DIV(sc0, sc0, 5);\r
287                         TM_DIV(sc1, sc1, 5);\r
288                         TM_DIV(sc2, sc2, 5);\r
289                         TM_DIV(sc3, sc3, 5);\r
290                         TM_DIV(sc4, sc4, 5);\r
291                 }\r
292 \r
293                 ff0 = sc0;\r
294 \r
295                 TM_MUL(sc1, sc1, sc5);\r
296                 TM_MUL(sc2, sc2, sc6);\r
297                 TM_MUL(sc3, sc3, sc7);\r
298                 TM_MUL(sc4, sc4, sc8);\r
299                 TM_ADD(sc7, sc1, sc4);\r
300                 TM_SUB(sc10,sc1, sc4);\r
301                 TM_ADD(sc8, sc2, sc3);\r
302                 TM_SUB(sc9, sc2, sc3);\r
303 \r
304                 TM_ADD(ff0, ff0, sc7);\r
305                 TM_ADD(ff0, ff0, sc8);\r
306                 st32d(j, Fout,  ff0);\r
307 \r
308                 sc78_msb = pack16msb(sc7,sc8);\r
309                 sc78_lsb = pack16lsb(sc7,sc8);\r
310                 sc90_msb = pack16msb(sc10,sc9);\r
311                 sc90_lsb = pack16lsb(sc10,sc9);\r
312                 \r
313                 sc5 = pack16lsb( sround(ifir16(sc78_msb,yab_lsb)), sround(ifir16(sc78_lsb,yab_lsb)));\r
314                 sc6 = pack16lsb(-sround(ifir16(sc90_lsb,yab_msb)), sround(ifir16(sc90_msb,yab_msb)));\r
315 \r
316                 TM_ADD(sc5, sc5, sc0);\r
317                 TM_SUB(sc1, sc5, sc6);\r
318                 TM_ADD(sc4, sc5, sc6);\r
319                 st32d(j, Fout1, sc1);\r
320                 st32d(j, Fout4, sc4);\r
321 \r
322                 sc11 = pack16lsb( sround(ifir16(sc78_msb,yba_lsb)), sround(ifir16(sc78_lsb,yba_lsb)));\r
323                 sc12 = pack16lsb(-sround(ifir16(sc90_lsb,yba_msb)), sround(ifir16(sc90_msb,yba_msb)));\r
324 \r
325                 TM_ADD(sc11, sc11, sc0);\r
326                 TM_ADD(sc2, sc11, sc12);\r
327                 TM_SUB(sc3, sc11, sc12);\r
328                 st32d(j, Fout2, sc2);\r
329                 st32d(j, Fout3, sc3);\r
330 \r
331         }\r
332 }\r
333 \r
334 \r
335 #define OVERRIDE_KF_BFLY_GENERIC\r
336 static void kf_bfly_generic(\r
337         kiss_fft_cpx * restrict Fout,\r
338         const size_t fstride,\r
339         const kiss_fft_cfg st,\r
340         int m,\r
341         int p\r
342         )\r
343 {\r
344         register int _inv = !st->inverse;\r
345         register int i, j, k, l;\r
346     register int * restrict twiddles = (int*)st->twiddles;\r
347     register int Norig = st->nfft;\r
348 \r
349     CHECKBUF(scratchbuf,nscratchbuf,p);\r
350 \r
351     for ( i=0; i<m; ++i ) \r
352         {       register int sc10;\r
353 \r
354         for ( j=0,k=i ; j<p ; ++j,k+=m ) \r
355                 {       register int f10;\r
356 \r
357                         f10 = ld32x(Fout,k);\r
358 \r
359                         if ( _inv ) \r
360                         {       TM_DIV(f10, f10, p);\r
361                         }\r
362 \r
363                         st32d(j<<2, scratchbuf, f10);\r
364         }\r
365 \r
366         for ( j=0,k=i,sc10=ld32(scratchbuf) ; j<p ; ++j,k+=m ) \r
367                 {\r
368             register int twidx = 0;\r
369                         register int f10;\r
370 \r
371             for ( l=1,f10 = sc10 ; l<p ; ++l ) \r
372                         {       register int tw, sc;\r
373 \r
374                 twidx += fstride * k;\r
375                                 if ( twidx>=Norig ) \r
376                                 {       twidx -= Norig;\r
377                                 }\r
378                                 \r
379                                 sc = ld32x(scratchbuf,l);\r
380                                 tw = ld32x(twiddles,twidx);\r
381                 \r
382                                 TM_MUL(sc, sc, tw);\r
383                                 TM_ADD(f10, f10, sc);\r
384                         }\r
385                         st32d(k<<2, Fout, f10); \r
386                 }\r
387         }\r
388 }\r
389 \r
390 #else\r
391 \r
392 #define OVERRIDE_KFBFLY2\r
393 static void kf_bfly2(\r
394         kiss_fft_cpx * Fout,\r
395         const size_t fstride,\r
396         const kiss_fft_cfg st,\r
397         int m\r
398         )\r
399 {\r
400     register kiss_fft_cpx * restrict Fout2;\r
401     register kiss_fft_cpx * restrict tw1 = st->twiddles;\r
402 \r
403     Fout2 = Fout + m;\r
404 \r
405     do\r
406         {\r
407                 register kiss_fft_cpx _fout2, _fout, t;\r
408                 \r
409                 _fout2 = *Fout2;\r
410                 _fout  = *Fout;\r
411                 \r
412         C_MUL   (         t,  _fout2,   *tw1);\r
413         C_SUB   (_fout2,   _fout,          t);\r
414         C_ADD   (_fout,    _fout,          t);\r
415                 \r
416                 *Fout2 = _fout2;\r
417                 *Fout  = _fout;\r
418                 \r
419                 tw1     += fstride;\r
420         ++Fout2;\r
421         ++Fout;\r
422 \r
423     } while ( --m );\r
424 }\r
425 \r
426 #define OVERRIDE_KFBFLY4\r
427 static void kf_bfly4(\r
428         kiss_fft_cpx * Fout,\r
429         const int fstride,\r
430         const kiss_fft_cfg st,\r
431         int m\r
432         )\r
433 {\r
434     register kiss_fft_cpx * restrict tw1,* restrict tw2,* restrict tw3;\r
435         register kiss_fft_cpx * restrict Fout1, * restrict Fout2, * restrict Fout3; \r
436         register int _inv = !st->inverse;\r
437         \r
438     tw3 = tw2 = tw1 = st->twiddles;\r
439         \r
440         Fout1 = Fout + m;\r
441         Fout2 = Fout + (m << 1);\r
442         Fout3 = Fout + (m * 3);\r
443 \r
444         do {\r
445            \r
446                 register kiss_fft_cpx _fout;\r
447                 register kiss_fft_cpx sc0, sc1, sc2, sc3, sc4, sc5;\r
448                 \r
449                 _fout = *Fout;\r
450                 \r
451                 C_MUL(   sc0,*Fout1, *tw1);\r
452                 C_MUL(   sc1,*Fout2, *tw2);\r
453                 C_MUL(   sc2,*Fout3, *tw3);\r
454                 C_SUB(   sc5, _fout,  sc1);\r
455                 C_ADD( _fout, _fout,  sc1);\r
456                 C_ADD(   sc3,   sc0,  sc2);\r
457                 C_SUB(   sc4,   sc0,  sc2);\r
458                 C_SUB(*Fout2, _fout,  sc3);\r
459                 C_ADD( *Fout, _fout,  sc3);\r
460 \r
461                 tw1 += fstride;         \r
462                 tw2 += (fstride << 1);\r
463                 tw3 += (fstride *  3);\r
464                 \r
465                 if ( _inv )\r
466                 {\r
467                         Fout1->r = sc5.r + sc4.i;\r
468                         Fout1->i = sc5.i - sc4.r;\r
469                         Fout3->r = sc5.r - sc4.i;\r
470                         Fout3->i = sc5.i + sc4.r;\r
471                 }\r
472                 else\r
473                 {       Fout1->r = sc5.r - sc4.i;\r
474                         Fout1->i = sc5.i + sc4.r;\r
475                         Fout3->r = sc5.r + sc4.i;\r
476                         Fout3->i = sc5.i - sc4.r;\r
477                 }\r
478                   \r
479                   \r
480         ++Fout; ++Fout1; ++Fout2; ++Fout3;\r
481                 \r
482     } while(--m);\r
483 }\r
484 \r
485 #define OVERRIDE_KFBFLY3\r
486 static void kf_bfly3(\r
487          kiss_fft_cpx * Fout,\r
488          const int fstride,\r
489          const kiss_fft_cfg st,\r
490          int m\r
491          )\r
492 {\r
493         register kiss_fft_cpx * restrict Fout1, * restrict Fout2;\r
494         register kiss_fft_cpx * restrict tw1,* restrict tw2;\r
495         register float epi;\r
496         \r
497     tw1 = tw2 = st->twiddles;\r
498     epi = st->twiddles[fstride*m].i;\r
499         Fout1 = Fout + m;\r
500         Fout2 = Fout + (m << 1);\r
501 \r
502     do {\r
503         \r
504                 register kiss_fft_cpx _fout;\r
505                 register kiss_fft_cpx sc0, sc1, sc2, sc3;\r
506                 \r
507                 _fout = *Fout;\r
508                 \r
509         C_MUL(   sc1, *Fout1,  *tw1);\r
510         C_MUL(   sc2, *Fout2,  *tw2);\r
511         C_ADD(   sc3,    sc1,   sc2);\r
512         C_SUB(   sc0,    sc1,   sc2);\r
513         tw1 += fstride;\r
514         tw2 += (fstride << 1);\r
515                 \r
516         sc1.r = _fout.r - HALF_OF(sc3.r);\r
517         sc1.i = _fout.i - HALF_OF(sc3.i);\r
518                 \r
519         C_MULBYSCALAR(sc0,  epi);\r
520         C_ADD(*Fout, _fout, sc3);\r
521                 \r
522         Fout2->r = sc1.r + sc0.i;\r
523         Fout2->i = sc1.i - sc0.r;\r
524                 \r
525         Fout1->r = sc1.i - sc0.i;\r
526         Fout1->i = sc1.r + sc0.r;\r
527                 \r
528         ++Fout; ++Fout1; ++Fout2;\r
529                 \r
530         } while(--m);\r
531 }\r
532 \r
533 #define OVERRIDE_KFBFLY5\r
534 static void kf_bfly5(\r
535         kiss_fft_cpx * Fout,\r
536         const size_t fstride,\r
537         const kiss_fft_cfg st,\r
538         int m\r
539         )\r
540 {\r
541     register kiss_fft_cpx * restrict Fout1,* restrict Fout2,* restrict Fout3,* restrict Fout4;\r
542         register int u;\r
543     register kiss_fft_cpx *tw;\r
544     register float yar, yai, ybr, ybi;\r
545 \r
546     Fout1=Fout+m;\r
547     Fout2=Fout+(m<<1);\r
548     Fout3=Fout+(m*3);\r
549     Fout4=Fout+(m<<2);\r
550 \r
551     tw = st->twiddles;\r
552     yar = tw[fstride*m].r;\r
553         yai = tw[fstride*m].i;\r
554     ybr = tw[fstride*2*m].r;\r
555         ybi = tw[fstride*2*m].i;\r
556    \r
557         for ( u=0; u<m; ++u )\r
558         {\r
559                 register kiss_fft_cpx sc0, sc1, sc2, sc3, sc4, sc5, sc6, sc7, sc8, sc9, sc10, sc11, sc12;\r
560                 \r
561                 sc0 = *Fout;\r
562                 \r
563         C_MUL(   sc1,*Fout1,   tw[u*fstride]);\r
564         C_MUL(   sc2,*Fout2, tw[2*u*fstride]);\r
565         C_MUL(   sc3,*Fout3, tw[3*u*fstride]);\r
566         C_MUL(   sc4,*Fout4, tw[4*u*fstride]);\r
567                 \r
568         C_ADD(   sc7,   sc1,   sc4);\r
569         C_SUB(  sc10,   sc1,   sc4);\r
570         C_ADD(   sc8,   sc2,   sc3);\r
571         C_SUB(   sc9,   sc2,   sc3);\r
572                 \r
573         Fout->r = sc0.r + sc7.r + sc8.r;\r
574         Fout->i = sc0.i + sc7.i + sc8.i;\r
575                 \r
576         sc5.r = sc0.r + S_MUL(sc7.r,yar) + S_MUL(sc8.r,ybr);\r
577         sc5.i = sc0.i + S_MUL(sc7.i,yar) + S_MUL(sc8.i,ybr);\r
578                 \r
579         sc6.r =  S_MUL(sc10.i,yai) + S_MUL(sc9.i,ybi);\r
580         sc6.i = -S_MUL(sc10.r,yai) - S_MUL(sc9.r,ybi);\r
581                 \r
582         C_SUB(*Fout1,sc5,sc6);\r
583         C_ADD(*Fout4,sc5,sc6);\r
584                 \r
585         sc11.r = sc0.r + S_MUL(sc7.r,ybr) + S_MUL(sc8.r,yar);\r
586         sc11.i = sc0.i + S_MUL(sc7.i,ybr) + S_MUL(sc8.i,yar);\r
587         sc12.r = - S_MUL(sc10.i,ybi) + S_MUL(sc9.i,yai);\r
588         sc12.i = S_MUL(sc10.r,ybi) - S_MUL(sc9.r,yai);\r
589         C_ADD(*Fout2,sc11,sc12);\r
590         C_SUB(*Fout3,sc11,sc12);\r
591                 \r
592         ++Fout1; ++Fout2; ++Fout3; ++Fout4;\r
593         }\r
594 }\r
595 \r
596 \r
597 #endif\r
598 \r
599 #endif\r