1/* { dg-do run } */
2/* { dg-require-effective-target avx2 } */
3/* { dg-options "-O3 -mavx2 -ffast-math" } */
4
5#include "avx2-check.h"
6
7#define N 1024
8float f[N];
9double d[N];
10int k[N];
11float *l[N];
12double *n[N];
13int **m[N];
14long **o[N];
15long q[N];
16long *r[N];
17int *s[N];
18
19__attribute__((noinline, noclone)) float
20f1 (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
30f2 (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
40f3 (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
50f4 (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
60f5 (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
70f6 (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
80f7 (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
90f8 (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
100f9 (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
110f10 (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
120f11 (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
130f12 (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
139static void
140avx2_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}
168