1 /* { dg-do run } */
2 /* { dg-options "-O2 -mavx512vpopcntdq" } */
3 /* { dg-require-effective-target avx512vpopcntdq } */
4
5 #define AVX512VPOPCNTDQ
6 #define SIZE (AVX512F_LEN / 32)
7
8 #include "avx512f-helper.h"
9 #include "avx512f-mask-type.h"
10
11 #define TYPE int
12
13 int
14 CALC (TYPE v)
15 {
16 int ret;
17 int i;
18
19 ret = 0;
20 for (i = 0; i < sizeof(v) * 8; i++)
21 if ((v & ((TYPE)1 << (TYPE) i)))
22 ret++;
23
24 return ret;
25 }
26
27 void
28 TEST (void)
29 {
30 UNION_TYPE (AVX512F_LEN, i_d) res1, res2, res3, src, src0;
31 MASK_TYPE mask = MASK_VALUE;
32 TYPE res_ref[SIZE];
33 src.x = INTRINSIC (_set1_epi8) (0x3D);
34 int i;
35
36 for (i = 0; i < SIZE; i++)
37 {
38 res_ref[i] = CALC (src.a[i]);
39 src0.a[i] = DEFAULT_VALUE;
40 }
41
42 res1.x = INTRINSIC (_popcnt_epi32) (src.x);
43 res2.x = INTRINSIC (_mask_popcnt_epi32) (src0.x, mask, src.x);
44 res3.x = INTRINSIC (_maskz_popcnt_epi32) (mask, src.x);
45
46 if (UNION_CHECK (AVX512F_LEN, i_d) (res1, res_ref))
47 abort ();
48
49 MASK_MERGE (i_d) (res_ref, mask, SIZE);
50 if (UNION_CHECK (AVX512F_LEN, i_d) (res2, res_ref))
51 abort ();
52
53 MASK_ZERO (i_d) (res_ref, mask, SIZE);
54 if (UNION_CHECK (AVX512F_LEN, i_d) (res3, res_ref))
55 abort ();
56 }