Daily bump.
[official-gcc.git] / gcc / testsuite / gcc.target / i386 / avx2-gather-3.c
blob0517e60351df595f4688fd44e7ad65fc708b6151
1 /* { dg-do run } */
2 /* { dg-require-effective-target avx2 } */
3 /* { dg-options "-O3 -mavx2 -ffast-math -mtune=skylake" } */
5 #include "avx2-check.h"
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];
19 __attribute__((noinline, noclone)) float
20 f1 (void)
22 int i;
23 float g = 0.0;
24 for (i = 0; i < N / 2; i++)
25 g += f[k[i]];
26 return g;
29 __attribute__((noinline, noclone)) float
30 f2 (float *p)
32 int i;
33 float g = 0.0;
34 for (i = 0; i < N / 2; i++)
35 g += p[k[i]];
36 return g;
39 __attribute__((noinline, noclone)) float
40 f3 (void)
42 int i;
43 float g = 0.0;
44 for (i = 0; i < N / 2; i++)
45 g += *l[i];
46 return g;
49 __attribute__((noinline, noclone)) int
50 f4 (void)
52 int i;
53 int g = 0;
54 for (i = 0; i < N / 2; i++)
55 g += **m[i];
56 return g;
59 __attribute__((noinline, noclone)) double
60 f5 (void)
62 int i;
63 double g = 0.0;
64 for (i = 0; i < N / 2; i++)
65 g += d[k[i]];
66 return g;
69 __attribute__((noinline, noclone)) double
70 f6 (double *p)
72 int i;
73 double g = 0.0;
74 for (i = 0; i < N / 2; i++)
75 g += p[k[i]];
76 return g;
79 __attribute__((noinline, noclone)) double
80 f7 (void)
82 int i;
83 double g = 0.0;
84 for (i = 0; i < N / 2; i++)
85 g += *n[i];
86 return g;
89 __attribute__((noinline, noclone)) int
90 f8 (void)
92 int i;
93 int g = 0;
94 for (i = 0; i < N / 2; i++)
95 g += **o[i];
96 return g;
99 __attribute__((noinline, noclone)) float
100 f9 (void)
102 int i;
103 float g = 0.0;
104 for (i = 0; i < N / 2; i++)
105 g += f[q[i]];
106 return g;
109 __attribute__((noinline, noclone)) float
110 f10 (float *p)
112 int i;
113 float g = 0.0;
114 for (i = 0; i < N / 2; i++)
115 g += p[q[i]];
116 return g;
119 __attribute__((noinline, noclone)) double
120 f11 (void)
122 int i;
123 double g = 0.0;
124 for (i = 0; i < N / 2; i++)
125 g += d[q[i]];
126 return g;
129 __attribute__((noinline, noclone)) double
130 f12 (double *p)
132 int i;
133 double g = 0.0;
134 for (i = 0; i < N / 2; i++)
135 g += p[q[i]];
136 return g;
139 static void
140 avx2_test (void)
142 int i;
144 for (i = 0; i < N; i++)
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)];
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 ();