1 /* Template file for VCVT operator validation.
3 This file is meant to be included by the relevant test files, which
4 have to define the intrinsic family to test. If a given intrinsic
5 supports variants which are not supported by all the other vcvt
6 operators, these can be tested by providing a definition for
9 This file is only used for VCVT? tests, which currently have only f16 to
10 integer variants. It is based on vcvt.c. */
12 #define FNNAME1(NAME) exec_ ## NAME
13 #define FNNAME(NAME) FNNAME1 (NAME)
15 void FNNAME (INSN_NAME) (void)
19 /* Basic test: y=vcvt(x), then store the result. */
20 #define TEST_VCVT1(INSN, Q, T1, T2, W, N, TS1, TS2, EXP) \
21 VECT_VAR(vector_res, T1, W, N) = \
22 INSN##Q##_##T2##W##_##TS2##W(VECT_VAR(vector, TS1, W, N)); \
23 vst1##Q##_##T2##W(VECT_VAR(result, T1, W, N), \
24 VECT_VAR(vector_res, T1, W, N)); \
25 CHECK(TEST_MSG, T1, W, N, PRIx##W, EXP, TEST_MSG2);
27 #define TEST_VCVT(INSN, Q, T1, T2, W, N, TS1, TS2, EXP) \
28 TEST_VCVT1 (INSN, Q, T1, T2, W, N, TS1, TS2, EXP)
30 DECL_VARIABLE_ALL_VARIANTS(vector);
31 DECL_VARIABLE_ALL_VARIANTS(vector_res);
35 /* Initialize input "vector" from "buffer". */
36 TEST_MACRO_ALL_VARIANTS_2_5(VLOAD, vector, buffer);
37 #if defined (__ARM_FEATURE_FP16_VECTOR_ARITHMETIC)
38 VLOAD(vector, buffer, , float, f, 16, 4);
39 VLOAD(vector, buffer, q, float, f, 16, 8);
42 /* Make sure some elements have a fractional part, to exercise
43 integer conversions. */
44 #if defined (__ARM_FEATURE_FP16_VECTOR_ARITHMETIC)
45 VSET_LANE(vector, , float, f, 16, 4, 0, -15.3f);
46 VSET_LANE(vector, , float, f, 16, 4, 1, 5.3f);
47 VSET_LANE(vector, , float, f, 16, 4, 2, -15.3f);
48 VSET_LANE(vector, , float, f, 16, 4, 3, 5.3f);
49 VSET_LANE(vector, q, float, f, 16, 8, 4, -15.3f);
50 VSET_LANE(vector, q, float, f, 16, 8, 5, 5.3f);
51 VSET_LANE(vector, q, float, f, 16, 8, 6, -15.3f);
52 VSET_LANE(vector, q, float, f, 16, 8, 7, 5.3f);
55 /* The same result buffers are used multiple times, so we check them
56 before overwriting them. */
59 #if defined (__ARM_FEATURE_FP16_VECTOR_ARITHMETIC)
61 TEST_VCVT(INSN_NAME, , int, s, 16, 4, float, f, expected);
62 TEST_VCVT(INSN_NAME, , uint, u, 16, 4, float, f, expected);
65 #if defined (__ARM_FEATURE_FP16_VECTOR_ARITHMETIC)
66 VSET_LANE(vector, q, float, f, 16, 8, 0, 0.0f);
67 VSET_LANE(vector, q, float, f, 16, 8, 1, -0.0f);
68 VSET_LANE(vector, q, float, f, 16, 8, 2, 15.12f);
69 VSET_LANE(vector, q, float, f, 16, 8, 3, -15.12f);
70 VSET_LANE(vector, q, float, f, 16, 8, 4, 0.0f);
71 VSET_LANE(vector, q, float, f, 16, 8, 5, -0.0f);
72 VSET_LANE(vector, q, float, f, 16, 8, 6, 15.12f);
73 VSET_LANE(vector, q, float, f, 16, 8, 7, -15.12f);
76 #if defined (__ARM_FEATURE_FP16_VECTOR_ARITHMETIC)
78 TEST_VCVT(INSN_NAME, q, int, s, 16, 8, float, f, expected);
79 TEST_VCVT(INSN_NAME, q, uint, u, 16, 8, float, f, expected);
84 #define TEST_MSG2 "(check rounding)"
86 #if defined (__ARM_FEATURE_FP16_VECTOR_ARITHMETIC)
87 VDUP(vector, , float, f, 16, 4, 10.4f);
88 VDUP(vector, q, float, f, 16, 8, 125.9f);
91 #if defined (__ARM_FEATURE_FP16_VECTOR_ARITHMETIC)
93 TEST_VCVT(INSN_NAME, , int, s, 16, 4, float, f, expected_rounding);
94 TEST_VCVT(INSN_NAME, , uint, u, 16, 4, float, f, expected_rounding);
97 #if defined (__ARM_FEATURE_FP16_VECTOR_ARITHMETIC)
99 TEST_VCVT(INSN_NAME, q, int, s, 16, 8, float, f, expected_rounding);
100 TEST_VCVT(INSN_NAME, q, uint, u, 16, 8, float, f, expected_rounding);
111 FNNAME (INSN_NAME) ();