1 /* { dg-do run { target avx512fp16 } } */
2 /* { dg-options "-O2 -mavx512fp16 -mavx512dq" } */
3
4
5 #define AVX512FP16
6 #include "avx512fp16-helper.h"
7
8 #define N_ELEMS 8
9
10 void NOINLINE
11 emulate_fnmadd_sh(V512 * dest, V512 op1, V512 op2,
12 __mmask8 k, int zero_mask, int mask3)
13 {
14 V512 v1, v2, v3, v4, v5, v6, v7, v8;
15 int i;
16
17 unpack_ph_2twops(op1, &v1, &v2);
18 unpack_ph_2twops(op2, &v3, &v4);
19 unpack_ph_2twops(*dest, &v7, &v8);
20
21 if ((k&1) || !k)
22 v5.f32[0] = -(v1.f32[0] * v3.f32[0]) + v7.f32[0];
23 else if (zero_mask)
24 v5.f32[0] = 0;
25 else
26 v5.f32[0] = v7.f32[0];
27
28 for (i = 1; i < 8; i++){
29 if (mask3)
30 v5.f32[i] = v7.f32[i];
31 else
32 v5.f32[i] = v1.f32[i];
33 }
34 *dest = pack_twops_2ph(v5, v6);
35 }
36
37 void
38 test_512 (void)
39 {
40 V512 res;
41 V512 exp;
42
43 init_src();
44
45 init_dest(&res, &exp);
46 emulate_fnmadd_sh(&exp, src1, src2, 0x1, 0, 0);
47 res.xmmh[0] = _mm_fnmadd_sh(src1.xmmh[0], src2.xmmh[0], res.xmmh[0]);
48 check_results(&res, &exp, N_ELEMS, "_mm_fnmadd_sh");
49 init_dest(&res, &exp);
50 emulate_fnmadd_sh(&exp, src1, src2, 0x1, 0, 1);
51 res.xmmh[0] = _mm_mask3_fnmadd_sh(src1.xmmh[0], src2.xmmh[0], res.xmmh[0],
52 0x1);
53 check_results(&res, &exp, N_ELEMS, "_mm_mask3_fnmadd_sh");
54 init_dest(&res, &exp);
55 emulate_fnmadd_sh(&exp, src1, src2, 0x1, 0, 0);
56 res.xmmh[0] = _mm_mask_fnmadd_sh(src1.xmmh[0], 0x1, src2.xmmh[0],
57 res.xmmh[0]);
58 check_results(&res, &exp, N_ELEMS, "_mm_mask_fnmadd_sh");
59 init_dest(&res, &exp);
60 emulate_fnmadd_sh(&exp, src1, src2, 0x3, 1, 0);
61 res.xmmh[0] = _mm_maskz_fnmadd_sh(0x3, src1.xmmh[0], src2.xmmh[0],
62 res.xmmh[0]);
63 check_results(&res, &exp, N_ELEMS, "_mm_maskz_fnmadd_sh");
64
65 init_dest(&res, &exp);
66 emulate_fnmadd_sh(&exp, src1, src2, 0x1, 0, 0);
67 res.xmmh[0] = _mm_fnmadd_round_sh(src1.xmmh[0], src2.xmmh[0], res.xmmh[0],
68 _ROUND_NINT);
69 check_results(&res, &exp, N_ELEMS, "_mm_fnmadd_sh");
70 init_dest(&res, &exp);
71 emulate_fnmadd_sh(&exp, src1, src2, 0x1, 0, 1);
72 res.xmmh[0] = _mm_mask3_fnmadd_round_sh(src1.xmmh[0], src2.xmmh[0],
73 res.xmmh[0], 0x1, _ROUND_NINT);
74 check_results(&res, &exp, N_ELEMS, "_mm_mask3_fnmadd_sh");
75 init_dest(&res, &exp);
76 emulate_fnmadd_sh(&exp, src1, src2, 0x1, 0, 0);
77 res.xmmh[0] = _mm_mask_fnmadd_round_sh(src1.xmmh[0], 0x1, src2.xmmh[0],
78 res.xmmh[0], _ROUND_NINT);
79 check_results(&res, &exp, N_ELEMS, "_mm_mask_fnmadd_sh");
80 init_dest(&res, &exp);
81 emulate_fnmadd_sh(&exp, src1, src2, 0x3, 1, 0);
82 res.xmmh[0] = _mm_maskz_fnmadd_round_sh(0x3, src1.xmmh[0], src2.xmmh[0],
83 res.xmmh[0], _ROUND_NINT);
84 check_results(&res, &exp, N_ELEMS, "_mm_maskz_fnmadd_sh");
85
86 if (n_errs != 0) {
87 abort ();
88 }
89 }
90