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