1/* { dg-do run } */
2/* { dg-options "-O2 -mavx512dq" } */
3/* { dg-require-effective-target avx512dq } */
4
5#define AVX512DQ
6#include "avx512f-helper.h"
7
8#include <math.h>
9#include <limits.h>
10#include <float.h>
11#include "avx512f-mask-type.h"
12#define SIZE (AVX512F_LEN / 32)
13
14#ifndef __FPCLASSPD__
15#define __FPCLASSPD__
16int check_fp_class_sp (float src, int imm)
17{
18  int qNaN_res = isnan (src);
19  int sNaN_res = isnan (src);
20  int Pzero_res = (src == 0.0);
21  int Nzero_res = (src == -0.0);
22  int PInf_res = (isinf (src) == 1);
23  int NInf_res = (isinf (src) == -1);
24  int Denorm_res = (fpclassify (src) == FP_SUBNORMAL);
25  int FinNeg_res = __builtin_finite (src) && (src < 0);
26
27  int result = (((imm & 1) && qNaN_res)
28		|| (((imm >> 1) & 1) && Pzero_res)
29		|| (((imm >> 2) & 1) && Nzero_res)
30		|| (((imm >> 3) & 1) && PInf_res)
31		|| (((imm >> 4) & 1) && NInf_res)
32		|| (((imm >> 5) & 1) && Denorm_res)
33		|| (((imm >> 6) & 1) && FinNeg_res)
34		|| (((imm >> 7) & 1) && sNaN_res));
35  return result;
36}
37#endif
38
39MASK_TYPE
40CALC (float *s1, int imm)
41{
42  int i;
43  MASK_TYPE res = 0;
44
45  for (i = 0; i < SIZE; i++)
46    if (check_fp_class_sp(s1[i], imm))
47      res = res | (1 << i);
48
49  return res;
50}
51
52void
53TEST (void)
54{
55  int i;
56  UNION_TYPE (AVX512F_LEN,) src;
57  MASK_TYPE res1, res2, res_ref = 0;
58  MASK_TYPE mask = MASK_VALUE;
59
60  src.a[0] = NAN;
61  src.a[1] = 1.0 / 0.0;
62  for (i = 2; i < SIZE; i++)
63    {
64      src.a[i] = -24.43 + 0.6 * i;
65    }
66
67  res1 = INTRINSIC (_fpclass_ps_mask) (src.x, 0xFF);
68  res2 = INTRINSIC (_mask_fpclass_ps_mask) (mask, src.x, 0xFF);
69
70
71  res_ref = CALC (src.a, 0xFF);
72
73  if (res_ref != res1)
74    abort ();
75
76  if ((mask & res_ref) != res2)
77    abort ();
78}
79