blob: 469ddc3b86b93d8730920ff94b2fbe699bf9c872 [file] [log] [blame]
/* { 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>
#define SIZE (128 / 64)
#include "avx512f-mask-type.h"
#ifndef __FPCLASSSD__
#define __FPCLASSSD__
int check_fp_class_dp (double 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 (double *s1, int imm)
{
int i;
__mmask8 res = 0;
if (check_fp_class_dp(s1[0], imm))
res = res | 1;
return res;
}
void
TEST (void)
{
int i;
union128d 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_sd_mask (src.x, 0xFF);
res2 = _mm_mask_fpclass_sd_mask (mask, src.x, 0xFF);
res_ref = CALC (src.a, 0xFF);
if (res_ref != res1)
abort ();
if ((res_ref & mask) != res2)
abort ();
}