fp-test.cc revision 1.1.1.1 1 1.1 mrg /* fp-test.cc - Check that all floating-point operations are available.
2 1.1 mrg Copyright (C) 1995-2022 Free Software Foundation, Inc.
3 1.1 mrg Contributed by Ronald F. Guilmette <rfg (at) monkeys.com>.
4 1.1 mrg
5 1.1 mrg This file is part of GCC.
6 1.1 mrg
7 1.1 mrg GCC is free software; you can redistribute it and/or modify it
8 1.1 mrg under the terms of the GNU General Public License as published by
9 1.1 mrg the Free Software Foundation; either version 3, or (at your option)
10 1.1 mrg any later version.
11 1.1 mrg
12 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT
13 1.1 mrg ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 1.1 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 1.1 mrg License for more details.
16 1.1 mrg
17 1.1 mrg You should have received a copy of the GNU General Public License
18 1.1 mrg along with GCC; see the file COPYING3. If not see
19 1.1 mrg <http://www.gnu.org/licenses/>. */
20 1.1 mrg
21 1.1 mrg /* This is a trivial test program which may be useful to people who are
22 1.1 mrg porting the GCC or G++ compilers to a new system. The intent here is
23 1.1 mrg merely to check that all floating-point operations have been provided
24 1.1 mrg by the port. (Note that I say ``provided'' rather than ``implemented''.)
25 1.1 mrg
26 1.1 mrg To use this file, simply compile it (with GCC or G++) and then try to
27 1.1 mrg link it in the normal way (also using GCC or G++ respectively). If
28 1.1 mrg all of the floating -point operations (including conversions) have
29 1.1 mrg been provided, then this file will link without incident. If however
30 1.1 mrg one or more of the primitive floating-point operations have not been
31 1.1 mrg properly provided, you will get link-time errors indicating which
32 1.1 mrg floating-point operations are unavailable.
33 1.1 mrg
34 1.1 mrg This file will typically be used when porting the GNU compilers to
35 1.1 mrg some system which lacks floating-point hardware, and for which
36 1.1 mrg software emulation routines (for FP ops) are needed in order to
37 1.1 mrg complete the port. */
38 1.1 mrg
39 1.1 mrg #if 0
40 1.1 mrg #include <math.h>
41 1.1 mrg #endif
42 1.1 mrg
43 1.1 mrg extern double acos (double);
44 1.1 mrg extern double asin (double);
45 1.1 mrg extern double atan (double);
46 1.1 mrg extern double atan2 (double, double);
47 1.1 mrg extern double cos (double);
48 1.1 mrg extern double sin (double);
49 1.1 mrg extern double tan (double);
50 1.1 mrg extern double cosh (double);
51 1.1 mrg extern double sinh (double);
52 1.1 mrg extern double tanh (double);
53 1.1 mrg extern double exp (double);
54 1.1 mrg extern double frexp (double, int *);
55 1.1 mrg extern double ldexp (double, int);
56 1.1 mrg extern double log (double);
57 1.1 mrg extern double log10 (double);
58 1.1 mrg extern double modf (double, double *);
59 1.1 mrg extern double pow (double, double);
60 1.1 mrg extern double sqrt (double);
61 1.1 mrg extern double ceil (double);
62 1.1 mrg extern double fabs (double);
63 1.1 mrg extern double floor (double);
64 1.1 mrg extern double fmod (double, double);
65 1.1 mrg
66 1.1 mrg int i1, i2 = 2;
67 1.1 mrg
68 1.1 mrg volatile signed char sc;
69 1.1 mrg volatile unsigned char uc;
70 1.1 mrg
71 1.1 mrg volatile signed short ss;
72 1.1 mrg volatile unsigned short us;
73 1.1 mrg
74 1.1 mrg volatile signed int si;
75 1.1 mrg volatile unsigned int ui;
76 1.1 mrg
77 1.1 mrg volatile signed long sl;
78 1.1 mrg volatile unsigned long ul;
79 1.1 mrg
80 1.1 mrg volatile float f1 = 1.0, f2 = 1.0, f3 = 1.0;
81 1.1 mrg volatile double d1 = 1.0, d2 = 1.0, d3 = 1.0;
82 1.1 mrg volatile long double D1 = 1.0, D2 = 1.0, D3 = 1.0;
83 1.1 mrg
84 1.1 mrg int
85 1.1 mrg main (void)
86 1.1 mrg {
87 1.1 mrg /* TYPE: float */
88 1.1 mrg
89 1.1 mrg f1 = -f2;
90 1.1 mrg f1 = f2 + f3;
91 1.1 mrg f1 = f2 - f3;
92 1.1 mrg f1 = f2 * f3;
93 1.1 mrg f1 = f2 / f3;
94 1.1 mrg f1 += f2;
95 1.1 mrg f1 -= f2;
96 1.1 mrg f1 *= f2;
97 1.1 mrg f1 /= f2;
98 1.1 mrg
99 1.1 mrg si = f1 == f2;
100 1.1 mrg si = f1 != f2;
101 1.1 mrg si = f1 > f2;
102 1.1 mrg si = f1 < f2;
103 1.1 mrg si = f1 >= f2;
104 1.1 mrg si = f1 <= f2;
105 1.1 mrg
106 1.1 mrg si = __builtin_isgreater (f1, f2);
107 1.1 mrg si = __builtin_isgreaterequal (f1, f2);
108 1.1 mrg si = __builtin_isless (f1, f2);
109 1.1 mrg si = __builtin_islessequal (f1, f2);
110 1.1 mrg si = __builtin_islessgreater (f1, f2);
111 1.1 mrg si = __builtin_isunordered (f1, f2);
112 1.1 mrg
113 1.1 mrg sc = f1;
114 1.1 mrg uc = f1;
115 1.1 mrg ss = f1;
116 1.1 mrg us = f1;
117 1.1 mrg si = f1;
118 1.1 mrg ui = f1;
119 1.1 mrg sl = f1;
120 1.1 mrg ul = f1;
121 1.1 mrg d1 = f1;
122 1.1 mrg D1 = f1;
123 1.1 mrg
124 1.1 mrg f1 = sc;
125 1.1 mrg f1 = uc;
126 1.1 mrg f1 = ss;
127 1.1 mrg f1 = us;
128 1.1 mrg f1 = si;
129 1.1 mrg f1 = ui;
130 1.1 mrg f1 = sl;
131 1.1 mrg f1 = ul;
132 1.1 mrg f1 = d1;
133 1.1 mrg f1 = D1;
134 1.1 mrg
135 1.1 mrg d1 = -d2;
136 1.1 mrg d1 = d2 + d3;
137 1.1 mrg d1 = d2 - d3;
138 1.1 mrg d1 = d2 * d3;
139 1.1 mrg d1 = d2 / d3;
140 1.1 mrg d1 += d2;
141 1.1 mrg d1 -= d2;
142 1.1 mrg d1 *= d2;
143 1.1 mrg d1 /= d2;
144 1.1 mrg
145 1.1 mrg si = d1 == d2;
146 1.1 mrg si = d1 != d2;
147 1.1 mrg si = d1 > d2;
148 1.1 mrg si = d1 < d2;
149 1.1 mrg si = d1 >= d2;
150 1.1 mrg si = d1 <= d2;
151 1.1 mrg
152 1.1 mrg si = __builtin_isgreater (d1, d2);
153 1.1 mrg si = __builtin_isgreaterequal (d1, d2);
154 1.1 mrg si = __builtin_isless (d1, d2);
155 1.1 mrg si = __builtin_islessequal (d1, d2);
156 1.1 mrg si = __builtin_islessgreater (d1, d2);
157 1.1 mrg si = __builtin_isunordered (d1, d2);
158 1.1 mrg
159 1.1 mrg sc = d1;
160 1.1 mrg uc = d1;
161 1.1 mrg ss = d1;
162 1.1 mrg us = d1;
163 1.1 mrg si = d1;
164 1.1 mrg ui = d1;
165 1.1 mrg sl = d1;
166 1.1 mrg ul = d1;
167 1.1 mrg f1 = d1;
168 1.1 mrg D1 = d1;
169 1.1 mrg
170 1.1 mrg d1 = sc;
171 1.1 mrg d1 = uc;
172 1.1 mrg d1 = ss;
173 1.1 mrg d1 = us;
174 1.1 mrg d1 = si;
175 1.1 mrg d1 = ui;
176 1.1 mrg d1 = sl;
177 1.1 mrg d1 = ul;
178 1.1 mrg d1 = f1;
179 1.1 mrg d1 = D1;
180 1.1 mrg
181 1.1 mrg D1 = -D2;
182 1.1 mrg D1 = D2 + D3;
183 1.1 mrg D1 = D2 - D3;
184 1.1 mrg D1 = D2 * D3;
185 1.1 mrg D1 = D2 / D3;
186 1.1 mrg D1 += D2;
187 1.1 mrg D1 -= D2;
188 1.1 mrg D1 *= D2;
189 1.1 mrg D1 /= D2;
190 1.1 mrg
191 1.1 mrg si = D1 == D2;
192 1.1 mrg si = D1 != D2;
193 1.1 mrg si = D1 > D2;
194 1.1 mrg si = D1 < D2;
195 1.1 mrg si = D1 >= D2;
196 1.1 mrg si = D1 <= D2;
197 1.1 mrg
198 1.1 mrg si = __builtin_isgreater (D1, D2);
199 1.1 mrg si = __builtin_isgreaterequal (D1, D2);
200 1.1 mrg si = __builtin_isless (D1, D2);
201 1.1 mrg si = __builtin_islessequal (D1, D2);
202 1.1 mrg si = __builtin_islessgreater (D1, D2);
203 1.1 mrg si = __builtin_isunordered (D1, D2);
204 1.1 mrg
205 1.1 mrg sc = D1;
206 1.1 mrg uc = D1;
207 1.1 mrg ss = D1;
208 1.1 mrg us = D1;
209 1.1 mrg si = D1;
210 1.1 mrg ui = D1;
211 1.1 mrg sl = D1;
212 1.1 mrg ul = D1;
213 1.1 mrg f1 = D1;
214 1.1 mrg d1 = D1;
215 1.1 mrg
216 1.1 mrg D1 = sc;
217 1.1 mrg D1 = uc;
218 1.1 mrg D1 = ss;
219 1.1 mrg D1 = us;
220 1.1 mrg D1 = si;
221 1.1 mrg D1 = ui;
222 1.1 mrg D1 = sl;
223 1.1 mrg D1 = ul;
224 1.1 mrg D1 = f1;
225 1.1 mrg D1 = d1;
226 1.1 mrg
227 1.1 mrg d1 = acos (d2);
228 1.1 mrg d1 = asin (d2);
229 1.1 mrg d1 = atan (d2);
230 1.1 mrg d1 = atan2 (d2, d3);
231 1.1 mrg d1 = cos (d2);
232 1.1 mrg d1 = sin (d2);
233 1.1 mrg d1 = tan (d2);
234 1.1 mrg d1 = cosh (d2);
235 1.1 mrg d1 = sinh (d2);
236 1.1 mrg d1 = tanh (d2);
237 1.1 mrg d1 = exp (d2);
238 1.1 mrg d1 = frexp (d2, &i1);
239 1.1 mrg d1 = ldexp (d2, i2);
240 1.1 mrg d1 = log (d2);
241 1.1 mrg d1 = log10 (d2);
242 1.1 mrg d1 = modf (d2, &d3);
243 1.1 mrg d1 = pow (d2, d3);
244 1.1 mrg d1 = sqrt (d2);
245 1.1 mrg d1 = ceil (d2);
246 1.1 mrg d1 = fabs (d2);
247 1.1 mrg d1 = floor (d2);
248 1.1 mrg d1 = fmod (d2, d3);
249 1.1 mrg
250 1.1 mrg return 0;
251 1.1 mrg }
252