1 /* { dg-do run } */
2 /* { dg-require-effective-target avx512vl } */
3 /* { dg-options "-O3 -mavx512vl" } */
4 
5 #include "avx512vl-check.h"
6 
7 #define N 12
8 float vf1[N+4], vf2[N];
9 double vd1[N+4], vd2[N];
10 int vi1[N+4], vi2[N], k[N];
11 long long vl1[N+4], vl2[N];
12 long l[N];
13 
14 __attribute__((noinline, noclone)) void
f1(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
f2(void)23 f2 (void)
24 {
25   int i;
26   for (i = 0; i < N; i++)
27     vi2[i] = vi1[k[i]];
28 }
29 
30 __attribute__((noinline, noclone)) void
f3(int x)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
f4(int x)39 f4 (int x)
40 {
41   int i;
42   for (i = 0; i < N; i++)
43     vi2[i] = vi1[k[i] + x];
44 }
45 
46 __attribute__((noinline, noclone)) void
f5(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
f6(void)55 f6 (void)
56 {
57   int i;
58   for (i = 0; i < N; i++)
59     vl2[i] = vl1[k[i]];
60 }
61 
62 __attribute__((noinline, noclone)) void
f7(int x)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
f8(int x)71 f8 (int x)
72 {
73   int i;
74   for (i = 0; i < N; i++)
75     vl2[i] = vl1[k[i] + x];
76 }
77 
78 __attribute__((noinline, noclone)) void
f9(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
f10(void)87 f10 (void)
88 {
89   int i;
90   for (i = 0; i < N; i++)
91     vi2[i] = vi1[l[i]];
92 }
93 
94 __attribute__((noinline, noclone)) void
f11(int x)95 f11 (int 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
f12(int x)103 f12 (int x)
104 {
105   int i;
106   for (i = 0; i < N; i++)
107     vi2[i] = vi1[l[i] + x];
108 }
109 
110 __attribute__((noinline, noclone)) void
f13(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
f14(void)119 f14 (void)
120 {
121   int i;
122   for (i = 0; i < N; i++)
123     vl2[i] = vl1[l[i]];
124 }
125 
126 __attribute__((noinline, noclone)) void
f15(int x)127 f15 (int 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
f16(int x)135 f16 (int x)
136 {
137   int i;
138   for (i = 0; i < N; i++)
139     vl2[i] = vl1[l[i] + x];
140 }
141 
142 static void
avx512vl_test(void)143 avx512vl_test (void)
144 {
145   int i;
146 
147   for (i = 0; i < N + 4; i++)
148     {
149       asm ("");
150       vf1[i] = 17.0f + i;
151       vd1[i] = 19.0 + i;
152       vi1[i] = 21 + i;
153       vl1[i] = 23L + i;
154     }
155   for (i = 0; i < N; i++)
156     {
157       asm ("");
158       k[i] = (i * 731) & (N - 1);
159       l[i] = (i * 657) & (N - 1);
160     }
161 
162   f1 ();
163   f2 ();
164   for (i = 0; i < N; i++)
165     if (vf2[i] != ((i * 731) & (N - 1)) + 17
166 	|| vi2[i] != ((i * 731) & (N - 1)) + 21)
167       abort ();
168 
169   f3 (1);
170   f4 (2);
171   for (i = 0; i < N; i++)
172     if (vf2[i] != ((i * 731) & (N - 1)) + 17 + 1
173 	|| vi2[i] != ((i * 731) & (N - 1)) + 21 + 2)
174       abort ();
175 
176   f5 ();
177   f6 ();
178   for (i = 0; i < N; i++)
179     if (vd2[i] != ((i * 731) & (N - 1)) + 19
180 	|| vl2[i] != ((i * 731) & (N - 1)) + 23)
181       abort ();
182 
183   f7 (3);
184   f8 (2);
185   for (i = 0; i < N; i++)
186     if (vd2[i] != ((i * 731) & (N - 1)) + 19 + 3
187 	|| vl2[i] != ((i * 731) & (N - 1)) + 23 + 2)
188       abort ();
189 
190   f9 ();
191   f10 ();
192   for (i = 0; i < N; i++)
193     if (vf2[i] != ((i * 657) & (N - 1)) + 17
194 	|| vi2[i] != ((i * 657) & (N - 1)) + 21)
195       abort ();
196 
197   f11 (4);
198   f12 (1);
199   for (i = 0; i < N; i++)
200     if (vf2[i] != ((i * 657) & (N - 1)) + 17 + 4
201 	|| vi2[i] != ((i * 657) & (N - 1)) + 21 + 1)
202       abort ();
203 
204   f13 ();
205   f14 ();
206   for (i = 0; i < N; i++)
207     if (vd2[i] != ((i * 657) & (N - 1)) + 19
208 	|| vl2[i] != ((i * 657) & (N - 1)) + 23)
209       abort ();
210 
211   f15 (2);
212   f16 (4);
213   for (i = 0; i < N; i++)
214     if (vd2[i] != ((i * 657) & (N - 1)) + 19 + 2
215 	|| vl2[i] != ((i * 657) & (N - 1)) + 23 + 4)
216       abort ();
217 }
218