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