1/* { dg-do run } */
2/* { dg-options "-O2 -mavx512bw" } */
3/* { dg-require-effective-target avx512bw } */
4
5#define AVX512BW
6#include "avx512f-helper.h"
7
8#define DST_SIZE (AVX512F_LEN / 8)
9#define SRC_SIZE (AVX512F_LEN / 16)
10
11#include "limits.h"
12
13#include "avx512f-mask-type.h"
14
15static char
16EVAL(short_to_char, AVX512F_LEN,) (short iVal)
17{
18  char sVal;
19
20  if (iVal < CHAR_MIN)
21    sVal = CHAR_MIN;
22  else if (iVal > CHAR_MAX)
23    sVal = CHAR_MAX;
24  else
25    sVal = iVal;
26
27  return sVal;
28}
29
30void
31CALC (short *src1, short *src2, char *dst)
32{
33  int i;
34  short *ptr;
35
36  for (i = 0; i < DST_SIZE; i++)
37    {
38      ptr = (i / 8) % 2 ? src2 : src1;
39      dst[i] = EVAL(short_to_char, AVX512F_LEN,) (ptr[i % 8 + (i / 16) * 8]);
40    }
41}
42
43void
44TEST (void)
45{
46  UNION_TYPE (AVX512F_LEN, i_w) s1, s2;
47  UNION_TYPE (AVX512F_LEN, i_b) res1, res2, res3;
48  MASK_TYPE mask = MASK_VALUE;
49  char dst_ref[DST_SIZE];
50  int i;
51
52  for (i = 0; i < DST_SIZE; i++)
53    res2.a[i] = DEFAULT_VALUE;
54
55  for (i = 0; i < SRC_SIZE; i++)
56    {
57      s1.a[i] = i + 10;
58      s2.a[i] = i + 15;
59    }
60
61  res1.x = INTRINSIC (_packs_epi16) (s1.x, s2.x);
62  res2.x = INTRINSIC (_mask_packs_epi16) (res2.x, mask, s1.x, s2.x);
63  res3.x = INTRINSIC (_maskz_packs_epi16) (mask, s1.x, s2.x);
64
65  CALC (s1.a, s2.a, dst_ref);
66
67  if (UNION_CHECK (AVX512F_LEN, i_b) (res1, dst_ref))
68    abort ();
69
70  MASK_MERGE (i_b) (dst_ref, mask, DST_SIZE);
71  if (UNION_CHECK (AVX512F_LEN, i_b) (res2, dst_ref))
72    abort ();
73
74  MASK_ZERO (i_b) (dst_ref, mask, DST_SIZE);
75  if (UNION_CHECK (AVX512F_LEN, i_b) (res3, dst_ref))
76    abort ();
77
78}
79