softfloat.h revision 178620
1178620Smarcel/* $NetBSD: softfloat.h,v 1.6 2002/05/12 13:12:46 bjh21 Exp $ */ 2178620Smarcel/* $FreeBSD: head/lib/libc/powerpc/softfloat/softfloat.h 178620 2008-04-27 18:34:34Z marcel $ */ 3178620Smarcel 4178620Smarcel/* This is a derivative work. */ 5178620Smarcel 6178620Smarcel/* 7178620Smarcel=============================================================================== 8178620Smarcel 9178620SmarcelThis C header file is part of the SoftFloat IEC/IEEE Floating-point 10178620SmarcelArithmetic Package, Release 2a. 11178620Smarcel 12178620SmarcelWritten by John R. Hauser. This work was made possible in part by the 13178620SmarcelInternational Computer Science Institute, located at Suite 600, 1947 Center 14178620SmarcelStreet, Berkeley, California 94704. Funding was partially provided by the 15178620SmarcelNational Science Foundation under grant MIP-9311980. The original version 16178620Smarcelof this code was written as part of a project to build a fixed-point vector 17178620Smarcelprocessor in collaboration with the University of California at Berkeley, 18178620Smarceloverseen by Profs. Nelson Morgan and John Wawrzynek. More information 19178620Smarcelis available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/ 20178620Smarcelarithmetic/SoftFloat.html'. 21178620Smarcel 22178620SmarcelTHIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort 23178620Smarcelhas been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT 24178620SmarcelTIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO 25178620SmarcelPERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY 26178620SmarcelAND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE. 27178620Smarcel 28178620SmarcelDerivative works are acceptable, even for commercial purposes, so long as 29178620Smarcel(1) they include prominent notice that the work is derivative, and (2) they 30178620Smarcelinclude prominent notice akin to these four paragraphs for those parts of 31178620Smarcelthis code that are retained. 32178620Smarcel 33178620Smarcel=============================================================================== 34178620Smarcel*/ 35178620Smarcel 36178620Smarcel/* 37178620Smarcel------------------------------------------------------------------------------- 38178620SmarcelThe macro `FLOATX80' must be defined to enable the extended double-precision 39178620Smarcelfloating-point format `floatx80'. If this macro is not defined, the 40178620Smarcel`floatx80' type will not be defined, and none of the functions that either 41178620Smarcelinput or output the `floatx80' type will be defined. The same applies to 42178620Smarcelthe `FLOAT128' macro and the quadruple-precision format `float128'. 43178620Smarcel------------------------------------------------------------------------------- 44178620Smarcel*/ 45178620Smarcel/* #define FLOATX80 */ 46178620Smarcel/* #define FLOAT128 */ 47178620Smarcel 48178620Smarcel#include <machine/ieeefp.h> 49178620Smarcel 50178620Smarcel/* 51178620Smarcel------------------------------------------------------------------------------- 52178620SmarcelSoftware IEC/IEEE floating-point types. 53178620Smarcel------------------------------------------------------------------------------- 54178620Smarcel*/ 55178620Smarceltypedef unsigned int float32; 56178620Smarceltypedef unsigned long long float64; 57178620Smarcel#ifdef FLOATX80 58178620Smarceltypedef struct { 59178620Smarcel unsigned short high; 60178620Smarcel unsigned long long low; 61178620Smarcel} floatx80; 62178620Smarcel#endif 63178620Smarcel#ifdef FLOAT128 64178620Smarceltypedef struct { 65178620Smarcel unsigned long long high, low; 66178620Smarcel} float128; 67178620Smarcel#endif 68178620Smarcel 69178620Smarcel/* 70178620Smarcel------------------------------------------------------------------------------- 71178620SmarcelSoftware IEC/IEEE floating-point underflow tininess-detection mode. 72178620Smarcel------------------------------------------------------------------------------- 73178620Smarcel*/ 74178620Smarcel#ifndef SOFTFLOAT_FOR_GCC 75178620Smarcelextern int8 float_detect_tininess; 76178620Smarcel#endif 77178620Smarcelenum { 78178620Smarcel float_tininess_after_rounding = 0, 79178620Smarcel float_tininess_before_rounding = 1 80178620Smarcel}; 81178620Smarcel 82178620Smarcel/* 83178620Smarcel------------------------------------------------------------------------------- 84178620SmarcelSoftware IEC/IEEE floating-point rounding mode. 85178620Smarcel------------------------------------------------------------------------------- 86178620Smarcel*/ 87178620Smarcelextern fp_rnd_t float_rounding_mode; 88178620Smarcelenum { 89178620Smarcel float_round_nearest_even = FP_RN, 90178620Smarcel float_round_to_zero = FP_RZ, 91178620Smarcel float_round_down = FP_RM, 92178620Smarcel float_round_up = FP_RP 93178620Smarcel}; 94178620Smarcel 95178620Smarcel/* 96178620Smarcel------------------------------------------------------------------------------- 97178620SmarcelSoftware IEC/IEEE floating-point exception flags. 98178620Smarcel------------------------------------------------------------------------------- 99178620Smarcel*/ 100178620Smarceltypedef fp_except_t fp_except; 101178620Smarcel 102178620Smarcelextern fp_except float_exception_flags; 103178620Smarcelextern fp_except float_exception_mask; 104178620Smarcelenum { 105178620Smarcel float_flag_inexact = FP_X_IMP, 106178620Smarcel float_flag_underflow = FP_X_UFL, 107178620Smarcel float_flag_overflow = FP_X_OFL, 108178620Smarcel float_flag_divbyzero = FP_X_DZ, 109178620Smarcel float_flag_invalid = FP_X_INV 110178620Smarcel}; 111178620Smarcel 112178620Smarcel/* 113178620Smarcel------------------------------------------------------------------------------- 114178620SmarcelRoutine to raise any or all of the software IEC/IEEE floating-point 115178620Smarcelexception flags. 116178620Smarcel------------------------------------------------------------------------------- 117178620Smarcel*/ 118178620Smarcelvoid float_raise( fp_except ); 119178620Smarcel 120178620Smarcel/* 121178620Smarcel------------------------------------------------------------------------------- 122178620SmarcelSoftware IEC/IEEE integer-to-floating-point conversion routines. 123178620Smarcel------------------------------------------------------------------------------- 124178620Smarcel*/ 125178620Smarcelfloat32 int32_to_float32( int ); 126178620Smarcelfloat64 int32_to_float64( int ); 127178620Smarcel#ifdef FLOATX80 128178620Smarcelfloatx80 int32_to_floatx80( int ); 129178620Smarcel#endif 130178620Smarcel#ifdef FLOAT128 131178620Smarcelfloat128 int32_to_float128( int ); 132178620Smarcel#endif 133178620Smarcelfloat32 int64_to_float32( long long ); 134178620Smarcelfloat64 int64_to_float64( long long ); 135178620Smarcel#ifdef FLOATX80 136178620Smarcelfloatx80 int64_to_floatx80( long long ); 137178620Smarcel#endif 138178620Smarcel#ifdef FLOAT128 139178620Smarcelfloat128 int64_to_float128( long long ); 140178620Smarcel#endif 141178620Smarcel 142178620Smarcel/* 143178620Smarcel------------------------------------------------------------------------------- 144178620SmarcelSoftware IEC/IEEE single-precision conversion routines. 145178620Smarcel------------------------------------------------------------------------------- 146178620Smarcel*/ 147178620Smarcelint float32_to_int32( float32 ); 148178620Smarcelint float32_to_int32_round_to_zero( float32 ); 149178620Smarcelunsigned int float32_to_uint32_round_to_zero( float32 ); 150178620Smarcellong long float32_to_int64( float32 ); 151178620Smarcellong long float32_to_int64_round_to_zero( float32 ); 152178620Smarcelfloat64 float32_to_float64( float32 ); 153178620Smarcel#ifdef FLOATX80 154178620Smarcelfloatx80 float32_to_floatx80( float32 ); 155178620Smarcel#endif 156178620Smarcel#ifdef FLOAT128 157178620Smarcelfloat128 float32_to_float128( float32 ); 158178620Smarcel#endif 159178620Smarcel 160178620Smarcel/* 161178620Smarcel------------------------------------------------------------------------------- 162178620SmarcelSoftware IEC/IEEE single-precision operations. 163178620Smarcel------------------------------------------------------------------------------- 164178620Smarcel*/ 165178620Smarcelfloat32 float32_round_to_int( float32 ); 166178620Smarcelfloat32 float32_add( float32, float32 ); 167178620Smarcelfloat32 float32_sub( float32, float32 ); 168178620Smarcelfloat32 float32_mul( float32, float32 ); 169178620Smarcelfloat32 float32_div( float32, float32 ); 170178620Smarcelfloat32 float32_rem( float32, float32 ); 171178620Smarcelfloat32 float32_sqrt( float32 ); 172178620Smarcelint float32_eq( float32, float32 ); 173178620Smarcelint float32_le( float32, float32 ); 174178620Smarcelint float32_lt( float32, float32 ); 175178620Smarcelint float32_eq_signaling( float32, float32 ); 176178620Smarcelint float32_le_quiet( float32, float32 ); 177178620Smarcelint float32_lt_quiet( float32, float32 ); 178178620Smarcel#ifndef SOFTFLOAT_FOR_GCC 179178620Smarcelint float32_is_signaling_nan( float32 ); 180178620Smarcel#endif 181178620Smarcel 182178620Smarcel/* 183178620Smarcel------------------------------------------------------------------------------- 184178620SmarcelSoftware IEC/IEEE double-precision conversion routines. 185178620Smarcel------------------------------------------------------------------------------- 186178620Smarcel*/ 187178620Smarcelint float64_to_int32( float64 ); 188178620Smarcelint float64_to_int32_round_to_zero( float64 ); 189178620Smarcelunsigned int float64_to_uint32_round_to_zero( float64 ); 190178620Smarcellong long float64_to_int64( float64 ); 191178620Smarcellong long float64_to_int64_round_to_zero( float64 ); 192178620Smarcelfloat32 float64_to_float32( float64 ); 193178620Smarcel#ifdef FLOATX80 194178620Smarcelfloatx80 float64_to_floatx80( float64 ); 195178620Smarcel#endif 196178620Smarcel#ifdef FLOAT128 197178620Smarcelfloat128 float64_to_float128( float64 ); 198178620Smarcel#endif 199178620Smarcel 200178620Smarcel/* 201178620Smarcel------------------------------------------------------------------------------- 202178620SmarcelSoftware IEC/IEEE double-precision operations. 203178620Smarcel------------------------------------------------------------------------------- 204178620Smarcel*/ 205178620Smarcelfloat64 float64_round_to_int( float64 ); 206178620Smarcelfloat64 float64_add( float64, float64 ); 207178620Smarcelfloat64 float64_sub( float64, float64 ); 208178620Smarcelfloat64 float64_mul( float64, float64 ); 209178620Smarcelfloat64 float64_div( float64, float64 ); 210178620Smarcelfloat64 float64_rem( float64, float64 ); 211178620Smarcelfloat64 float64_sqrt( float64 ); 212178620Smarcelint float64_eq( float64, float64 ); 213178620Smarcelint float64_le( float64, float64 ); 214178620Smarcelint float64_lt( float64, float64 ); 215178620Smarcelint float64_eq_signaling( float64, float64 ); 216178620Smarcelint float64_le_quiet( float64, float64 ); 217178620Smarcelint float64_lt_quiet( float64, float64 ); 218178620Smarcel#ifndef SOFTFLOAT_FOR_GCC 219178620Smarcelint float64_is_signaling_nan( float64 ); 220178620Smarcel#endif 221178620Smarcel 222178620Smarcel#ifdef FLOATX80 223178620Smarcel 224178620Smarcel/* 225178620Smarcel------------------------------------------------------------------------------- 226178620SmarcelSoftware IEC/IEEE extended double-precision conversion routines. 227178620Smarcel------------------------------------------------------------------------------- 228178620Smarcel*/ 229178620Smarcelint floatx80_to_int32( floatx80 ); 230178620Smarcelint floatx80_to_int32_round_to_zero( floatx80 ); 231178620Smarcellong long floatx80_to_int64( floatx80 ); 232178620Smarcellong long floatx80_to_int64_round_to_zero( floatx80 ); 233178620Smarcelfloat32 floatx80_to_float32( floatx80 ); 234178620Smarcelfloat64 floatx80_to_float64( floatx80 ); 235178620Smarcel#ifdef FLOAT128 236178620Smarcelfloat128 floatx80_to_float128( floatx80 ); 237178620Smarcel#endif 238178620Smarcel 239178620Smarcel/* 240178620Smarcel------------------------------------------------------------------------------- 241178620SmarcelSoftware IEC/IEEE extended double-precision rounding precision. Valid 242178620Smarcelvalues are 32, 64, and 80. 243178620Smarcel------------------------------------------------------------------------------- 244178620Smarcel*/ 245178620Smarcelextern int floatx80_rounding_precision; 246178620Smarcel 247178620Smarcel/* 248178620Smarcel------------------------------------------------------------------------------- 249178620SmarcelSoftware IEC/IEEE extended double-precision operations. 250178620Smarcel------------------------------------------------------------------------------- 251178620Smarcel*/ 252178620Smarcelfloatx80 floatx80_round_to_int( floatx80 ); 253178620Smarcelfloatx80 floatx80_add( floatx80, floatx80 ); 254178620Smarcelfloatx80 floatx80_sub( floatx80, floatx80 ); 255178620Smarcelfloatx80 floatx80_mul( floatx80, floatx80 ); 256178620Smarcelfloatx80 floatx80_div( floatx80, floatx80 ); 257178620Smarcelfloatx80 floatx80_rem( floatx80, floatx80 ); 258178620Smarcelfloatx80 floatx80_sqrt( floatx80 ); 259178620Smarcelint floatx80_eq( floatx80, floatx80 ); 260178620Smarcelint floatx80_le( floatx80, floatx80 ); 261178620Smarcelint floatx80_lt( floatx80, floatx80 ); 262178620Smarcelint floatx80_eq_signaling( floatx80, floatx80 ); 263178620Smarcelint floatx80_le_quiet( floatx80, floatx80 ); 264178620Smarcelint floatx80_lt_quiet( floatx80, floatx80 ); 265178620Smarcelint floatx80_is_signaling_nan( floatx80 ); 266178620Smarcel 267178620Smarcel#endif 268178620Smarcel 269178620Smarcel#ifdef FLOAT128 270178620Smarcel 271178620Smarcel/* 272178620Smarcel------------------------------------------------------------------------------- 273178620SmarcelSoftware IEC/IEEE quadruple-precision conversion routines. 274178620Smarcel------------------------------------------------------------------------------- 275178620Smarcel*/ 276178620Smarcelint float128_to_int32( float128 ); 277178620Smarcelint float128_to_int32_round_to_zero( float128 ); 278178620Smarcellong long float128_to_int64( float128 ); 279178620Smarcellong long float128_to_int64_round_to_zero( float128 ); 280178620Smarcelfloat32 float128_to_float32( float128 ); 281178620Smarcelfloat64 float128_to_float64( float128 ); 282178620Smarcel#ifdef FLOATX80 283178620Smarcelfloatx80 float128_to_floatx80( float128 ); 284178620Smarcel#endif 285178620Smarcel 286178620Smarcel/* 287178620Smarcel------------------------------------------------------------------------------- 288178620SmarcelSoftware IEC/IEEE quadruple-precision operations. 289178620Smarcel------------------------------------------------------------------------------- 290178620Smarcel*/ 291178620Smarcelfloat128 float128_round_to_int( float128 ); 292178620Smarcelfloat128 float128_add( float128, float128 ); 293178620Smarcelfloat128 float128_sub( float128, float128 ); 294178620Smarcelfloat128 float128_mul( float128, float128 ); 295178620Smarcelfloat128 float128_div( float128, float128 ); 296178620Smarcelfloat128 float128_rem( float128, float128 ); 297178620Smarcelfloat128 float128_sqrt( float128 ); 298178620Smarcelint float128_eq( float128, float128 ); 299178620Smarcelint float128_le( float128, float128 ); 300178620Smarcelint float128_lt( float128, float128 ); 301178620Smarcelint float128_eq_signaling( float128, float128 ); 302178620Smarcelint float128_le_quiet( float128, float128 ); 303178620Smarcelint float128_lt_quiet( float128, float128 ); 304178620Smarcelint float128_is_signaling_nan( float128 ); 305178620Smarcel 306178620Smarcel#endif 307178620Smarcel 308