1  /* { dg-do run } */
       2  /* { dg-options "-O2 -mavx512fp16" } */
       3  /* { dg-require-effective-target avx512fp16 } */
       4  
       5  #define AVX512FP16
       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 / 16)
      13  
      14  #ifndef __FPCLASSSH__
      15  #define __FPCLASSSH__
      16  int check_fp_class_hp (_Float16 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
      40  CALC (_Float16 *s1, int imm)
      41  {
      42    int i;
      43    __mmask8 res = 0;
      44  
      45    if (check_fp_class_hp(s1[0], imm))
      46      res = res | 1;
      47  
      48    return res;
      49  }
      50  
      51  void
      52  TEST (void)
      53  {
      54    int i;
      55    union128h 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_sh_mask (src.x, 0xFF);
      66    res2 = _mm_mask_fpclass_sh_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  }