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#define SIZE (AVX512F_LEN / 64) 12#include "avx512f-mask-type.h" 13 14#ifndef __FPCLASSPD__ 15#define __FPCLASSPD__ 16int check_fp_class_dp (double 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 40CALC (double *s1, int imm) 41{ 42 int i; 43 __mmask8 res = 0; 44 45 for (i = 0; i < SIZE; i++) 46 if (check_fp_class_dp(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, d) src; 57 __mmask8 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_pd_mask) (src.x, 0xFF); 68 res2 = INTRINSIC (_mask_fpclass_pd_mask) (mask, src.x, 0xFF); 69 70 res_ref = CALC (src.a, 0xFF); 71 72 if (res_ref != res1) 73 abort (); 74 75 if ((res_ref & mask) != res2) 76 abort (); 77} 78