710538d467bd5827b4a37d4a4d50e565207b5af9
[gcc.git] / gcc / testsuite / gcc.dg / dfp / convert-bfp.c
1 /* N1150 5.2 Conversions among decimal floating types and between
2 decimal floating types and generic floating types.
3 C99 6.3.1.5(4) Conversions, arithmetic operands, real floating types. */
4
5 /* Long double isn't supported yet at runtime, so disable those checks. */
6
7 #include "dfp-dbg.h"
8
9 static int skip_long_double;
10
11 volatile _Decimal32 d32;
12 volatile _Decimal64 d64;
13 volatile _Decimal128 d128;
14 volatile float sf;
15 volatile double df;
16 volatile long double tf;
17
18 int
19 main ()
20 {
21 /* Conversions from decimal float to binary float. */
22
23 if (sizeof (long double) == sizeof (double))
24 skip_long_double = 1;
25
26 /* Conversions from _Decimal32. */
27 d32 = 2.0df;
28 sf = d32;
29 if (sf != 2.0f)
30 FAILURE
31
32 df = d32;
33 if (df != 2.0)
34 FAILURE
35
36 if (skip_long_double == 0)
37 {
38 tf = d32;
39 if (tf != 2.0l)
40 FAILURE
41 }
42
43 /* Conversions from _Decimal64. */
44 d64 = -7.0dd;
45 sf = d64;
46 if (sf != -7.0f)
47 FAILURE
48
49 df = d64;
50 if (df != -7.0)
51 FAILURE
52
53 if (skip_long_double == 0)
54 {
55 tf = d64;
56 if (tf != -7.0l)
57 FAILURE
58 }
59
60 /* Conversions from _Decimal128. */
61 d128 = 30.0dl;
62 sf = d128;
63 if (sf != 30.0f)
64 FAILURE
65
66 df = d128;
67 if (df != 30.0)
68 FAILURE
69
70 df = d128;
71 if (df != 30.0l)
72 FAILURE
73
74 /* Conversions from binary float to decimal float. */
75 sf = 30.0f;
76 d32 = sf;
77 if (d32 != 30.0df)
78 FAILURE
79
80 d64 = sf;
81 if (d64 != 30.0dd)
82 FAILURE
83
84 df = -2.0;
85 d32 = df;
86 if (d32 != -2.0df)
87 FAILURE
88
89 d64 = df;
90 if (d64 != -2.0dd)
91 FAILURE
92
93 d128 = df;
94 if (d128 != -2.0dl)
95 FAILURE
96
97 sf = 30.0f;
98 d128 = sf;
99 if (d128 != 30.0dl)
100 FAILURE
101
102 if (skip_long_double == 0)
103 {
104 tf = -22.0l;
105 d32 = tf;
106 if (d32 != -22.0df)
107 FAILURE
108
109 d64 = tf;
110 if (d64 != -22.0dd)
111 FAILURE
112
113 d128 = tf;
114 if (d128 != -22.0dl)
115 FAILURE
116 }
117
118 /* 2**(-11) = 0.00048828125. */
119 d128 = 0.000488281251dl;
120 sf = d128;
121 if (sf != 0.00048828125f)
122 FAILURE
123 /* 2**(-25) = 0.298023223876953125E-7. */
124 d128 = 2.98023223876953125E-8dl;
125 df = d128;
126 if (df < (2.9802322387695312e-08 - 0.00000000001)
127 || df > (2.9802322387695312e-08 + 0.00000000001))
128 FAILURE
129
130 FINISH
131 }