/* { dg-do run } */
/* { dg-options "-O2 -mavx512dq" } */
/* { dg-require-effective-target avx512dq } */

#define AVX512DQ
#include "avx512f-helper.h"

#include <math.h>
#include <limits.h>
#include <float.h>
#include "avx512f-mask-type.h"
#define SIZE (128 / 32)

#ifndef __FPCLASSSS__
#define __FPCLASSSS__
int check_fp_class_sp (float src, int imm)
{
  int qNaN_res = isnan (src);
  int sNaN_res = isnan (src);
  int Pzero_res = (src == 0.0);
  int Nzero_res = (src == -0.0);
  int PInf_res = (isinf (src) == 1);
  int NInf_res = (isinf (src) == -1);
  int Denorm_res = (fpclassify (src) == FP_SUBNORMAL);
  int FinNeg_res = __builtin_finite (src) && (src < 0);

  int result = (((imm & 1) && qNaN_res)
		|| (((imm >> 1) & 1) && Pzero_res)
		|| (((imm >> 2) & 1) && Nzero_res)
		|| (((imm >> 3) & 1) && PInf_res)
		|| (((imm >> 4) & 1) && NInf_res)
		|| (((imm >> 5) & 1) && Denorm_res)
		|| (((imm >> 6) & 1) && FinNeg_res)
		|| (((imm >> 7) & 1) && sNaN_res));
  return result;
}
#endif

__mmask8
CALC (float *s1, int imm)
{
  int i;
  __mmask8 res = 0;

  if (check_fp_class_sp(s1[0], imm))
    res = res | 1;

  return res;
}

void
TEST (void)
{
  int i;
  union128 src;
  __mmask8 res1, res2, res_ref = 0;
  __mmask8 mask = MASK_VALUE;

  src.a[0] = 1.0 / 0.0;
  for (i = 1; i < SIZE; i++)
    {
      src.a[i] = -24.43 + 0.6 * i;
    }

  res1 = _mm_fpclass_ss_mask (src.x, 0xFF);
  res2 = _mm_mask_fpclass_ss_mask (mask, src.x, 0xFF);


  res_ref = CALC (src.a, 0xFF);

  if (res_ref != res1)
    abort ();

  if ((mask & res_ref) != res2)
    abort ();
}
