[BACK]Return to softfloat.h CVS log [TXT][DIR] Up to [local] / sys / lib / libkern

Annotation of sys/lib/libkern/softfloat.h, Revision 1.1.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