(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
avx512dq-vfpclasspd-2.c
       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__
      16  int 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
      40  CALC (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  
      52  void
      53  TEST (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  }