1 
2 extern void cpass(complex *,const complex *,unsigned int);
3 extern void cpassbig(complex *,const complex *,unsigned int);
4 extern void upass(complex *,const complex *,unsigned int);
5 extern void upassbig(complex *,const complex *,unsigned int);
6 extern void rpass(real *,const complex *,unsigned int);
7 extern void rpassbig(real *,const complex *,unsigned int);
8 extern void vpass(real *,const complex *,unsigned int);
9 extern void vpassbig(real *,const complex *,unsigned int);
10 
11 extern const complex d16[];
12 extern const complex d32[];
13 extern const complex d64[];
14 extern const complex d128[];
15 extern const complex d256[];
16 extern const complex d512[];
17 extern const complex d1024[];
18 extern const complex d2048[];
19 extern const complex d4096[];
20 extern const complex d8192[];
21 extern const complex d16384[];
22 extern const complex d32768[];
23 extern const complex d65536[];
24 
25 #define sqrthalf (d16[1].re)
26 
27 #define TRANSFORM(a0,a1,a2,a3,wre,wim) { \
28   t1 = a0.re - a2.re; \
29   t2 = a0.im - a2.im; \
30   t3 = a1.re - a3.re; \
31   t4 = a1.im - a3.im; \
32   a0.re += a2.re; \
33   a0.im += a2.im; \
34   a1.re += a3.re; \
35   a1.im += a3.im; \
36   t5 = t1 - t4; \
37   t6 = t2 + t3; \
38   t7 = t1 + t4; \
39   t8 = t2 - t3; \
40   a2.re = t5 * wre - t6 * wim; \
41   a2.im = t6 * wre + t5 * wim; \
42   a3.re = t7 * wre + t8 * wim; \
43   a3.im = t8 * wre - t7 * wim; \
44   }
45 
46 #define TRANSFORMHALF(a0,a1,a2,a3) { \
47   t1 = a0.re - a2.re; \
48   t2 = a0.im - a2.im; \
49   t3 = a1.re - a3.re; \
50   t4 = a1.im - a3.im; \
51   a0.re += a2.re; \
52   a0.im += a2.im; \
53   a1.re += a3.re; \
54   a1.im += a3.im; \
55   t5 = t1 - t4; \
56   t6 = t2 + t3; \
57   t7 = t1 + t4; \
58   t8 = t2 - t3; \
59   a2.re = (t5 - t6) * sqrthalf; \
60   a2.im = (t6 + t5) * sqrthalf; \
61   a3.re = (t7 + t8) * sqrthalf; \
62   a3.im = (t8 - t7) * sqrthalf; \
63   }
64 
65 #define TRANSFORMZERO(a0,a1,a2,a3) { \
66   t1 = a0.re - a2.re; \
67   t2 = a0.im - a2.im; \
68   t3 = a1.re - a3.re; \
69   t4 = a1.im - a3.im; \
70   a0.re += a2.re; \
71   a0.im += a2.im; \
72   a1.re += a3.re; \
73   a1.im += a3.im; \
74   a2.re = t1 - t4; \
75   a2.im = t2 + t3; \
76   a3.re = t1 + t4; \
77   a3.im = t2 - t3; \
78   }
79 
80 #define UNTRANSFORM(a0,a1,a2,a3,wre,wim) { \
81   t5 = a2.re * wre + a2.im * wim; \
82   t6 = a2.im * wre - a2.re * wim; \
83   t7 = a3.re * wre - a3.im * wim; \
84   t8 = a3.im * wre + a3.re * wim; \
85   t1 = t5 + t7; \
86   t2 = t6 + t8; \
87   t3 = t6 - t8; \
88   t4 = t7 - t5; \
89   a2.re = a0.re - t1; \
90   a2.im = a0.im - t2; \
91   a3.re = a1.re - t3; \
92   a3.im = a1.im - t4; \
93   a0.re += t1; \
94   a0.im += t2; \
95   a1.re += t3; \
96   a1.im += t4; \
97   }
98 
99 #define UNTRANSFORMHALF(a0,a1,a2,a3) { \
100   t5 = (a2.re + a2.im) * sqrthalf; \
101   t6 = (a2.im - a2.re) * sqrthalf; \
102   t7 = (a3.re - a3.im) * sqrthalf; \
103   t8 = (a3.im + a3.re) * sqrthalf; \
104   t1 = t5 + t7; \
105   t2 = t6 + t8; \
106   t3 = t6 - t8; \
107   t4 = t7 - t5; \
108   a2.re = a0.re - t1; \
109   a2.im = a0.im - t2; \
110   a3.re = a1.re - t3; \
111   a3.im = a1.im - t4; \
112   a0.re += t1; \
113   a0.im += t2; \
114   a1.re += t3; \
115   a1.im += t4; \
116   }
117 
118 #define UNTRANSFORMZERO(a0,a1,a2,a3) { \
119   t1 = a2.re + a3.re; \
120   t2 = a2.im + a3.im; \
121   t3 = a2.im - a3.im; \
122   t4 = a3.re - a2.re; \
123   a2.re = a0.re - t1; \
124   a2.im = a0.im - t2; \
125   a3.re = a1.re - t3; \
126   a3.im = a1.im - t4; \
127   a0.re += t1; \
128   a0.im += t2; \
129   a1.re += t3; \
130   a1.im += t4; \
131   }
132 
133 #define R(a0,a1,b0,b1,wre,wim) { \
134   t1 = a0 - a1; \
135   t2 = b0 - b1; \
136   t3 = a0 + a1; \
137   t4 = b0 + b1; \
138   b0 = t1 * wre - t2 * wim; \
139   b1 = t2 * wre + t1 * wim; \
140   a0 = t3; \
141   a1 = t4; \
142   }
143 
144 #define RHALF(a0,a1,b0,b1) { \
145   t1 = a0 - a1; \
146   t2 = b0 - b1; \
147   t3 = a0 + a1; \
148   t4 = b0 + b1; \
149   b0 = (t1 - t2) * sqrthalf; \
150   b1 = (t2 + t1) * sqrthalf; \
151   a0 = t3; \
152   a1 = t4; \
153   }
154 
155 #define RZERO(a0,a1,b0,b1) { \
156   t1 = a0 - a1; \
157   t2 = b0 - b1; \
158   t3 = a0 + a1; \
159   t4 = b0 + b1; \
160   b0 = t1; \
161   b1 = t2; \
162   a0 = t3; \
163   a1 = t4; \
164   }
165 
166 #define V(a0,a1,b0,b1,wre,wim) { \
167   t5 = b0 * wre + b1 * wim; \
168   t6 = b1 * wre - b0 * wim; \
169   t1 = a0 + t5; \
170   t2 = a0 - t5; \
171   t3 = a1 + t6; \
172   t4 = a1 - t6; \
173   a0 = t1; \
174   a1 = t2; \
175   b0 = t3; \
176   b1 = t4; \
177   }
178 
179 #define VHALF(a0,a1,b0,b1) { \
180   t5 = (b0 + b1) * sqrthalf; \
181   t6 = (b1 - b0) * sqrthalf; \
182   t1 = a0 + t5; \
183   t2 = a0 - t5; \
184   t3 = a1 + t6; \
185   t4 = a1 - t6; \
186   a0 = t1; \
187   a1 = t2; \
188   b0 = t3; \
189   b1 = t4; \
190   }
191 
192 #define VZERO(a0,a1,b0,b1) { \
193   t1 = a0 + b0; \
194   t2 = a0 - b0; \
195   t3 = a1 + b1; \
196   t4 = a1 - b1; \
197   a0 = t1; \
198   a1 = t2; \
199   b0 = t3; \
200   b1 = t4; \
201   }
202 
203