1*dc9b124dSJustin Hibbits /* $NetBSD: softfloat.h,v 1.6 2002/05/12 13:12:46 bjh21 Exp $ */ 2*dc9b124dSJustin Hibbits /* $FreeBSD$ */ 3*dc9b124dSJustin Hibbits 4*dc9b124dSJustin Hibbits /* This is a derivative work. */ 5*dc9b124dSJustin Hibbits 6*dc9b124dSJustin Hibbits /* 7*dc9b124dSJustin Hibbits =============================================================================== 8*dc9b124dSJustin Hibbits 9*dc9b124dSJustin Hibbits This C header file is part of the SoftFloat IEC/IEEE Floating-point 10*dc9b124dSJustin Hibbits Arithmetic Package, Release 2a. 11*dc9b124dSJustin Hibbits 12*dc9b124dSJustin Hibbits Written by John R. Hauser. This work was made possible in part by the 13*dc9b124dSJustin Hibbits International Computer Science Institute, located at Suite 600, 1947 Center 14*dc9b124dSJustin Hibbits Street, Berkeley, California 94704. Funding was partially provided by the 15*dc9b124dSJustin Hibbits National Science Foundation under grant MIP-9311980. The original version 16*dc9b124dSJustin Hibbits of this code was written as part of a project to build a fixed-point vector 17*dc9b124dSJustin Hibbits processor in collaboration with the University of California at Berkeley, 18*dc9b124dSJustin Hibbits overseen by Profs. Nelson Morgan and John Wawrzynek. More information 19*dc9b124dSJustin Hibbits is available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/ 20*dc9b124dSJustin Hibbits arithmetic/SoftFloat.html'. 21*dc9b124dSJustin Hibbits 22*dc9b124dSJustin Hibbits THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort 23*dc9b124dSJustin Hibbits has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT 24*dc9b124dSJustin Hibbits TIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO 25*dc9b124dSJustin Hibbits PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY 26*dc9b124dSJustin Hibbits AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE. 27*dc9b124dSJustin Hibbits 28*dc9b124dSJustin Hibbits Derivative works are acceptable, even for commercial purposes, so long as 29*dc9b124dSJustin Hibbits (1) they include prominent notice that the work is derivative, and (2) they 30*dc9b124dSJustin Hibbits include prominent notice akin to these four paragraphs for those parts of 31*dc9b124dSJustin Hibbits this code that are retained. 32*dc9b124dSJustin Hibbits 33*dc9b124dSJustin Hibbits =============================================================================== 34*dc9b124dSJustin Hibbits */ 35*dc9b124dSJustin Hibbits 36*dc9b124dSJustin Hibbits /* 37*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 38*dc9b124dSJustin Hibbits The macro `FLOATX80' must be defined to enable the extended double-precision 39*dc9b124dSJustin Hibbits floating-point format `floatx80'. If this macro is not defined, the 40*dc9b124dSJustin Hibbits `floatx80' type will not be defined, and none of the functions that either 41*dc9b124dSJustin Hibbits input or output the `floatx80' type will be defined. The same applies to 42*dc9b124dSJustin Hibbits the `FLOAT128' macro and the quadruple-precision format `float128'. 43*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 44*dc9b124dSJustin Hibbits */ 45*dc9b124dSJustin Hibbits /* #define FLOATX80 */ 46*dc9b124dSJustin Hibbits /* #define FLOAT128 */ 47*dc9b124dSJustin Hibbits 48*dc9b124dSJustin Hibbits #include <machine/ieeefp.h> 49*dc9b124dSJustin Hibbits 50*dc9b124dSJustin Hibbits /* 51*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 52*dc9b124dSJustin Hibbits Software IEC/IEEE floating-point types. 53*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 54*dc9b124dSJustin Hibbits */ 55*dc9b124dSJustin Hibbits typedef unsigned int float32; 56*dc9b124dSJustin Hibbits typedef unsigned long long float64; 57*dc9b124dSJustin Hibbits #ifdef FLOATX80 58*dc9b124dSJustin Hibbits typedef struct { 59*dc9b124dSJustin Hibbits unsigned short high; 60*dc9b124dSJustin Hibbits unsigned long long low; 61*dc9b124dSJustin Hibbits } floatx80; 62*dc9b124dSJustin Hibbits #endif 63*dc9b124dSJustin Hibbits #ifdef FLOAT128 64*dc9b124dSJustin Hibbits typedef struct { 65*dc9b124dSJustin Hibbits unsigned long long high, low; 66*dc9b124dSJustin Hibbits } float128; 67*dc9b124dSJustin Hibbits #endif 68*dc9b124dSJustin Hibbits 69*dc9b124dSJustin Hibbits /* 70*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 71*dc9b124dSJustin Hibbits Software IEC/IEEE floating-point underflow tininess-detection mode. 72*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 73*dc9b124dSJustin Hibbits */ 74*dc9b124dSJustin Hibbits #ifndef SOFTFLOAT_FOR_GCC 75*dc9b124dSJustin Hibbits extern int8 float_detect_tininess; 76*dc9b124dSJustin Hibbits #endif 77*dc9b124dSJustin Hibbits enum { 78*dc9b124dSJustin Hibbits float_tininess_after_rounding = 0, 79*dc9b124dSJustin Hibbits float_tininess_before_rounding = 1 80*dc9b124dSJustin Hibbits }; 81*dc9b124dSJustin Hibbits 82*dc9b124dSJustin Hibbits /* 83*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 84*dc9b124dSJustin Hibbits Software IEC/IEEE floating-point rounding mode. 85*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 86*dc9b124dSJustin Hibbits */ 87*dc9b124dSJustin Hibbits extern fp_rnd_t float_rounding_mode; 88*dc9b124dSJustin Hibbits enum { 89*dc9b124dSJustin Hibbits float_round_nearest_even = FP_RN, 90*dc9b124dSJustin Hibbits float_round_to_zero = FP_RZ, 91*dc9b124dSJustin Hibbits float_round_down = FP_RM, 92*dc9b124dSJustin Hibbits float_round_up = FP_RP 93*dc9b124dSJustin Hibbits }; 94*dc9b124dSJustin Hibbits 95*dc9b124dSJustin Hibbits /* 96*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 97*dc9b124dSJustin Hibbits Software IEC/IEEE floating-point exception flags. 98*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 99*dc9b124dSJustin Hibbits */ 100*dc9b124dSJustin Hibbits typedef fp_except_t fp_except; 101*dc9b124dSJustin Hibbits 102*dc9b124dSJustin Hibbits extern fp_except float_exception_flags; 103*dc9b124dSJustin Hibbits extern fp_except float_exception_mask; 104*dc9b124dSJustin Hibbits enum { 105*dc9b124dSJustin Hibbits float_flag_inexact = FP_X_IMP, 106*dc9b124dSJustin Hibbits float_flag_underflow = FP_X_UFL, 107*dc9b124dSJustin Hibbits float_flag_overflow = FP_X_OFL, 108*dc9b124dSJustin Hibbits float_flag_divbyzero = FP_X_DZ, 109*dc9b124dSJustin Hibbits float_flag_invalid = FP_X_INV 110*dc9b124dSJustin Hibbits }; 111*dc9b124dSJustin Hibbits 112*dc9b124dSJustin Hibbits /* 113*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 114*dc9b124dSJustin Hibbits Routine to raise any or all of the software IEC/IEEE floating-point 115*dc9b124dSJustin Hibbits exception flags. 116*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 117*dc9b124dSJustin Hibbits */ 118*dc9b124dSJustin Hibbits void float_raise( fp_except ); 119*dc9b124dSJustin Hibbits 120*dc9b124dSJustin Hibbits /* 121*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 122*dc9b124dSJustin Hibbits Software IEC/IEEE integer-to-floating-point conversion routines. 123*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 124*dc9b124dSJustin Hibbits */ 125*dc9b124dSJustin Hibbits float32 int32_to_float32( int ); 126*dc9b124dSJustin Hibbits float64 int32_to_float64( int ); 127*dc9b124dSJustin Hibbits #ifdef FLOATX80 128*dc9b124dSJustin Hibbits floatx80 int32_to_floatx80( int ); 129*dc9b124dSJustin Hibbits #endif 130*dc9b124dSJustin Hibbits #ifdef FLOAT128 131*dc9b124dSJustin Hibbits float128 int32_to_float128( int ); 132*dc9b124dSJustin Hibbits #endif 133*dc9b124dSJustin Hibbits float32 int64_to_float32( long long ); 134*dc9b124dSJustin Hibbits float64 int64_to_float64( long long ); 135*dc9b124dSJustin Hibbits #ifdef FLOATX80 136*dc9b124dSJustin Hibbits floatx80 int64_to_floatx80( long long ); 137*dc9b124dSJustin Hibbits #endif 138*dc9b124dSJustin Hibbits #ifdef FLOAT128 139*dc9b124dSJustin Hibbits float128 int64_to_float128( long long ); 140*dc9b124dSJustin Hibbits #endif 141*dc9b124dSJustin Hibbits 142*dc9b124dSJustin Hibbits /* 143*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 144*dc9b124dSJustin Hibbits Software IEC/IEEE single-precision conversion routines. 145*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 146*dc9b124dSJustin Hibbits */ 147*dc9b124dSJustin Hibbits int float32_to_int32( float32 ); 148*dc9b124dSJustin Hibbits int float32_to_int32_round_to_zero( float32 ); 149*dc9b124dSJustin Hibbits unsigned int float32_to_uint32_round_to_zero( float32 ); 150*dc9b124dSJustin Hibbits long long float32_to_int64( float32 ); 151*dc9b124dSJustin Hibbits long long float32_to_int64_round_to_zero( float32 ); 152*dc9b124dSJustin Hibbits float64 float32_to_float64( float32 ); 153*dc9b124dSJustin Hibbits #ifdef FLOATX80 154*dc9b124dSJustin Hibbits floatx80 float32_to_floatx80( float32 ); 155*dc9b124dSJustin Hibbits #endif 156*dc9b124dSJustin Hibbits #ifdef FLOAT128 157*dc9b124dSJustin Hibbits float128 float32_to_float128( float32 ); 158*dc9b124dSJustin Hibbits #endif 159*dc9b124dSJustin Hibbits 160*dc9b124dSJustin Hibbits /* 161*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 162*dc9b124dSJustin Hibbits Software IEC/IEEE single-precision operations. 163*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 164*dc9b124dSJustin Hibbits */ 165*dc9b124dSJustin Hibbits float32 float32_round_to_int( float32 ); 166*dc9b124dSJustin Hibbits float32 float32_add( float32, float32 ); 167*dc9b124dSJustin Hibbits float32 float32_sub( float32, float32 ); 168*dc9b124dSJustin Hibbits float32 float32_mul( float32, float32 ); 169*dc9b124dSJustin Hibbits float32 float32_div( float32, float32 ); 170*dc9b124dSJustin Hibbits float32 float32_rem( float32, float32 ); 171*dc9b124dSJustin Hibbits float32 float32_sqrt( float32 ); 172*dc9b124dSJustin Hibbits int float32_eq( float32, float32 ); 173*dc9b124dSJustin Hibbits int float32_le( float32, float32 ); 174*dc9b124dSJustin Hibbits int float32_lt( float32, float32 ); 175*dc9b124dSJustin Hibbits int float32_eq_signaling( float32, float32 ); 176*dc9b124dSJustin Hibbits int float32_le_quiet( float32, float32 ); 177*dc9b124dSJustin Hibbits int float32_lt_quiet( float32, float32 ); 178*dc9b124dSJustin Hibbits #ifndef SOFTFLOAT_FOR_GCC 179*dc9b124dSJustin Hibbits int float32_is_signaling_nan( float32 ); 180*dc9b124dSJustin Hibbits #endif 181*dc9b124dSJustin Hibbits 182*dc9b124dSJustin Hibbits /* 183*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 184*dc9b124dSJustin Hibbits Software IEC/IEEE double-precision conversion routines. 185*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 186*dc9b124dSJustin Hibbits */ 187*dc9b124dSJustin Hibbits int float64_to_int32( float64 ); 188*dc9b124dSJustin Hibbits int float64_to_int32_round_to_zero( float64 ); 189*dc9b124dSJustin Hibbits unsigned int float64_to_uint32_round_to_zero( float64 ); 190*dc9b124dSJustin Hibbits long long float64_to_int64( float64 ); 191*dc9b124dSJustin Hibbits long long float64_to_int64_round_to_zero( float64 ); 192*dc9b124dSJustin Hibbits float32 float64_to_float32( float64 ); 193*dc9b124dSJustin Hibbits #ifdef FLOATX80 194*dc9b124dSJustin Hibbits floatx80 float64_to_floatx80( float64 ); 195*dc9b124dSJustin Hibbits #endif 196*dc9b124dSJustin Hibbits #ifdef FLOAT128 197*dc9b124dSJustin Hibbits float128 float64_to_float128( float64 ); 198*dc9b124dSJustin Hibbits #endif 199*dc9b124dSJustin Hibbits 200*dc9b124dSJustin Hibbits /* 201*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 202*dc9b124dSJustin Hibbits Software IEC/IEEE double-precision operations. 203*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 204*dc9b124dSJustin Hibbits */ 205*dc9b124dSJustin Hibbits float64 float64_round_to_int( float64 ); 206*dc9b124dSJustin Hibbits float64 float64_add( float64, float64 ); 207*dc9b124dSJustin Hibbits float64 float64_sub( float64, float64 ); 208*dc9b124dSJustin Hibbits float64 float64_mul( float64, float64 ); 209*dc9b124dSJustin Hibbits float64 float64_div( float64, float64 ); 210*dc9b124dSJustin Hibbits float64 float64_rem( float64, float64 ); 211*dc9b124dSJustin Hibbits float64 float64_sqrt( float64 ); 212*dc9b124dSJustin Hibbits int float64_eq( float64, float64 ); 213*dc9b124dSJustin Hibbits int float64_le( float64, float64 ); 214*dc9b124dSJustin Hibbits int float64_lt( float64, float64 ); 215*dc9b124dSJustin Hibbits int float64_eq_signaling( float64, float64 ); 216*dc9b124dSJustin Hibbits int float64_le_quiet( float64, float64 ); 217*dc9b124dSJustin Hibbits int float64_lt_quiet( float64, float64 ); 218*dc9b124dSJustin Hibbits #ifndef SOFTFLOAT_FOR_GCC 219*dc9b124dSJustin Hibbits int float64_is_signaling_nan( float64 ); 220*dc9b124dSJustin Hibbits #endif 221*dc9b124dSJustin Hibbits 222*dc9b124dSJustin Hibbits #ifdef FLOATX80 223*dc9b124dSJustin Hibbits 224*dc9b124dSJustin Hibbits /* 225*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 226*dc9b124dSJustin Hibbits Software IEC/IEEE extended double-precision conversion routines. 227*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 228*dc9b124dSJustin Hibbits */ 229*dc9b124dSJustin Hibbits int floatx80_to_int32( floatx80 ); 230*dc9b124dSJustin Hibbits int floatx80_to_int32_round_to_zero( floatx80 ); 231*dc9b124dSJustin Hibbits long long floatx80_to_int64( floatx80 ); 232*dc9b124dSJustin Hibbits long long floatx80_to_int64_round_to_zero( floatx80 ); 233*dc9b124dSJustin Hibbits float32 floatx80_to_float32( floatx80 ); 234*dc9b124dSJustin Hibbits float64 floatx80_to_float64( floatx80 ); 235*dc9b124dSJustin Hibbits #ifdef FLOAT128 236*dc9b124dSJustin Hibbits float128 floatx80_to_float128( floatx80 ); 237*dc9b124dSJustin Hibbits #endif 238*dc9b124dSJustin Hibbits 239*dc9b124dSJustin Hibbits /* 240*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 241*dc9b124dSJustin Hibbits Software IEC/IEEE extended double-precision rounding precision. Valid 242*dc9b124dSJustin Hibbits values are 32, 64, and 80. 243*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 244*dc9b124dSJustin Hibbits */ 245*dc9b124dSJustin Hibbits extern int floatx80_rounding_precision; 246*dc9b124dSJustin Hibbits 247*dc9b124dSJustin Hibbits /* 248*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 249*dc9b124dSJustin Hibbits Software IEC/IEEE extended double-precision operations. 250*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 251*dc9b124dSJustin Hibbits */ 252*dc9b124dSJustin Hibbits floatx80 floatx80_round_to_int( floatx80 ); 253*dc9b124dSJustin Hibbits floatx80 floatx80_add( floatx80, floatx80 ); 254*dc9b124dSJustin Hibbits floatx80 floatx80_sub( floatx80, floatx80 ); 255*dc9b124dSJustin Hibbits floatx80 floatx80_mul( floatx80, floatx80 ); 256*dc9b124dSJustin Hibbits floatx80 floatx80_div( floatx80, floatx80 ); 257*dc9b124dSJustin Hibbits floatx80 floatx80_rem( floatx80, floatx80 ); 258*dc9b124dSJustin Hibbits floatx80 floatx80_sqrt( floatx80 ); 259*dc9b124dSJustin Hibbits int floatx80_eq( floatx80, floatx80 ); 260*dc9b124dSJustin Hibbits int floatx80_le( floatx80, floatx80 ); 261*dc9b124dSJustin Hibbits int floatx80_lt( floatx80, floatx80 ); 262*dc9b124dSJustin Hibbits int floatx80_eq_signaling( floatx80, floatx80 ); 263*dc9b124dSJustin Hibbits int floatx80_le_quiet( floatx80, floatx80 ); 264*dc9b124dSJustin Hibbits int floatx80_lt_quiet( floatx80, floatx80 ); 265*dc9b124dSJustin Hibbits int floatx80_is_signaling_nan( floatx80 ); 266*dc9b124dSJustin Hibbits 267*dc9b124dSJustin Hibbits #endif 268*dc9b124dSJustin Hibbits 269*dc9b124dSJustin Hibbits #ifdef FLOAT128 270*dc9b124dSJustin Hibbits 271*dc9b124dSJustin Hibbits /* 272*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 273*dc9b124dSJustin Hibbits Software IEC/IEEE quadruple-precision conversion routines. 274*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 275*dc9b124dSJustin Hibbits */ 276*dc9b124dSJustin Hibbits int float128_to_int32( float128 ); 277*dc9b124dSJustin Hibbits int float128_to_int32_round_to_zero( float128 ); 278*dc9b124dSJustin Hibbits long long float128_to_int64( float128 ); 279*dc9b124dSJustin Hibbits long long float128_to_int64_round_to_zero( float128 ); 280*dc9b124dSJustin Hibbits float32 float128_to_float32( float128 ); 281*dc9b124dSJustin Hibbits float64 float128_to_float64( float128 ); 282*dc9b124dSJustin Hibbits #ifdef FLOATX80 283*dc9b124dSJustin Hibbits floatx80 float128_to_floatx80( float128 ); 284*dc9b124dSJustin Hibbits #endif 285*dc9b124dSJustin Hibbits 286*dc9b124dSJustin Hibbits /* 287*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 288*dc9b124dSJustin Hibbits Software IEC/IEEE quadruple-precision operations. 289*dc9b124dSJustin Hibbits ------------------------------------------------------------------------------- 290*dc9b124dSJustin Hibbits */ 291*dc9b124dSJustin Hibbits float128 float128_round_to_int( float128 ); 292*dc9b124dSJustin Hibbits float128 float128_add( float128, float128 ); 293*dc9b124dSJustin Hibbits float128 float128_sub( float128, float128 ); 294*dc9b124dSJustin Hibbits float128 float128_mul( float128, float128 ); 295*dc9b124dSJustin Hibbits float128 float128_div( float128, float128 ); 296*dc9b124dSJustin Hibbits float128 float128_rem( float128, float128 ); 297*dc9b124dSJustin Hibbits float128 float128_sqrt( float128 ); 298*dc9b124dSJustin Hibbits int float128_eq( float128, float128 ); 299*dc9b124dSJustin Hibbits int float128_le( float128, float128 ); 300*dc9b124dSJustin Hibbits int float128_lt( float128, float128 ); 301*dc9b124dSJustin Hibbits int float128_eq_signaling( float128, float128 ); 302*dc9b124dSJustin Hibbits int float128_le_quiet( float128, float128 ); 303*dc9b124dSJustin Hibbits int float128_lt_quiet( float128, float128 ); 304*dc9b124dSJustin Hibbits int float128_is_signaling_nan( float128 ); 305*dc9b124dSJustin Hibbits 306*dc9b124dSJustin Hibbits #endif 307*dc9b124dSJustin Hibbits 308