(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
vmx/
fft.c
       1  /* { dg-do compile } */
       2  #include <altivec.h>
       3  
       4  inline void
       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
      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  }