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 / 64)
10 #include "avx512f-mask-type.h"
11 #include <limits.h>
12 
13 void
CALC(unsigned short * r,unsigned long long * s,int mem)14 CALC (unsigned short *r, unsigned long long *s, int mem)
15 {
16   int i;
17   int len = mem ? SIZE : 8;
18   for (i = 0; i < len; i++)
19     r[i] = (i < SIZE) ? ((s[i] > USHRT_MAX) ? USHRT_MAX : s[i]) : 0;
20 }
21 
22 void
TEST(void)23 TEST (void)
24 {
25   int i;
26   UNION_TYPE (128, i_uw) res1, res2, res3;
27   unsigned short res4[8];
28   UNION_TYPE (AVX512F_LEN, i_uq) src;
29   MASK_TYPE mask = MASK_VALUE;
30   unsigned short res_ref[8];
31   unsigned short res_ref2[8];
32 
33   for (i = 0; i < SIZE; i++)
34     {
35       src.a[i] = 1 + 34 * i;
36       res2.a[i] = DEFAULT_VALUE;
37       res4[i] = DEFAULT_VALUE;
38     }
39 
40   for (i = SIZE; i < 8; i++)
41     {
42       res_ref2[i] = DEFAULT_VALUE * 2;
43       res4[i] = DEFAULT_VALUE * 2;
44     }
45 
46   res1.x = INTRINSIC (_cvtusepi64_epi16) (src.x);
47   res2.x = INTRINSIC (_mask_cvtusepi64_epi16) (res2.x, mask, src.x);
48   res3.x = INTRINSIC (_maskz_cvtusepi64_epi16) (mask, src.x);
49 
50   CALC (res_ref, src.a, 0);
51 
52   if (UNION_CHECK (128, i_uw) (res1, res_ref))
53     abort ();
54 
55   MASK_MERGE (i_uw) (res_ref, mask, SIZE);
56   if (UNION_CHECK (128, i_uw) (res2, res_ref))
57     abort ();
58 
59   MASK_ZERO (i_uw) (res_ref, mask, SIZE);
60   if (UNION_CHECK (128, i_uw) (res3, res_ref))
61     abort ();
62 
63   INTRINSIC (_mask_cvtusepi64_storeu_epi16) (res4, mask, src.x);
64   CALC (res_ref2, src.a, 1);
65 
66   MASK_MERGE (i_w) (res_ref2, mask, SIZE);
67   if (checkVs (res4, res_ref2, 8))
68     abort ();
69 }
70