1840b91ccSNathan Whitehorn /* $NetBSD: softfloat.h,v 1.6 2002/05/12 13:12:46 bjh21 Exp $ */ 2840b91ccSNathan Whitehorn 3840b91ccSNathan Whitehorn /* This is a derivative work. */ 4840b91ccSNathan Whitehorn 5840b91ccSNathan Whitehorn /* 6840b91ccSNathan Whitehorn =============================================================================== 7840b91ccSNathan Whitehorn 8840b91ccSNathan Whitehorn This C header file is part of the SoftFloat IEC/IEEE Floating-point 9840b91ccSNathan Whitehorn Arithmetic Package, Release 2a. 10840b91ccSNathan Whitehorn 11840b91ccSNathan Whitehorn Written by John R. Hauser. This work was made possible in part by the 12840b91ccSNathan Whitehorn International Computer Science Institute, located at Suite 600, 1947 Center 13840b91ccSNathan Whitehorn Street, Berkeley, California 94704. Funding was partially provided by the 14840b91ccSNathan Whitehorn National Science Foundation under grant MIP-9311980. The original version 15840b91ccSNathan Whitehorn of this code was written as part of a project to build a fixed-point vector 16840b91ccSNathan Whitehorn processor in collaboration with the University of California at Berkeley, 17840b91ccSNathan Whitehorn overseen by Profs. Nelson Morgan and John Wawrzynek. More information 18840b91ccSNathan Whitehorn is available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/ 19840b91ccSNathan Whitehorn arithmetic/SoftFloat.html'. 20840b91ccSNathan Whitehorn 21840b91ccSNathan Whitehorn THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort 22840b91ccSNathan Whitehorn has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT 23840b91ccSNathan Whitehorn TIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO 24840b91ccSNathan Whitehorn PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY 25840b91ccSNathan Whitehorn AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE. 26840b91ccSNathan Whitehorn 27840b91ccSNathan Whitehorn Derivative works are acceptable, even for commercial purposes, so long as 28840b91ccSNathan Whitehorn (1) they include prominent notice that the work is derivative, and (2) they 29840b91ccSNathan Whitehorn include prominent notice akin to these four paragraphs for those parts of 30840b91ccSNathan Whitehorn this code that are retained. 31840b91ccSNathan Whitehorn 32840b91ccSNathan Whitehorn =============================================================================== 33840b91ccSNathan Whitehorn */ 34840b91ccSNathan Whitehorn 35840b91ccSNathan Whitehorn /* 36840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 37840b91ccSNathan Whitehorn The macro `FLOATX80' must be defined to enable the extended double-precision 38840b91ccSNathan Whitehorn floating-point format `floatx80'. If this macro is not defined, the 39840b91ccSNathan Whitehorn `floatx80' type will not be defined, and none of the functions that either 40840b91ccSNathan Whitehorn input or output the `floatx80' type will be defined. The same applies to 41840b91ccSNathan Whitehorn the `FLOAT128' macro and the quadruple-precision format `float128'. 42840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 43840b91ccSNathan Whitehorn */ 44840b91ccSNathan Whitehorn /* #define FLOATX80 */ 45840b91ccSNathan Whitehorn /* #define FLOAT128 */ 46840b91ccSNathan Whitehorn 47840b91ccSNathan Whitehorn #include <machine/ieeefp.h> 48840b91ccSNathan Whitehorn 49840b91ccSNathan Whitehorn /* 50840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 51840b91ccSNathan Whitehorn Software IEC/IEEE floating-point types. 52840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 53840b91ccSNathan Whitehorn */ 54840b91ccSNathan Whitehorn typedef unsigned int float32; 55840b91ccSNathan Whitehorn typedef unsigned long long float64; 56840b91ccSNathan Whitehorn #ifdef FLOATX80 57840b91ccSNathan Whitehorn typedef struct { 58840b91ccSNathan Whitehorn unsigned short high; 59840b91ccSNathan Whitehorn unsigned long long low; 60840b91ccSNathan Whitehorn } floatx80; 61840b91ccSNathan Whitehorn #endif 62840b91ccSNathan Whitehorn #ifdef FLOAT128 63840b91ccSNathan Whitehorn typedef struct { 64840b91ccSNathan Whitehorn unsigned long long high, low; 65840b91ccSNathan Whitehorn } float128; 66840b91ccSNathan Whitehorn #endif 67840b91ccSNathan Whitehorn 68840b91ccSNathan Whitehorn /* 69840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 70840b91ccSNathan Whitehorn Software IEC/IEEE floating-point underflow tininess-detection mode. 71840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 72840b91ccSNathan Whitehorn */ 73840b91ccSNathan Whitehorn #ifndef SOFTFLOAT_FOR_GCC 74840b91ccSNathan Whitehorn extern int8 float_detect_tininess; 75840b91ccSNathan Whitehorn #endif 76840b91ccSNathan Whitehorn enum { 77840b91ccSNathan Whitehorn float_tininess_after_rounding = 0, 78840b91ccSNathan Whitehorn float_tininess_before_rounding = 1 79840b91ccSNathan Whitehorn }; 80840b91ccSNathan Whitehorn 81840b91ccSNathan Whitehorn /* 82840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 83840b91ccSNathan Whitehorn Software IEC/IEEE floating-point rounding mode. 84840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 85840b91ccSNathan Whitehorn */ 86840b91ccSNathan Whitehorn extern fp_rnd_t float_rounding_mode; 87840b91ccSNathan Whitehorn enum { 88840b91ccSNathan Whitehorn float_round_nearest_even = FP_RN, 89840b91ccSNathan Whitehorn float_round_to_zero = FP_RZ, 90840b91ccSNathan Whitehorn float_round_down = FP_RM, 91840b91ccSNathan Whitehorn float_round_up = FP_RP 92840b91ccSNathan Whitehorn }; 93840b91ccSNathan Whitehorn 94840b91ccSNathan Whitehorn /* 95840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 96840b91ccSNathan Whitehorn Software IEC/IEEE floating-point exception flags. 97840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 98840b91ccSNathan Whitehorn */ 99840b91ccSNathan Whitehorn typedef fp_except_t fp_except; 100840b91ccSNathan Whitehorn 101840b91ccSNathan Whitehorn extern fp_except float_exception_flags; 102840b91ccSNathan Whitehorn extern fp_except float_exception_mask; 103840b91ccSNathan Whitehorn enum { 104840b91ccSNathan Whitehorn float_flag_inexact = FP_X_IMP, 105840b91ccSNathan Whitehorn float_flag_underflow = FP_X_UFL, 106840b91ccSNathan Whitehorn float_flag_overflow = FP_X_OFL, 107840b91ccSNathan Whitehorn float_flag_divbyzero = FP_X_DZ, 108840b91ccSNathan Whitehorn float_flag_invalid = FP_X_INV 109840b91ccSNathan Whitehorn }; 110840b91ccSNathan Whitehorn 111840b91ccSNathan Whitehorn /* 112840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 113840b91ccSNathan Whitehorn Routine to raise any or all of the software IEC/IEEE floating-point 114840b91ccSNathan Whitehorn exception flags. 115840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 116840b91ccSNathan Whitehorn */ 117840b91ccSNathan Whitehorn void float_raise( fp_except ); 118840b91ccSNathan Whitehorn 119840b91ccSNathan Whitehorn /* 120840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 121840b91ccSNathan Whitehorn Software IEC/IEEE integer-to-floating-point conversion routines. 122840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 123840b91ccSNathan Whitehorn */ 124840b91ccSNathan Whitehorn float32 int32_to_float32( int ); 125840b91ccSNathan Whitehorn float64 int32_to_float64( int ); 126840b91ccSNathan Whitehorn #ifdef FLOATX80 127840b91ccSNathan Whitehorn floatx80 int32_to_floatx80( int ); 128840b91ccSNathan Whitehorn #endif 129840b91ccSNathan Whitehorn #ifdef FLOAT128 130840b91ccSNathan Whitehorn float128 int32_to_float128( int ); 131840b91ccSNathan Whitehorn #endif 132840b91ccSNathan Whitehorn float32 int64_to_float32( long long ); 133840b91ccSNathan Whitehorn float64 int64_to_float64( long long ); 134840b91ccSNathan Whitehorn #ifdef FLOATX80 135840b91ccSNathan Whitehorn floatx80 int64_to_floatx80( long long ); 136840b91ccSNathan Whitehorn #endif 137840b91ccSNathan Whitehorn #ifdef FLOAT128 138840b91ccSNathan Whitehorn float128 int64_to_float128( long long ); 139840b91ccSNathan Whitehorn #endif 140840b91ccSNathan Whitehorn 141840b91ccSNathan Whitehorn /* 142840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 143840b91ccSNathan Whitehorn Software IEC/IEEE single-precision conversion routines. 144840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 145840b91ccSNathan Whitehorn */ 146840b91ccSNathan Whitehorn int float32_to_int32( float32 ); 147840b91ccSNathan Whitehorn int float32_to_int32_round_to_zero( float32 ); 148840b91ccSNathan Whitehorn unsigned int float32_to_uint32_round_to_zero( float32 ); 149840b91ccSNathan Whitehorn long long float32_to_int64( float32 ); 150840b91ccSNathan Whitehorn long long float32_to_int64_round_to_zero( float32 ); 151840b91ccSNathan Whitehorn float64 float32_to_float64( float32 ); 152840b91ccSNathan Whitehorn #ifdef FLOATX80 153840b91ccSNathan Whitehorn floatx80 float32_to_floatx80( float32 ); 154840b91ccSNathan Whitehorn #endif 155840b91ccSNathan Whitehorn #ifdef FLOAT128 156840b91ccSNathan Whitehorn float128 float32_to_float128( float32 ); 157840b91ccSNathan Whitehorn #endif 158840b91ccSNathan Whitehorn 159840b91ccSNathan Whitehorn /* 160840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 161840b91ccSNathan Whitehorn Software IEC/IEEE single-precision operations. 162840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 163840b91ccSNathan Whitehorn */ 164840b91ccSNathan Whitehorn float32 float32_round_to_int( float32 ); 165840b91ccSNathan Whitehorn float32 float32_add( float32, float32 ); 166840b91ccSNathan Whitehorn float32 float32_sub( float32, float32 ); 167840b91ccSNathan Whitehorn float32 float32_mul( float32, float32 ); 168840b91ccSNathan Whitehorn float32 float32_div( float32, float32 ); 169840b91ccSNathan Whitehorn float32 float32_rem( float32, float32 ); 170840b91ccSNathan Whitehorn float32 float32_sqrt( float32 ); 171840b91ccSNathan Whitehorn int float32_eq( float32, float32 ); 172840b91ccSNathan Whitehorn int float32_le( float32, float32 ); 173840b91ccSNathan Whitehorn int float32_lt( float32, float32 ); 174840b91ccSNathan Whitehorn int float32_eq_signaling( float32, float32 ); 175840b91ccSNathan Whitehorn int float32_le_quiet( float32, float32 ); 176840b91ccSNathan Whitehorn int float32_lt_quiet( float32, float32 ); 177840b91ccSNathan Whitehorn #ifndef SOFTFLOAT_FOR_GCC 178840b91ccSNathan Whitehorn int float32_is_signaling_nan( float32 ); 179840b91ccSNathan Whitehorn #endif 180840b91ccSNathan Whitehorn 181840b91ccSNathan Whitehorn /* 182840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 183840b91ccSNathan Whitehorn Software IEC/IEEE double-precision conversion routines. 184840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 185840b91ccSNathan Whitehorn */ 186840b91ccSNathan Whitehorn int float64_to_int32( float64 ); 187840b91ccSNathan Whitehorn int float64_to_int32_round_to_zero( float64 ); 188840b91ccSNathan Whitehorn unsigned int float64_to_uint32_round_to_zero( float64 ); 189840b91ccSNathan Whitehorn long long float64_to_int64( float64 ); 190840b91ccSNathan Whitehorn long long float64_to_int64_round_to_zero( float64 ); 191840b91ccSNathan Whitehorn float32 float64_to_float32( float64 ); 192840b91ccSNathan Whitehorn #ifdef FLOATX80 193840b91ccSNathan Whitehorn floatx80 float64_to_floatx80( float64 ); 194840b91ccSNathan Whitehorn #endif 195840b91ccSNathan Whitehorn #ifdef FLOAT128 196840b91ccSNathan Whitehorn float128 float64_to_float128( float64 ); 197840b91ccSNathan Whitehorn #endif 198840b91ccSNathan Whitehorn 199840b91ccSNathan Whitehorn /* 200840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 201840b91ccSNathan Whitehorn Software IEC/IEEE double-precision operations. 202840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 203840b91ccSNathan Whitehorn */ 204840b91ccSNathan Whitehorn float64 float64_round_to_int( float64 ); 205840b91ccSNathan Whitehorn float64 float64_add( float64, float64 ); 206840b91ccSNathan Whitehorn float64 float64_sub( float64, float64 ); 207840b91ccSNathan Whitehorn float64 float64_mul( float64, float64 ); 208840b91ccSNathan Whitehorn float64 float64_div( float64, float64 ); 209840b91ccSNathan Whitehorn float64 float64_rem( float64, float64 ); 210840b91ccSNathan Whitehorn float64 float64_sqrt( float64 ); 211840b91ccSNathan Whitehorn int float64_eq( float64, float64 ); 212840b91ccSNathan Whitehorn int float64_le( float64, float64 ); 213840b91ccSNathan Whitehorn int float64_lt( float64, float64 ); 214840b91ccSNathan Whitehorn int float64_eq_signaling( float64, float64 ); 215840b91ccSNathan Whitehorn int float64_le_quiet( float64, float64 ); 216840b91ccSNathan Whitehorn int float64_lt_quiet( float64, float64 ); 217840b91ccSNathan Whitehorn #ifndef SOFTFLOAT_FOR_GCC 218840b91ccSNathan Whitehorn int float64_is_signaling_nan( float64 ); 219840b91ccSNathan Whitehorn #endif 220840b91ccSNathan Whitehorn 221840b91ccSNathan Whitehorn #ifdef FLOATX80 222840b91ccSNathan Whitehorn 223840b91ccSNathan Whitehorn /* 224840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 225840b91ccSNathan Whitehorn Software IEC/IEEE extended double-precision conversion routines. 226840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 227840b91ccSNathan Whitehorn */ 228840b91ccSNathan Whitehorn int floatx80_to_int32( floatx80 ); 229840b91ccSNathan Whitehorn int floatx80_to_int32_round_to_zero( floatx80 ); 230840b91ccSNathan Whitehorn long long floatx80_to_int64( floatx80 ); 231840b91ccSNathan Whitehorn long long floatx80_to_int64_round_to_zero( floatx80 ); 232840b91ccSNathan Whitehorn float32 floatx80_to_float32( floatx80 ); 233840b91ccSNathan Whitehorn float64 floatx80_to_float64( floatx80 ); 234840b91ccSNathan Whitehorn #ifdef FLOAT128 235840b91ccSNathan Whitehorn float128 floatx80_to_float128( floatx80 ); 236840b91ccSNathan Whitehorn #endif 237840b91ccSNathan Whitehorn 238840b91ccSNathan Whitehorn /* 239840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 240840b91ccSNathan Whitehorn Software IEC/IEEE extended double-precision rounding precision. Valid 241840b91ccSNathan Whitehorn values are 32, 64, and 80. 242840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 243840b91ccSNathan Whitehorn */ 244840b91ccSNathan Whitehorn extern int floatx80_rounding_precision; 245840b91ccSNathan Whitehorn 246840b91ccSNathan Whitehorn /* 247840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 248840b91ccSNathan Whitehorn Software IEC/IEEE extended double-precision operations. 249840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 250840b91ccSNathan Whitehorn */ 251840b91ccSNathan Whitehorn floatx80 floatx80_round_to_int( floatx80 ); 252840b91ccSNathan Whitehorn floatx80 floatx80_add( floatx80, floatx80 ); 253840b91ccSNathan Whitehorn floatx80 floatx80_sub( floatx80, floatx80 ); 254840b91ccSNathan Whitehorn floatx80 floatx80_mul( floatx80, floatx80 ); 255840b91ccSNathan Whitehorn floatx80 floatx80_div( floatx80, floatx80 ); 256840b91ccSNathan Whitehorn floatx80 floatx80_rem( floatx80, floatx80 ); 257840b91ccSNathan Whitehorn floatx80 floatx80_sqrt( floatx80 ); 258840b91ccSNathan Whitehorn int floatx80_eq( floatx80, floatx80 ); 259840b91ccSNathan Whitehorn int floatx80_le( floatx80, floatx80 ); 260840b91ccSNathan Whitehorn int floatx80_lt( floatx80, floatx80 ); 261840b91ccSNathan Whitehorn int floatx80_eq_signaling( floatx80, floatx80 ); 262840b91ccSNathan Whitehorn int floatx80_le_quiet( floatx80, floatx80 ); 263840b91ccSNathan Whitehorn int floatx80_lt_quiet( floatx80, floatx80 ); 264840b91ccSNathan Whitehorn int floatx80_is_signaling_nan( floatx80 ); 265840b91ccSNathan Whitehorn 266840b91ccSNathan Whitehorn #endif 267840b91ccSNathan Whitehorn 268840b91ccSNathan Whitehorn #ifdef FLOAT128 269840b91ccSNathan Whitehorn 270840b91ccSNathan Whitehorn /* 271840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 272840b91ccSNathan Whitehorn Software IEC/IEEE quadruple-precision conversion routines. 273840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 274840b91ccSNathan Whitehorn */ 275840b91ccSNathan Whitehorn int float128_to_int32( float128 ); 276840b91ccSNathan Whitehorn int float128_to_int32_round_to_zero( float128 ); 277840b91ccSNathan Whitehorn long long float128_to_int64( float128 ); 278840b91ccSNathan Whitehorn long long float128_to_int64_round_to_zero( float128 ); 279840b91ccSNathan Whitehorn float32 float128_to_float32( float128 ); 280840b91ccSNathan Whitehorn float64 float128_to_float64( float128 ); 281840b91ccSNathan Whitehorn #ifdef FLOATX80 282840b91ccSNathan Whitehorn floatx80 float128_to_floatx80( float128 ); 283840b91ccSNathan Whitehorn #endif 284840b91ccSNathan Whitehorn 285840b91ccSNathan Whitehorn /* 286840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 287840b91ccSNathan Whitehorn Software IEC/IEEE quadruple-precision operations. 288840b91ccSNathan Whitehorn ------------------------------------------------------------------------------- 289840b91ccSNathan Whitehorn */ 290840b91ccSNathan Whitehorn float128 float128_round_to_int( float128 ); 291840b91ccSNathan Whitehorn float128 float128_add( float128, float128 ); 292840b91ccSNathan Whitehorn float128 float128_sub( float128, float128 ); 293840b91ccSNathan Whitehorn float128 float128_mul( float128, float128 ); 294840b91ccSNathan Whitehorn float128 float128_div( float128, float128 ); 295840b91ccSNathan Whitehorn float128 float128_rem( float128, float128 ); 296840b91ccSNathan Whitehorn float128 float128_sqrt( float128 ); 297840b91ccSNathan Whitehorn int float128_eq( float128, float128 ); 298840b91ccSNathan Whitehorn int float128_le( float128, float128 ); 299840b91ccSNathan Whitehorn int float128_lt( float128, float128 ); 300840b91ccSNathan Whitehorn int float128_eq_signaling( float128, float128 ); 301840b91ccSNathan Whitehorn int float128_le_quiet( float128, float128 ); 302840b91ccSNathan Whitehorn int float128_lt_quiet( float128, float128 ); 303840b91ccSNathan Whitehorn int float128_is_signaling_nan( float128 ); 304840b91ccSNathan Whitehorn 305840b91ccSNathan Whitehorn #endif 306840b91ccSNathan Whitehorn 307