1 |
686 |
jeremybenn |
/* Basic test of runtime relational comparisons using NaNs and infinities. */
|
2 |
|
|
|
3 |
|
|
#include <stdlib.h>
|
4 |
|
|
#include "dfp-dbg.h"
|
5 |
|
|
|
6 |
|
|
#define PASTE2(A,B) A ## B
|
7 |
|
|
#define PASTE(A,B) PASTE2(A,B)
|
8 |
|
|
|
9 |
|
|
/* Override FAILURE from dfp-dbg.h with one that provides additional info. */
|
10 |
|
|
#undef FAILURE
|
11 |
|
|
#ifdef DBG
|
12 |
|
|
#define FAILURE(OP,KIND) \
|
13 |
|
|
{ printf ("failed at line %d: %s for %s values\n", __LINE__, OP, KIND); \
|
14 |
|
|
failures++; }
|
15 |
|
|
#else
|
16 |
|
|
#define FAILURE(OP,KIND) __builtin_abort ();
|
17 |
|
|
#endif
|
18 |
|
|
|
19 |
|
|
#ifndef WIDTH
|
20 |
|
|
#error define WIDTH as decimal float size in bytes
|
21 |
|
|
#endif
|
22 |
|
|
|
23 |
|
|
#if WIDTH == 32
|
24 |
|
|
#define DTYPE _Decimal32
|
25 |
|
|
#define SUFFIX DF
|
26 |
|
|
#define SUFFIX2 d32
|
27 |
|
|
#elif WIDTH == 64
|
28 |
|
|
#define DTYPE _Decimal64
|
29 |
|
|
#define SUFFIX DD
|
30 |
|
|
#define SUFFIX2 d64
|
31 |
|
|
#elif WIDTH == 128
|
32 |
|
|
#define DTYPE _Decimal128
|
33 |
|
|
#define SUFFIX DL
|
34 |
|
|
#define SUFFIX2 d128
|
35 |
|
|
#elif WIDTH == 0
|
36 |
|
|
/* This is for testing the test using a type known to work. */
|
37 |
|
|
#define DTYPE double
|
38 |
|
|
#define SUFFIX
|
39 |
|
|
#define SUFFIX2
|
40 |
|
|
#else
|
41 |
|
|
#error invalid width for decimal float type
|
42 |
|
|
#endif
|
43 |
|
|
|
44 |
|
|
DTYPE m_two = PASTE(-2.0, SUFFIX);
|
45 |
|
|
DTYPE m_one = PASTE(-1.0, SUFFIX);
|
46 |
|
|
DTYPE zero = PASTE(0.0, SUFFIX);
|
47 |
|
|
DTYPE one = PASTE(1.0, SUFFIX);
|
48 |
|
|
DTYPE two = PASTE(2.0, SUFFIX);
|
49 |
|
|
|
50 |
|
|
volatile DTYPE x, y, z, _nan, inf, m_inf;
|
51 |
|
|
|
52 |
|
|
void
|
53 |
|
|
test_compares (void)
|
54 |
|
|
{
|
55 |
|
|
_nan = PASTE(__builtin_nan, SUFFIX2) ("");
|
56 |
|
|
inf = PASTE(__builtin_inf, SUFFIX2) ();
|
57 |
|
|
m_inf = - PASTE(__builtin_inf, SUFFIX2) ();
|
58 |
|
|
|
59 |
|
|
x = PASTE(__builtin_nan, SUFFIX2) ("");
|
60 |
|
|
y = PASTE(__builtin_inf, SUFFIX2) ();
|
61 |
|
|
z = - PASTE(__builtin_inf, SUFFIX2) ();
|
62 |
|
|
|
63 |
|
|
/* Less than or equal to with NaN. */
|
64 |
|
|
|
65 |
|
|
if (x <= two) FAILURE ("<=", "NaN")
|
66 |
|
|
if (x <= zero) FAILURE ("<=", "NaN")
|
67 |
|
|
if (x <= m_one) FAILURE ("<=", "NaN")
|
68 |
|
|
if (x <= _nan) FAILURE ("<=", "NaN")
|
69 |
|
|
if (x <= inf) FAILURE ("<=", "NaN")
|
70 |
|
|
if (x <= m_inf) FAILURE ("<=", "NaN")
|
71 |
|
|
|
72 |
|
|
if (two <= x) FAILURE ("<=", "NaN")
|
73 |
|
|
if (zero <= x) FAILURE ("<=", "NaN")
|
74 |
|
|
if (m_one <= x) FAILURE ("<=", "NaN")
|
75 |
|
|
if (_nan <= x) FAILURE ("<=", "NaN")
|
76 |
|
|
if (inf <= x) FAILURE ("<=", "NaN")
|
77 |
|
|
if (m_inf <= x) FAILURE ("<=", "NaN")
|
78 |
|
|
|
79 |
|
|
/* Less than or equal to with infinities, no NaNs. */
|
80 |
|
|
|
81 |
|
|
if (y <= two) FAILURE ("<=", "inf")
|
82 |
|
|
if (y <= zero) FAILURE ("<=", "inf")
|
83 |
|
|
if (y <= m_one) FAILURE ("<=", "inf")
|
84 |
|
|
if (!(two <= y)) FAILURE ("<=", "inf")
|
85 |
|
|
if (!(zero <= y)) FAILURE ("<=", "inf")
|
86 |
|
|
if (!(m_one <= y)) FAILURE ("<=", "inf")
|
87 |
|
|
|
88 |
|
|
if (!(z <= two)) FAILURE ("<=", "-inf")
|
89 |
|
|
if (!(z <= zero)) FAILURE ("<=", "-inf")
|
90 |
|
|
if (!(z <= m_one)) FAILURE ("<=", "-inf")
|
91 |
|
|
if (two <= z) FAILURE ("<=", "-inf")
|
92 |
|
|
if (zero <= z) FAILURE ("<=", "-inf")
|
93 |
|
|
if (m_one <= z) FAILURE ("<=", "-inf")
|
94 |
|
|
|
95 |
|
|
if (!(y <= inf)) FAILURE ("<=", "inf")
|
96 |
|
|
if (y <= m_inf) FAILURE ("<=", "inf")
|
97 |
|
|
if (!(z <= inf)) FAILURE ("<=", "inf")
|
98 |
|
|
if (!(z <= m_inf)) FAILURE ("<=", "inf")
|
99 |
|
|
|
100 |
|
|
/* Less than with NaN. */
|
101 |
|
|
|
102 |
|
|
if (x < two) FAILURE ("<", "NaN")
|
103 |
|
|
if (x < zero) FAILURE ("<", "NaN")
|
104 |
|
|
if (x < m_one) FAILURE ("<", "NaN")
|
105 |
|
|
if (x < _nan) FAILURE ("<", "NaN")
|
106 |
|
|
if (x < inf) FAILURE ("<", "NaN")
|
107 |
|
|
if (x < m_inf) FAILURE ("<", "NaN")
|
108 |
|
|
|
109 |
|
|
if (two < x) FAILURE ("<", "NaN")
|
110 |
|
|
if (zero < x) FAILURE ("<", "NaN")
|
111 |
|
|
if (m_one < x) FAILURE ("<", "NaN")
|
112 |
|
|
if (_nan < x) FAILURE ("<", "NaN")
|
113 |
|
|
if (inf < x) FAILURE ("<", "NaN")
|
114 |
|
|
if (m_inf < x) FAILURE ("<", "NaN")
|
115 |
|
|
|
116 |
|
|
/* Less than with infinities, no NaNs. */
|
117 |
|
|
|
118 |
|
|
if (y < two) FAILURE ("<", "inf")
|
119 |
|
|
if (y < zero) FAILURE ("<", "inf")
|
120 |
|
|
if (y < m_one) FAILURE ("<", "inf")
|
121 |
|
|
if (!(two < y)) FAILURE ("<", "inf")
|
122 |
|
|
if (!(zero < y)) FAILURE ("<", "inf")
|
123 |
|
|
if (!(m_one < y)) FAILURE ("<", "inf")
|
124 |
|
|
|
125 |
|
|
if (!(z < two)) FAILURE ("<", "-inf")
|
126 |
|
|
if (!(z < zero)) FAILURE ("<", "-inf")
|
127 |
|
|
if (!(z < m_one)) FAILURE ("<", "-inf")
|
128 |
|
|
if (two < z) FAILURE ("<", "-inf")
|
129 |
|
|
if (zero < z) FAILURE ("<", "-inf")
|
130 |
|
|
if (m_one < z) FAILURE ("<", "-inf")
|
131 |
|
|
|
132 |
|
|
if (y < inf) FAILURE ("<=", "inf")
|
133 |
|
|
if (y < m_inf) FAILURE ("<=", "inf")
|
134 |
|
|
if (!(z < inf)) FAILURE ("<=", "inf")
|
135 |
|
|
if (z < m_inf) FAILURE ("<=", "inf")
|
136 |
|
|
|
137 |
|
|
/* Greater than or equal to with NaN. */
|
138 |
|
|
|
139 |
|
|
if (x >= two) FAILURE (">=", "NaN")
|
140 |
|
|
if (x >= zero) FAILURE (">=", "NaN")
|
141 |
|
|
if (x >= m_one) FAILURE (">=", "NaN")
|
142 |
|
|
if (x >= _nan) FAILURE (">=", "NaN")
|
143 |
|
|
if (x >= inf) FAILURE (">=", "NaN")
|
144 |
|
|
if (x >= m_inf) FAILURE (">=", "NaN")
|
145 |
|
|
|
146 |
|
|
if (two >= x) FAILURE (">=", "NaN")
|
147 |
|
|
if (zero >= x) FAILURE (">=", "NaN")
|
148 |
|
|
if (m_one >= x) FAILURE (">=", "NaN")
|
149 |
|
|
if (_nan >= x) FAILURE (">=", "NaN")
|
150 |
|
|
if (inf >= x) FAILURE (">=", "NaN")
|
151 |
|
|
if (m_inf >= x) FAILURE (">=", "NaN")
|
152 |
|
|
|
153 |
|
|
/* Greater than or equal to with infinities, no NaNs. */
|
154 |
|
|
|
155 |
|
|
if (!(y >= two)) FAILURE (">=", "inf")
|
156 |
|
|
if (!(y >= zero)) FAILURE (">=", "inf")
|
157 |
|
|
if (!(y >= m_one)) FAILURE (">=", "inf")
|
158 |
|
|
if (two >= y) FAILURE (">=", "inf")
|
159 |
|
|
if (zero >= y) FAILURE (">=", "inf")
|
160 |
|
|
if (m_one >= y) FAILURE (">=", "inf")
|
161 |
|
|
|
162 |
|
|
if (z >= two) FAILURE (">=", "-inf")
|
163 |
|
|
if (z >= zero) FAILURE (">=", "-inf")
|
164 |
|
|
if (z >= m_one) FAILURE (">=", "-inf")
|
165 |
|
|
if (!(two >= z)) FAILURE (">=", "-inf")
|
166 |
|
|
if (!(zero >= z)) FAILURE (">=", "-inf")
|
167 |
|
|
if (!(m_one >= z)) FAILURE (">=", "-inf")
|
168 |
|
|
|
169 |
|
|
if (!(y >= inf)) FAILURE ("<=", "inf")
|
170 |
|
|
if (!(y >= m_inf)) FAILURE ("<=", "inf")
|
171 |
|
|
if (z >= inf) FAILURE ("<=", "inf")
|
172 |
|
|
if (!(z >= m_inf)) FAILURE ("<=", "inf")
|
173 |
|
|
|
174 |
|
|
/* Greater than with NaN. */
|
175 |
|
|
|
176 |
|
|
if (x > two) FAILURE (">", "NaN")
|
177 |
|
|
if (x > zero) FAILURE (">", "NaN")
|
178 |
|
|
if (x > m_one) FAILURE (">", "NaN")
|
179 |
|
|
if (x > _nan) FAILURE (">", "NaN")
|
180 |
|
|
if (x > inf) FAILURE (">", "NaN")
|
181 |
|
|
if (x > m_inf) FAILURE (">", "NaN")
|
182 |
|
|
|
183 |
|
|
if (two > x) FAILURE (">", "NaN")
|
184 |
|
|
if (zero > x) FAILURE (">", "NaN")
|
185 |
|
|
if (m_one > x) FAILURE (">", "NaN")
|
186 |
|
|
if (_nan > x) FAILURE (">", "NaN")
|
187 |
|
|
if (inf > x) FAILURE (">", "NaN")
|
188 |
|
|
if (m_inf > x) FAILURE (">", "NaN")
|
189 |
|
|
|
190 |
|
|
/* Greater than with infinities, no NaNs. */
|
191 |
|
|
|
192 |
|
|
if (!(y > two)) FAILURE (">", "inf")
|
193 |
|
|
if (!(y > zero)) FAILURE (">", "inf")
|
194 |
|
|
if (!(y > m_one)) FAILURE (">", "inf")
|
195 |
|
|
if (two > y) FAILURE (">", "inf")
|
196 |
|
|
if (zero > y) FAILURE (">", "inf")
|
197 |
|
|
if (m_one > y) FAILURE (">", "inf")
|
198 |
|
|
|
199 |
|
|
if (z > two) FAILURE (">", "-inf")
|
200 |
|
|
if (z > zero) FAILURE (">", "-inf")
|
201 |
|
|
if (z > m_one) FAILURE (">", "-inf")
|
202 |
|
|
if (!(two > z)) FAILURE (">", "-inf")
|
203 |
|
|
if (!(zero > z)) FAILURE (">", "-inf")
|
204 |
|
|
if (!(m_one > z)) FAILURE (">", "-inf")
|
205 |
|
|
|
206 |
|
|
if (y > inf) FAILURE (">", "inf")
|
207 |
|
|
if (!(y > m_inf)) FAILURE (">", "inf")
|
208 |
|
|
if (z > inf) FAILURE (">", "inf")
|
209 |
|
|
if (z > m_inf) FAILURE (">", "inf")
|
210 |
|
|
|
211 |
|
|
/* Equal with NaN. */
|
212 |
|
|
|
213 |
|
|
if (x == two) FAILURE ("==", "NaN")
|
214 |
|
|
if (x == zero) FAILURE ("==", "NaN")
|
215 |
|
|
if (x == m_one) FAILURE ("==", "NaN")
|
216 |
|
|
if (x == _nan) FAILURE ("==", "NaN")
|
217 |
|
|
if (x == inf) FAILURE ("==", "NaN")
|
218 |
|
|
if (x == m_inf) FAILURE ("==", "NaN")
|
219 |
|
|
|
220 |
|
|
if (two == x) FAILURE ("==", "NaN")
|
221 |
|
|
if (zero == x) FAILURE ("==", "NaN")
|
222 |
|
|
if (m_one == x) FAILURE ("==", "NaN")
|
223 |
|
|
if (_nan == x) FAILURE ("==", "NaN")
|
224 |
|
|
if (inf == x) FAILURE ("==", "NaN")
|
225 |
|
|
if (m_inf == x) FAILURE ("==", "NaN")
|
226 |
|
|
|
227 |
|
|
/* Equal with infinities, no NaNs. */
|
228 |
|
|
|
229 |
|
|
if (y == two) FAILURE ("==", "inf")
|
230 |
|
|
if (y == zero) FAILURE ("==", "inf")
|
231 |
|
|
if (y == m_one) FAILURE ("==", "inf")
|
232 |
|
|
if (two == y) FAILURE ("==", "inf")
|
233 |
|
|
if (zero == y) FAILURE ("==", "inf")
|
234 |
|
|
if (m_one == y) FAILURE ("==", "inf")
|
235 |
|
|
|
236 |
|
|
if (z == two) FAILURE ("==", "-inf")
|
237 |
|
|
if (z == zero) FAILURE ("==", "-inf")
|
238 |
|
|
if (z == m_one) FAILURE ("==", "-inf")
|
239 |
|
|
if (two == z) FAILURE ("==", "-inf")
|
240 |
|
|
if (zero == z) FAILURE ("==", "-inf")
|
241 |
|
|
if (m_one == z) FAILURE ("==", "-inf")
|
242 |
|
|
|
243 |
|
|
if (!(y == inf)) FAILURE ("==", "inf")
|
244 |
|
|
if (y == m_inf) FAILURE ("==", "inf")
|
245 |
|
|
if (z == inf) FAILURE ("==", "inf")
|
246 |
|
|
if (!(z == m_inf)) FAILURE ("==", "inf")
|
247 |
|
|
|
248 |
|
|
/* Not equal with NaN. */
|
249 |
|
|
|
250 |
|
|
if (!(x != two)) FAILURE ("!=", "NaN")
|
251 |
|
|
if (!(x != zero)) FAILURE ("!=", "NaN")
|
252 |
|
|
if (!(x != m_one)) FAILURE ("!=", "NaN")
|
253 |
|
|
if (!(x != _nan)) FAILURE ("!=", "NaN")
|
254 |
|
|
if (!(x != inf)) FAILURE ("!=", "NaN")
|
255 |
|
|
if (!(x != m_inf)) FAILURE ("!=", "NaN")
|
256 |
|
|
|
257 |
|
|
if (!(two != x)) FAILURE ("!=", "NaN")
|
258 |
|
|
if (!(zero != x)) FAILURE ("!=", "NaN")
|
259 |
|
|
if (!(m_one != x)) FAILURE ("!=", "NaN")
|
260 |
|
|
if (!(_nan != x)) FAILURE ("!=", "NaN")
|
261 |
|
|
if (!(inf != x)) FAILURE ("!=", "NaN")
|
262 |
|
|
if (!(m_inf != x)) FAILURE ("!=", "NaN")
|
263 |
|
|
|
264 |
|
|
/* Not equal with infinities, no NaNs. */
|
265 |
|
|
|
266 |
|
|
if (!(y != two)) FAILURE ("!=", "inf")
|
267 |
|
|
if (!(y != zero)) FAILURE ("!=", "inf")
|
268 |
|
|
if (!(y != m_one)) FAILURE ("!=", "inf")
|
269 |
|
|
if (!(two != y)) FAILURE ("!=", "inf")
|
270 |
|
|
if (!(zero != y)) FAILURE ("!=", "inf")
|
271 |
|
|
if (!(m_one != y)) FAILURE ("!=", "inf")
|
272 |
|
|
|
273 |
|
|
if (!(z != two)) FAILURE ("!=", "-inf")
|
274 |
|
|
if (!(z != zero)) FAILURE ("!=", "-inf")
|
275 |
|
|
if (!(z != m_one)) FAILURE ("!=", "-inf")
|
276 |
|
|
if (!(two != z)) FAILURE ("!=", "-inf")
|
277 |
|
|
if (!(zero != z)) FAILURE ("!=", "-inf")
|
278 |
|
|
if (!(m_one != z)) FAILURE ("!=", "-inf")
|
279 |
|
|
|
280 |
|
|
if (y != inf) FAILURE ("!=", "inf")
|
281 |
|
|
if (!(y != m_inf)) FAILURE ("!=", "inf")
|
282 |
|
|
if (!(z != inf)) FAILURE ("!=", "inf")
|
283 |
|
|
if (z != m_inf) FAILURE ("!=", "inf")
|
284 |
|
|
}
|