1/* 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
44DTYPE m_two = PASTE(-2.0, SUFFIX);
45DTYPE m_one = PASTE(-1.0, SUFFIX);
46DTYPE zero  = PASTE(0.0, SUFFIX);
47DTYPE one   = PASTE(1.0, SUFFIX);
48DTYPE two   = PASTE(2.0, SUFFIX);
49
50volatile DTYPE x, y, z, _nan, inf, m_inf;
51
52void
53test_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}
285