Annotation of sys/lib/libkern/softfloat.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: softfloat.h,v 1.1 2002/04/28 20:55:14 pvalchev Exp $ */
! 2: /* $NetBSD: softfloat.h,v 1.1 2001/04/26 03:10:48 ross Exp $ */
! 3:
! 4: /* This is a derivative work. */
! 5:
! 6: /*-
! 7: * Copyright (c) 2001 The NetBSD Foundation, Inc.
! 8: * All rights reserved.
! 9: *
! 10: * This code is derived from software contributed to The NetBSD Foundation
! 11: * by Ross Harvey.
! 12: *
! 13: * Redistribution and use in source and binary forms, with or without
! 14: * modification, are permitted provided that the following conditions
! 15: * are met:
! 16: * 1. Redistributions of source code must retain the above copyright
! 17: * notice, this list of conditions and the following disclaimer.
! 18: * 2. Redistributions in binary form must reproduce the above copyright
! 19: * notice, this list of conditions and the following disclaimer in the
! 20: * documentation and/or other materials provided with the distribution.
! 21: * 3. All advertising materials mentioning features or use of this software
! 22: * must display the following acknowledgement:
! 23: * This product includes software developed by the NetBSD
! 24: * Foundation, Inc. and its contributors.
! 25: * 4. Neither the name of The NetBSD Foundation nor the names of its
! 26: * contributors may be used to endorse or promote products derived
! 27: * from this software without specific prior written permission.
! 28: *
! 29: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
! 30: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
! 31: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
! 32: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
! 33: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
! 34: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
! 35: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
! 36: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
! 37: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
! 38: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
! 39: * POSSIBILITY OF SUCH DAMAGE.
! 40: */
! 41:
! 42: /*
! 43: ===============================================================================
! 44:
! 45: This C header file is part of the SoftFloat IEC/IEEE Floating-point
! 46: Arithmetic Package, Release 2a.
! 47:
! 48: Written by John R. Hauser. This work was made possible in part by the
! 49: International Computer Science Institute, located at Suite 600, 1947 Center
! 50: Street, Berkeley, California 94704. Funding was partially provided by the
! 51: National Science Foundation under grant MIP-9311980. The original version
! 52: of this code was written as part of a project to build a fixed-point vector
! 53: processor in collaboration with the University of California at Berkeley,
! 54: overseen by Profs. Nelson Morgan and John Wawrzynek. More information
! 55: is available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/
! 56: arithmetic/SoftFloat.html'.
! 57:
! 58: THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable
! 59: effort has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT
! 60: WILL AT TIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS
! 61: RESTRICTED TO PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL
! 62: RESPONSIBILITY FOR ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM
! 63: THEIR OWN USE OF THE SOFTWARE, AND WHO ALSO EFFECTIVELY INDEMNIFY
! 64: (possibly via similar legal warning) JOHN HAUSER AND THE INTERNATIONAL
! 65: COMPUTER SCIENCE INSTITUTE AGAINST ALL LOSSES, COSTS, OR OTHER PROBLEMS
! 66: ARISING FROM THE USE OF THE SOFTWARE BY THEIR CUSTOMERS AND CLIENTS.
! 67:
! 68: Derivative works are acceptable, even for commercial purposes, so long as
! 69: (1) they include prominent notice that the work is derivative, and (2) they
! 70: include prominent notice akin to these four paragraphs for those parts of
! 71: this code that are retained.
! 72:
! 73: ===============================================================================
! 74: */
! 75:
! 76: #ifndef NO_IEEE
! 77:
! 78: #include <sys/types.h>
! 79:
! 80: #if !defined(_KERNEL) && !defined(_STANDALONE)
! 81: #include <ieeefp.h>
! 82: #else
! 83: #include "machine/ieeefp.h"
! 84: #endif
! 85: #include <sys/endian.h>
! 86:
! 87: /*
! 88: -------------------------------------------------------------------------------
! 89: The macro `FLOATX80' must be defined to enable the extended double-precision
! 90: floating-point format `floatx80'. If this macro is not defined, the
! 91: `floatx80' type will not be defined, and none of the functions that either
! 92: input or output the `floatx80' type will be defined. The same applies to
! 93: the `FLOAT128' macro and the quadruple-precision format `float128'.
! 94: -------------------------------------------------------------------------------
! 95: */
! 96: /* #define FLOATX80 */
! 97: /* #define FLOAT128 */
! 98:
! 99: /*
! 100: -------------------------------------------------------------------------------
! 101: Software IEC/IEEE floating-point types.
! 102: -------------------------------------------------------------------------------
! 103: */
! 104: typedef u_int32_t float32;
! 105: typedef u_int64_t float64;
! 106: #ifdef FLOATX80
! 107: typedef struct {
! 108: #if BYTE_ORDER == BIG_ENDIAN
! 109: u_int16_t high;
! 110: u_int64_t low;
! 111: #else
! 112: u_int64_t low;
! 113: u_int16_t high;
! 114: #endif
! 115: } floatx80;
! 116: #endif
! 117: #ifdef FLOAT128
! 118: typedef struct {
! 119: u_int64_t high, low;
! 120: } float128;
! 121: #endif
! 122:
! 123: /*
! 124: * Some of the global variables that used to be here have been removed for
! 125: * fairly obvious (defopt-MULTIPROCESSOR) reasons. The rest (which don't
! 126: * change dynamically) will be removed later. [ross]
! 127: */
! 128:
! 129: #define float_rounding_mode() fpgetround()
! 130:
! 131: /*
! 132: -------------------------------------------------------------------------------
! 133: Software IEC/IEEE floating-point underflow tininess-detection mode.
! 134: -------------------------------------------------------------------------------
! 135: */
! 136:
! 137: extern int float_detect_tininess;
! 138: enum {
! 139: float_tininess_after_rounding = 1,
! 140: float_tininess_before_rounding = 0
! 141: };
! 142:
! 143: /*
! 144: -------------------------------------------------------------------------------
! 145: Software IEC/IEEE floating-point rounding mode.
! 146: -------------------------------------------------------------------------------
! 147: */
! 148:
! 149: enum {
! 150: float_round_nearest_even = FP_RN,
! 151: float_round_to_zero = FP_RZ,
! 152: float_round_down = FP_RM,
! 153: float_round_up = FP_RP
! 154: };
! 155:
! 156: /*
! 157: -------------------------------------------------------------------------------
! 158: Software IEC/IEEE floating-point exception flags.
! 159: -------------------------------------------------------------------------------
! 160: */
! 161:
! 162: enum {
! 163: float_flag_inexact = FP_X_IMP,
! 164: float_flag_underflow = FP_X_UFL,
! 165: float_flag_overflow = FP_X_OFL,
! 166: float_flag_divbyzero = FP_X_DZ,
! 167: float_flag_invalid = FP_X_INV
! 168: };
! 169:
! 170: /*
! 171: -------------------------------------------------------------------------------
! 172: Software IEC/IEEE integer-to-floating-point conversion routines.
! 173: -------------------------------------------------------------------------------
! 174: */
! 175: float32 int32_to_float32( int );
! 176: float64 int32_to_float64( int );
! 177: #ifdef FLOATX80
! 178: floatx80 int32_to_floatx80( int );
! 179: #endif
! 180: #ifdef FLOAT128
! 181: float128 int32_to_float128( int );
! 182: #endif
! 183: #ifndef SOFTFLOAT_FOR_GCC /* __floatdi?f is in libgcc2.c */
! 184: float32 int64_to_float32( int64_t );
! 185: float64 int64_to_float64( int64_t );
! 186: #ifdef FLOATX80
! 187: floatx80 int64_to_floatx80( int64_t );
! 188: #endif
! 189: #ifdef FLOAT128
! 190: float128 int64_to_float128( int64_t );
! 191: #endif
! 192: #endif
! 193:
! 194: /*
! 195: -------------------------------------------------------------------------------
! 196: Software IEC/IEEE single-precision conversion routines.
! 197: -------------------------------------------------------------------------------
! 198: */
! 199: int float32_to_int32( float32 );
! 200: int float32_to_int32_round_to_zero( float32 );
! 201: #ifndef SOFTFLOAT_FOR_GCC /* __fix?fdi provided by libgcc2.c */
! 202: int64_t float32_to_int64( float32 );
! 203: int64_t float32_to_int64_round_to_zero( float32 );
! 204: #endif
! 205: float64 float32_to_float64( float32 );
! 206: #ifdef FLOATX80
! 207: floatx80 float32_to_floatx80( float32 );
! 208: #endif
! 209: #ifdef FLOAT128
! 210: float128 float32_to_float128( float32 );
! 211: #endif
! 212:
! 213: /*
! 214: -------------------------------------------------------------------------------
! 215: Software IEC/IEEE single-precision operations.
! 216: -------------------------------------------------------------------------------
! 217: */
! 218: float32 float32_round_to_int( float32 );
! 219: float32 float32_add( float32, float32 );
! 220: float32 float32_sub( float32, float32 );
! 221: float32 float32_mul( float32, float32 );
! 222: float32 float32_div( float32, float32 );
! 223: float32 float32_rem( float32, float32 );
! 224: float32 float32_sqrt( float32 );
! 225: int float32_eq( float32, float32 );
! 226: int float32_le( float32, float32 );
! 227: int float32_lt( float32, float32 );
! 228: int float32_eq_signaling( float32, float32 );
! 229: int float32_le_quiet( float32, float32 );
! 230: int float32_lt_quiet( float32, float32 );
! 231: #ifndef SOFTFLOAT_FOR_GCC
! 232: int float32_is_signaling_nan( float32 );
! 233: #endif
! 234:
! 235: /*
! 236: -------------------------------------------------------------------------------
! 237: Software IEC/IEEE double-precision conversion routines.
! 238: -------------------------------------------------------------------------------
! 239: */
! 240: int float64_to_int32( float64 );
! 241: int float64_to_int32_round_to_zero( float64 );
! 242: #ifndef SOFTFLOAT_FOR_GCC /* __fix?fdi provided by libgcc2.c */
! 243: int64_t float64_to_int64( float64 );
! 244: int64_t float64_to_int64_round_to_zero( float64 );
! 245: #endif
! 246: float32 float64_to_float32( float64 );
! 247: #ifdef FLOATX80
! 248: floatx80 float64_to_floatx80( float64 );
! 249: #endif
! 250: #ifdef FLOAT128
! 251: float128 float64_to_float128( float64 );
! 252: #endif
! 253:
! 254: /*
! 255: -------------------------------------------------------------------------------
! 256: Software IEC/IEEE double-precision operations.
! 257: -------------------------------------------------------------------------------
! 258: */
! 259: #define float64_default_nan 0xFFF8000000000000LL
! 260:
! 261: static __inline int
! 262: float64_is_nan(float64 a)
! 263: {
! 264: return 0xFFE0000000000000LL < a << 1;
! 265: }
! 266:
! 267: static __inline int
! 268: float64_is_signaling_nan(float64 a)
! 269: {
! 270: return (a >> 51 & 0xFFF) == 0xFFE && (a & 0x0007FFFFFFFFFFFFLL);
! 271: }
! 272:
! 273: float64 float64_round_to_int( float64 );
! 274: float64 float64_add( float64, float64 );
! 275: float64 float64_sub( float64, float64 );
! 276: float64 float64_mul( float64, float64 );
! 277: float64 float64_div( float64, float64 );
! 278: float64 float64_rem( float64, float64 );
! 279: float64 float64_sqrt( float64 );
! 280: int float64_eq( float64, float64 );
! 281: int float64_le( float64, float64 );
! 282: int float64_lt( float64, float64 );
! 283: int float64_eq_signaling( float64, float64 );
! 284: int float64_le_quiet( float64, float64 );
! 285: int float64_lt_quiet( float64, float64 );
! 286: #ifndef SOFTFLOAT_FOR_GCC
! 287: int float64_is_signaling_nan( float64 );
! 288: #endif
! 289:
! 290: #ifdef FLOATX80
! 291:
! 292: /*
! 293: -------------------------------------------------------------------------------
! 294: Software IEC/IEEE extended double-precision conversion routines.
! 295: -------------------------------------------------------------------------------
! 296: */
! 297: int floatx80_to_int32( floatx80 );
! 298: int floatx80_to_int32_round_to_zero( floatx80 );
! 299: int64_t floatx80_to_int64( floatx80 );
! 300: int64_t floatx80_to_int64_round_to_zero( floatx80 );
! 301: float32 floatx80_to_float32( floatx80 );
! 302: float64 floatx80_to_float64( floatx80 );
! 303: #ifdef FLOAT128
! 304: float128 floatx80_to_float128( floatx80 );
! 305: #endif
! 306:
! 307: /*
! 308: -------------------------------------------------------------------------------
! 309: Software IEC/IEEE extended double-precision rounding precision. Valid
! 310: values are 32, 64, and 80.
! 311: -------------------------------------------------------------------------------
! 312: */
! 313: extern int floatx80_rounding_precision;
! 314:
! 315: /*
! 316: -------------------------------------------------------------------------------
! 317: Software IEC/IEEE extended double-precision operations.
! 318: -------------------------------------------------------------------------------
! 319: */
! 320: floatx80 floatx80_round_to_int( floatx80 );
! 321: floatx80 floatx80_add( floatx80, floatx80 );
! 322: floatx80 floatx80_sub( floatx80, floatx80 );
! 323: floatx80 floatx80_mul( floatx80, floatx80 );
! 324: floatx80 floatx80_div( floatx80, floatx80 );
! 325: floatx80 floatx80_rem( floatx80, floatx80 );
! 326: floatx80 floatx80_sqrt( floatx80 );
! 327: int floatx80_eq( floatx80, floatx80 );
! 328: int floatx80_le( floatx80, floatx80 );
! 329: int floatx80_lt( floatx80, floatx80 );
! 330: int floatx80_eq_signaling( floatx80, floatx80 );
! 331: int floatx80_le_quiet( floatx80, floatx80 );
! 332: int floatx80_lt_quiet( floatx80, floatx80 );
! 333: int floatx80_is_signaling_nan( floatx80 );
! 334:
! 335: #endif
! 336:
! 337: #ifdef FLOAT128
! 338:
! 339: /*
! 340: -------------------------------------------------------------------------------
! 341: Software IEC/IEEE quadruple-precision conversion routines.
! 342: -------------------------------------------------------------------------------
! 343: */
! 344: int float128_to_int32( float128 );
! 345: int float128_to_int32_round_to_zero( float128 );
! 346: int64_t float128_to_int64( float128 );
! 347: int64_t float128_to_int64_round_to_zero( float128 );
! 348: float32 float128_to_float32( float128 );
! 349: float64 float128_to_float64( float128 );
! 350: #ifdef FLOATX80
! 351: floatx80 float128_to_floatx80( float128 );
! 352: #endif
! 353:
! 354: /*
! 355: -------------------------------------------------------------------------------
! 356: Software IEC/IEEE quadruple-precision operations.
! 357: -------------------------------------------------------------------------------
! 358: */
! 359: float128 float128_round_to_int( float128 );
! 360: float128 float128_add( float128, float128 );
! 361: float128 float128_sub( float128, float128 );
! 362: float128 float128_mul( float128, float128 );
! 363: float128 float128_div( float128, float128 );
! 364: float128 float128_rem( float128, float128 );
! 365: float128 float128_sqrt( float128 );
! 366: int float128_eq( float128, float128 );
! 367: int float128_le( float128, float128 );
! 368: int float128_lt( float128, float128 );
! 369: int float128_eq_signaling( float128, float128 );
! 370: int float128_le_quiet( float128, float128 );
! 371: int float128_lt_quiet( float128, float128 );
! 372: int float128_is_signaling_nan( float128 );
! 373:
! 374: #endif
! 375:
! 376: #endif /* !NO_IEEE */
CVSweb