OSDN Git Service

1bd77e521563127ad34fa2dc238d969539650e1f
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.dg / dfp / compare-special.h
1 /* Basic test of runtime relational comparisons using NaNs and infinities.  */
2
3 #include <stdlib.h>
4
5 static int failcnt;
6
7 #define PASTE2(A,B) A ## B
8 #define PASTE(A,B) PASTE2(A,B)
9
10 #ifdef DBG
11 #include <stdio.h>
12 #define FAILURE(OP,KIND) \
13   { printf ("failed at line %d: %s for %s values\n", __LINE__, OP, KIND); \
14     failcnt++; }
15 #else
16 #define FAILURE(OP,KIND) 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
285   if (failcnt)
286     abort ();
287 }