1 /* Test vdiv works correctly. */
3 /* { dg-options "-O3 --save-temps" } */
7 #define FLT_INFINITY (__builtin_inff ())
8 #define DBL_INFINITY (__builtin_inf ())
10 #define NAN (0.0 / 0.0)
12 #define PI 3.141592653589793
13 #define PI_4 0.7853981633974483
14 #define SQRT2 1.4142135623730951
15 #define SQRT1_2 0.7071067811865475
25 /* 2^25+1, float has 24 significand bits
26 according to Single-precision floating-point format. */
27 #define TESTA8_FLT 33554433
28 /* 2^54+1, double has 53 significand bits
29 according to Double-precision floating-point format. */
30 #define TESTA8_DBL 18014398509481985
31 #define TESTA9 -TESTA8
32 #define TESTA10 TESTA8
33 #define TESTA11 -TESTA8
36 #define TESTA14 INFINITY
37 #define TESTA15 -INFINITY
38 #define TESTA16 INFINITY
59 #define TESTB16 INFINITY
60 #define TESTB17 INFINITY
61 #define TESTB18 -INFINITY
69 #define ANSW5 -SQRT1_2
70 #define ANSW6 -SQRT1_2
72 #define ANSW8_FLT 16777216
73 #define ANSW8_DBL 9007199254740992
79 #define ANSW14 INFINITY
80 #define ANSW15 -INFINITY
84 #define ANSW19 INFINITY
86 #define CONCAT(a, b) a##b
87 #define CONCAT1(a, b) CONCAT (a, b)
89 #define REG_INFEX128 q_
90 #define REG_INFEX(reg_len) REG_INFEX##reg_len
91 #define POSTFIX(reg_len, data_len) \
92 CONCAT1 (REG_INFEX (reg_len), f##data_len)
94 #define DATA_TYPE_32 float
95 #define DATA_TYPE_64 double
96 #define DATA_TYPE(data_len) DATA_TYPE_##data_len
98 #define EPSILON_32 __FLT_EPSILON__
99 #define EPSILON_64 __DBL_EPSILON__
100 #define EPSILON(data_len) EPSILON_##data_len
102 #define LOAD_INST(reg_len, data_len) \
103 CONCAT1 (vld1, POSTFIX (reg_len, data_len))
104 #define DIV_INST(reg_len, data_len) \
105 CONCAT1 (vdiv, POSTFIX (reg_len, data_len))
107 #define ABS(a) __builtin_fabs (a)
108 #define ISNAN(a) __builtin_isnan (a)
109 #define FP_equals(a, b, epsilon) \
112 || (ISNAN (a) && ISNAN (b)) \
113 || (ABS (a - b) < epsilon) \
116 #define INHIB_OPTIMIZATION asm volatile ("" : : : "memory")
118 #define RUN_TEST(a, b, c, testseta, testsetb, answset, count, \
119 reg_len, data_len, n) \
122 INHIB_OPTIMIZATION; \
123 (a) = LOAD_INST (reg_len, data_len) (testseta[count]); \
124 (b) = LOAD_INST (reg_len, data_len) (testsetb[count]); \
125 (c) = LOAD_INST (reg_len, data_len) (answset[count]); \
126 INHIB_OPTIMIZATION; \
127 (a) = DIV_INST (reg_len, data_len) (a, b); \
128 for (i = 0; i < n; i++) \
130 INHIB_OPTIMIZATION; \
131 if (!FP_equals ((a) [i], (c) [i], EPSILON (data_len))) \
136 extern void abort (void);
138 #define TESTA8 TESTA8_FLT
139 #define ANSW8 ANSW8_FLT
140 #define INFINITY FLT_INFINITY
150 float32_t testseta
[10][2] = {
151 { TESTA0
, TESTA1
}, { TESTA2
, TESTA3
},
152 { TESTA4
, TESTA5
}, { TESTA6
, TESTA7
},
153 { TESTA8
, TESTA9
}, { TESTA10
, TESTA11
},
154 { TESTA12
, TESTA13
}, { TESTA14
, TESTA15
},
155 { TESTA16
, TESTA17
}, { TESTA18
, TESTA19
}
158 float32_t testsetb
[10][2] = {
159 { TESTB0
, TESTB1
}, { TESTB2
, TESTB3
},
160 { TESTB4
, TESTB5
}, { TESTB6
, TESTB7
},
161 { TESTB8
, TESTB9
}, { TESTB10
, TESTB11
},
162 { TESTB12
, TESTB13
}, { TESTB14
, TESTB15
},
163 { TESTB16
, TESTB17
}, { TESTB18
, TESTB19
}
166 float32_t answset
[10][2] = {
167 { ANSW0
, ANSW1
}, { ANSW2
, ANSW3
},
168 { ANSW4
, ANSW5
}, { ANSW6
, ANSW7
},
169 { ANSW8
, ANSW9
}, { ANSW10
, ANSW11
},
170 { ANSW12
, ANSW13
}, { ANSW14
, ANSW15
},
171 { ANSW16
, ANSW17
}, { ANSW18
, ANSW19
}
174 for (count
= 0; count
< 10; count
++)
176 RUN_TEST (a
, b
, c
, testseta
, testsetb
, answset
, count
, 64, 32, 2);
182 /* { dg-final { scan-assembler-times "fdiv\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s, v\[0-9\]+\.2s" 1 } } */
188 #define TESTA8 TESTA8_DBL
189 #define ANSW8 ANSW8_DBL
190 #define INFINITY DBL_INFINITY
200 float64_t testseta
[20][1] = {
201 { TESTA0
}, { TESTA1
}, { TESTA2
}, { TESTA3
},
202 { TESTA4
}, { TESTA5
}, { TESTA6
}, { TESTA7
},
203 { TESTA8
}, { TESTA9
}, { TESTA10
}, { TESTA11
},
204 { TESTA12
}, { TESTA13
}, { TESTA14
}, { TESTA15
},
205 { TESTA16
}, { TESTA17
}, { TESTA18
}, { TESTA19
}
208 float64_t testsetb
[20][1] = {
209 { TESTB0
}, { TESTB1
}, { TESTB2
}, { TESTB3
},
210 { TESTB4
}, { TESTB5
}, { TESTB6
}, { TESTB7
},
211 { TESTB8
}, { TESTB9
}, { TESTB10
}, { TESTB11
},
212 { TESTB12
}, { TESTB13
}, { TESTB14
}, { TESTB15
},
213 { TESTB16
}, { TESTB17
}, { TESTB18
}, { TESTB19
}
216 float64_t answset
[20][1] = {
217 { ANSW0
}, { ANSW1
}, { ANSW2
}, { ANSW3
},
218 { ANSW4
}, { ANSW5
}, { ANSW6
}, { ANSW7
},
219 { ANSW8
}, { ANSW9
}, { ANSW10
}, { ANSW11
},
220 { ANSW12
}, { ANSW13
}, { ANSW14
}, { ANSW15
},
221 { ANSW16
}, { ANSW17
}, { ANSW18
}, { ANSW19
}
224 for (count
= 0; count
< 20; count
++)
226 RUN_TEST (a
, b
, c
, testseta
, testsetb
, answset
, count
, 64, 64, 1);
231 /* The following assembly should match 2 more times,
232 in 64bit NAN generation. */
233 /* { dg-final { scan-assembler-times "fdiv\\td\[0-9\]+, d\[0-9\]+, d\[0-9\]+" 3 } } */
239 #define TESTA8 TESTA8_FLT
240 #define ANSW8 ANSW8_FLT
241 #define INFINITY FLT_INFINITY
251 float32_t testseta
[5][4] = {
252 { TESTA0
, TESTA1
, TESTA2
, TESTA3
},
253 { TESTA4
, TESTA5
, TESTA6
, TESTA7
},
254 { TESTA8
, TESTA9
, TESTA10
, TESTA11
},
255 { TESTA12
, TESTA13
, TESTA14
, TESTA15
},
256 { TESTA16
, TESTA17
, TESTA18
, TESTA19
}
259 float32_t testsetb
[5][4] = {
260 { TESTB0
, TESTB1
, TESTB2
, TESTB3
},
261 { TESTB4
, TESTB5
, TESTB6
, TESTB7
},
262 { TESTB8
, TESTB9
, TESTB10
, TESTB11
},
263 { TESTB12
, TESTB13
, TESTB14
, TESTB15
},
264 { TESTB16
, TESTB17
, TESTB18
, TESTB19
}
267 float32_t answset
[5][4] = {
268 { ANSW0
, ANSW1
, ANSW2
, ANSW3
},
269 { ANSW4
, ANSW5
, ANSW6
, ANSW7
},
270 { ANSW8
, ANSW9
, ANSW10
, ANSW11
},
271 { ANSW12
, ANSW13
, ANSW14
, ANSW15
},
272 { ANSW16
, ANSW17
, ANSW18
, ANSW19
}
275 for (count
= 0; count
< 5; count
++)
277 RUN_TEST (a
, b
, c
, testseta
, testsetb
, answset
, count
, 128, 32, 4);
282 /* { dg-final { scan-assembler-times "fdiv\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s, v\[0-9\]+\.4s" 1 } } */
288 #define TESTA8 TESTA8_DBL
289 #define ANSW8 ANSW8_DBL
290 #define INFINITY DBL_INFINITY
300 float64_t testseta
[10][2] = {
301 { TESTA0
, TESTA1
}, { TESTA2
, TESTA3
},
302 { TESTA4
, TESTA5
}, { TESTA6
, TESTA7
},
303 { TESTA8
, TESTA9
}, { TESTA10
, TESTA11
},
304 { TESTA12
, TESTA13
}, { TESTA14
, TESTA15
},
305 { TESTA16
, TESTA17
}, { TESTA18
, TESTA19
}
308 float64_t testsetb
[10][2] = {
309 { TESTB0
, TESTB1
}, { TESTB2
, TESTB3
},
310 { TESTB4
, TESTB5
}, { TESTB6
, TESTB7
},
311 { TESTB8
, TESTB9
}, { TESTB10
, TESTB11
},
312 { TESTB12
, TESTB13
}, { TESTB14
, TESTB15
},
313 { TESTB16
, TESTB17
}, { TESTB18
, TESTB19
}
316 float64_t answset
[10][2] = {
317 { ANSW0
, ANSW1
}, { ANSW2
, ANSW3
},
318 { ANSW4
, ANSW5
}, { ANSW6
, ANSW7
},
319 { ANSW8
, ANSW9
}, { ANSW10
, ANSW11
},
320 { ANSW12
, ANSW13
}, { ANSW14
, ANSW15
},
321 { ANSW16
, ANSW17
}, { ANSW18
, ANSW19
}
324 for (count
= 0; count
< 10; count
++)
326 RUN_TEST (a
, b
, c
, testseta
, testsetb
, answset
, count
, 128, 64, 2);
332 /* { dg-final { scan-assembler-times "fdiv\\tv\[0-9\]+\.2d, v\[0-9\]+\.2d, v\[0-9\]+\.2d" 1 } } */
335 main (int argc
, char **argv
)
337 if (test_vdiv_f32 ())
340 if (test_vdiv_f64 ())
343 if (test_vdivq_f32 ())
346 if (test_vdivq_f64 ())
352 /* { dg-final { cleanup-saved-temps } } */