libcpp, c, middle-end: Optimize initializers using #embed in C
[official-gcc.git] / gcc / testsuite / gcc.dg / vect / pr103581.c
blob92695c83d99bf048b52c8978634027bcfd71c13d
1 /* { dg-additional-options "-mavx2 -mtune-ctrl=use_gather" { target avx2_runtime } } */
3 #include "tree-vect.h"
5 #define MASKGATHER(SUFF, TYPE1, TYPE2) \
6 TYPE1 * __attribute__((noipa)) \
7 maskgather ## SUFF (int n, TYPE2 *indices, TYPE1 *data) \
8 { \
9 TYPE1 *out = __builtin_malloc (sizeof (TYPE1) * n); \
10 for (int i = 0; i < n; ++i) \
11 { \
12 TYPE2 d = indices[i]; \
13 if (d > 1) \
14 out[i] = data[d]; \
15 } \
16 return out; \
19 MASKGATHER(udiusi, unsigned long long, unsigned int)
20 MASKGATHER(usiusi, unsigned int, unsigned int)
21 MASKGATHER(udiudi, unsigned long long, unsigned long long)
22 MASKGATHER(usiudi, unsigned int, unsigned long long)
24 int
25 main()
27 check_vect ();
29 unsigned int idx4[32], data4[32];
30 unsigned long long idx8[32], data8[32];
31 for (int i = 0; i < 32; ++i)
33 idx4[i] = i;
34 idx8[i] = i;
35 data4[i] = i;
36 data8[i] = i;
38 unsigned long long *resudiusi = maskgatherudiusi (16, idx4, data8);
39 unsigned int *resusiusi = maskgatherusiusi (16, idx4, data4);
40 unsigned long long *resudiudi = maskgatherudiudi (16, idx8, data8);
41 unsigned int *resusiudi = maskgatherusiudi (16, idx8, data4);
42 #pragma GCC novector
43 for (int i = 0; i < 16; ++i)
45 unsigned int d = idx4[i];
46 if (d > 1)
48 if (resudiusi[i] != data4[d])
49 __builtin_abort ();
50 if (resudiudi[i] != data4[d])
51 __builtin_abort ();
52 if (resusiudi[i] != data4[d])
53 __builtin_abort ();
54 if (resusiusi[i] != data4[d])
55 __builtin_abort ();
58 return 0;