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 }