2 /* { dg-require-effective-target arm_v8_2a_fp16_neon_hw } */
3 /* { dg-add-options arm_v8_2a_fp16_neon } */
4 /* { dg-skip-if "" { arm*-*-* } } */
7 #include "arm-neon-ref.h"
8 #include "compute-ref-data.h"
10 #define FP16_C(a) ((__fp16) a)
11 #define A FP16_C (13.4)
12 #define B FP16_C (__builtin_inff ())
13 #define C FP16_C (-34.8)
14 #define D FP16_C (-__builtin_inff ())
15 #define E FP16_C (63.1)
16 #define F FP16_C (0.0)
17 #define G FP16_C (-4.8)
18 #define H FP16_C (0.0)
20 #define I FP16_C (0.7)
21 #define J FP16_C (-__builtin_inff ())
22 #define K FP16_C (11.23)
24 #define M FP16_C (87.1)
25 #define N FP16_C (-0.0)
26 #define O FP16_C (-1.1)
29 /* Expected results for vmulx. */
30 VECT_VAR_DECL (expected_static
, hfloat
, 16, 4) []
31 = { 0x629B /* A * E. */, 0x4000 /* FP16_C (2.0f). */,
32 0x5939 /* C * G. */, 0xC000 /* FP16_C (-2.0f). */ };
34 VECT_VAR_DECL (expected_static
, hfloat
, 16, 8) []
35 = { 0x629B /* A * E. */, 0x4000 /* FP16_C (2.0f). */,
36 0x5939 /* C * G. */, 0xC000 /* FP16_C (-2.0f). */,
37 0x53A0 /* I * M. */, 0x4000 /* FP16_C (2.0f). */,
38 0xCA2C /* K * O. */, 0x615C /* L * P. */ };
40 void exec_vmulx_f16 (void)
43 #define TEST_MSG "VMULX (FP16)"
46 DECL_VARIABLE(vsrc_1
, float, 16, 4);
47 DECL_VARIABLE(vsrc_2
, float, 16, 4);
48 VECT_VAR_DECL (buf_src_1
, float, 16, 4) [] = {A
, B
, C
, D
};
49 VECT_VAR_DECL (buf_src_2
, float, 16, 4) [] = {E
, F
, G
, H
};
50 VLOAD (vsrc_1
, buf_src_1
, , float, f
, 16, 4);
51 VLOAD (vsrc_2
, buf_src_2
, , float, f
, 16, 4);
52 DECL_VARIABLE (vector_res
, float, 16, 4)
53 = vmulx_f16 (VECT_VAR (vsrc_1
, float, 16, 4),
54 VECT_VAR (vsrc_2
, float, 16, 4));
55 vst1_f16 (VECT_VAR (result
, float, 16, 4),
56 VECT_VAR (vector_res
, float, 16, 4));
58 CHECK_FP (TEST_MSG
, float, 16, 4, PRIx16
, expected_static
, "");
61 #define TEST_MSG "VMULXQ (FP16)"
64 DECL_VARIABLE(vsrc_1
, float, 16, 8);
65 DECL_VARIABLE(vsrc_2
, float, 16, 8);
66 VECT_VAR_DECL (buf_src_1
, float, 16, 8) [] = {A
, B
, C
, D
, I
, J
, K
, L
};
67 VECT_VAR_DECL (buf_src_2
, float, 16, 8) [] = {E
, F
, G
, H
, M
, N
, O
, P
};
68 VLOAD (vsrc_1
, buf_src_1
, q
, float, f
, 16, 8);
69 VLOAD (vsrc_2
, buf_src_2
, q
, float, f
, 16, 8);
70 DECL_VARIABLE (vector_res
, float, 16, 8)
71 = vmulxq_f16 (VECT_VAR (vsrc_1
, float, 16, 8),
72 VECT_VAR (vsrc_2
, float, 16, 8));
73 vst1q_f16 (VECT_VAR (result
, float, 16, 8),
74 VECT_VAR (vector_res
, float, 16, 8));
76 CHECK_FP (TEST_MSG
, float, 16, 8, PRIx16
, expected_static
, "");