1249259Sdim/* { dg-do run } */
2249259Sdim/* { dg-options "-O2 -mavx512f" } */
3249259Sdim/* { dg-require-effective-target avx512f } */
4249259Sdim
5249259Sdim#define AVX512F
6249259Sdim
7249259Sdim#include "avx512f-helper.h"
8249259Sdim
9249259Sdim#define SIZE (AVX512F_LEN / 64)
10249259Sdim#include "avx512f-mask-type.h"
11249259Sdim
12249259Sdim#if AVX512F_LEN > 256
13249259Sdim  #define CTRL 129
14249259Sdim#elif AVX512F_LEN > 128
15249259Sdim  #define CTRL 5
16249259Sdim#else
17249259Sdim  #define CTRL 1
18249259Sdim#endif
19249259Sdim
20249259Sdimstatic void
21249259SdimCALC (double *s1, int s2, double *r)
22249259Sdim{
23249259Sdim  int i;
24249259Sdim
25249259Sdim  for (i = 0; i < SIZE; i++)
26249259Sdim    {
27249259Sdim      r[i] = (s2 & (1 << i)) ? s1[1 + 2 * (i / 2)] : s1[2 * (i / 2)];
28249259Sdim    }
29249259Sdim}
30249259Sdim
31249259Sdimvoid
32249259SdimTEST (void)
33249259Sdim{
34249259Sdim  UNION_TYPE (AVX512F_LEN, d) s1, res1, res2, res3;
35249259Sdim  MASK_TYPE mask = MASK_VALUE;
36249259Sdim  double res_ref[SIZE];
37249259Sdim  int i;
38249259Sdim
39249259Sdim  for (i = 0; i < SIZE; i++)
40249259Sdim    {
41249259Sdim      s1.a[i] = i + 10.;
42249259Sdim      res2.a[i] = DEFAULT_VALUE;
43249259Sdim    }
44249259Sdim
45249259Sdim  res1.x = INTRINSIC (_permute_pd) (s1.x, CTRL);
46249259Sdim  res2.x = INTRINSIC (_mask_permute_pd) (res2.x, mask, s1.x, CTRL);
47249259Sdim  res3.x = INTRINSIC (_maskz_permute_pd) (mask, s1.x, CTRL);
48249259Sdim
49249259Sdim  CALC (s1.a, CTRL, res_ref);
50249259Sdim
51249259Sdim  if (UNION_CHECK (AVX512F_LEN, d) (res1, res_ref))
52249259Sdim    abort ();
53249259Sdim
54249259Sdim  MASK_MERGE (d) (res_ref, mask, SIZE);
55249259Sdim  if (UNION_CHECK (AVX512F_LEN, d) (res2, res_ref))
56249259Sdim    abort ();
57249259Sdim
58249259Sdim  MASK_ZERO (d) (res_ref, mask, SIZE);
59249259Sdim  if (UNION_CHECK (AVX512F_LEN, d) (res3, res_ref))
60249259Sdim    abort ();
61249259Sdim}
62249259Sdim
63249259Sdim#undef CTRL
64249259Sdim