summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/vmx/fft.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/gcc.dg/vmx/fft.c')
-rw-r--r--gcc/testsuite/gcc.dg/vmx/fft.c99
1 files changed, 99 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/vmx/fft.c b/gcc/testsuite/gcc.dg/vmx/fft.c
new file mode 100644
index 000000000..2b8a537c6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vmx/fft.c
@@ -0,0 +1,99 @@
+/* { dg-do compile } */
+#include <altivec.h>
+
+inline void
+transpose4x4(vector float *matrix)
+{
+ vector float v0, v1, v2, v3;
+
+ v0 = vec_mergeh(matrix[0], matrix[2]);
+ v1 = vec_mergel(matrix[0], matrix[2]);
+ v2 = vec_mergeh(matrix[1], matrix[3]);
+ v3 = vec_mergel(matrix[1], matrix[3]);
+
+ matrix[0] = vec_mergeh(v0, v2);
+ matrix[1] = vec_mergel(v0, v2);
+ matrix[2] = vec_mergeh(v1, v3);
+ matrix[3] = vec_mergel(v1, v3);
+}
+
+void
+vec_ifft64(vector float *x0, vector float *x1)
+{
+ int i;
+ vector float real[4], imag[4];
+ vector float c0r, c1r, c2r, c3r, c0i, c1i, c2i, c3i;
+ vector float d0r, d1r, d2r, d3r, d0i, d1i, d2i, d3i;
+
+ /*
+ * N=64
+ *
+ * Stage 1: t=1 => k = 0, j = 0..15
+ * ================================
+ * for j = 0:15
+ * c0 = x0(j+0*16);
+ * c1 = x0(j+1*16);
+ * c2 = x0(j+2*16);
+ * c3 = x0(j+3*16);
+ *
+ * d0 = c0 + c2;
+ * d1 = c0 - c2;
+ * d2 = c1 + c3;
+ * d3 = i*(c1 - c3);
+ *
+ * x1(4j+0) = d0 + d2;
+ * x1(4j+1) = d1 + d3;
+ * x1(4j+2) = d0 - d2;
+ * x1(4j+3) = d1 - d3;
+ * end
+ ******************************************************/
+
+ for (i=0; i < 4; i++)
+ {
+ c0r = x0[i];
+ c1r = x0[i+4];
+ c2r = x0[i+8];
+ c3r = x0[i+12];
+
+ c0i = x0[i+16];
+ c1i = x0[i+20];
+ c2i = x0[i+24];
+ c3i = x0[i+28];
+
+ d0r = vec_add(c0r, c2r);
+ d1r = vec_sub(c0r, c2r);
+ d2r = vec_add(c1r, c3r);
+ d3r = vec_sub(c3i, c1i);
+
+ d0i = vec_add(c0i, c2i);
+ d1i = vec_sub(c0i, c2i);
+ d2i = vec_add(c1i, c3i);
+ d3i = vec_sub(c1r, c3r);
+
+ /* Calculate real{x1} */
+ real[0] = vec_add(d0r, d2r);
+ real[1] = vec_add(d1r, d3r);
+ real[2] = vec_sub(d0r, d2r);
+ real[3] = vec_sub(d1r, d3r);
+
+ transpose4x4(real);
+
+ /* Calculate imag{x1} */
+ imag[0] = vec_add(d0i, d2i);
+ imag[1] = vec_add(d1i, d3i);
+ imag[2] = vec_sub(d0i, d2i);
+ imag[3] = vec_sub(d1i, d3i);
+
+ transpose4x4(imag);
+
+ x1[4*i] = real[0];
+ x1[4*i+1] = real[1];
+ x1[4*i+2] = real[2];
+ x1[4*i+3] = real[3];
+
+ x1[4*i+16] = imag[0];
+ x1[4*i+17] = imag[1];
+ x1[4*i+18] = imag[2];
+ x1[4*i+19] = imag[3];
+ }
+}