1/* { dg-do run } */
2/* { dg-options "-O2 -mavx512f" } */
3/* { dg-require-effective-target avx512f } */
4
5#define AVX512F
6
7#include "avx512f-helper.h"
8
9#define SIZE (AVX512F_LEN / 32)
10#include "avx512f-mask-type.h"
11
12static void
13CALC (int *r, int *s1, int count)
14{
15  int i;
16  for (i = 0; i < SIZE; i++)
17    {
18      r[i] =
19	count < 32 ? (s1[i] >> count) : (s1[i] > 0 ? 0 : 0xFFFFFFFF);
20    }
21}
22
23void
24TEST (void)
25{
26  int i, sign;
27  UNION_TYPE (AVX512F_LEN, i_d) res1, res2, res3, src1;
28  MASK_TYPE mask = MASK_VALUE;
29  int res_ref[SIZE];
30
31  sign = -1;
32  for (i = 0; i < SIZE; i++)
33    {
34      src1.a[i] = 2 + sign * 7 * i % 291;
35      sign = sign * -1;
36    }
37
38  for (i = 0; i < SIZE; i++)
39    res2.a[i] = DEFAULT_VALUE;
40
41  res1.x = INTRINSIC (_srai_epi32) (src1.x, 3);
42  res2.x =
43    INTRINSIC (_mask_srai_epi32) (res2.x, mask, src1.x, 3);
44  res3.x = INTRINSIC (_maskz_srai_epi32) (mask, src1.x, 3);
45
46  CALC (res_ref, src1.a, 3);
47
48  if (UNION_CHECK (AVX512F_LEN, i_d) (res1, res_ref))
49    abort ();
50
51  MASK_MERGE (i_d) (res_ref, mask, SIZE);
52  if (UNION_CHECK (AVX512F_LEN, i_d) (res2, res_ref))
53    abort ();
54
55  MASK_ZERO (i_d) (res_ref, mask, SIZE);
56  if (UNION_CHECK (AVX512F_LEN, i_d) (res3, res_ref))
57    abort ();
58
59  for (i = 0; i < SIZE; i++)
60    res2.a[i] = DEFAULT_VALUE;
61
62  res1.x = INTRINSIC (_srai_epi32) (src1.x, 33);
63  res2.x =
64    INTRINSIC (_mask_srai_epi32) (res2.x, mask, src1.x, 33);
65  res3.x = INTRINSIC (_maskz_srai_epi32) (mask, src1.x, 33);
66
67  CALC (res_ref, src1.a, 33);
68
69  if (UNION_CHECK (AVX512F_LEN, i_d) (res1, res_ref))
70    abort ();
71
72  MASK_MERGE (i_d) (res_ref, mask, SIZE);
73  if (UNION_CHECK (AVX512F_LEN, i_d) (res2, res_ref))
74    abort ();
75
76  MASK_ZERO (i_d) (res_ref, mask, SIZE);
77  if (UNION_CHECK (AVX512F_LEN, i_d) (res3, res_ref))
78    abort ();
79}
80