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 (128 / 32)
13 
14 #ifndef __FPCLASSSS__
15 #define __FPCLASSSS__
check_fp_class_sp(float src,int imm)16 int 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 
39 __mmask8
CALC(float * s1,int imm)40 CALC (float *s1, int imm)
41 {
42   int i;
43   __mmask8 res = 0;
44 
45   if (check_fp_class_sp(s1[0], imm))
46     res = res | 1;
47 
48   return res;
49 }
50 
51 void
TEST(void)52 TEST (void)
53 {
54   int i;
55   union128 src;
56   __mmask8 res1, res2, res_ref = 0;
57   __mmask8 mask = MASK_VALUE;
58 
59   src.a[0] = 1.0 / 0.0;
60   for (i = 1; i < SIZE; i++)
61     {
62       src.a[i] = -24.43 + 0.6 * i;
63     }
64 
65   res1 = _mm_fpclass_ss_mask (src.x, 0xFF);
66   res2 = _mm_mask_fpclass_ss_mask (mask, src.x, 0xFF);
67 
68 
69   res_ref = CALC (src.a, 0xFF);
70 
71   if (res_ref != res1)
72     abort ();
73 
74   if ((mask & res_ref) != res2)
75     abort ();
76 }
77