1/* { dg-do run } */
2/* { dg-options "-O2 -mavx512f" } */
3/* { dg-require-effective-target avx512f } */
4
5#define AVX512F
6
7#include "avx512f-helper.h"
8
9#include <math.h>
10#define SIZE (AVX512F_LEN / 64)
11#include "avx512f-mask-type.h"
12
13static void
14CALC (double *s, double *r)
15{
16  int i;
17
18  for (i = 0; i < SIZE; i++)
19    {
20      r[i] = 1.0 / sqrt(s[i]);
21    }
22}
23
24void
25TEST (void)
26{
27  UNION_TYPE (AVX512F_LEN, d) s, res1, res2, res3;
28  MASK_TYPE mask = MASK_VALUE;
29  double res_ref[SIZE];
30  int i;
31
32  for (i = 0; i < SIZE; i++)
33    {
34      s.a[i] = 123.456 * (i + 2000);
35      res2.a[i] = DEFAULT_VALUE;
36    }
37
38  res1.x = INTRINSIC (_rsqrt14_pd) (s.x);
39  res2.x = INTRINSIC (_mask_rsqrt14_pd) (res2.x, mask, s.x);
40  res3.x = INTRINSIC (_maskz_rsqrt14_pd) (mask, s.x);
41
42  CALC (s.a, res_ref);
43
44  if (UNION_ROUGH_CHECK (AVX512F_LEN, d) (res1, res_ref, 0.0001))
45    abort ();
46
47  MASK_MERGE (d) (res_ref, mask, SIZE);
48  if (UNION_ROUGH_CHECK (AVX512F_LEN, d) (res2, res_ref, 0.0001))
49    abort ();
50
51  MASK_ZERO (d) (res_ref, mask, SIZE);
52  if (UNION_ROUGH_CHECK (AVX512F_LEN, d) (res3, res_ref, 0.0001))
53    abort ();
54}
55