Mercurial > hg > CbC > CbC_gcc
comparison gcc/testsuite/c-c++-common/dfp/pr39902.c @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
68:561a7518be6b | 111:04ced10e8804 |
---|---|
1 /* Check that optimizations like (x * 1) to x, or (x * -1) to -x, | |
2 do not apply to decimal float computations where trailing zeroes | |
3 are significant. */ | |
4 | |
5 #include "dfp-dbg.h" | |
6 | |
7 #define COMPARE32(A,B) \ | |
8 A.i == B.i | |
9 | |
10 #define COMPARE64(A,B) \ | |
11 A.i[0] == B.i[0] && A.i[1] == B.i[1] | |
12 | |
13 #define COMPARE128(A,B) \ | |
14 A.i[0] == B.i[0] && A.i[1] == B.i[1] && A.i[2] == B.i[2] && A.i[3] == B.i[3] | |
15 | |
16 typedef union { | |
17 _Decimal32 d; | |
18 unsigned int i; | |
19 } u32; | |
20 | |
21 typedef union { | |
22 _Decimal64 d; | |
23 unsigned int i[2]; | |
24 } u64; | |
25 | |
26 typedef union { | |
27 _Decimal128 d; | |
28 unsigned int i[4]; | |
29 } u128; | |
30 | |
31 volatile u32 p32_1; | |
32 volatile u32 p32_1_0; | |
33 volatile u32 p32_2_0; | |
34 volatile u32 m32_1; | |
35 volatile u32 m32_1_0; | |
36 volatile u32 m32_2_0; | |
37 volatile u32 a32; | |
38 | |
39 volatile u64 p64_1; | |
40 volatile u64 p64_1_0; | |
41 volatile u64 p64_2_0; | |
42 volatile u64 m64_1; | |
43 volatile u64 m64_1_0; | |
44 volatile u64 m64_2_0; | |
45 volatile u64 a64; | |
46 | |
47 volatile u128 p128_1; | |
48 volatile u128 p128_1_0; | |
49 volatile u128 p128_2_0; | |
50 volatile u128 m128_1; | |
51 volatile u128 m128_1_0; | |
52 volatile u128 m128_2_0; | |
53 volatile u128 a128; | |
54 | |
55 void | |
56 init32 (void) | |
57 { | |
58 p32_1.d = 1.DF; | |
59 p32_1_0.d = 1.0DF; | |
60 p32_2_0.d = 2.0DF; | |
61 m32_1.d = -1.DF; | |
62 m32_1_0.d = -1.0DF; | |
63 m32_2_0.d = -2.0DF; | |
64 } | |
65 | |
66 void | |
67 init64 (void) | |
68 { | |
69 p64_1.d = 1.DD; | |
70 p64_1_0.d = 1.0DD; | |
71 p64_2_0.d = 2.0DD; | |
72 m64_1.d = -1.DD; | |
73 m64_1_0.d = -1.0DD; | |
74 m64_2_0.d = -2.0DD; | |
75 } | |
76 | |
77 void | |
78 init128 (void) | |
79 { | |
80 p128_1.d = 1.DL; | |
81 p128_1_0.d = 1.0DL; | |
82 p128_2_0.d = 2.0DL; | |
83 m128_1.d = -1.DL; | |
84 m128_1_0.d = -1.0DL; | |
85 m128_2_0.d = -2.0DL; | |
86 } | |
87 | |
88 void | |
89 doit32 (void) | |
90 { | |
91 /* Multiplying by a value with no trailing zero should not change the | |
92 quantum exponent. */ | |
93 | |
94 a32.d = p32_2_0.d * p32_1.d; | |
95 if (! (COMPARE32 (a32, p32_2_0))) | |
96 FAILURE | |
97 | |
98 a32.d = p32_2_0.d * 1.DF; | |
99 if (! (COMPARE32 (a32, p32_2_0))) | |
100 FAILURE | |
101 | |
102 a32.d = p32_2_0.d * m32_1.d; | |
103 if (! (COMPARE32 (a32, m32_2_0))) | |
104 FAILURE | |
105 | |
106 a32.d = p32_2_0.d * -1.DF; | |
107 if (! (COMPARE32 (a32, m32_2_0))) | |
108 FAILURE | |
109 | |
110 /* Multiplying by a value with a trailing zero should change the | |
111 quantum exponent. */ | |
112 | |
113 a32.d = p32_2_0.d * p32_1_0.d; | |
114 if (COMPARE32 (a32, p32_2_0)) | |
115 FAILURE | |
116 | |
117 a32.d = p32_2_0.d * 1.0DF; | |
118 if (COMPARE32 (a32, p32_2_0)) | |
119 FAILURE | |
120 | |
121 a32.d = p32_2_0.d * m32_1_0.d; | |
122 if (COMPARE32 (a32, m32_2_0)) | |
123 FAILURE | |
124 | |
125 a32.d = p32_2_0.d * -1.0DF; | |
126 if (COMPARE32 (a32, m32_2_0)) | |
127 FAILURE | |
128 } | |
129 | |
130 void | |
131 doit64 (void) | |
132 { | |
133 /* Multiplying by a value with no trailing zero should not change the | |
134 quantum exponent. */ | |
135 | |
136 a64.d = p64_2_0.d * p64_1.d; | |
137 if (! (COMPARE64 (a64, p64_2_0))) | |
138 FAILURE | |
139 | |
140 a64.d = p64_2_0.d * 1.DD; | |
141 if (! (COMPARE64 (a64, p64_2_0))) | |
142 FAILURE | |
143 | |
144 a64.d = p64_2_0.d * m64_1.d; | |
145 if (! (COMPARE64 (a64, m64_2_0))) | |
146 FAILURE | |
147 | |
148 a64.d = p64_2_0.d * -1.DD; | |
149 if (! (COMPARE64 (a64, m64_2_0))) | |
150 FAILURE | |
151 | |
152 /* Multiplying by a value with a trailing zero should change the | |
153 quantum exponent. */ | |
154 | |
155 a64.d = p64_2_0.d * p64_1_0.d; | |
156 if (COMPARE64 (a64, p64_2_0)) | |
157 FAILURE | |
158 | |
159 a64.d = p64_2_0.d * 1.0DD; | |
160 if (COMPARE64 (a64, p64_2_0)) | |
161 FAILURE | |
162 | |
163 a64.d = p64_2_0.d * m64_1_0.d; | |
164 if (COMPARE64 (a64, m64_2_0)) | |
165 FAILURE | |
166 | |
167 a64.d = p64_2_0.d * -1.0DD; | |
168 if (COMPARE64 (a64, m64_2_0)) | |
169 FAILURE | |
170 } | |
171 | |
172 void | |
173 doit128 (void) | |
174 { | |
175 /* Multiplying by a value with no trailing zero should not change the | |
176 quantum exponent. */ | |
177 | |
178 a128.d = p128_2_0.d * p128_1_0.d; | |
179 if (COMPARE128 (a128, p128_2_0)) | |
180 FAILURE | |
181 | |
182 a128.d = p128_2_0.d * 1.0DL; | |
183 if (COMPARE128 (a128, p128_2_0)) | |
184 FAILURE | |
185 | |
186 a128.d = p128_2_0.d * m128_1_0.d; | |
187 if (COMPARE128 (a128, m128_2_0)) | |
188 FAILURE | |
189 | |
190 a128.d = p128_2_0.d * -1.0DL; | |
191 if (COMPARE128 (a128, m128_2_0)) | |
192 FAILURE | |
193 | |
194 /* Multiplying by a value with a trailing zero should change the | |
195 quantum exponent. */ | |
196 | |
197 a128.d = p128_2_0.d * p128_1.d; | |
198 if (! (COMPARE128 (a128, p128_2_0))) | |
199 FAILURE | |
200 | |
201 a128.d = p128_2_0.d * 1.DL; | |
202 if (! (COMPARE128 (a128, p128_2_0))) | |
203 FAILURE | |
204 | |
205 a128.d = p128_2_0.d * m128_1.d; | |
206 if (! (COMPARE128 (a128, m128_2_0))) | |
207 FAILURE | |
208 | |
209 a128.d = p128_2_0.d * -1.DL; | |
210 if (! (COMPARE128 (a128, m128_2_0))) | |
211 FAILURE | |
212 } | |
213 | |
214 int | |
215 main (void) | |
216 { | |
217 init32 (); | |
218 init64 (); | |
219 init128 (); | |
220 | |
221 doit32 (); | |
222 doit64 (); | |
223 doit128 (); | |
224 | |
225 FINISH | |
226 } |