1 /* { dg-options "-O0" } */
2 
3 /* N1150 5.2 Conversions among decimal floating types and between
4    decimal floating types and generic floating types.
5    C99 6.3.1.5(3) New.
6 
7    Test various conversions involving decimal floating types. */
8 
9 #ifndef	__STDC_WANT_DEC_FP__
10 #define __STDC_WANT_DEC_FP__ 1
11 #endif
12 
13 #include "dfp-dbg.h"
14 #include <float.h>
15 
16 volatile _Decimal32 d32;
17 volatile _Decimal64 d64;
18 volatile _Decimal128 d128;
19 
20 int
main()21 main ()
22 {
23   /* Conversions to larger types.  */
24   d32 = 123.4df;
25   d64 = d32;
26   if (d64 != 123.4dd)
27     FAILURE
28   d128 = d32;
29   if (d128 != 123.4dl)
30     FAILURE
31   d64 = 345.678dd;
32   d128 = d64;
33   if (d128 != 345.678dl)
34     FAILURE
35 
36   /* Conversions to smaller types for which the value fits.  */
37   d64 = 3456.789dd;
38   d32 = d64;
39   if (d32 != 3456.789df)
40     FAILURE
41   d128 = 123.4567dl;
42   d32 = d128;
43   if (d32 != 123.4567df)
44     FAILURE
45 
46   d128 = 1234567890.123456dl;
47   d64 = d128;
48   if (d64 != 1234567890.123456dd)
49     FAILURE
50 
51   /* Test demotion to non-representable decimal floating type. */
52 
53   /* Assumes a default rounding mode of 'near'.  This uses the rules
54      describe in the 27 July 2005 draft of IEEE 754r, which are much
55      more clear that what's described in draft 5 of N1107.  */
56 
57   /* Rounds to what _Decimal32 can handle.  */
58   d64 = 9.99999949E96DD;
59   d32 = d64;
60   if (d32 != DEC32_MAX)
61     FAILURE
62 
63   /* Rounds to more than _Decimal32 can handle.  */
64   d64 = 9.9999995E96DD;
65   d32 = d64;
66   if (d32 != __builtin_infd32())
67     FAILURE
68 
69   /* Rounds to what _Decimal32 can handle.  */
70   d128 = 9.99999949E96DD;
71   d32 = d128;
72   if (d32 != DEC32_MAX)
73     FAILURE
74 
75   /* Rounds to more than _Decimal32 can handle.  */
76   d128= 9.9999995E96DD;
77   d32 = d128;
78   if (d32 != __builtin_infd32())
79     FAILURE
80 
81   /* Rounds to what _Decimal64 can handle.  */
82   d128 = 9.99999999999999949E384DL;
83   d64 = d128;
84   if (d64 != DEC64_MAX)
85     FAILURE
86 
87   /* Rounds to more than _Decimal64 can handle.  */
88   d128 = 9.9999999999999995E384DL;
89   d64 = d128;
90   if (d64 != __builtin_infd64())
91     FAILURE
92 
93   FINISH
94 }
95