1 /* Floating-point only version of binary_op_no64.inc template. Currently only
6 #define FNNAME1(NAME) exec_ ## NAME
7 #define FNNAME(NAME) FNNAME1(NAME)
9 void FNNAME (INSN_NAME) (void)
13 /* Basic test: z = INSN (x, y), then store the result. */
14 #define TEST_BINARY_OP1(INSN, Q, T1, T2, W, N) \
15 VECT_VAR(vector_res, T1, W, N) = \
16 INSN##Q##_##T2##W(VECT_VAR(vector, T1, W, N), \
17 VECT_VAR(vector2, T1, W, N)); \
18 vst1##Q##_##T2##W(VECT_VAR(result, T1, W, N), VECT_VAR(vector_res, T1, W, N))
20 #define TEST_BINARY_OP(INSN, Q, T1, T2, W, N) \
21 TEST_BINARY_OP1(INSN, Q, T1, T2, W, N) \
23 #ifdef HAS_FLOAT16_VARIANT
24 DECL_VARIABLE(vector, float, 16, 4);
25 DECL_VARIABLE(vector2, float, 16, 4);
26 DECL_VARIABLE(vector_res, float, 16, 4);
28 DECL_VARIABLE(vector, float, 16, 8);
29 DECL_VARIABLE(vector2, float, 16, 8);
30 DECL_VARIABLE(vector_res, float, 16, 8);
33 #ifdef HAS_FLOAT_VARIANT
34 DECL_VARIABLE(vector, float, 32, 2);
35 DECL_VARIABLE(vector2, float, 32, 2);
36 DECL_VARIABLE(vector_res, float, 32, 2);
38 DECL_VARIABLE(vector, float, 32, 4);
39 DECL_VARIABLE(vector2, float, 32, 4);
40 DECL_VARIABLE(vector_res, float, 32, 4);
45 /* Initialize input "vector" from "buffer". */
46 #ifdef HAS_FLOAT16_VARIANT
47 VLOAD(vector, buffer, , float, f, 16, 4);
48 VLOAD(vector, buffer, q, float, f, 16, 8);
50 #ifdef HAS_FLOAT_VARIANT
51 VLOAD(vector, buffer, , float, f, 32, 2);
52 VLOAD(vector, buffer, q, float, f, 32, 4);
55 /* Choose init value arbitrarily, will be used as comparison value. */
56 #ifdef HAS_FLOAT16_VARIANT
57 VDUP(vector2, , float, f, 16, 4, -15.5f);
58 VDUP(vector2, q, float, f, 16, 8, -14.5f);
60 #ifdef HAS_FLOAT_VARIANT
61 VDUP(vector2, , float, f, 32, 2, -15.5f);
62 VDUP(vector2, q, float, f, 32, 4, -14.5f);
65 #ifdef HAS_FLOAT16_VARIANT
66 #define FLOAT16_VARIANT(MACRO, VAR) \
67 MACRO(VAR, , float, f, 16, 4); \
68 MACRO(VAR, q, float, f, 16, 8);
70 #define FLOAT16_VARIANT(MACRO, VAR)
73 #ifdef HAS_FLOAT_VARIANT
74 #define FLOAT_VARIANT(MACRO, VAR) \
75 MACRO(VAR, , float, f, 32, 2); \
76 MACRO(VAR, q, float, f, 32, 4);
78 #define FLOAT_VARIANT(MACRO, VAR)
81 #define TEST_MACRO_NO64BIT_VARIANT_1_5(MACRO, VAR) \
83 /* Apply a binary operator named INSN_NAME. */
84 FLOAT16_VARIANT(TEST_BINARY_OP, INSN_NAME);
85 FLOAT_VARIANT(TEST_BINARY_OP, INSN_NAME);
87 #ifdef HAS_FLOAT16_VARIANT
88 CHECK_FP(TEST_MSG, float, 16, 4, PRIx16, expected, "");
89 CHECK_FP(TEST_MSG, float, 16, 8, PRIx16, expected, "");
91 /* Extra FP tests with special values (NaN, ....) */
92 VDUP(vector, q, float, f, 16, 8, 1.0f);
93 VDUP(vector2, q, float, f, 16, 8, NAN);
94 TEST_BINARY_OP(INSN_NAME, q, float, f, 16, 8);
95 CHECK_FP(TEST_MSG, float, 16, 8, PRIx16, expected_nan,
98 VDUP(vector, q, float, f, 16, 8, -NAN);
99 VDUP(vector2, q, float, f, 16, 8, 1.0f);
100 TEST_BINARY_OP(INSN_NAME, q, float, f, 16, 8);
101 CHECK_FP(TEST_MSG, float, 16, 8, PRIx16, expected_mnan,
102 " FP special (-NaN)");
104 VDUP(vector, q, float, f, 16, 8, 1.0f);
105 VDUP(vector2, q, float, f, 16, 8, HUGE_VALF);
106 TEST_BINARY_OP(INSN_NAME, q, float, f, 16, 8);
107 CHECK_FP(TEST_MSG, float, 16, 8, PRIx16, expected_inf,
108 " FP special (inf)");
110 VDUP(vector, q, float, f, 16, 8, -HUGE_VALF);
111 VDUP(vector2, q, float, f, 16, 8, 1.0f);
112 TEST_BINARY_OP(INSN_NAME, q, float, f, 16, 8);
113 CHECK_FP(TEST_MSG, float, 16, 8, PRIx16, expected_minf,
114 " FP special (-inf)");
116 VDUP(vector, q, float, f, 16, 8, 0.0f);
117 VDUP(vector2, q, float, f, 16, 8, -0.0f);
118 TEST_BINARY_OP(INSN_NAME, q, float, f, 16, 8);
119 CHECK_FP(TEST_MSG, float, 16, 8, PRIx16, expected_zero1,
120 " FP special (-0.0)");
122 VDUP(vector, q, float, f, 16, 8, -0.0f);
123 VDUP(vector2, q, float, f, 16, 8, 0.0f);
124 TEST_BINARY_OP(INSN_NAME, q, float, f, 16, 8);
125 CHECK_FP(TEST_MSG, float, 16, 8, PRIx16, expected_zero2,
126 " FP special (-0.0)");
129 #ifdef HAS_FLOAT_VARIANT
130 CHECK_FP(TEST_MSG, float, 32, 2, PRIx32, expected, "");
131 CHECK_FP(TEST_MSG, float, 32, 4, PRIx32, expected, "");
133 /* Extra FP tests with special values (NaN, ....) */
134 VDUP(vector, q, float, f, 32, 4, 1.0f);
135 VDUP(vector2, q, float, f, 32, 4, NAN);
136 TEST_BINARY_OP(INSN_NAME, q, float, f, 32, 4);
137 CHECK_FP(TEST_MSG, float, 32, 4, PRIx32, expected_nan, " FP special (NaN)");
139 VDUP(vector, q, float, f, 32, 4, -NAN);
140 VDUP(vector2, q, float, f, 32, 4, 1.0f);
141 TEST_BINARY_OP(INSN_NAME, q, float, f, 32, 4);
142 CHECK_FP(TEST_MSG, float, 32, 4, PRIx32, expected_mnan, " FP special (-NaN)");
144 VDUP(vector, q, float, f, 32, 4, 1.0f);
145 VDUP(vector2, q, float, f, 32, 4, HUGE_VALF);
146 TEST_BINARY_OP(INSN_NAME, q, float, f, 32, 4);
147 CHECK_FP(TEST_MSG, float, 32, 4, PRIx32, expected_inf, " FP special (inf)");
149 VDUP(vector, q, float, f, 32, 4, -HUGE_VALF);
150 VDUP(vector2, q, float, f, 32, 4, 1.0f);
151 TEST_BINARY_OP(INSN_NAME, q, float, f, 32, 4);
152 CHECK_FP(TEST_MSG, float, 32, 4, PRIx32, expected_minf, " FP special (-inf)");
154 VDUP(vector, q, float, f, 32, 4, 0.0f);
155 VDUP(vector2, q, float, f, 32, 4, -0.0f);
156 TEST_BINARY_OP(INSN_NAME, q, float, f, 32, 4);
157 CHECK_FP(TEST_MSG, float, 32, 4, PRIx32, expected_zero1, " FP special (-0.0)");
159 VDUP(vector, q, float, f, 32, 4, -0.0f);
160 VDUP(vector2, q, float, f, 32, 4, 0.0f);
161 TEST_BINARY_OP(INSN_NAME, q, float, f, 32, 4);
162 CHECK_FP(TEST_MSG, float, 32, 4, PRIx32, expected_zero2, " FP special (-0.0)");
168 FNNAME (INSN_NAME) ();