1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82#ifndef SOFTFLOAT_H
83#define SOFTFLOAT_H
84
85#if defined(CONFIG_SOLARIS) && defined(CONFIG_NEEDS_LIBSUNMATH)
86#include <sunmath.h>
87#endif
88
89
90
91
92
93
94typedef uint8_t flag;
95
96#define LIT64( a ) a##LL
97
98
99
100
101enum {
102 float_relation_less = -1,
103 float_relation_equal = 0,
104 float_relation_greater = 1,
105 float_relation_unordered = 2
106};
107
108
109
110
111
112
113
114
115
116#ifdef USE_SOFTFLOAT_STRUCT_TYPES
117typedef struct {
118 uint16_t v;
119} float16;
120#define float16_val(x) (((float16)(x)).v)
121#define make_float16(x) __extension__ ({ float16 f16_val = {x}; f16_val; })
122#define const_float16(x) { x }
123typedef struct {
124 uint32_t v;
125} float32;
126
127#define float32_val(x) (((float32)(x)).v)
128#define make_float32(x) __extension__ ({ float32 f32_val = {x}; f32_val; })
129#define const_float32(x) { x }
130typedef struct {
131 uint64_t v;
132} float64;
133#define float64_val(x) (((float64)(x)).v)
134#define make_float64(x) __extension__ ({ float64 f64_val = {x}; f64_val; })
135#define const_float64(x) { x }
136#else
137typedef uint16_t float16;
138typedef uint32_t float32;
139typedef uint64_t float64;
140#define float16_val(x) (x)
141#define float32_val(x) (x)
142#define float64_val(x) (x)
143#define make_float16(x) (x)
144#define make_float32(x) (x)
145#define make_float64(x) (x)
146#define const_float16(x) (x)
147#define const_float32(x) (x)
148#define const_float64(x) (x)
149#endif
150typedef struct {
151 uint64_t low;
152 uint16_t high;
153} floatx80;
154#define make_floatx80(exp, mant) ((floatx80) { mant, exp })
155#define make_floatx80_init(exp, mant) { .low = mant, .high = exp }
156typedef struct {
157#ifdef HOST_WORDS_BIGENDIAN
158 uint64_t high, low;
159#else
160 uint64_t low, high;
161#endif
162} float128;
163#define make_float128(high_, low_) ((float128) { .high = high_, .low = low_ })
164#define make_float128_init(high_, low_) { .high = high_, .low = low_ }
165
166
167
168
169enum {
170 float_tininess_after_rounding = 0,
171 float_tininess_before_rounding = 1
172};
173
174
175
176
177enum {
178 float_round_nearest_even = 0,
179 float_round_down = 1,
180 float_round_up = 2,
181 float_round_to_zero = 3,
182 float_round_ties_away = 4,
183};
184
185
186
187
188enum {
189 float_flag_invalid = 1,
190 float_flag_divbyzero = 4,
191 float_flag_overflow = 8,
192 float_flag_underflow = 16,
193 float_flag_inexact = 32,
194 float_flag_input_denormal = 64,
195 float_flag_output_denormal = 128
196};
197
198typedef struct float_status {
199 signed char float_detect_tininess;
200 signed char float_rounding_mode;
201 uint8_t float_exception_flags;
202 signed char floatx80_rounding_precision;
203
204 flag flush_to_zero;
205
206 flag flush_inputs_to_zero;
207 flag default_nan_mode;
208 flag snan_bit_is_one;
209} float_status;
210
211static inline void set_float_detect_tininess(int val, float_status *status)
212{
213 status->float_detect_tininess = val;
214}
215static inline void set_float_rounding_mode(int val, float_status *status)
216{
217 status->float_rounding_mode = val;
218}
219static inline void set_float_exception_flags(int val, float_status *status)
220{
221 status->float_exception_flags = val;
222}
223static inline void set_floatx80_rounding_precision(int val,
224 float_status *status)
225{
226 status->floatx80_rounding_precision = val;
227}
228static inline void set_flush_to_zero(flag val, float_status *status)
229{
230 status->flush_to_zero = val;
231}
232static inline void set_flush_inputs_to_zero(flag val, float_status *status)
233{
234 status->flush_inputs_to_zero = val;
235}
236static inline void set_default_nan_mode(flag val, float_status *status)
237{
238 status->default_nan_mode = val;
239}
240static inline void set_snan_bit_is_one(flag val, float_status *status)
241{
242 status->snan_bit_is_one = val;
243}
244static inline int get_float_detect_tininess(float_status *status)
245{
246 return status->float_detect_tininess;
247}
248static inline int get_float_rounding_mode(float_status *status)
249{
250 return status->float_rounding_mode;
251}
252static inline int get_float_exception_flags(float_status *status)
253{
254 return status->float_exception_flags;
255}
256static inline int get_floatx80_rounding_precision(float_status *status)
257{
258 return status->floatx80_rounding_precision;
259}
260static inline flag get_flush_to_zero(float_status *status)
261{
262 return status->flush_to_zero;
263}
264static inline flag get_flush_inputs_to_zero(float_status *status)
265{
266 return status->flush_inputs_to_zero;
267}
268static inline flag get_default_nan_mode(float_status *status)
269{
270 return status->default_nan_mode;
271}
272
273
274
275
276
277void float_raise(uint8_t flags, float_status *status);
278
279
280
281
282
283float32 float32_squash_input_denormal(float32 a, float_status *status);
284float64 float64_squash_input_denormal(float64 a, float_status *status);
285
286
287
288
289
290
291
292
293
294enum {
295 float_muladd_negate_c = 1,
296 float_muladd_negate_product = 2,
297 float_muladd_negate_result = 4,
298 float_muladd_halve_result = 8,
299};
300
301
302
303
304float32 int32_to_float32(int32_t, float_status *status);
305float64 int32_to_float64(int32_t, float_status *status);
306float32 uint32_to_float32(uint32_t, float_status *status);
307float64 uint32_to_float64(uint32_t, float_status *status);
308floatx80 int32_to_floatx80(int32_t, float_status *status);
309float128 int32_to_float128(int32_t, float_status *status);
310float32 int64_to_float32(int64_t, float_status *status);
311float64 int64_to_float64(int64_t, float_status *status);
312floatx80 int64_to_floatx80(int64_t, float_status *status);
313float128 int64_to_float128(int64_t, float_status *status);
314float32 uint64_to_float32(uint64_t, float_status *status);
315float64 uint64_to_float64(uint64_t, float_status *status);
316float128 uint64_to_float128(uint64_t, float_status *status);
317
318
319static inline float32 int16_to_float32(int16_t v, float_status *status)
320{
321 return int32_to_float32(v, status);
322}
323
324static inline float32 uint16_to_float32(uint16_t v, float_status *status)
325{
326 return uint32_to_float32(v, status);
327}
328
329static inline float64 int16_to_float64(int16_t v, float_status *status)
330{
331 return int32_to_float64(v, status);
332}
333
334static inline float64 uint16_to_float64(uint16_t v, float_status *status)
335{
336 return uint32_to_float64(v, status);
337}
338
339
340
341
342float16 float32_to_float16(float32, flag, float_status *status);
343float32 float16_to_float32(float16, flag, float_status *status);
344float16 float64_to_float16(float64 a, flag ieee, float_status *status);
345float64 float16_to_float64(float16 a, flag ieee, float_status *status);
346
347
348
349
350int float16_is_quiet_nan(float16, float_status *status);
351int float16_is_signaling_nan(float16, float_status *status);
352float16 float16_maybe_silence_nan(float16, float_status *status);
353
354static inline int float16_is_any_nan(float16 a)
355{
356 return ((float16_val(a) & ~0x8000) > 0x7c00);
357}
358
359
360
361
362float16 float16_default_nan(float_status *status);
363
364
365
366
367int16_t float32_to_int16(float32, float_status *status);
368uint16_t float32_to_uint16(float32, float_status *status);
369int16_t float32_to_int16_round_to_zero(float32, float_status *status);
370uint16_t float32_to_uint16_round_to_zero(float32, float_status *status);
371int32_t float32_to_int32(float32, float_status *status);
372int32_t float32_to_int32_round_to_zero(float32, float_status *status);
373uint32_t float32_to_uint32(float32, float_status *status);
374uint32_t float32_to_uint32_round_to_zero(float32, float_status *status);
375int64_t float32_to_int64(float32, float_status *status);
376uint64_t float32_to_uint64(float32, float_status *status);
377uint64_t float32_to_uint64_round_to_zero(float32, float_status *status);
378int64_t float32_to_int64_round_to_zero(float32, float_status *status);
379float64 float32_to_float64(float32, float_status *status);
380floatx80 float32_to_floatx80(float32, float_status *status);
381float128 float32_to_float128(float32, float_status *status);
382
383
384
385
386float32 float32_round_to_int(float32, float_status *status);
387float32 float32_add(float32, float32, float_status *status);
388float32 float32_sub(float32, float32, float_status *status);
389float32 float32_mul(float32, float32, float_status *status);
390float32 float32_div(float32, float32, float_status *status);
391float32 float32_rem(float32, float32, float_status *status);
392float32 float32_muladd(float32, float32, float32, int, float_status *status);
393float32 float32_sqrt(float32, float_status *status);
394float32 float32_exp2(float32, float_status *status);
395float32 float32_log2(float32, float_status *status);
396int float32_eq(float32, float32, float_status *status);
397int float32_le(float32, float32, float_status *status);
398int float32_lt(float32, float32, float_status *status);
399int float32_unordered(float32, float32, float_status *status);
400int float32_eq_quiet(float32, float32, float_status *status);
401int float32_le_quiet(float32, float32, float_status *status);
402int float32_lt_quiet(float32, float32, float_status *status);
403int float32_unordered_quiet(float32, float32, float_status *status);
404int float32_compare(float32, float32, float_status *status);
405int float32_compare_quiet(float32, float32, float_status *status);
406float32 float32_min(float32, float32, float_status *status);
407float32 float32_max(float32, float32, float_status *status);
408float32 float32_minnum(float32, float32, float_status *status);
409float32 float32_maxnum(float32, float32, float_status *status);
410float32 float32_minnummag(float32, float32, float_status *status);
411float32 float32_maxnummag(float32, float32, float_status *status);
412int float32_is_quiet_nan(float32, float_status *status);
413int float32_is_signaling_nan(float32, float_status *status);
414float32 float32_maybe_silence_nan(float32, float_status *status);
415float32 float32_scalbn(float32, int, float_status *status);
416
417static inline float32 float32_abs(float32 a)
418{
419
420
421
422 return make_float32(float32_val(a) & 0x7fffffff);
423}
424
425static inline float32 float32_chs(float32 a)
426{
427
428
429
430 return make_float32(float32_val(a) ^ 0x80000000);
431}
432
433static inline int float32_is_infinity(float32 a)
434{
435 return (float32_val(a) & 0x7fffffff) == 0x7f800000;
436}
437
438static inline int float32_is_neg(float32 a)
439{
440 return float32_val(a) >> 31;
441}
442
443static inline int float32_is_zero(float32 a)
444{
445 return (float32_val(a) & 0x7fffffff) == 0;
446}
447
448static inline int float32_is_any_nan(float32 a)
449{
450 return ((float32_val(a) & ~(1 << 31)) > 0x7f800000UL);
451}
452
453static inline int float32_is_zero_or_denormal(float32 a)
454{
455 return (float32_val(a) & 0x7f800000) == 0;
456}
457
458static inline float32 float32_set_sign(float32 a, int sign)
459{
460 return make_float32((float32_val(a) & 0x7fffffff) | (sign << 31));
461}
462
463#define float32_zero make_float32(0)
464#define float32_one make_float32(0x3f800000)
465#define float32_ln2 make_float32(0x3f317218)
466#define float32_pi make_float32(0x40490fdb)
467#define float32_half make_float32(0x3f000000)
468#define float32_infinity make_float32(0x7f800000)
469
470
471
472
473
474float32 float32_default_nan(float_status *status);
475
476
477
478
479int16_t float64_to_int16(float64, float_status *status);
480uint16_t float64_to_uint16(float64, float_status *status);
481int16_t float64_to_int16_round_to_zero(float64, float_status *status);
482uint16_t float64_to_uint16_round_to_zero(float64, float_status *status);
483int32_t float64_to_int32(float64, float_status *status);
484int32_t float64_to_int32_round_to_zero(float64, float_status *status);
485uint32_t float64_to_uint32(float64, float_status *status);
486uint32_t float64_to_uint32_round_to_zero(float64, float_status *status);
487int64_t float64_to_int64(float64, float_status *status);
488int64_t float64_to_int64_round_to_zero(float64, float_status *status);
489uint64_t float64_to_uint64(float64 a, float_status *status);
490uint64_t float64_to_uint64_round_to_zero(float64 a, float_status *status);
491float32 float64_to_float32(float64, float_status *status);
492floatx80 float64_to_floatx80(float64, float_status *status);
493float128 float64_to_float128(float64, float_status *status);
494
495
496
497
498float64 float64_round_to_int(float64, float_status *status);
499float64 float64_trunc_to_int(float64, float_status *status);
500float64 float64_add(float64, float64, float_status *status);
501float64 float64_sub(float64, float64, float_status *status);
502float64 float64_mul(float64, float64, float_status *status);
503float64 float64_div(float64, float64, float_status *status);
504float64 float64_rem(float64, float64, float_status *status);
505float64 float64_muladd(float64, float64, float64, int, float_status *status);
506float64 float64_sqrt(float64, float_status *status);
507float64 float64_log2(float64, float_status *status);
508int float64_eq(float64, float64, float_status *status);
509int float64_le(float64, float64, float_status *status);
510int float64_lt(float64, float64, float_status *status);
511int float64_unordered(float64, float64, float_status *status);
512int float64_eq_quiet(float64, float64, float_status *status);
513int float64_le_quiet(float64, float64, float_status *status);
514int float64_lt_quiet(float64, float64, float_status *status);
515int float64_unordered_quiet(float64, float64, float_status *status);
516int float64_compare(float64, float64, float_status *status);
517int float64_compare_quiet(float64, float64, float_status *status);
518float64 float64_min(float64, float64, float_status *status);
519float64 float64_max(float64, float64, float_status *status);
520float64 float64_minnum(float64, float64, float_status *status);
521float64 float64_maxnum(float64, float64, float_status *status);
522float64 float64_minnummag(float64, float64, float_status *status);
523float64 float64_maxnummag(float64, float64, float_status *status);
524int float64_is_quiet_nan(float64 a, float_status *status);
525int float64_is_signaling_nan(float64, float_status *status);
526float64 float64_maybe_silence_nan(float64, float_status *status);
527float64 float64_scalbn(float64, int, float_status *status);
528
529static inline float64 float64_abs(float64 a)
530{
531
532
533
534 return make_float64(float64_val(a) & 0x7fffffffffffffffLL);
535}
536
537static inline float64 float64_chs(float64 a)
538{
539
540
541
542 return make_float64(float64_val(a) ^ 0x8000000000000000LL);
543}
544
545static inline int float64_is_infinity(float64 a)
546{
547 return (float64_val(a) & 0x7fffffffffffffffLL ) == 0x7ff0000000000000LL;
548}
549
550static inline int float64_is_neg(float64 a)
551{
552 return float64_val(a) >> 63;
553}
554
555static inline int float64_is_zero(float64 a)
556{
557 return (float64_val(a) & 0x7fffffffffffffffLL) == 0;
558}
559
560static inline int float64_is_any_nan(float64 a)
561{
562 return ((float64_val(a) & ~(1ULL << 63)) > 0x7ff0000000000000ULL);
563}
564
565static inline int float64_is_zero_or_denormal(float64 a)
566{
567 return (float64_val(a) & 0x7ff0000000000000LL) == 0;
568}
569
570static inline float64 float64_set_sign(float64 a, int sign)
571{
572 return make_float64((float64_val(a) & 0x7fffffffffffffffULL)
573 | ((int64_t)sign << 63));
574}
575
576#define float64_zero make_float64(0)
577#define float64_one make_float64(0x3ff0000000000000LL)
578#define float64_ln2 make_float64(0x3fe62e42fefa39efLL)
579#define float64_pi make_float64(0x400921fb54442d18LL)
580#define float64_half make_float64(0x3fe0000000000000LL)
581#define float64_infinity make_float64(0x7ff0000000000000LL)
582
583
584
585
586float64 float64_default_nan(float_status *status);
587
588
589
590
591int32_t floatx80_to_int32(floatx80, float_status *status);
592int32_t floatx80_to_int32_round_to_zero(floatx80, float_status *status);
593int64_t floatx80_to_int64(floatx80, float_status *status);
594int64_t floatx80_to_int64_round_to_zero(floatx80, float_status *status);
595float32 floatx80_to_float32(floatx80, float_status *status);
596float64 floatx80_to_float64(floatx80, float_status *status);
597float128 floatx80_to_float128(floatx80, float_status *status);
598
599
600
601
602floatx80 floatx80_round_to_int(floatx80, float_status *status);
603floatx80 floatx80_add(floatx80, floatx80, float_status *status);
604floatx80 floatx80_sub(floatx80, floatx80, float_status *status);
605floatx80 floatx80_mul(floatx80, floatx80, float_status *status);
606floatx80 floatx80_div(floatx80, floatx80, float_status *status);
607floatx80 floatx80_rem(floatx80, floatx80, float_status *status);
608floatx80 floatx80_sqrt(floatx80, float_status *status);
609int floatx80_eq(floatx80, floatx80, float_status *status);
610int floatx80_le(floatx80, floatx80, float_status *status);
611int floatx80_lt(floatx80, floatx80, float_status *status);
612int floatx80_unordered(floatx80, floatx80, float_status *status);
613int floatx80_eq_quiet(floatx80, floatx80, float_status *status);
614int floatx80_le_quiet(floatx80, floatx80, float_status *status);
615int floatx80_lt_quiet(floatx80, floatx80, float_status *status);
616int floatx80_unordered_quiet(floatx80, floatx80, float_status *status);
617int floatx80_compare(floatx80, floatx80, float_status *status);
618int floatx80_compare_quiet(floatx80, floatx80, float_status *status);
619int floatx80_is_quiet_nan(floatx80, float_status *status);
620int floatx80_is_signaling_nan(floatx80, float_status *status);
621floatx80 floatx80_maybe_silence_nan(floatx80, float_status *status);
622floatx80 floatx80_scalbn(floatx80, int, float_status *status);
623
624static inline floatx80 floatx80_abs(floatx80 a)
625{
626 a.high &= 0x7fff;
627 return a;
628}
629
630static inline floatx80 floatx80_chs(floatx80 a)
631{
632 a.high ^= 0x8000;
633 return a;
634}
635
636static inline int floatx80_is_infinity(floatx80 a)
637{
638 return (a.high & 0x7fff) == 0x7fff && a.low == 0x8000000000000000LL;
639}
640
641static inline int floatx80_is_neg(floatx80 a)
642{
643 return a.high >> 15;
644}
645
646static inline int floatx80_is_zero(floatx80 a)
647{
648 return (a.high & 0x7fff) == 0 && a.low == 0;
649}
650
651static inline int floatx80_is_zero_or_denormal(floatx80 a)
652{
653 return (a.high & 0x7fff) == 0;
654}
655
656static inline int floatx80_is_any_nan(floatx80 a)
657{
658 return ((a.high & 0x7fff) == 0x7fff) && (a.low<<1);
659}
660
661
662
663
664
665
666
667
668
669
670
671static inline bool floatx80_invalid_encoding(floatx80 a)
672{
673 return (a.low & (1ULL << 63)) == 0 && (a.high & 0x7FFF) != 0;
674}
675
676#define floatx80_zero make_floatx80(0x0000, 0x0000000000000000LL)
677#define floatx80_one make_floatx80(0x3fff, 0x8000000000000000LL)
678#define floatx80_ln2 make_floatx80(0x3ffe, 0xb17217f7d1cf79acLL)
679#define floatx80_pi make_floatx80(0x4000, 0xc90fdaa22168c235LL)
680#define floatx80_half make_floatx80(0x3ffe, 0x8000000000000000LL)
681#define floatx80_infinity make_floatx80(0x7fff, 0x8000000000000000LL)
682
683
684
685
686floatx80 floatx80_default_nan(float_status *status);
687
688
689
690
691int32_t float128_to_int32(float128, float_status *status);
692int32_t float128_to_int32_round_to_zero(float128, float_status *status);
693int64_t float128_to_int64(float128, float_status *status);
694int64_t float128_to_int64_round_to_zero(float128, float_status *status);
695float32 float128_to_float32(float128, float_status *status);
696float64 float128_to_float64(float128, float_status *status);
697floatx80 float128_to_floatx80(float128, float_status *status);
698
699
700
701
702float128 float128_round_to_int(float128, float_status *status);
703float128 float128_add(float128, float128, float_status *status);
704float128 float128_sub(float128, float128, float_status *status);
705float128 float128_mul(float128, float128, float_status *status);
706float128 float128_div(float128, float128, float_status *status);
707float128 float128_rem(float128, float128, float_status *status);
708float128 float128_sqrt(float128, float_status *status);
709int float128_eq(float128, float128, float_status *status);
710int float128_le(float128, float128, float_status *status);
711int float128_lt(float128, float128, float_status *status);
712int float128_unordered(float128, float128, float_status *status);
713int float128_eq_quiet(float128, float128, float_status *status);
714int float128_le_quiet(float128, float128, float_status *status);
715int float128_lt_quiet(float128, float128, float_status *status);
716int float128_unordered_quiet(float128, float128, float_status *status);
717int float128_compare(float128, float128, float_status *status);
718int float128_compare_quiet(float128, float128, float_status *status);
719int float128_is_quiet_nan(float128, float_status *status);
720int float128_is_signaling_nan(float128, float_status *status);
721float128 float128_maybe_silence_nan(float128, float_status *status);
722float128 float128_scalbn(float128, int, float_status *status);
723
724static inline float128 float128_abs(float128 a)
725{
726 a.high &= 0x7fffffffffffffffLL;
727 return a;
728}
729
730static inline float128 float128_chs(float128 a)
731{
732 a.high ^= 0x8000000000000000LL;
733 return a;
734}
735
736static inline int float128_is_infinity(float128 a)
737{
738 return (a.high & 0x7fffffffffffffffLL) == 0x7fff000000000000LL && a.low == 0;
739}
740
741static inline int float128_is_neg(float128 a)
742{
743 return a.high >> 63;
744}
745
746static inline int float128_is_zero(float128 a)
747{
748 return (a.high & 0x7fffffffffffffffLL) == 0 && a.low == 0;
749}
750
751static inline int float128_is_zero_or_denormal(float128 a)
752{
753 return (a.high & 0x7fff000000000000LL) == 0;
754}
755
756static inline int float128_is_any_nan(float128 a)
757{
758 return ((a.high >> 48) & 0x7fff) == 0x7fff &&
759 ((a.low != 0) || ((a.high & 0xffffffffffffLL) != 0));
760}
761
762#define float128_zero make_float128(0, 0)
763
764
765
766
767float128 float128_default_nan(float_status *status);
768
769#endif
770