1 /* { dg-do compile } */
2 #include <altivec.h>
3
4 inline void
transpose4x4(vector float * matrix)5 transpose4x4(vector float *matrix)
6 {
7 vector float v0, v1, v2, v3;
8
9 v0 = vec_mergeh(matrix[0], matrix[2]);
10 v1 = vec_mergel(matrix[0], matrix[2]);
11 v2 = vec_mergeh(matrix[1], matrix[3]);
12 v3 = vec_mergel(matrix[1], matrix[3]);
13
14 matrix[0] = vec_mergeh(v0, v2);
15 matrix[1] = vec_mergel(v0, v2);
16 matrix[2] = vec_mergeh(v1, v3);
17 matrix[3] = vec_mergel(v1, v3);
18 }
19
20 void
vec_ifft64(vector float * x0,vector float * x1)21 vec_ifft64(vector float *x0, vector float *x1)
22 {
23 int i;
24 vector float real[4], imag[4];
25 vector float c0r, c1r, c2r, c3r, c0i, c1i, c2i, c3i;
26 vector float d0r, d1r, d2r, d3r, d0i, d1i, d2i, d3i;
27
28 /*
29 * N=64
30 *
31 * Stage 1: t=1 => k = 0, j = 0..15
32 * ================================
33 * for j = 0:15
34 * c0 = x0(j+0*16);
35 * c1 = x0(j+1*16);
36 * c2 = x0(j+2*16);
37 * c3 = x0(j+3*16);
38 *
39 * d0 = c0 + c2;
40 * d1 = c0 - c2;
41 * d2 = c1 + c3;
42 * d3 = i*(c1 - c3);
43 *
44 * x1(4j+0) = d0 + d2;
45 * x1(4j+1) = d1 + d3;
46 * x1(4j+2) = d0 - d2;
47 * x1(4j+3) = d1 - d3;
48 * end
49 ******************************************************/
50
51 for (i=0; i < 4; i++)
52 {
53 c0r = x0[i];
54 c1r = x0[i+4];
55 c2r = x0[i+8];
56 c3r = x0[i+12];
57
58 c0i = x0[i+16];
59 c1i = x0[i+20];
60 c2i = x0[i+24];
61 c3i = x0[i+28];
62
63 d0r = vec_add(c0r, c2r);
64 d1r = vec_sub(c0r, c2r);
65 d2r = vec_add(c1r, c3r);
66 d3r = vec_sub(c3i, c1i);
67
68 d0i = vec_add(c0i, c2i);
69 d1i = vec_sub(c0i, c2i);
70 d2i = vec_add(c1i, c3i);
71 d3i = vec_sub(c1r, c3r);
72
73 /* Calculate real{x1} */
74 real[0] = vec_add(d0r, d2r);
75 real[1] = vec_add(d1r, d3r);
76 real[2] = vec_sub(d0r, d2r);
77 real[3] = vec_sub(d1r, d3r);
78
79 transpose4x4(real);
80
81 /* Calculate imag{x1} */
82 imag[0] = vec_add(d0i, d2i);
83 imag[1] = vec_add(d1i, d3i);
84 imag[2] = vec_sub(d0i, d2i);
85 imag[3] = vec_sub(d1i, d3i);
86
87 transpose4x4(imag);
88
89 x1[4*i] = real[0];
90 x1[4*i+1] = real[1];
91 x1[4*i+2] = real[2];
92 x1[4*i+3] = real[3];
93
94 x1[4*i+16] = imag[0];
95 x1[4*i+17] = imag[1];
96 x1[4*i+18] = imag[2];
97 x1[4*i+19] = imag[3];
98 }
99 }
100