1  /* { dg-do run } */
       2  /* { dg-require-effective-target avx512f } */
       3  /* { dg-options "-O3 -mavx512f -ffast-math -mtune=knl" } */
       4  
       5  #include "avx512f-check.h"
       6  
       7  #define N 1024
       8  float f[N];
       9  double d[N];
      10  int k[N];
      11  float *l[N];
      12  double *n[N];
      13  int **m[N];
      14  long q[N];
      15  long long **o[N];
      16  long long t[N];
      17  long long *r[N];
      18  int *s[N];
      19  
      20  __attribute__((noinline, noclone)) float
      21  f1 (void)
      22  {
      23    int i;
      24    float g = 0.0;
      25    for (i = 0; i < N / 2; i++)
      26      g += f[k[i]];
      27    return g;
      28  }
      29  
      30  __attribute__((noinline, noclone)) float
      31  f2 (float *p)
      32  {
      33    int i;
      34    float g = 0.0;
      35    for (i = 0; i < N / 2; i++)
      36      g += p[k[i]];
      37    return g;
      38  }
      39  
      40  __attribute__((noinline, noclone)) float
      41  f3 (void)
      42  {
      43    int i;
      44    float g = 0.0;
      45    for (i = 0; i < N / 2; i++)
      46      g += *l[i];
      47    return g;
      48  }
      49  
      50  __attribute__((noinline, noclone)) int
      51  f4 (void)
      52  {
      53    int i;
      54    int g = 0;
      55    for (i = 0; i < N / 2; i++)
      56      g += **m[i];
      57    return g;
      58  }
      59  
      60  __attribute__((noinline, noclone)) double
      61  f5 (void)
      62  {
      63    int i;
      64    double g = 0.0;
      65    for (i = 0; i < N / 2; i++)
      66      g += d[k[i]];
      67    return g;
      68  }
      69  
      70  __attribute__((noinline, noclone)) double
      71  f6 (double *p)
      72  {
      73    int i;
      74    double g = 0.0;
      75    for (i = 0; i < N / 2; i++)
      76      g += p[k[i]];
      77    return g;
      78  }
      79  
      80  __attribute__((noinline, noclone)) double
      81  f7 (void)
      82  {
      83    int i;
      84    double g = 0.0;
      85    for (i = 0; i < N / 2; i++)
      86      g += *n[i];
      87    return g;
      88  }
      89  
      90  __attribute__((noinline, noclone)) int
      91  f8 (void)
      92  {
      93    int i;
      94    int g = 0;
      95    for (i = 0; i < N / 2; i++)
      96      g += **o[i];
      97    return g;
      98  }
      99  
     100  __attribute__((noinline, noclone)) float
     101  f9 (void)
     102  {
     103    int i;
     104    float g = 0.0;
     105    for (i = 0; i < N / 2; i++)
     106      g += f[q[i]];
     107    return g;
     108  }
     109  
     110  __attribute__((noinline, noclone)) float
     111  f10 (float *p)
     112  {
     113    int i;
     114    float g = 0.0;
     115    for (i = 0; i < N / 2; i++)
     116      g += p[q[i]];
     117    return g;
     118  }
     119  
     120  __attribute__((noinline, noclone)) double
     121  f11 (void)
     122  {
     123    int i;
     124    double g = 0.0;
     125    for (i = 0; i < N / 2; i++)
     126      g += d[q[i]];
     127    return g;
     128  }
     129  
     130  __attribute__((noinline, noclone)) double
     131  f12 (double *p)
     132  {
     133    int i;
     134    double g = 0.0;
     135    for (i = 0; i < N / 2; i++)
     136      g += p[q[i]];
     137    return g;
     138  }
     139  
     140  static void
     141  avx512f_test (void)
     142  {
     143    int i;
     144  
     145    for (i = 0; i < N; i++)
     146      {
     147        asm ("");
     148        f[i] = -256.0f + i;
     149        d[i] = -258.0 + i;
     150        k[i] = (i * 731) & (N - 1);
     151        q[i] = (i * 657) & (N - 1);
     152        t[i] = (i * 657) & (N - 1);
     153        l[i] = &f[(i * 239) & (N - 1)];
     154        n[i] = &d[(i * 271) & (N - 1)];
     155        r[i] = &t[(i * 323) & (N - 1)];
     156        s[i] = &k[(i * 565) & (N - 1)];
     157        m[i] = &s[(i * 13) & (N - 1)];
     158        o[i] = &r[(i * 19) & (N - 1)];
     159      }
     160  
     161    if (f1 () != 136448.0f || f2 (f) != 136448.0f || f3 () != 130304.0)
     162      abort ();
     163    if (f4 () != 261376 || f5 () != 135424.0 || f6 (d) != 135424.0)
     164      abort ();
     165    if (f7 () != 129280.0 || f8 () != 259840L || f9 () != 130816.0f)
     166      abort ();
     167    if (f10 (f) != 130816.0f || f11 () != 129792.0 || f12 (d) != 129792.0)
     168      abort ();
     169  }