1 /* { dg-do run } */
2 /* { dg-require-effective-target avx512f } */
3 /* { dg-options "-O2 -mavx512f" } */
4 
5 #include <string.h>
6 #include "avx512f-check.h"
7 #include "avx512f-helper.h"
8 
9 void static
avx512f_test(void)10 avx512f_test (void)
11 {
12   union512i_q s1;
13   union256i_q res1, res2, res3;
14   __mmask8 mask = 0xBA;
15   long long int res_ref[4];
16   int j;
17 
18   for (j = 0; j < 8; j++)
19     s1.a[j] = j * j;
20 
21   for (j = 0; j < 4; j++)
22     {
23       res1.a[j] = DEFAULT_VALUE;
24       res2.a[j] = DEFAULT_VALUE;
25       res3.a[j] = DEFAULT_VALUE;
26     }
27   res1.x = _mm512_extracti64x4_epi64 (s1.x, 0);
28   res2.x = _mm512_mask_extracti64x4_epi64 (res2.x, mask, s1.x, 0);
29   res3.x = _mm512_maskz_extracti64x4_epi64 (mask, s1.x, 0);
30 
31   memset (res_ref, 0, 32);
32   memcpy (res_ref, s1.a, 32);
33 
34   if (check_union256i_q (res1, res_ref))
35     abort ();
36 
37   MASK_MERGE (i_q) (res_ref, mask, 4);
38   if (check_union256i_q (res2, res_ref))
39     abort ();
40 
41   MASK_ZERO (i_q) (res_ref, mask, 4);
42   if (check_union256i_q (res3, res_ref))
43     abort ();
44 
45   res1.x = _mm512_extracti64x4_epi64 (s1.x, 1);
46   res2.x = _mm512_mask_extracti64x4_epi64 (res2.x, mask, s1.x, 1);
47   res3.x = _mm512_maskz_extracti64x4_epi64 (mask, s1.x, 1);
48 
49   memset (res_ref, 0, 32);
50   memcpy (res_ref, s1.a + 4, 32);
51 
52   if (check_union256i_q (res1, res_ref))
53     abort ();
54 
55   MASK_MERGE (i_q) (res_ref, mask, 4);
56   if (check_union256i_q (res2, res_ref))
57     abort ();
58 
59   MASK_ZERO (i_q) (res_ref, mask, 4);
60   if (check_union256i_q (res3, res_ref))
61     abort ();
62 }
63