1/* { dg-do run } */
2/* { dg-require-effective-target avx512f } */
3/* { dg-options "-O3 -mavx512f -ffast-math" } */
4
5#include "avx512f-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 q[N];
15long long **o[N];
16long long t[N];
17long long *r[N];
18int *s[N];
19
20__attribute__((noinline, noclone)) float
21f1 (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
31f2 (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
41f3 (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
51f4 (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
61f5 (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
71f6 (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
81f7 (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
91f8 (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
101f9 (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
111f10 (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
121f11 (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
131f12 (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
140static void
141avx512f_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}
170