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
9void static
10avx512f_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