xref: /freebsd/lib/libc/softfloat/templates/softfloat.h (revision 15144b0f960e6044ec23ad91c5f76f37d1de36ba)
115144b0fSOlivier Houchard /* $FreeBSD$ */
215144b0fSOlivier Houchard 
315144b0fSOlivier Houchard /*
415144b0fSOlivier Houchard ===============================================================================
515144b0fSOlivier Houchard 
615144b0fSOlivier Houchard This C header file is part of the SoftFloat IEC/IEEE Floating-point
715144b0fSOlivier Houchard Arithmetic Package, Release 2a.
815144b0fSOlivier Houchard 
915144b0fSOlivier Houchard Written by John R. Hauser.  This work was made possible in part by the
1015144b0fSOlivier Houchard International Computer Science Institute, located at Suite 600, 1947 Center
1115144b0fSOlivier Houchard Street, Berkeley, California 94704.  Funding was partially provided by the
1215144b0fSOlivier Houchard National Science Foundation under grant MIP-9311980.  The original version
1315144b0fSOlivier Houchard of this code was written as part of a project to build a fixed-point vector
1415144b0fSOlivier Houchard processor in collaboration with the University of California at Berkeley,
1515144b0fSOlivier Houchard overseen by Profs. Nelson Morgan and John Wawrzynek.  More information
1615144b0fSOlivier Houchard is available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/
1715144b0fSOlivier Houchard arithmetic/SoftFloat.html'.
1815144b0fSOlivier Houchard 
1915144b0fSOlivier Houchard THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort
2015144b0fSOlivier Houchard has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
2115144b0fSOlivier Houchard TIMES RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO
2215144b0fSOlivier Houchard PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
2315144b0fSOlivier Houchard AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
2415144b0fSOlivier Houchard 
2515144b0fSOlivier Houchard Derivative works are acceptable, even for commercial purposes, so long as
2615144b0fSOlivier Houchard (1) they include prominent notice that the work is derivative, and (2) they
2715144b0fSOlivier Houchard include prominent notice akin to these four paragraphs for those parts of
2815144b0fSOlivier Houchard this code that are retained.
2915144b0fSOlivier Houchard 
3015144b0fSOlivier Houchard ===============================================================================
3115144b0fSOlivier Houchard */
3215144b0fSOlivier Houchard 
3315144b0fSOlivier Houchard /*
3415144b0fSOlivier Houchard -------------------------------------------------------------------------------
3515144b0fSOlivier Houchard The macro `FLOATX80' must be defined to enable the extended double-precision
3615144b0fSOlivier Houchard floating-point format `floatx80'.  If this macro is not defined, the
3715144b0fSOlivier Houchard `floatx80' type will not be defined, and none of the functions that either
3815144b0fSOlivier Houchard input or output the `floatx80' type will be defined.  The same applies to
3915144b0fSOlivier Houchard the `FLOAT128' macro and the quadruple-precision format `float128'.
4015144b0fSOlivier Houchard -------------------------------------------------------------------------------
4115144b0fSOlivier Houchard */
4215144b0fSOlivier Houchard #define FLOATX80
4315144b0fSOlivier Houchard #define FLOAT128
4415144b0fSOlivier Houchard 
4515144b0fSOlivier Houchard /*
4615144b0fSOlivier Houchard -------------------------------------------------------------------------------
4715144b0fSOlivier Houchard Software IEC/IEEE floating-point types.
4815144b0fSOlivier Houchard -------------------------------------------------------------------------------
4915144b0fSOlivier Houchard */
5015144b0fSOlivier Houchard typedef !!!bits32 float32;
5115144b0fSOlivier Houchard typedef !!!bits64 float64;
5215144b0fSOlivier Houchard #ifdef FLOATX80
5315144b0fSOlivier Houchard typedef struct {
5415144b0fSOlivier Houchard     !!!bits16 high;
5515144b0fSOlivier Houchard     !!!bits64 low;
5615144b0fSOlivier Houchard } floatx80;
5715144b0fSOlivier Houchard #endif
5815144b0fSOlivier Houchard #ifdef FLOAT128
5915144b0fSOlivier Houchard typedef struct {
6015144b0fSOlivier Houchard     !!!bits64 high, low;
6115144b0fSOlivier Houchard } float128;
6215144b0fSOlivier Houchard #endif
6315144b0fSOlivier Houchard 
6415144b0fSOlivier Houchard /*
6515144b0fSOlivier Houchard -------------------------------------------------------------------------------
6615144b0fSOlivier Houchard Software IEC/IEEE floating-point underflow tininess-detection mode.
6715144b0fSOlivier Houchard -------------------------------------------------------------------------------
6815144b0fSOlivier Houchard */
6915144b0fSOlivier Houchard extern !!!int8 float_detect_tininess;
7015144b0fSOlivier Houchard enum {
7115144b0fSOlivier Houchard     float_tininess_after_rounding  = 0,
7215144b0fSOlivier Houchard     float_tininess_before_rounding = 1
7315144b0fSOlivier Houchard };
7415144b0fSOlivier Houchard 
7515144b0fSOlivier Houchard /*
7615144b0fSOlivier Houchard -------------------------------------------------------------------------------
7715144b0fSOlivier Houchard Software IEC/IEEE floating-point rounding mode.
7815144b0fSOlivier Houchard -------------------------------------------------------------------------------
7915144b0fSOlivier Houchard */
8015144b0fSOlivier Houchard extern !!!int8 float_rounding_mode;
8115144b0fSOlivier Houchard enum {
8215144b0fSOlivier Houchard     float_round_nearest_even = 0,
8315144b0fSOlivier Houchard     float_round_to_zero      = 1,
8415144b0fSOlivier Houchard     float_round_down         = 2,
8515144b0fSOlivier Houchard     float_round_up           = 3
8615144b0fSOlivier Houchard };
8715144b0fSOlivier Houchard 
8815144b0fSOlivier Houchard /*
8915144b0fSOlivier Houchard -------------------------------------------------------------------------------
9015144b0fSOlivier Houchard Software IEC/IEEE floating-point exception flags.
9115144b0fSOlivier Houchard -------------------------------------------------------------------------------
9215144b0fSOlivier Houchard */
9315144b0fSOlivier Houchard extern !!!int8 float_exception_flags;
9415144b0fSOlivier Houchard enum {
9515144b0fSOlivier Houchard     float_flag_inexact   =  1,
9615144b0fSOlivier Houchard     float_flag_underflow =  2,
9715144b0fSOlivier Houchard     float_flag_overflow  =  4,
9815144b0fSOlivier Houchard     float_flag_divbyzero =  8,
9915144b0fSOlivier Houchard     float_flag_invalid   = 16
10015144b0fSOlivier Houchard };
10115144b0fSOlivier Houchard 
10215144b0fSOlivier Houchard /*
10315144b0fSOlivier Houchard -------------------------------------------------------------------------------
10415144b0fSOlivier Houchard Routine to raise any or all of the software IEC/IEEE floating-point
10515144b0fSOlivier Houchard exception flags.
10615144b0fSOlivier Houchard -------------------------------------------------------------------------------
10715144b0fSOlivier Houchard */
10815144b0fSOlivier Houchard void float_raise( !!!int8 );
10915144b0fSOlivier Houchard 
11015144b0fSOlivier Houchard /*
11115144b0fSOlivier Houchard -------------------------------------------------------------------------------
11215144b0fSOlivier Houchard Software IEC/IEEE integer-to-floating-point conversion routines.
11315144b0fSOlivier Houchard -------------------------------------------------------------------------------
11415144b0fSOlivier Houchard */
11515144b0fSOlivier Houchard float32 int32_to_float32( !!!int32 );
11615144b0fSOlivier Houchard float64 int32_to_float64( !!!int32 );
11715144b0fSOlivier Houchard #ifdef FLOATX80
11815144b0fSOlivier Houchard floatx80 int32_to_floatx80( !!!int32 );
11915144b0fSOlivier Houchard #endif
12015144b0fSOlivier Houchard #ifdef FLOAT128
12115144b0fSOlivier Houchard float128 int32_to_float128( !!!int32 );
12215144b0fSOlivier Houchard #endif
12315144b0fSOlivier Houchard float32 int64_to_float32( !!!int64 );
12415144b0fSOlivier Houchard float64 int64_to_float64( !!!int64 );
12515144b0fSOlivier Houchard #ifdef FLOATX80
12615144b0fSOlivier Houchard floatx80 int64_to_floatx80( !!!int64 );
12715144b0fSOlivier Houchard #endif
12815144b0fSOlivier Houchard #ifdef FLOAT128
12915144b0fSOlivier Houchard float128 int64_to_float128( !!!int64 );
13015144b0fSOlivier Houchard #endif
13115144b0fSOlivier Houchard 
13215144b0fSOlivier Houchard /*
13315144b0fSOlivier Houchard -------------------------------------------------------------------------------
13415144b0fSOlivier Houchard Software IEC/IEEE single-precision conversion routines.
13515144b0fSOlivier Houchard -------------------------------------------------------------------------------
13615144b0fSOlivier Houchard */
13715144b0fSOlivier Houchard !!!int32 float32_to_int32( float32 );
13815144b0fSOlivier Houchard !!!int32 float32_to_int32_round_to_zero( float32 );
13915144b0fSOlivier Houchard !!!int64 float32_to_int64( float32 );
14015144b0fSOlivier Houchard !!!int64 float32_to_int64_round_to_zero( float32 );
14115144b0fSOlivier Houchard float64 float32_to_float64( float32 );
14215144b0fSOlivier Houchard #ifdef FLOATX80
14315144b0fSOlivier Houchard floatx80 float32_to_floatx80( float32 );
14415144b0fSOlivier Houchard #endif
14515144b0fSOlivier Houchard #ifdef FLOAT128
14615144b0fSOlivier Houchard float128 float32_to_float128( float32 );
14715144b0fSOlivier Houchard #endif
14815144b0fSOlivier Houchard 
14915144b0fSOlivier Houchard /*
15015144b0fSOlivier Houchard -------------------------------------------------------------------------------
15115144b0fSOlivier Houchard Software IEC/IEEE single-precision operations.
15215144b0fSOlivier Houchard -------------------------------------------------------------------------------
15315144b0fSOlivier Houchard */
15415144b0fSOlivier Houchard float32 float32_round_to_int( float32 );
15515144b0fSOlivier Houchard float32 float32_add( float32, float32 );
15615144b0fSOlivier Houchard float32 float32_sub( float32, float32 );
15715144b0fSOlivier Houchard float32 float32_mul( float32, float32 );
15815144b0fSOlivier Houchard float32 float32_div( float32, float32 );
15915144b0fSOlivier Houchard float32 float32_rem( float32, float32 );
16015144b0fSOlivier Houchard float32 float32_sqrt( float32 );
16115144b0fSOlivier Houchard !!!flag float32_eq( float32, float32 );
16215144b0fSOlivier Houchard !!!flag float32_le( float32, float32 );
16315144b0fSOlivier Houchard !!!flag float32_lt( float32, float32 );
16415144b0fSOlivier Houchard !!!flag float32_eq_signaling( float32, float32 );
16515144b0fSOlivier Houchard !!!flag float32_le_quiet( float32, float32 );
16615144b0fSOlivier Houchard !!!flag float32_lt_quiet( float32, float32 );
16715144b0fSOlivier Houchard !!!flag float32_is_signaling_nan( float32 );
16815144b0fSOlivier Houchard 
16915144b0fSOlivier Houchard /*
17015144b0fSOlivier Houchard -------------------------------------------------------------------------------
17115144b0fSOlivier Houchard Software IEC/IEEE double-precision conversion routines.
17215144b0fSOlivier Houchard -------------------------------------------------------------------------------
17315144b0fSOlivier Houchard */
17415144b0fSOlivier Houchard !!!int32 float64_to_int32( float64 );
17515144b0fSOlivier Houchard !!!int32 float64_to_int32_round_to_zero( float64 );
17615144b0fSOlivier Houchard !!!int64 float64_to_int64( float64 );
17715144b0fSOlivier Houchard !!!int64 float64_to_int64_round_to_zero( float64 );
17815144b0fSOlivier Houchard float32 float64_to_float32( float64 );
17915144b0fSOlivier Houchard #ifdef FLOATX80
18015144b0fSOlivier Houchard floatx80 float64_to_floatx80( float64 );
18115144b0fSOlivier Houchard #endif
18215144b0fSOlivier Houchard #ifdef FLOAT128
18315144b0fSOlivier Houchard float128 float64_to_float128( float64 );
18415144b0fSOlivier Houchard #endif
18515144b0fSOlivier Houchard 
18615144b0fSOlivier Houchard /*
18715144b0fSOlivier Houchard -------------------------------------------------------------------------------
18815144b0fSOlivier Houchard Software IEC/IEEE double-precision operations.
18915144b0fSOlivier Houchard -------------------------------------------------------------------------------
19015144b0fSOlivier Houchard */
19115144b0fSOlivier Houchard float64 float64_round_to_int( float64 );
19215144b0fSOlivier Houchard float64 float64_add( float64, float64 );
19315144b0fSOlivier Houchard float64 float64_sub( float64, float64 );
19415144b0fSOlivier Houchard float64 float64_mul( float64, float64 );
19515144b0fSOlivier Houchard float64 float64_div( float64, float64 );
19615144b0fSOlivier Houchard float64 float64_rem( float64, float64 );
19715144b0fSOlivier Houchard float64 float64_sqrt( float64 );
19815144b0fSOlivier Houchard !!!flag float64_eq( float64, float64 );
19915144b0fSOlivier Houchard !!!flag float64_le( float64, float64 );
20015144b0fSOlivier Houchard !!!flag float64_lt( float64, float64 );
20115144b0fSOlivier Houchard !!!flag float64_eq_signaling( float64, float64 );
20215144b0fSOlivier Houchard !!!flag float64_le_quiet( float64, float64 );
20315144b0fSOlivier Houchard !!!flag float64_lt_quiet( float64, float64 );
20415144b0fSOlivier Houchard !!!flag float64_is_signaling_nan( float64 );
20515144b0fSOlivier Houchard 
20615144b0fSOlivier Houchard #ifdef FLOATX80
20715144b0fSOlivier Houchard 
20815144b0fSOlivier Houchard /*
20915144b0fSOlivier Houchard -------------------------------------------------------------------------------
21015144b0fSOlivier Houchard Software IEC/IEEE extended double-precision conversion routines.
21115144b0fSOlivier Houchard -------------------------------------------------------------------------------
21215144b0fSOlivier Houchard */
21315144b0fSOlivier Houchard !!!int32 floatx80_to_int32( floatx80 );
21415144b0fSOlivier Houchard !!!int32 floatx80_to_int32_round_to_zero( floatx80 );
21515144b0fSOlivier Houchard !!!int64 floatx80_to_int64( floatx80 );
21615144b0fSOlivier Houchard !!!int64 floatx80_to_int64_round_to_zero( floatx80 );
21715144b0fSOlivier Houchard float32 floatx80_to_float32( floatx80 );
21815144b0fSOlivier Houchard float64 floatx80_to_float64( floatx80 );
21915144b0fSOlivier Houchard #ifdef FLOAT128
22015144b0fSOlivier Houchard float128 floatx80_to_float128( floatx80 );
22115144b0fSOlivier Houchard #endif
22215144b0fSOlivier Houchard 
22315144b0fSOlivier Houchard /*
22415144b0fSOlivier Houchard -------------------------------------------------------------------------------
22515144b0fSOlivier Houchard Software IEC/IEEE extended double-precision rounding precision.  Valid
22615144b0fSOlivier Houchard values are 32, 64, and 80.
22715144b0fSOlivier Houchard -------------------------------------------------------------------------------
22815144b0fSOlivier Houchard */
22915144b0fSOlivier Houchard extern !!!int8 floatx80_rounding_precision;
23015144b0fSOlivier Houchard 
23115144b0fSOlivier Houchard /*
23215144b0fSOlivier Houchard -------------------------------------------------------------------------------
23315144b0fSOlivier Houchard Software IEC/IEEE extended double-precision operations.
23415144b0fSOlivier Houchard -------------------------------------------------------------------------------
23515144b0fSOlivier Houchard */
23615144b0fSOlivier Houchard floatx80 floatx80_round_to_int( floatx80 );
23715144b0fSOlivier Houchard floatx80 floatx80_add( floatx80, floatx80 );
23815144b0fSOlivier Houchard floatx80 floatx80_sub( floatx80, floatx80 );
23915144b0fSOlivier Houchard floatx80 floatx80_mul( floatx80, floatx80 );
24015144b0fSOlivier Houchard floatx80 floatx80_div( floatx80, floatx80 );
24115144b0fSOlivier Houchard floatx80 floatx80_rem( floatx80, floatx80 );
24215144b0fSOlivier Houchard floatx80 floatx80_sqrt( floatx80 );
24315144b0fSOlivier Houchard !!!flag floatx80_eq( floatx80, floatx80 );
24415144b0fSOlivier Houchard !!!flag floatx80_le( floatx80, floatx80 );
24515144b0fSOlivier Houchard !!!flag floatx80_lt( floatx80, floatx80 );
24615144b0fSOlivier Houchard !!!flag floatx80_eq_signaling( floatx80, floatx80 );
24715144b0fSOlivier Houchard !!!flag floatx80_le_quiet( floatx80, floatx80 );
24815144b0fSOlivier Houchard !!!flag floatx80_lt_quiet( floatx80, floatx80 );
24915144b0fSOlivier Houchard !!!flag floatx80_is_signaling_nan( floatx80 );
25015144b0fSOlivier Houchard 
25115144b0fSOlivier Houchard #endif
25215144b0fSOlivier Houchard 
25315144b0fSOlivier Houchard #ifdef FLOAT128
25415144b0fSOlivier Houchard 
25515144b0fSOlivier Houchard /*
25615144b0fSOlivier Houchard -------------------------------------------------------------------------------
25715144b0fSOlivier Houchard Software IEC/IEEE quadruple-precision conversion routines.
25815144b0fSOlivier Houchard -------------------------------------------------------------------------------
25915144b0fSOlivier Houchard */
26015144b0fSOlivier Houchard !!!int32 float128_to_int32( float128 );
26115144b0fSOlivier Houchard !!!int32 float128_to_int32_round_to_zero( float128 );
26215144b0fSOlivier Houchard !!!int64 float128_to_int64( float128 );
26315144b0fSOlivier Houchard !!!int64 float128_to_int64_round_to_zero( float128 );
26415144b0fSOlivier Houchard float32 float128_to_float32( float128 );
26515144b0fSOlivier Houchard float64 float128_to_float64( float128 );
26615144b0fSOlivier Houchard #ifdef FLOATX80
26715144b0fSOlivier Houchard floatx80 float128_to_floatx80( float128 );
26815144b0fSOlivier Houchard #endif
26915144b0fSOlivier Houchard 
27015144b0fSOlivier Houchard /*
27115144b0fSOlivier Houchard -------------------------------------------------------------------------------
27215144b0fSOlivier Houchard Software IEC/IEEE quadruple-precision operations.
27315144b0fSOlivier Houchard -------------------------------------------------------------------------------
27415144b0fSOlivier Houchard */
27515144b0fSOlivier Houchard float128 float128_round_to_int( float128 );
27615144b0fSOlivier Houchard float128 float128_add( float128, float128 );
27715144b0fSOlivier Houchard float128 float128_sub( float128, float128 );
27815144b0fSOlivier Houchard float128 float128_mul( float128, float128 );
27915144b0fSOlivier Houchard float128 float128_div( float128, float128 );
28015144b0fSOlivier Houchard float128 float128_rem( float128, float128 );
28115144b0fSOlivier Houchard float128 float128_sqrt( float128 );
28215144b0fSOlivier Houchard !!!flag float128_eq( float128, float128 );
28315144b0fSOlivier Houchard !!!flag float128_le( float128, float128 );
28415144b0fSOlivier Houchard !!!flag float128_lt( float128, float128 );
28515144b0fSOlivier Houchard !!!flag float128_eq_signaling( float128, float128 );
28615144b0fSOlivier Houchard !!!flag float128_le_quiet( float128, float128 );
28715144b0fSOlivier Houchard !!!flag float128_lt_quiet( float128, float128 );
28815144b0fSOlivier Houchard !!!flag float128_is_signaling_nan( float128 );
28915144b0fSOlivier Houchard 
29015144b0fSOlivier Houchard #endif
29115144b0fSOlivier Houchard 
292