1/* Copyright (C) 2004 Free Software Foundation.
2
3   Test for correctness of composite floating-point comparisons.
4
5   Written by Paolo Bonzini, 26th May 2004.  */
6
7extern void abort (void);
8
9#define TEST(c) if ((c) != ok) abort ();
10#define ORD(a, b) (!__builtin_isunordered ((a), (b)))
11#define UNORD(a, b) (__builtin_isunordered ((a), (b)))
12#define UNEQ(a, b) (__builtin_isunordered ((a), (b)) || ((a) == (b)))
13#define UNLT(a, b) (__builtin_isunordered ((a), (b)) || ((a) < (b)))
14#define UNLE(a, b) (__builtin_isunordered ((a), (b)) || ((a) <= (b)))
15#define UNGT(a, b) (__builtin_isunordered ((a), (b)) || ((a) > (b)))
16#define UNGE(a, b) (__builtin_isunordered ((a), (b)) || ((a) >= (b)))
17#define LTGT(a, b) (__builtin_islessgreater ((a), (b)))
18
19float pinf;
20float ninf;
21float NaN;
22
23int iuneq (float x, float y, int ok)
24{
25  TEST (UNEQ (x, y));
26  TEST (!LTGT (x, y));
27  TEST (UNLE (x, y) && UNGE (x,y));
28}
29
30int ieq (float x, float y, int ok)
31{
32  TEST (ORD (x, y) && UNEQ (x, y));
33}
34
35int iltgt (float x, float y, int ok)
36{
37  TEST (!UNEQ (x, y)); /* Not optimizable. */
38  TEST (LTGT (x, y)); /* Same, __builtin_islessgreater does not trap. */
39  TEST (ORD (x, y) && (UNLT (x, y) || UNGT (x,y)));
40}
41
42int ine (float x, float y, int ok)
43{
44  TEST (UNLT (x, y) || UNGT (x, y));
45}
46
47int iunlt (float x, float y, int ok)
48{
49  TEST (UNLT (x, y));
50  TEST (UNORD (x, y) || (x < y));
51}
52
53int ilt (float x, float y, int ok)
54{
55  TEST (ORD (x, y) && UNLT (x, y)); /* Not optimized */
56  TEST ((x <= y) && (x != y));
57  TEST ((x <= y) && (y != x));
58  TEST ((x != y) && (x <= y)); /* Not optimized */
59  TEST ((y != x) && (x <= y)); /* Not optimized */
60}
61
62int iunle (float x, float y, int ok)
63{
64  TEST (UNLE (x, y));
65  TEST (UNORD (x, y) || (x <= y));
66}
67
68int ile (float x, float y, int ok)
69{
70  TEST (ORD (x, y) && UNLE (x, y)); /* Not optimized */
71  TEST ((x < y) || (x == y));
72  TEST ((y > x) || (x == y));
73  TEST ((x == y) || (x < y)); /* Not optimized */
74  TEST ((y == x) || (x < y)); /* Not optimized */
75}
76
77int iungt (float x, float y, int ok)
78{
79  TEST (UNGT (x, y));
80  TEST (UNORD (x, y) || (x > y));
81}
82
83int igt (float x, float y, int ok)
84{
85  TEST (ORD (x, y) && UNGT (x, y)); /* Not optimized */
86  TEST ((x >= y) && (x != y));
87  TEST ((x >= y) && (y != x));
88  TEST ((x != y) && (x >= y)); /* Not optimized */
89  TEST ((y != x) && (x >= y)); /* Not optimized */
90}
91
92int iunge (float x, float y, int ok)
93{
94  TEST (UNGE (x, y));
95  TEST (UNORD (x, y) || (x >= y));
96}
97
98int ige (float x, float y, int ok)
99{
100  TEST (ORD (x, y) && UNGE (x, y)); /* Not optimized */
101  TEST ((x > y) || (x == y));
102  TEST ((y < x) || (x == y));
103  TEST ((x == y) || (x > y)); /* Not optimized */
104  TEST ((y == x) || (x > y)); /* Not optimized */
105}
106
107int
108main ()
109{
110  pinf = __builtin_inf ();
111  ninf = -__builtin_inf ();
112  NaN = __builtin_nan ("");
113
114  iuneq (ninf, pinf, 0);
115  iuneq (NaN, NaN, 1);
116  iuneq (pinf, ninf, 0);
117  iuneq (1, 4, 0);
118  iuneq (3, 3, 1);
119  iuneq (5, 2, 0);
120
121  ieq (1, 4, 0);
122  ieq (3, 3, 1);
123  ieq (5, 2, 0);
124
125  iltgt (ninf, pinf, 1);
126  iltgt (NaN, NaN, 0);
127  iltgt (pinf, ninf, 1);
128  iltgt (1, 4, 1);
129  iltgt (3, 3, 0);
130  iltgt (5, 2, 1);
131
132  ine (1, 4, 1);
133  ine (3, 3, 0);
134  ine (5, 2, 1);
135
136  iunlt (NaN, ninf, 1);
137  iunlt (pinf, NaN, 1);
138  iunlt (pinf, ninf, 0);
139  iunlt (pinf, pinf, 0);
140  iunlt (ninf, ninf, 0);
141  iunlt (1, 4, 1);
142  iunlt (3, 3, 0);
143  iunlt (5, 2, 0);
144
145  ilt (1, 4, 1);
146  ilt (3, 3, 0);
147  ilt (5, 2, 0);
148
149  iunle (NaN, ninf, 1);
150  iunle (pinf, NaN, 1);
151  iunle (pinf, ninf, 0);
152  iunle (pinf, pinf, 1);
153  iunle (ninf, ninf, 1);
154  iunle (1, 4, 1);
155  iunle (3, 3, 1);
156  iunle (5, 2, 0);
157
158  ile (1, 4, 1);
159  ile (3, 3, 1);
160  ile (5, 2, 0);
161
162  iungt (NaN, ninf, 1);
163  iungt (pinf, NaN, 1);
164  iungt (pinf, ninf, 1);
165  iungt (pinf, pinf, 0);
166  iungt (ninf, ninf, 0);
167  iungt (1, 4, 0);
168  iungt (3, 3, 0);
169  iungt (5, 2, 1);
170
171  igt (1, 4, 0);
172  igt (3, 3, 0);
173  igt (5, 2, 1);
174
175  iunge (NaN, ninf, 1);
176  iunge (pinf, NaN, 1);
177  iunge (ninf, pinf, 0);
178  iunge (pinf, pinf, 1);
179  iunge (ninf, ninf, 1);
180  iunge (1, 4, 0);
181  iunge (3, 3, 1);
182  iunge (5, 2, 1);
183
184  ige (1, 4, 0);
185  ige (3, 3, 1);
186  ige (5, 2, 1);
187
188  return 0;
189}
190