1 /* { dg-options "-std=gnu99 -D_GNU_SOURCE -pthread" } */
2 /* { dg-do run { target i?86-*-linux* x86_64-*-linux* } } */
4 /* N1150 5.2: Conversions among decimal floating types and between
5 decimal floating types and generic floating types.
8 Perform conversions between DFP types in which the assigned value
9 cannot be represented exactly in the result and must be rounded
10 correctly according to the current rounding mode.
12 Normally this would not be part of compiler testing, but conversions
13 are currently handled in libgcc via decNumber. */
20 #include "dfp-round.h"
22 extern void abort (void);
23 static __thread int failcnt = 0;
25 /* Support compiling the test to report individual failures; default is
26 to abort as soon as a check fails. */
29 #define FAILURE { printf ("failed at line %d\n", __LINE__); failcnt++; }
31 #define FAILURE abort ();
34 pthread_mutex_t mut1 = PTHREAD_MUTEX_INITIALIZER;
35 pthread_mutex_t mut2 = PTHREAD_MUTEX_INITIALIZER;
36 pthread_mutex_t mut3 = PTHREAD_MUTEX_INITIALIZER;
37 pthread_mutex_t mut4 = PTHREAD_MUTEX_INITIALIZER;
38 pthread_mutex_t mut5 = PTHREAD_MUTEX_INITIALIZER;
39 pthread_cond_t cond1 = PTHREAD_COND_INITIALIZER;
40 pthread_cond_t cond2 = PTHREAD_COND_INITIALIZER;
41 pthread_cond_t cond3 = PTHREAD_COND_INITIALIZER;
42 pthread_cond_t cond4 = PTHREAD_COND_INITIALIZER;
43 pthread_cond_t cond5 = PTHREAD_COND_INITIALIZER;
44 pthread_barrier_t bar1;
45 pthread_barrier_t bar2;
46 pthread_barrier_t bar3;
47 pthread_barrier_t bar4;
48 pthread_barrier_t bar5;
50 __thread _Decimal32 d32;
51 __thread _Decimal64 d64;
52 __thread _Decimal128 d128;
54 _Decimal32 d64_to_d32 (_Decimal64 d) { return d; }
55 _Decimal64 d128_to_d64 (_Decimal128 d) { return d; }
56 _Decimal32 d128_to_d32 (_Decimal128 d) { return d; }
59 do_d64_to_d32 (_Decimal64 orig, _Decimal32 exp)
62 d32 = d64_to_d32 (d64);
67 do_d128_to_d32 (_Decimal128 orig, _Decimal32 exp)
70 d32 = d128_to_d32 (d128);
75 do_d128_to_d64 (_Decimal128 orig, _Decimal64 exp)
78 d64 = d128_to_d64 (d128);
87 DFP_SETROUND (FE_DEC_DOWNWARD);
89 err = pthread_mutex_lock (&mut1);
91 error (EXIT_FAILURE, err, "downward: failed to lock");
93 err = pthread_barrier_wait (&bar1);
94 if (err != 0 && err != PTHREAD_BARRIER_SERIAL_THREAD)
96 puts ("downward: barrier_wait failed");
100 err = pthread_cond_wait (&cond1, &mut1);
102 error (EXIT_FAILURE, err, "downward: failed to wait");
104 err = pthread_mutex_unlock (&mut1);
106 error (EXIT_FAILURE, err, "downward: failed to unlock");
108 if (!do_d64_to_d32 (1.1111125dd, 1.111112df)) FAILURE
109 if (!do_d64_to_d32 (1.1111135dd, 1.111113df)) FAILURE
110 if (!do_d64_to_d32 (-1.1111125dd, -1.111113df)) FAILURE
111 if (!do_d64_to_d32 (-1.1111135dd, -1.111114df)) FAILURE
112 if (!do_d128_to_d32 (1.1111125dl, 1.111112df)) FAILURE
113 if (!do_d128_to_d32 (1.1111135dl, 1.111113df)) FAILURE
114 if (!do_d128_to_d32 (-1.1111125dl, -1.111113df)) FAILURE
115 if (!do_d128_to_d32 (-1.1111135dl, -1.111114df)) FAILURE
116 if (!do_d128_to_d64 (1.1111111111111125dl, 1.111111111111112dd)) FAILURE
117 if (!do_d128_to_d64 (1.1111111111111135dl, 1.111111111111113dd)) FAILURE
118 if (!do_d128_to_d64 (-1.1111111111111125dl, -1.111111111111113dd)) FAILURE
119 if (!do_d128_to_d64 (-1.1111111111111135dl, -1.111111111111114dd)) FAILURE
123 printf ("downward: %d fails\n", failcnt);
125 return (void *) (ptrdiff_t) failcnt;
129 tonearest (void *arg)
132 DFP_SETROUND (FE_DEC_TONEAREST);
134 err = pthread_mutex_lock (&mut2);
136 error (EXIT_FAILURE, err, "tonearest: failed to lock");
138 err = pthread_barrier_wait (&bar2);
139 if (err != 0 && err != PTHREAD_BARRIER_SERIAL_THREAD)
141 puts ("tonearest: barrier_wait failed");
145 err = pthread_cond_wait (&cond2, &mut2);
147 error (EXIT_FAILURE, err, "tonearest: failed to wait");
149 err = pthread_mutex_unlock (&mut2);
151 error (EXIT_FAILURE, err, "tonearest: failed to unlock");
153 if (!do_d64_to_d32 (1.1111125dd, 1.111112df)) FAILURE
154 if (!do_d64_to_d32 (1.1111135dd, 1.111114df)) FAILURE
155 if (!do_d64_to_d32 (-1.1111125dd, -1.111112df)) FAILURE
156 if (!do_d64_to_d32 (-1.1111135dd, -1.111114df)) FAILURE
157 if (!do_d128_to_d32 (1.1111125dl, 1.111112df)) FAILURE
158 if (!do_d128_to_d32 (1.1111135dl, 1.111114df)) FAILURE
159 if (!do_d128_to_d32 (-1.1111125dl, -1.111112df)) FAILURE
160 if (!do_d128_to_d32 (-1.1111135dl, -1.111114df)) FAILURE
161 if (!do_d128_to_d64 (1.1111111111111125dl, 1.111111111111112dd)) FAILURE
162 if (!do_d128_to_d64 (1.1111111111111135dl, 1.111111111111114dd)) FAILURE
163 if (!do_d128_to_d64 (-1.1111111111111125dl, -1.111111111111112dd)) FAILURE
164 if (!do_d128_to_d64 (-1.1111111111111135dl, -1.111111111111114dd)) FAILURE
168 printf ("tonearest: %d fails\n", failcnt);
170 return (void *) (ptrdiff_t) failcnt;
174 toneareastfromzero (void *arg)
177 DFP_SETROUND (FE_DEC_TONEARESTFROMZERO);
179 err = pthread_mutex_lock (&mut3);
181 error (EXIT_FAILURE, err, "toneareastfromzero: failed to lock");
183 err = pthread_barrier_wait (&bar3);
184 if (err != 0 && err != PTHREAD_BARRIER_SERIAL_THREAD)
186 puts ("toneareastfromzero: barrier_wait failed");
190 err = pthread_cond_wait (&cond3, &mut3);
192 error (EXIT_FAILURE, err, "toneareastfromzero: failed to wait");
194 err = pthread_mutex_unlock (&mut3);
196 error (EXIT_FAILURE, err, "toneareastfromzero: failed to unlock");
198 if (!do_d64_to_d32 (1.1111125dd, 1.111113df)) FAILURE
199 if (!do_d64_to_d32 (1.1111135dd, 1.111114df)) FAILURE
200 if (!do_d64_to_d32 (-1.1111125dd, -1.111113df)) FAILURE
201 if (!do_d64_to_d32 (-1.1111135dd, -1.111114df)) FAILURE
202 if (!do_d128_to_d32 (1.1111125dl, 1.111113df)) FAILURE
203 if (!do_d128_to_d32 (1.1111135dl, 1.111114df)) FAILURE
204 if (!do_d128_to_d32 (-1.1111125dl, -1.111113df)) FAILURE
205 if (!do_d128_to_d32 (-1.1111135dl, -1.111114df)) FAILURE
206 if (!do_d128_to_d64 (1.1111111111111125dl, 1.111111111111113dd)) FAILURE
207 if (!do_d128_to_d64 (1.1111111111111135dl, 1.111111111111114dd)) FAILURE
208 if (!do_d128_to_d64 (-1.1111111111111125dl, -1.111111111111113dd)) FAILURE
209 if (!do_d128_to_d64 (-1.1111111111111135dl, -1.111111111111114dd)) FAILURE
213 printf ("toneareastfromzero: %d fails\n", failcnt);
215 return (void *) (ptrdiff_t) failcnt;
219 towardzero (void *arg)
222 DFP_SETROUND (FE_DEC_TOWARDZERO);
224 err = pthread_mutex_lock (&mut4);
226 error (EXIT_FAILURE, err, "towardzero: failed to lock");
228 err = pthread_barrier_wait (&bar4);
229 if (err != 0 && err != PTHREAD_BARRIER_SERIAL_THREAD)
231 puts ("towardzero: barrier_wait failed");
235 err = pthread_cond_wait (&cond4, &mut4);
237 error (EXIT_FAILURE, err, "towardzero: failed to wait");
239 err = pthread_mutex_unlock (&mut4);
241 error (EXIT_FAILURE, err, "towardzero: failed to unlock");
243 if (!do_d64_to_d32 (1.1111125dd, 1.111112df)) FAILURE
244 if (!do_d64_to_d32 (1.1111135dd, 1.111113df)) FAILURE
245 if (!do_d64_to_d32 (-1.1111125dd, -1.111112df)) FAILURE
246 if (!do_d64_to_d32 (-1.1111135dd, -1.111113df)) FAILURE
247 if (!do_d128_to_d32 (1.1111125dl, 1.111112df)) FAILURE
248 if (!do_d128_to_d32 (1.1111135dl, 1.111113df)) FAILURE
249 if (!do_d128_to_d32 (-1.1111125dl, -1.111112df)) FAILURE
250 if (!do_d128_to_d32 (-1.1111135dl, -1.111113df)) FAILURE
251 if (!do_d128_to_d64 (1.1111111111111125dl, 1.111111111111112dd)) FAILURE
252 if (!do_d128_to_d64 (1.1111111111111135dl, 1.111111111111113dd)) FAILURE
253 if (!do_d128_to_d64 (-1.1111111111111125dl, -1.111111111111112dd)) FAILURE
254 if (!do_d128_to_d64 (-1.1111111111111135dl, -1.111111111111113dd)) FAILURE
258 printf ("towardzero: %d fails\n", failcnt);
260 return (void *) (ptrdiff_t) failcnt;
267 DFP_SETROUND (FE_DEC_UPWARD);
269 err = pthread_mutex_lock (&mut5);
271 error (EXIT_FAILURE, err, "upward: failed to lock");
273 err = pthread_barrier_wait (&bar5);
274 if (err != 0 && err != PTHREAD_BARRIER_SERIAL_THREAD)
276 puts ("upward: barrier_wait failed");
280 err = pthread_cond_wait (&cond5, &mut5);
282 error (EXIT_FAILURE, err, "upward: failed to wait");
284 err = pthread_mutex_unlock (&mut5);
286 error (EXIT_FAILURE, err, "upward: failed to unlock");
288 if (!do_d64_to_d32 (1.1111125dd, 1.111113df)) FAILURE
289 if (!do_d64_to_d32 (1.1111135dd, 1.111114df)) FAILURE
290 if (!do_d64_to_d32 (-1.1111125dd, -1.111112df)) FAILURE
291 if (!do_d64_to_d32 (-1.1111135dd, -1.111113df)) FAILURE
292 if (!do_d128_to_d32 (1.1111125dl, 1.111113df)) FAILURE
293 if (!do_d128_to_d32 (1.1111135dl, 1.111114df)) FAILURE
294 if (!do_d128_to_d32 (-1.1111125dl, -1.111112df)) FAILURE
295 if (!do_d128_to_d32 (-1.1111135dl, -1.111113df)) FAILURE
296 if (!do_d128_to_d64 (1.1111111111111125dl, 1.111111111111113dd)) FAILURE
297 if (!do_d128_to_d64 (1.1111111111111135dl, 1.111111111111114dd)) FAILURE
298 if (!do_d128_to_d64 (-1.1111111111111125dl, -1.111111111111112dd)) FAILURE
299 if (!do_d128_to_d64 (-1.1111111111111135dl, -1.111111111111113dd)) FAILURE
303 printf ("upward: %d fails\n", failcnt);
305 return (void *) (ptrdiff_t) failcnt;
314 pthread_t down, up, tozero, fromzero, nearest;
316 if (pthread_barrier_init (&bar1, NULL, 2) != 0
317 || pthread_barrier_init (&bar2, NULL, 2) != 0
318 || pthread_barrier_init (&bar3, NULL, 2) != 0
319 || pthread_barrier_init (&bar4, NULL, 2) != 0
320 || pthread_barrier_init (&bar5, NULL, 2) != 0)
322 puts ("parent: failed to init barrier");
326 if (pthread_create (&down, NULL, downward, NULL) != 0)
328 puts ("parent: failed to create");
332 if (pthread_create (&nearest, NULL, tonearest, NULL) != 0)
334 puts ("create failed");
338 if (pthread_create (&fromzero, NULL, toneareastfromzero, NULL) != 0)
340 puts ("create failed");
344 if (pthread_create (&up, NULL, upward, NULL) != 0)
346 puts ("create failed");
350 if (pthread_create (&tozero, NULL, towardzero, NULL) != 0)
352 puts ("create failed");
356 err = pthread_barrier_wait (&bar1);
357 if (err != 0 && err != PTHREAD_BARRIER_SERIAL_THREAD)
359 puts ("parent: failed to wait barrier 1");
362 err = pthread_barrier_wait (&bar2);
363 if (err != 0 && err != PTHREAD_BARRIER_SERIAL_THREAD)
365 puts ("parent: failed to wait barrier 2");
368 err = pthread_barrier_wait (&bar3);
369 if (err != 0 && err != PTHREAD_BARRIER_SERIAL_THREAD)
371 puts ("parent: failed to wait barrier 3");
374 err = pthread_barrier_wait (&bar4);
375 if (err != 0 && err != PTHREAD_BARRIER_SERIAL_THREAD)
377 puts ("parent: failed to wait barrier 4");
380 err = pthread_barrier_wait (&bar5);
381 if (err != 0 && err != PTHREAD_BARRIER_SERIAL_THREAD)
383 puts ("parent: failed to wait barrier 5");
387 err = pthread_mutex_lock (&mut1);
389 error (EXIT_FAILURE, err, "parent: lock failed");
390 err = pthread_mutex_lock (&mut2);
392 error (EXIT_FAILURE, err, "parent: lock failed");
393 err = pthread_mutex_lock (&mut3);
395 error (EXIT_FAILURE, err, "parent: lock failed");
396 err = pthread_mutex_lock (&mut4);
398 error (EXIT_FAILURE, err, "parent: lock failed");
399 err = pthread_mutex_lock (&mut5);
401 error (EXIT_FAILURE, err, "parent: lock failed");
403 err = pthread_cond_signal(&cond1);
405 error (EXIT_FAILURE, err, "parent: broadcast failed");
406 err = pthread_cond_signal(&cond2);
408 error (EXIT_FAILURE, err, "parent: broadcast failed");
409 err = pthread_cond_signal(&cond3);
411 error (EXIT_FAILURE, err, "parent: broadcast failed");
412 err = pthread_cond_signal(&cond4);
414 error (EXIT_FAILURE, err, "parent: broadcast failed");
415 err = pthread_cond_signal(&cond5);
417 error (EXIT_FAILURE, err, "parent: broadcast failed");
419 err = pthread_mutex_unlock (&mut1);
422 puts ("parent: failed to unlock");
425 err = pthread_mutex_unlock (&mut2);
428 puts ("parent: failed to unlock");
431 err = pthread_mutex_unlock (&mut3);
434 puts ("parent: failed to unlock");
437 err = pthread_mutex_unlock (&mut4);
440 puts ("parent: failed to unlock");
443 err = pthread_mutex_unlock (&mut5);
446 puts ("parent: failed to unlock");
450 if (pthread_join (down, &ret) != 0)
452 puts ("pthread_join failed");
455 count += (int) (ptrdiff_t) ret;
457 if (pthread_join (up, &ret) != 0)
459 puts ("pthread_join failed");
462 count += (int) (ptrdiff_t) ret;
464 if (pthread_join (tozero, &ret) != 0)
466 puts ("pthread_join failed");
469 count += (int) (ptrdiff_t) ret;
471 if (pthread_join (fromzero, &ret) != 0)
473 puts ("pthread_join failed");
476 count += (int) (ptrdiff_t) ret;
478 if (pthread_join (nearest, &ret) != 0)
480 puts ("pthread_join failed");
483 count += (int) (ptrdiff_t) ret;
488 printf ("Total: %d fails\n", count);