Initial support for AVX-512{VL,BW,DQ}
[official-gcc.git] / gcc / testsuite / gcc.target / i386 / avx512dq-vfpclasspd-2.c
blobc6610fded4067f5871c8095738454d778aee0108
1 /* { dg-do run } */
2 /* { dg-options "-O2 -mavx512dq -DAVX512DQ" } */
3 /* { dg-require-effective-target avx512dq } */
5 #include "avx512f-helper.h"
7 #include <math.h>
8 #include <values.h>
9 #define SIZE (AVX512F_LEN / 64)
10 #include "avx512f-mask-type.h"
12 #ifndef __FPCLASSPD__
13 #define __FPCLASSPD__
14 int check_fp_class_dp (double src, int imm)
16 int qNaN_res = isnan (src);
17 int sNaN_res = isnan (src);
18 int Pzero_res = (src == 0.0);
19 int Nzero_res = (src == -0.0);
20 int PInf_res = (isinf (src) == 1);
21 int NInf_res = (isinf (src) == -1);
22 int Denorm_res = (fpclassify (src) == FP_SUBNORMAL);
23 int FinNeg_res = finite (src) && (src < 0);
25 int result = (((imm & 1) && qNaN_res)
26 || (((imm >> 1) & 1) && Pzero_res)
27 || (((imm >> 2) & 1) && Nzero_res)
28 || (((imm >> 3) & 1) && PInf_res)
29 || (((imm >> 4) & 1) && NInf_res)
30 || (((imm >> 5) & 1) && Denorm_res)
31 || (((imm >> 6) & 1) && FinNeg_res)
32 || (((imm >> 7) & 1) && sNaN_res));
33 return result;
35 #endif
37 CALC (double *s1, int imm)
39 int i;
40 __mmask8 res = 0;
42 for (i = 0; i < SIZE; i++)
43 if (check_fp_class_dp(s1[i], imm))
44 res = res | (1 << i);
46 return res;
49 void
50 TEST (void)
52 int i;
53 UNION_TYPE (AVX512F_LEN, d) src;
54 __mmask8 res1, res2, res_ref = 0;
55 MASK_TYPE mask = MASK_VALUE;
57 src.a[0] = NAN;
58 src.a[1] = 1.0 / 0.0;
59 for (i = 2; i < SIZE; i++)
61 src.a[i] = -24.43 + 0.6 * i;
64 res1 = INTRINSIC (_fpclass_pd_mask) (src.x, 0xFF);
65 res2 = INTRINSIC (_mask_fpclass_pd_mask) (mask, src.x, 0xFF);
67 res_ref = CALC (src.a, 0xFF);
69 if (res_ref != res1)
70 abort ();
72 if ((res_ref & mask) != res2)
73 abort ();