1/* { dg-do run } */
2/* { dg-require-effective-target avx2 } */
3/* { dg-options "-O3 -mavx2" } */
4
5#include "avx2-check.h"
6
7#define N 1024
8float vf1[N+16], vf2[N];
9double vd1[N+16], vd2[N];
10int k[N];
11long l[N];
12short n[N];
13
14__attribute__((noinline, noclone)) void
15f1 (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
23f2 (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
31f3 (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
39f4 (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
47f5 (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
55f6 (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
63f7 (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
71f8 (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
79f9 (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
87f10 (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
95f11 (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
103f12 (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
111f13 (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
119f14 (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
127f15 (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
135f16 (long x)
136{
137  int i;
138  for (i = 0; i < N; i++)
139    n[i] = (int) vd1[l[i] + x];
140}
141
142static void
143avx2_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}
216