1 /* { dg-do run { target avx512fp16 } } */
2 /* { dg-options "-O2 -mavx512fp16 -mavx512dq" } */
3
4 #define AVX512FP16
5 #include "avx512fp16-helper.h"
6
7 #define N_ELEMS (AVX512F_LEN / 16)
8
9 void NOINLINE
10 EMULATE(cvtw2_ph) (V512 * dest, V512 op1,
11 __mmask32 k, int zero_mask)
12 {
13 V512 v1, v2, v3, v4, v5, v6, v7, v8;
14 int i;
15 __mmask16 m1, m2;
16
17 m1 = k & 0xffff;
18 m2 = (k >> 16) & 0xffff;
19
20 unpack_ph_2twops(*dest, &v7, &v8);
21
22 for (i = 0; i < 16; i++) {
23 if (((1 << i) & m1) == 0) {
24 if (zero_mask) {
25 v5.f32[i] = 0;
26 }
27 else {
28 v5.f32[i] = v7.f32[i];
29 }
30 }
31 else {
32 v5.f32[i] = op1.u16[i];
33
34 }
35
36 if (((1 << i) & m2) == 0) {
37 if (zero_mask) {
38 v6.f32[i] = 0;
39 }
40 else {
41 v6.f32[i] = v8.f32[i];
42 }
43 }
44 else {
45 v6.f32[i] = op1.u16[i+16];
46 }
47 }
48
49 *dest = pack_twops_2ph(v5, v6);
50 }
51
52 void
53 TEST (void)
54 {
55 V512 res;
56 V512 exp;
57
58 init_src();
59
60 EMULATE(cvtw2_ph)(&exp, src3, NET_MASK, 0);
61 HF(res) = INTRINSIC (_cvtepi16_ph) (SI(src3));
62 CHECK_RESULT (&res, &exp, N_ELEMS, _cvtepi16_ph);
63
64 init_dest(&res, &exp);
65 EMULATE(cvtw2_ph)(&exp, src3, MASK_VALUE, 0);
66 HF(res) = INTRINSIC (_mask_cvtepi16_ph) (HF(res), MASK_VALUE, SI(src3));
67 CHECK_RESULT (&res, &exp, N_ELEMS, _mask_cvtepi16_ph);
68
69 EMULATE(cvtw2_ph)(&exp, src3, ZMASK_VALUE, 1);
70 HF(res) = INTRINSIC (_maskz_cvtepi16_ph) (ZMASK_VALUE, SI(src3));
71 CHECK_RESULT (&res, &exp, N_ELEMS, _maskz_cvtepi16_ph);
72
73 #if AVX512F_LEN == 512
74 EMULATE(cvtw2_ph)(&exp, src3, NET_MASK, 0);
75 HF(res) = INTRINSIC (_cvt_roundepi16_ph) (SI(src3), _ROUND_NINT);
76 CHECK_RESULT (&res, &exp, N_ELEMS, _cvt_roundepi16_ph);
77
78 init_dest(&res, &exp);
79 EMULATE(cvtw2_ph)(&exp, src3, MASK_VALUE, 0);
80 HF(res) = INTRINSIC (_mask_cvt_roundepi16_ph) (HF(res), MASK_VALUE, SI(src3), _ROUND_NINT);
81 CHECK_RESULT (&res, &exp, N_ELEMS, _mask_cvt_roundepi16_ph);
82
83 EMULATE(cvtw2_ph)(&exp, src3, ZMASK_VALUE, 1);
84 HF(res) = INTRINSIC (_maskz_cvt_roundepi16_ph) (ZMASK_VALUE, SI(src3), _ROUND_NINT);
85 CHECK_RESULT (&res, &exp, N_ELEMS, _maskz_cvt_roundepi16_ph);
86 #endif
87
88 if (n_errs != 0) {
89 abort ();
90 }
91 }
92