1 /* { dg-options "-std=gnu99 -D_GNU_SOURCE -pthread" } */
2 /* { dg-do run { target i?86-*-linux* i?86-*-gnu* x86_64-*-linux* } } */
3 /* { dg-require-effective-target error_h } */
6 /* N1150 5.2: Conversions among decimal floating types and between
7 decimal floating types and generic floating types.
10 Perform conversions between DFP types in which the assigned value
11 cannot be represented exactly in the result and must be rounded
12 correctly according to the current rounding mode.
14 Normally this would not be part of compiler testing, but conversions
15 are currently handled in libgcc via decNumber. */
22 #include "dfp-round.h"
24 extern void abort (void);
25 static __thread
int failcnt
= 0;
27 /* Support compiling the test to report individual failures; default is
28 to abort as soon as a check fails. */
31 #define FAILURE { printf ("failed at line %d\n", __LINE__); failcnt++; }
33 #define FAILURE abort ();
36 pthread_mutex_t mut1
= PTHREAD_MUTEX_INITIALIZER
;
37 pthread_mutex_t mut2
= PTHREAD_MUTEX_INITIALIZER
;
38 pthread_mutex_t mut3
= PTHREAD_MUTEX_INITIALIZER
;
39 pthread_mutex_t mut4
= PTHREAD_MUTEX_INITIALIZER
;
40 pthread_mutex_t mut5
= PTHREAD_MUTEX_INITIALIZER
;
41 pthread_cond_t cond1
= PTHREAD_COND_INITIALIZER
;
42 pthread_cond_t cond2
= PTHREAD_COND_INITIALIZER
;
43 pthread_cond_t cond3
= PTHREAD_COND_INITIALIZER
;
44 pthread_cond_t cond4
= PTHREAD_COND_INITIALIZER
;
45 pthread_cond_t cond5
= PTHREAD_COND_INITIALIZER
;
46 pthread_barrier_t bar1
;
47 pthread_barrier_t bar2
;
48 pthread_barrier_t bar3
;
49 pthread_barrier_t bar4
;
50 pthread_barrier_t bar5
;
52 __thread _Decimal32 d32
;
53 __thread _Decimal64 d64
;
54 __thread _Decimal128 d128
;
56 _Decimal32
d64_to_d32 (_Decimal64 d
) { return d
; }
57 _Decimal64
d128_to_d64 (_Decimal128 d
) { return d
; }
58 _Decimal32
d128_to_d32 (_Decimal128 d
) { return d
; }
61 do_d64_to_d32 (_Decimal64 orig
, _Decimal32 exp
)
64 d32
= d64_to_d32 (d64
);
69 do_d128_to_d32 (_Decimal128 orig
, _Decimal32 exp
)
72 d32
= d128_to_d32 (d128
);
77 do_d128_to_d64 (_Decimal128 orig
, _Decimal64 exp
)
80 d64
= d128_to_d64 (d128
);
89 DFP_SETROUND (FE_DEC_DOWNWARD
);
91 err
= pthread_mutex_lock (&mut1
);
93 error (EXIT_FAILURE
, err
, "downward: failed to lock");
95 err
= pthread_barrier_wait (&bar1
);
96 if (err
!= 0 && err
!= PTHREAD_BARRIER_SERIAL_THREAD
)
98 puts ("downward: barrier_wait failed");
102 err
= pthread_cond_wait (&cond1
, &mut1
);
104 error (EXIT_FAILURE
, err
, "downward: failed to wait");
106 err
= pthread_mutex_unlock (&mut1
);
108 error (EXIT_FAILURE
, err
, "downward: failed to unlock");
110 if (!do_d64_to_d32 (1.1111125dd
, 1.111112df
)) FAILURE
111 if (!do_d64_to_d32 (1.1111135dd
, 1.111113df
)) FAILURE
112 if (!do_d64_to_d32 (-1.1111125dd
, -1.111113df
)) FAILURE
113 if (!do_d64_to_d32 (-1.1111135dd
, -1.111114df
)) FAILURE
114 if (!do_d128_to_d32 (1.1111125dl
, 1.111112df
)) FAILURE
115 if (!do_d128_to_d32 (1.1111135dl
, 1.111113df
)) FAILURE
116 if (!do_d128_to_d32 (-1.1111125dl
, -1.111113df
)) FAILURE
117 if (!do_d128_to_d32 (-1.1111135dl
, -1.111114df
)) FAILURE
118 if (!do_d128_to_d64 (1.1111111111111125dl
, 1.111111111111112dd
)) FAILURE
119 if (!do_d128_to_d64 (1.1111111111111135dl
, 1.111111111111113dd
)) FAILURE
120 if (!do_d128_to_d64 (-1.1111111111111125dl
, -1.111111111111113dd
)) FAILURE
121 if (!do_d128_to_d64 (-1.1111111111111135dl
, -1.111111111111114dd
)) FAILURE
125 printf ("downward: %d fails\n", failcnt
);
127 return (void *) (ptrdiff_t) failcnt
;
131 tonearest (void *arg
)
134 DFP_SETROUND (FE_DEC_TONEAREST
);
136 err
= pthread_mutex_lock (&mut2
);
138 error (EXIT_FAILURE
, err
, "tonearest: failed to lock");
140 err
= pthread_barrier_wait (&bar2
);
141 if (err
!= 0 && err
!= PTHREAD_BARRIER_SERIAL_THREAD
)
143 puts ("tonearest: barrier_wait failed");
147 err
= pthread_cond_wait (&cond2
, &mut2
);
149 error (EXIT_FAILURE
, err
, "tonearest: failed to wait");
151 err
= pthread_mutex_unlock (&mut2
);
153 error (EXIT_FAILURE
, err
, "tonearest: failed to unlock");
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_d64_to_d32 (-1.1111125dd
, -1.111112df
)) FAILURE
158 if (!do_d64_to_d32 (-1.1111135dd
, -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_d32 (-1.1111125dl
, -1.111112df
)) FAILURE
162 if (!do_d128_to_d32 (-1.1111135dl
, -1.111114df
)) FAILURE
163 if (!do_d128_to_d64 (1.1111111111111125dl
, 1.111111111111112dd
)) FAILURE
164 if (!do_d128_to_d64 (1.1111111111111135dl
, 1.111111111111114dd
)) FAILURE
165 if (!do_d128_to_d64 (-1.1111111111111125dl
, -1.111111111111112dd
)) FAILURE
166 if (!do_d128_to_d64 (-1.1111111111111135dl
, -1.111111111111114dd
)) FAILURE
170 printf ("tonearest: %d fails\n", failcnt
);
172 return (void *) (ptrdiff_t) failcnt
;
176 toneareastfromzero (void *arg
)
179 DFP_SETROUND (FE_DEC_TONEARESTFROMZERO
);
181 err
= pthread_mutex_lock (&mut3
);
183 error (EXIT_FAILURE
, err
, "toneareastfromzero: failed to lock");
185 err
= pthread_barrier_wait (&bar3
);
186 if (err
!= 0 && err
!= PTHREAD_BARRIER_SERIAL_THREAD
)
188 puts ("toneareastfromzero: barrier_wait failed");
192 err
= pthread_cond_wait (&cond3
, &mut3
);
194 error (EXIT_FAILURE
, err
, "toneareastfromzero: failed to wait");
196 err
= pthread_mutex_unlock (&mut3
);
198 error (EXIT_FAILURE
, err
, "toneareastfromzero: failed to unlock");
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_d64_to_d32 (-1.1111125dd
, -1.111113df
)) FAILURE
203 if (!do_d64_to_d32 (-1.1111135dd
, -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_d32 (-1.1111125dl
, -1.111113df
)) FAILURE
207 if (!do_d128_to_d32 (-1.1111135dl
, -1.111114df
)) FAILURE
208 if (!do_d128_to_d64 (1.1111111111111125dl
, 1.111111111111113dd
)) FAILURE
209 if (!do_d128_to_d64 (1.1111111111111135dl
, 1.111111111111114dd
)) FAILURE
210 if (!do_d128_to_d64 (-1.1111111111111125dl
, -1.111111111111113dd
)) FAILURE
211 if (!do_d128_to_d64 (-1.1111111111111135dl
, -1.111111111111114dd
)) FAILURE
215 printf ("toneareastfromzero: %d fails\n", failcnt
);
217 return (void *) (ptrdiff_t) failcnt
;
221 towardzero (void *arg
)
224 DFP_SETROUND (FE_DEC_TOWARDZERO
);
226 err
= pthread_mutex_lock (&mut4
);
228 error (EXIT_FAILURE
, err
, "towardzero: failed to lock");
230 err
= pthread_barrier_wait (&bar4
);
231 if (err
!= 0 && err
!= PTHREAD_BARRIER_SERIAL_THREAD
)
233 puts ("towardzero: barrier_wait failed");
237 err
= pthread_cond_wait (&cond4
, &mut4
);
239 error (EXIT_FAILURE
, err
, "towardzero: failed to wait");
241 err
= pthread_mutex_unlock (&mut4
);
243 error (EXIT_FAILURE
, err
, "towardzero: failed to unlock");
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_d64_to_d32 (-1.1111125dd
, -1.111112df
)) FAILURE
248 if (!do_d64_to_d32 (-1.1111135dd
, -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_d32 (-1.1111125dl
, -1.111112df
)) FAILURE
252 if (!do_d128_to_d32 (-1.1111135dl
, -1.111113df
)) FAILURE
253 if (!do_d128_to_d64 (1.1111111111111125dl
, 1.111111111111112dd
)) FAILURE
254 if (!do_d128_to_d64 (1.1111111111111135dl
, 1.111111111111113dd
)) FAILURE
255 if (!do_d128_to_d64 (-1.1111111111111125dl
, -1.111111111111112dd
)) FAILURE
256 if (!do_d128_to_d64 (-1.1111111111111135dl
, -1.111111111111113dd
)) FAILURE
260 printf ("towardzero: %d fails\n", failcnt
);
262 return (void *) (ptrdiff_t) failcnt
;
269 DFP_SETROUND (FE_DEC_UPWARD
);
271 err
= pthread_mutex_lock (&mut5
);
273 error (EXIT_FAILURE
, err
, "upward: failed to lock");
275 err
= pthread_barrier_wait (&bar5
);
276 if (err
!= 0 && err
!= PTHREAD_BARRIER_SERIAL_THREAD
)
278 puts ("upward: barrier_wait failed");
282 err
= pthread_cond_wait (&cond5
, &mut5
);
284 error (EXIT_FAILURE
, err
, "upward: failed to wait");
286 err
= pthread_mutex_unlock (&mut5
);
288 error (EXIT_FAILURE
, err
, "upward: failed to unlock");
290 if (!do_d64_to_d32 (1.1111125dd
, 1.111113df
)) FAILURE
291 if (!do_d64_to_d32 (1.1111135dd
, 1.111114df
)) FAILURE
292 if (!do_d64_to_d32 (-1.1111125dd
, -1.111112df
)) FAILURE
293 if (!do_d64_to_d32 (-1.1111135dd
, -1.111113df
)) FAILURE
294 if (!do_d128_to_d32 (1.1111125dl
, 1.111113df
)) FAILURE
295 if (!do_d128_to_d32 (1.1111135dl
, 1.111114df
)) FAILURE
296 if (!do_d128_to_d32 (-1.1111125dl
, -1.111112df
)) FAILURE
297 if (!do_d128_to_d32 (-1.1111135dl
, -1.111113df
)) FAILURE
298 if (!do_d128_to_d64 (1.1111111111111125dl
, 1.111111111111113dd
)) FAILURE
299 if (!do_d128_to_d64 (1.1111111111111135dl
, 1.111111111111114dd
)) FAILURE
300 if (!do_d128_to_d64 (-1.1111111111111125dl
, -1.111111111111112dd
)) FAILURE
301 if (!do_d128_to_d64 (-1.1111111111111135dl
, -1.111111111111113dd
)) FAILURE
305 printf ("upward: %d fails\n", failcnt
);
307 return (void *) (ptrdiff_t) failcnt
;
316 pthread_t down
, up
, tozero
, fromzero
, nearest
;
318 if (pthread_barrier_init (&bar1
, NULL
, 2) != 0
319 || pthread_barrier_init (&bar2
, NULL
, 2) != 0
320 || pthread_barrier_init (&bar3
, NULL
, 2) != 0
321 || pthread_barrier_init (&bar4
, NULL
, 2) != 0
322 || pthread_barrier_init (&bar5
, NULL
, 2) != 0)
324 puts ("parent: failed to init barrier");
328 if (pthread_create (&down
, NULL
, downward
, NULL
) != 0)
330 puts ("parent: failed to create");
334 if (pthread_create (&nearest
, NULL
, tonearest
, NULL
) != 0)
336 puts ("create failed");
340 if (pthread_create (&fromzero
, NULL
, toneareastfromzero
, NULL
) != 0)
342 puts ("create failed");
346 if (pthread_create (&up
, NULL
, upward
, NULL
) != 0)
348 puts ("create failed");
352 if (pthread_create (&tozero
, NULL
, towardzero
, NULL
) != 0)
354 puts ("create failed");
358 err
= pthread_barrier_wait (&bar1
);
359 if (err
!= 0 && err
!= PTHREAD_BARRIER_SERIAL_THREAD
)
361 puts ("parent: failed to wait barrier 1");
364 err
= pthread_barrier_wait (&bar2
);
365 if (err
!= 0 && err
!= PTHREAD_BARRIER_SERIAL_THREAD
)
367 puts ("parent: failed to wait barrier 2");
370 err
= pthread_barrier_wait (&bar3
);
371 if (err
!= 0 && err
!= PTHREAD_BARRIER_SERIAL_THREAD
)
373 puts ("parent: failed to wait barrier 3");
376 err
= pthread_barrier_wait (&bar4
);
377 if (err
!= 0 && err
!= PTHREAD_BARRIER_SERIAL_THREAD
)
379 puts ("parent: failed to wait barrier 4");
382 err
= pthread_barrier_wait (&bar5
);
383 if (err
!= 0 && err
!= PTHREAD_BARRIER_SERIAL_THREAD
)
385 puts ("parent: failed to wait barrier 5");
389 err
= pthread_mutex_lock (&mut1
);
391 error (EXIT_FAILURE
, err
, "parent: lock failed");
392 err
= pthread_mutex_lock (&mut2
);
394 error (EXIT_FAILURE
, err
, "parent: lock failed");
395 err
= pthread_mutex_lock (&mut3
);
397 error (EXIT_FAILURE
, err
, "parent: lock failed");
398 err
= pthread_mutex_lock (&mut4
);
400 error (EXIT_FAILURE
, err
, "parent: lock failed");
401 err
= pthread_mutex_lock (&mut5
);
403 error (EXIT_FAILURE
, err
, "parent: lock failed");
405 err
= pthread_cond_signal(&cond1
);
407 error (EXIT_FAILURE
, err
, "parent: broadcast failed");
408 err
= pthread_cond_signal(&cond2
);
410 error (EXIT_FAILURE
, err
, "parent: broadcast failed");
411 err
= pthread_cond_signal(&cond3
);
413 error (EXIT_FAILURE
, err
, "parent: broadcast failed");
414 err
= pthread_cond_signal(&cond4
);
416 error (EXIT_FAILURE
, err
, "parent: broadcast failed");
417 err
= pthread_cond_signal(&cond5
);
419 error (EXIT_FAILURE
, err
, "parent: broadcast failed");
421 err
= pthread_mutex_unlock (&mut1
);
424 puts ("parent: failed to unlock");
427 err
= pthread_mutex_unlock (&mut2
);
430 puts ("parent: failed to unlock");
433 err
= pthread_mutex_unlock (&mut3
);
436 puts ("parent: failed to unlock");
439 err
= pthread_mutex_unlock (&mut4
);
442 puts ("parent: failed to unlock");
445 err
= pthread_mutex_unlock (&mut5
);
448 puts ("parent: failed to unlock");
452 if (pthread_join (down
, &ret
) != 0)
454 puts ("pthread_join failed");
457 count
+= (int) (ptrdiff_t) ret
;
459 if (pthread_join (up
, &ret
) != 0)
461 puts ("pthread_join failed");
464 count
+= (int) (ptrdiff_t) ret
;
466 if (pthread_join (tozero
, &ret
) != 0)
468 puts ("pthread_join failed");
471 count
+= (int) (ptrdiff_t) ret
;
473 if (pthread_join (fromzero
, &ret
) != 0)
475 puts ("pthread_join failed");
478 count
+= (int) (ptrdiff_t) ret
;
480 if (pthread_join (nearest
, &ret
) != 0)
482 puts ("pthread_join failed");
485 count
+= (int) (ptrdiff_t) ret
;
490 printf ("Total: %d fails\n", count
);