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