]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - tools/test/testfloat/systfloat.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / tools / test / testfloat / systfloat.c
1
2 /*
3 ===============================================================================
4
5 This C source file is part of TestFloat, Release 2a, a package of programs
6 for testing the correctness of floating-point arithmetic complying to the
7 IEC/IEEE Standard for Floating-Point.
8
9 Written by John R. Hauser.  More information is available through the Web
10 page `http://HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/TestFloat.html'.
11
12 THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort
13 has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
14 TIMES RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO
15 PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
16 AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
17
18 Derivative works are acceptable, even for commercial purposes, so long as
19 (1) they include prominent notice that the work is derivative, and (2) they
20 include prominent notice akin to these four paragraphs for those parts of
21 this code that are retained.
22
23 ===============================================================================
24 */
25
26 #include <math.h>
27 #include "milieu.h"
28 #include "softfloat.h"
29 #include "systfloat.h"
30
31 float32 syst_int32_to_float32( int32 a )
32 {
33     float32 z;
34
35     *( (float *) &z ) = a;
36     return z;
37
38 }
39
40 float64 syst_int32_to_float64( int32 a )
41 {
42     float64 z;
43
44     *( (double *) &z ) = a;
45     return z;
46
47 }
48
49 #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 )
50
51 floatx80 syst_int32_to_floatx80( int32 a )
52 {
53     floatx80 z;
54
55     *( (long double *) &z ) = a;
56     return z;
57
58 }
59
60 #endif
61
62 #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 )
63
64 float128 syst_int32_to_float128( int32 a )
65 {
66     float128 z;
67
68     *( (long double *) &z ) = a;
69     return z;
70
71 }
72
73 #endif
74
75 #ifdef BITS64
76
77 float32 syst_int64_to_float32( int64 a )
78 {
79     float32 z;
80
81     *( (float *) &z ) = a;
82     return z;
83
84 }
85
86 float64 syst_int64_to_float64( int64 a )
87 {
88     float64 z;
89
90     *( (double *) &z ) = a;
91     return z;
92
93 }
94
95 #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 )
96
97 floatx80 syst_int64_to_floatx80( int64 a )
98 {
99     floatx80 z;
100
101     *( (long double *) &z ) = a;
102     return z;
103
104 }
105
106 #endif
107
108 #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 )
109
110 float128 syst_int64_to_float128( int64 a )
111 {
112     float128 z;
113
114     *( (long double *) &z ) = a;
115     return z;
116
117 }
118
119 #endif
120
121 #endif
122
123 int32 syst_float32_to_int32_round_to_zero( float32 a )
124 {
125
126     return *( (float *) &a );
127
128 }
129
130 #ifdef BITS64
131
132 int64 syst_float32_to_int64_round_to_zero( float32 a )
133 {
134
135     return *( (float *) &a );
136
137 }
138
139 #endif
140
141 float64 syst_float32_to_float64( float32 a )
142 {
143     float64 z;
144
145     *( (double *) &z ) = *( (float *) &a );
146     return z;
147
148 }
149
150 #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 )
151
152 floatx80 syst_float32_to_floatx80( float32 a )
153 {
154     floatx80 z;
155
156     *( (long double *) &z ) = *( (float *) &a );
157     return z;
158
159 }
160
161 #endif
162
163 #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 )
164
165 float128 syst_float32_to_float128( float32 a )
166 {
167     float128 z;
168
169     *( (long double *) &z ) = *( (float *) &a );
170     return z;
171
172 }
173
174 #endif
175
176 float32 syst_float32_add( float32 a, float32 b )
177 {
178     float32 z;
179
180     *( (float *) &z ) = *( (float *) &a ) + *( (float *) &b );
181     return z;
182
183 }
184
185 float32 syst_float32_sub( float32 a, float32 b )
186 {
187     float32 z;
188
189     *( (float *) &z ) = *( (float *) &a ) - *( (float *) &b );
190     return z;
191
192 }
193
194 float32 syst_float32_mul( float32 a, float32 b )
195 {
196     float32 z;
197
198     *( (float *) &z ) = *( (float *) &a ) * *( (float *) &b );
199     return z;
200
201 }
202
203 float32 syst_float32_div( float32 a, float32 b )
204 {
205     float32 z;
206
207     *( (float *) &z ) = *( (float *) &a ) / *( (float *) &b );
208     return z;
209
210 }
211
212 flag syst_float32_eq( float32 a, float32 b )
213 {
214
215     return ( *( (float *) &a ) == *( (float *) &b ) );
216
217 }
218
219 flag syst_float32_le( float32 a, float32 b )
220 {
221
222     return ( *( (float *) &a ) <= *( (float *) &b ) );
223
224 }
225
226 flag syst_float32_lt( float32 a, float32 b )
227 {
228
229     return ( *( (float *) &a ) < *( (float *) &b ) );
230
231 }
232
233 int32 syst_float64_to_int32_round_to_zero( float64 a )
234 {
235
236     return *( (double *) &a );
237
238 }
239
240 #ifdef BITS64
241
242 int64 syst_float64_to_int64_round_to_zero( float64 a )
243 {
244
245     return *( (double *) &a );
246
247 }
248
249 #endif
250
251 float32 syst_float64_to_float32( float64 a )
252 {
253     float32 z;
254
255     *( (float *) &z ) = *( (double *) &a );
256     return z;
257
258 }
259
260 #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 )
261
262 floatx80 syst_float64_to_floatx80( float64 a )
263 {
264     floatx80 z;
265
266     *( (long double *) &z ) = *( (double *) &a );
267     return z;
268
269 }
270
271 #endif
272
273 #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 )
274
275 float128 syst_float64_to_float128( float64 a )
276 {
277     float128 z;
278
279     *( (long double *) &z ) = *( (double *) &a );
280     return z;
281
282 }
283
284 #endif
285
286 float64 syst_float64_add( float64 a, float64 b )
287 {
288     float64 z;
289
290     *( (double *) &z ) = *( (double *) &a ) + *( (double *) &b );
291     return z;
292
293 }
294
295 float64 syst_float64_sub( float64 a, float64 b )
296 {
297     float64 z;
298
299     *( (double *) &z ) = *( (double *) &a ) - *( (double *) &b );
300     return z;
301
302 }
303
304 float64 syst_float64_mul( float64 a, float64 b )
305 {
306     float64 z;
307
308     *( (double *) &z ) = *( (double *) &a ) * *( (double *) &b );
309     return z;
310
311 }
312
313 float64 syst_float64_div( float64 a, float64 b )
314 {
315     float64 z;
316
317     *( (double *) &z ) = *( (double *) &a ) / *( (double *) &b );
318     return z;
319
320 }
321
322 float64 syst_float64_sqrt( float64 a )
323 {
324     float64 z;
325
326     *( (double *) &z ) = sqrt( *( (double *) &a ) );
327     return z;
328
329 }
330
331 flag syst_float64_eq( float64 a, float64 b )
332 {
333
334     return ( *( (double *) &a ) == *( (double *) &b ) );
335
336 }
337
338 flag syst_float64_le( float64 a, float64 b )
339 {
340
341     return ( *( (double *) &a ) <= *( (double *) &b ) );
342
343 }
344
345 flag syst_float64_lt( float64 a, float64 b )
346 {
347
348     return ( *( (double *) &a ) < *( (double *) &b ) );
349
350 }
351
352 #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 )
353
354 int32 syst_floatx80_to_int32_round_to_zero( floatx80 a )
355 {
356
357     return *( (long double *) &a );
358
359 }
360
361 #ifdef BITS64
362
363 int64 syst_floatx80_to_int64_round_to_zero( floatx80 a )
364 {
365
366     return *( (long double *) &a );
367
368 }
369
370 #endif
371
372 float32 syst_floatx80_to_float32( floatx80 a )
373 {
374     float32 z;
375
376     *( (float *) &z ) = *( (long double *) &a );
377     return z;
378
379 }
380
381 float64 syst_floatx80_to_float64( floatx80 a )
382 {
383     float64 z;
384
385     *( (double *) &z ) = *( (long double *) &a );
386     return z;
387
388 }
389
390 floatx80 syst_floatx80_add( floatx80 a, floatx80 b )
391 {
392     floatx80 z;
393
394     *( (long double *) &z ) =
395         *( (long double *) &a ) + *( (long double *) &b );
396     return z;
397
398 }
399
400 floatx80 syst_floatx80_sub( floatx80 a, floatx80 b )
401 {
402     floatx80 z;
403
404     *( (long double *) &z ) =
405         *( (long double *) &a ) - *( (long double *) &b );
406     return z;
407
408 }
409
410 floatx80 syst_floatx80_mul( floatx80 a, floatx80 b )
411 {
412     floatx80 z;
413
414     *( (long double *) &z ) =
415         *( (long double *) &a ) * *( (long double *) &b );
416     return z;
417
418 }
419
420 floatx80 syst_floatx80_div( floatx80 a, floatx80 b )
421 {
422     floatx80 z;
423
424     *( (long double *) &z ) =
425         *( (long double *) &a ) / *( (long double *) &b );
426     return z;
427
428 }
429
430 flag syst_floatx80_eq( floatx80 a, floatx80 b )
431 {
432
433     return ( *( (long double *) &a ) == *( (long double *) &b ) );
434
435 }
436
437 flag syst_floatx80_le( floatx80 a, floatx80 b )
438 {
439
440     return ( *( (long double *) &a ) <= *( (long double *) &b ) );
441
442 }
443
444 flag syst_floatx80_lt( floatx80 a, floatx80 b )
445 {
446
447     return ( *( (long double *) &a ) < *( (long double *) &b ) );
448
449 }
450
451 #endif
452
453 #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 )
454
455 int32 syst_float128_to_int32_round_to_zero( float128 a )
456 {
457
458     return *( (long double *) &a );
459
460 }
461
462 #ifdef BITS64
463
464 int64 syst_float128_to_int64_round_to_zero( float128 a )
465 {
466
467     return *( (long double *) &a );
468
469 }
470
471 #endif
472
473 float32 syst_float128_to_float32( float128 a )
474 {
475     float32 z;
476
477     *( (float *) &z ) = *( (long double *) &a );
478     return z;
479
480 }
481
482 float64 syst_float128_to_float64( float128 a )
483 {
484     float64 z;
485
486     *( (double *) &z ) = *( (long double *) &a );
487     return z;
488
489 }
490
491 float128 syst_float128_add( float128 a, float128 b )
492 {
493     float128 z;
494
495     *( (long double *) &z ) =
496         *( (long double *) &a ) + *( (long double *) &b );
497     return z;
498
499 }
500
501 float128 syst_float128_sub( float128 a, float128 b )
502 {
503     float128 z;
504
505     *( (long double *) &z ) =
506         *( (long double *) &a ) - *( (long double *) &b );
507     return z;
508
509 }
510
511 float128 syst_float128_mul( float128 a, float128 b )
512 {
513     float128 z;
514
515     *( (long double *) &z ) =
516         *( (long double *) &a ) * *( (long double *) &b );
517     return z;
518
519 }
520
521 float128 syst_float128_div( float128 a, float128 b )
522 {
523     float128 z;
524
525     *( (long double *) &z ) =
526         *( (long double *) &a ) / *( (long double *) &b );
527     return z;
528
529 }
530
531 flag syst_float128_eq( float128 a, float128 b )
532 {
533
534     return ( *( (long double *) &a ) == *( (long double *) &b ) );
535
536 }
537
538 flag syst_float128_le( float128 a, float128 b )
539 {
540
541     return ( *( (long double *) &a ) <= *( (long double *) &b ) );
542
543 }
544
545 flag syst_float128_lt( float128 a, float128 b )
546 {
547
548     return ( *( (long double *) &a ) < *( (long double *) &b ) );
549
550 }
551
552 #endif
553