1  /* { dg-do run } */
       2  /* { dg-require-effective-target avx2 } */
       3  /* { dg-options "-O3 -mavx2 -mtune=skylake" } */
       4  
       5  #include "avx2-check.h"
       6  
       7  #define N 1024
       8  float vf1[N+16], vf2[N];
       9  double vd1[N+16], vd2[N];
      10  int k[N];
      11  long l[N];
      12  short n[N];
      13  
      14  __attribute__((noinline, noclone)) void
      15  f1 (void)
      16  {
      17    int i;
      18    for (i = 0; i < N; i++)
      19      vf2[i] = vf1[k[i]];
      20  }
      21  
      22  __attribute__((noinline, noclone)) void
      23  f2 (void)
      24  {
      25    int i;
      26    for (i = 0; i < N; i++)
      27      n[i] = (int) vf1[k[i]];
      28  }
      29  
      30  __attribute__((noinline, noclone)) void
      31  f3 (int x)
      32  {
      33    int i;
      34    for (i = 0; i < N; i++)
      35      vf2[i] = vf1[k[i] + x];
      36  }
      37  
      38  __attribute__((noinline, noclone)) void
      39  f4 (int x)
      40  {
      41    int i;
      42    for (i = 0; i < N; i++)
      43      n[i] = (int) vf1[k[i] + x];
      44  }
      45  
      46  __attribute__((noinline, noclone)) void
      47  f5 (void)
      48  {
      49    int i;
      50    for (i = 0; i < N; i++)
      51      vd2[i] = vd1[k[i]];
      52  }
      53  
      54  __attribute__((noinline, noclone)) void
      55  f6 (void)
      56  {
      57    int i;
      58    for (i = 0; i < N; i++)
      59      n[i] = (int) vd1[k[i]];
      60  }
      61  
      62  __attribute__((noinline, noclone)) void
      63  f7 (int x)
      64  {
      65    int i;
      66    for (i = 0; i < N; i++)
      67      vd2[i] = vd1[k[i] + x];
      68  }
      69  
      70  __attribute__((noinline, noclone)) void
      71  f8 (int x)
      72  {
      73    int i;
      74    for (i = 0; i < N; i++)
      75      n[i] = (int) vd1[k[i] + x];
      76  }
      77  
      78  __attribute__((noinline, noclone)) void
      79  f9 (void)
      80  {
      81    int i;
      82    for (i = 0; i < N; i++)
      83      vf2[i] = vf1[l[i]];
      84  }
      85  
      86  __attribute__((noinline, noclone)) void
      87  f10 (void)
      88  {
      89    int i;
      90    for (i = 0; i < N; i++)
      91      n[i] = (int) vf1[l[i]];
      92  }
      93  
      94  __attribute__((noinline, noclone)) void
      95  f11 (long x)
      96  {
      97    int i;
      98    for (i = 0; i < N; i++)
      99      vf2[i] = vf1[l[i] + x];
     100  }
     101  
     102  __attribute__((noinline, noclone)) void
     103  f12 (long x)
     104  {
     105    int i;
     106    for (i = 0; i < N; i++)
     107      n[i] = (int) vf1[l[i] + x];
     108  }
     109  
     110  __attribute__((noinline, noclone)) void
     111  f13 (void)
     112  {
     113    int i;
     114    for (i = 0; i < N; i++)
     115      vd2[i] = vd1[l[i]];
     116  }
     117  
     118  __attribute__((noinline, noclone)) void
     119  f14 (void)
     120  {
     121    int i;
     122    for (i = 0; i < N; i++)
     123      n[i] = (int) vd1[l[i]];
     124  }
     125  
     126  __attribute__((noinline, noclone)) void
     127  f15 (long x)
     128  {
     129    int i;
     130    for (i = 0; i < N; i++)
     131      vd2[i] = vd1[l[i] + x];
     132  }
     133  
     134  __attribute__((noinline, noclone)) void
     135  f16 (long x)
     136  {
     137    int i;
     138    for (i = 0; i < N; i++)
     139      n[i] = (int) vd1[l[i] + x];
     140  }
     141  
     142  static void
     143  avx2_test (void)
     144  {
     145    int i;
     146  
     147    for (i = 0; i < N + 16; i++)
     148      {
     149        asm ("");
     150        vf1[i] = 17.0f + i;
     151        vd1[i] = 19.0 + i;
     152      }
     153    for (i = 0; i < N; i++)
     154      {
     155        asm ("");
     156        k[i] = (i * 731) & (N - 1);
     157        l[i] = (i * 657) & (N - 1);
     158      }
     159  
     160    f1 ();
     161    f2 ();
     162    for (i = 0; i < N; i++)
     163      if (vf2[i] != ((i * 731) & (N - 1)) + 17
     164  	|| n[i] != ((i * 731) & (N - 1)) + 17)
     165        abort ();
     166  
     167    f3 (12);
     168    f4 (14);
     169    for (i = 0; i < N; i++)
     170      if (vf2[i] != ((i * 731) & (N - 1)) + 17 + 12
     171  	|| n[i] != ((i * 731) & (N - 1)) + 17 + 14)
     172        abort ();
     173  
     174    f5 ();
     175    f6 ();
     176    for (i = 0; i < N; i++)
     177      if (vd2[i] != ((i * 731) & (N - 1)) + 19
     178  	|| n[i] != ((i * 731) & (N - 1)) + 19)
     179        abort ();
     180  
     181    f7 (7);
     182    f8 (9);
     183    for (i = 0; i < N; i++)
     184      if (vd2[i] != ((i * 731) & (N - 1)) + 19 + 7
     185  	|| n[i] != ((i * 731) & (N - 1)) + 19 + 9)
     186        abort ();
     187  
     188    f9 ();
     189    f10 ();
     190    for (i = 0; i < N; i++)
     191      if (vf2[i] != ((i * 657) & (N - 1)) + 17
     192  	|| n[i] != ((i * 657) & (N - 1)) + 17)
     193        abort ();
     194  
     195    f11 (2);
     196    f12 (4);
     197    for (i = 0; i < N; i++)
     198      if (vf2[i] != ((i * 657) & (N - 1)) + 17 + 2
     199  	|| n[i] != ((i * 657) & (N - 1)) + 17 + 4)
     200        abort ();
     201  
     202    f13 ();
     203    f14 ();
     204    for (i = 0; i < N; i++)
     205      if (vd2[i] != ((i * 657) & (N - 1)) + 19
     206  	|| n[i] != ((i * 657) & (N - 1)) + 19)
     207        abort ();
     208  
     209    f15 (13);
     210    f16 (15);
     211    for (i = 0; i < N; i++)
     212      if (vd2[i] != ((i * 657) & (N - 1)) + 19 + 13
     213  	|| n[i] != ((i * 657) & (N - 1)) + 19 + 15)
     214        abort ();
     215  }