1160814Ssimon/* { dg-do run } */
2280304Sjkim/* { dg-options "-mavx512f -O2" } */
3160814Ssimon/* { dg-require-effective-target avx512f } */
4280304Sjkim
5160814Ssimon#include "avx512f-check.h"
6160814Ssimon
7160814Ssimonstatic void
8160814Ssimoninit_vpadd_mask (int* dst, int *src1, int *src2, int seed)
9160814Ssimon{
10160814Ssimon  int i;
11160814Ssimon
12160814Ssimon  for (i = 0; i < 16; i++)
13160814Ssimon    {
14280304Sjkim      dst[i] = -1;
15160814Ssimon      src1[i] = seed * 2 * i + 1;
16160814Ssimon      src2[i] = seed * 2 * i;
17160814Ssimon    }
18160814Ssimon}
19160814Ssimon
20160814Ssimonstatic inline void
21160814Ssimoncalc_vpadd_mask_zeroed (int *dst, __mmask16 m, int *src1, int *src2)
22160814Ssimon{
23160814Ssimon  int i;
24160814Ssimon
25160814Ssimon  for (i = 0; i < 16; i++)
26160814Ssimon    {
27160814Ssimon      if (m & (1 << i))
28160814Ssimon	dst[i] = src1[i] + src2[i];
29160814Ssimon      else
30160814Ssimon	dst[i] = 0;
31160814Ssimon    }
32160814Ssimon}
33160814Ssimon
34160814Ssimonvoid static
35160814Ssimonavx512f_test (void)
36160814Ssimon{
37160814Ssimon  /* Checking mask arithmetic instruction */
38160814Ssimon
39160814Ssimon  __mmask16 msk_dst, msk_src1, msk_src2, msk_dst_ref;
40160814Ssimon
41160814Ssimon  msk_src1 = 0x0FFB;
42160814Ssimon  msk_src2 = 0x0F0F;
43160814Ssimon
44160814Ssimon  asm ("kandw\t%2, %1, %0"
45160814Ssimon       : "=k" (msk_dst)
46160814Ssimon       : "k" (msk_src1), "k" (msk_src2));
47160814Ssimon
48160814Ssimon  msk_dst_ref =  _mm512_kand (msk_src1, msk_src2);
49160814Ssimon  if (msk_dst != msk_dst_ref)
50160814Ssimon    abort ();
51160814Ssimon
52160814Ssimon
53160814Ssimon  /* Checking zero-masked vector instruction */
54160814Ssimon  union512i_d dst, src1, src2;
55160814Ssimon  int dst_ref[16];
56160814Ssimon
57160814Ssimon  init_vpadd_mask (dst.a,   src1.a, src2.a, 1);
58160814Ssimon  init_vpadd_mask (dst_ref, src1.a, src2.a, 1);
59160814Ssimon
60160814Ssimon  asm ("vpaddd\t%2, %1, %0 %{%3%}%{z%}"
61160814Ssimon       : "=x" (dst.x)
62160814Ssimon       : "x" (src1.x), "x" (src2.x), "Yk" (msk_dst));
63160814Ssimon
64160814Ssimon  calc_vpadd_mask_zeroed (dst_ref, msk_dst, src1.a, src2.a);
65280304Sjkim
66160814Ssimon  if (check_union512i_d (dst, dst_ref))
67160814Ssimon    abort ();
68160814Ssimon}
69160814Ssimon