1 /* { dg-do run } */
2 /* { dg-options "-mavx512f -O2" } */
3 /* { dg-require-effective-target avx512f } */
4
5 #include "avx512f-check.h"
6
7 static void
init_vpadd_mask(int * dst,int * src1,int * src2,int seed)8 init_vpadd_mask (int* dst, int *src1, int *src2, int seed)
9 {
10 int i;
11
12 for (i = 0; i < 16; i++)
13 {
14 dst[i] = -1;
15 src1[i] = seed * 2 * i + 1;
16 src2[i] = seed * 2 * i;
17 }
18 }
19
20 static inline void
calc_vpadd_mask_zeroed(int * dst,__mmask16 m,int * src1,int * src2)21 calc_vpadd_mask_zeroed (int *dst, __mmask16 m, int *src1, int *src2)
22 {
23 int i;
24
25 for (i = 0; i < 16; i++)
26 {
27 if (m & (1 << i))
28 dst[i] = src1[i] + src2[i];
29 else
30 dst[i] = 0;
31 }
32 }
33
34 void static
avx512f_test(void)35 avx512f_test (void)
36 {
37 /* Checking mask arithmetic instruction */
38
39 __mmask16 msk_dst, msk_src1, msk_src2, msk_dst_ref;
40
41 msk_src1 = 0x0FFB;
42 msk_src2 = 0x0F0F;
43
44 asm ("kandw\t%2, %1, %0"
45 : "=k" (msk_dst)
46 : "k" (msk_src1), "k" (msk_src2));
47
48 msk_dst_ref = _mm512_kand (msk_src1, msk_src2);
49 if (msk_dst != msk_dst_ref)
50 abort ();
51
52
53 /* Checking zero-masked vector instruction */
54 union512i_d dst, src1, src2;
55 int dst_ref[16];
56
57 init_vpadd_mask (dst.a, src1.a, src2.a, 1);
58 init_vpadd_mask (dst_ref, src1.a, src2.a, 1);
59
60 asm ("vpaddd\t%2, %1, %0 %{%3%}%{z%}"
61 : "=x" (dst.x)
62 : "x" (src1.x), "x" (src2.x), "Yk" (msk_dst));
63
64 calc_vpadd_mask_zeroed (dst_ref, msk_dst, src1.a, src2.a);
65
66 if (check_union512i_d (dst, dst_ref))
67 abort ();
68 }
69