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) (!__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 
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)); /* 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 
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 }
46 
iunlt(float x,float y,int ok)47 int iunlt (float x, float y, int ok)
48 {
49   TEST (UNLT (x, y));
50   TEST (UNORD (x, y) || (x < y));
51 }
52 
ilt(float x,float y,int ok)53 int 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 
iunle(float x,float y,int ok)62 int iunle (float x, float y, int ok)
63 {
64   TEST (UNLE (x, y));
65   TEST (UNORD (x, y) || (x <= y));
66 }
67 
ile(float x,float y,int ok)68 int 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 
iungt(float x,float y,int ok)77 int iungt (float x, float y, int ok)
78 {
79   TEST (UNGT (x, y));
80   TEST (UNORD (x, y) || (x > y));
81 }
82 
igt(float x,float y,int ok)83 int 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 
iunge(float x,float y,int ok)92 int iunge (float x, float y, int ok)
93 {
94   TEST (UNGE (x, y));
95   TEST (UNORD (x, y) || (x >= y));
96 }
97 
ige(float x,float y,int ok)98 int 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 
107 int
main()108 main ()
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