1 /* Basic test of runtime relational comparisons using NaNs and infinities. */
7 #define PASTE2(A,B) A ## B
8 #define PASTE(A,B) PASTE2(A,B)
12 #define FAILURE(OP,KIND) \
13 { printf ("failed at line %d: %s for %s values\n", __LINE__, OP, KIND); \
16 #define FAILURE(OP,KIND) abort ();
20 #error define WIDTH as decimal float size in bytes
24 #define DTYPE _Decimal32
28 #define DTYPE _Decimal64
32 #define DTYPE _Decimal128
36 /* This is for testing the test using a type known to work. */
41 #error invalid width for decimal float type
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
);
50 volatile DTYPE x
, y
, z
, nan
, inf
, m_inf
;
55 nan
= PASTE(__builtin_nan
, SUFFIX2
) ("");
56 inf
= PASTE(__builtin_inf
, SUFFIX2
) ();
57 m_inf
= - PASTE(__builtin_inf
, SUFFIX2
) ();
59 x
= PASTE(__builtin_nan
, SUFFIX2
) ("");
60 y
= PASTE(__builtin_inf
, SUFFIX2
) ();
61 z
= - PASTE(__builtin_inf
, SUFFIX2
) ();
63 /* Less than or equal to with NaN. */
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")
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")
79 /* Less than or equal to with infinities, no NaNs. */
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")
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")
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")
100 /* Less than with NaN. */
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")
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")
116 /* Less than with infinities, no NaNs. */
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")
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")
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")
137 /* Greater than or equal to with NaN. */
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")
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")
153 /* Greater than or equal to with infinities, no NaNs. */
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")
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")
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")
174 /* Greater than with NaN. */
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")
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")
190 /* Greater than with infinities, no NaNs. */
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")
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")
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")
211 /* Equal with NaN. */
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")
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")
227 /* Equal with infinities, no NaNs. */
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")
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")
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")
248 /* Not equal with NaN. */
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")
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")
264 /* Not equal with infinities, no NaNs. */
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")
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")
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")