Annotation of hatari/src/cpu/softfloat/softfloat.h, revision 1.1.1.1

1.1       root        1: #define SOFTFLOAT_68K
                      2: 
                      3: /*
                      4:  * QEMU float support
                      5:  *
                      6:  * The code in this source file is derived from release 2a of the SoftFloat
                      7:  * IEC/IEEE Floating-point Arithmetic Package. Those parts of the code (and
                      8:  * some later contributions) are provided under that license, as detailed below.
                      9:  * It has subsequently been modified by contributors to the QEMU Project,
                     10:  * so some portions are provided under:
                     11:  *  the SoftFloat-2a license
                     12:  *  the BSD license
                     13:  *  GPL-v2-or-later
                     14:  *
                     15:  * Any future contributions to this file after December 1st 2014 will be
                     16:  * taken to be licensed under the Softfloat-2a license unless specifically
                     17:  * indicated otherwise.
                     18:  */
                     19: 
                     20: /*
                     21: ===============================================================================
                     22: This C header file is part of the SoftFloat IEC/IEEE Floating-point
                     23: Arithmetic Package, Release 2a.
                     24: 
                     25: Written by John R. Hauser.  This work was made possible in part by the
                     26: International Computer Science Institute, located at Suite 600, 1947 Center
                     27: Street, Berkeley, California 94704.  Funding was partially provided by the
                     28: National Science Foundation under grant MIP-9311980.  The original version
                     29: of this code was written as part of a project to build a fixed-point vector
                     30: processor in collaboration with the University of California at Berkeley,
                     31: overseen by Profs. Nelson Morgan and John Wawrzynek.  More information
                     32: is available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/
                     33: arithmetic/SoftFloat.html'.
                     34: 
                     35: THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort
                     36: has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
                     37: TIMES RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO
                     38: PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
                     39: AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
                     40: 
                     41: Derivative works are acceptable, even for commercial purposes, so long as
                     42: (1) they include prominent notice that the work is derivative, and (2) they
                     43: include prominent notice akin to these four paragraphs for those parts of
                     44: this code that are retained.
                     45: 
                     46: ===============================================================================
                     47: */
                     48: 
                     49: /* BSD licensing:
                     50:  * Copyright (c) 2006, Fabrice Bellard
                     51:  * All rights reserved.
                     52:  *
                     53:  * Redistribution and use in source and binary forms, with or without
                     54:  * modification, are permitted provided that the following conditions are met:
                     55:  *
                     56:  * 1. Redistributions of source code must retain the above copyright notice,
                     57:  * this list of conditions and the following disclaimer.
                     58:  *
                     59:  * 2. Redistributions in binary form must reproduce the above copyright notice,
                     60:  * this list of conditions and the following disclaimer in the documentation
                     61:  * and/or other materials provided with the distribution.
                     62:  *
                     63:  * 3. Neither the name of the copyright holder nor the names of its contributors
                     64:  * may be used to endorse or promote products derived from this software without
                     65:  * specific prior written permission.
                     66:  *
                     67:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
                     68:  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     69:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     70:  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
                     71:  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
                     72:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
                     73:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
                     74:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
                     75:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     76:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
                     77:  * THE POSSIBILITY OF SUCH DAMAGE.
                     78:  */
                     79: 
                     80: /* Portions of this work are licensed under the terms of the GNU GPL,
                     81:  * version 2 or later. See the COPYING file in the top-level directory.
                     82:  */
                     83: 
                     84: #ifndef SOFTFLOAT_H
                     85: #define SOFTFLOAT_H
                     86: 
                     87: #include <stdbool.h>
                     88: 
                     89: #if defined(CONFIG_SOLARIS) && defined(CONFIG_NEEDS_LIBSUNMATH)
                     90: #include <sunmath.h>
                     91: #endif
                     92: 
                     93: 
                     94: /* This 'flag' type must be able to hold at least 0 and 1. It should
                     95:  * probably be replaced with 'bool' but the uses would need to be audited
                     96:  * to check that they weren't accidentally relying on it being a larger type.
                     97:  */
                     98: typedef uint8_t flag;
                     99: 
                    100: #define LIT64( a ) a##ULL
                    101: 
                    102: /*----------------------------------------------------------------------------
                    103: | Software IEC/IEEE floating-point ordering relations
                    104: *----------------------------------------------------------------------------*/
                    105: enum {
                    106:     float_relation_less      = -1,
                    107:     float_relation_equal     =  0,
                    108:     float_relation_greater   =  1,
                    109:     float_relation_unordered =  2
                    110: };
                    111: 
                    112: /*----------------------------------------------------------------------------
                    113: | Software IEC/IEEE floating-point types.
                    114: *----------------------------------------------------------------------------*/
                    115: /* Use structures for soft-float types.  This prevents accidentally mixing
                    116:    them with native int/float types.  A sufficiently clever compiler and
                    117:    sane ABI should be able to see though these structs.  However
                    118:    x86/gcc 3.x seems to struggle a bit, so leave them disabled by default.  */
                    119: //#define USE_SOFTFLOAT_STRUCT_TYPES
                    120: #ifdef USE_SOFTFLOAT_STRUCT_TYPES
                    121: typedef struct {
                    122:     uint16_t v;
                    123: } float16;
                    124: #define float16_val(x) (((float16)(x)).v)
                    125: #define make_float16(x) __extension__ ({ float16 f16_val = {x}; f16_val; })
                    126: #define const_float16(x) { x }
                    127: typedef struct {
                    128:     uint32_t v;
                    129: } float32;
                    130: /* The cast ensures an error if the wrong type is passed.  */
                    131: #define float32_val(x) (((float32)(x)).v)
                    132: #define make_float32(x) __extension__ ({ float32 f32_val = {x}; f32_val; })
                    133: #define const_float32(x) { x }
                    134: typedef struct {
                    135:     uint64_t v;
                    136: } float64;
                    137: #define float64_val(x) (((float64)(x)).v)
                    138: #define make_float64(x) __extension__ ({ float64 f64_val = {x}; f64_val; })
                    139: #define const_float64(x) { x }
                    140: #else
                    141: typedef uint16_t float16;
                    142: typedef uint32_t float32;
                    143: typedef uint64_t float64;
                    144: #define float16_val(x) (x)
                    145: #define float32_val(x) (x)
                    146: #define float64_val(x) (x)
                    147: #define make_float16(x) (x)
                    148: #define make_float32(x) (x)
                    149: #define make_float64(x) (x)
                    150: #define const_float16(x) (x)
                    151: #define const_float32(x) (x)
                    152: #define const_float64(x) (x)
                    153: #endif
                    154: typedef struct {
                    155:     uint16_t high;
                    156:     uint64_t low;
                    157: } floatx80;
                    158: typedef struct {
                    159: #ifdef HOST_WORDS_BIGENDIAN
                    160:     uint64_t high, low;
                    161: #else
                    162:     uint64_t low, high;
                    163: #endif
                    164: } float128;
                    165: 
                    166: /*----------------------------------------------------------------------------
                    167: | Software IEC/IEEE floating-point underflow tininess-detection mode.
                    168: *----------------------------------------------------------------------------*/
                    169: enum {
                    170:     float_tininess_after_rounding  = 0,
                    171:     float_tininess_before_rounding = 1
                    172: };
                    173: 
                    174: /*----------------------------------------------------------------------------
                    175: | Software IEC/IEEE floating-point rounding mode.
                    176: *----------------------------------------------------------------------------*/
                    177: enum {
                    178:     float_round_nearest_even = 0,
                    179:     float_round_down         = 1,
                    180:     float_round_up           = 2,
                    181:     float_round_to_zero      = 3,
                    182:     float_round_ties_away    = 4,
                    183: };
                    184: 
                    185: /*----------------------------------------------------------------------------
                    186: | Software IEC/IEEE floating-point exception flags.
                    187: *----------------------------------------------------------------------------*/
                    188: enum {
                    189:     float_flag_invalid   = 0x01,
                    190:        float_flag_denormal  = 0x02,
                    191:     float_flag_divbyzero = 0x04,
                    192:     float_flag_overflow  = 0x08,
                    193:     float_flag_underflow = 0x10,
                    194:     float_flag_inexact   = 0x20,
                    195:        float_flag_signaling = 0x40,
                    196:        float_flag_decimal =   0x80
                    197: };
                    198: 
                    199: /*----------------------------------------------------------------------------
                    200:  | Variables for storing sign, exponent and significand of overflowed or 
                    201:  | underflowed extended double-precision floating-point value.
                    202:  | Variables for storing sign, exponent and significand of internal extended 
                    203:  | double-precision floating-point value for external use.
                    204:  *----------------------------------------------------------------------------*/
                    205: 
                    206: extern flag floatx80_internal_sign;
                    207: extern int32_t floatx80_internal_exp;
                    208: extern uint64_t floatx80_internal_sig;
                    209: extern int32_t floatx80_internal_exp0;
                    210: extern uint64_t floatx80_internal_sig0;
                    211: extern uint64_t floatx80_internal_sig1;
                    212: extern int8_t floatx80_internal_precision;
                    213: extern int8_t floatx80_internal_mode;
                    214: 
                    215: typedef struct float_status {
                    216:     signed char float_detect_tininess;
                    217:     signed char float_rounding_mode;
                    218:     uint8_t     float_exception_flags;
                    219:     signed char floatx80_rounding_precision;
                    220:     /* should denormalised results go to zero and set the inexact flag? */
                    221:     flag flush_to_zero;
                    222:     /* should denormalised inputs go to zero and set the input_denormal flag? */
                    223:     flag flush_inputs_to_zero;
                    224:     flag default_nan_mode;
                    225:     flag snan_bit_is_one;
                    226: } float_status;
                    227: 
                    228: /*----------------------------------------------------------------------------
                    229:  | Function for getting sign, exponent and significand of extended
                    230:  | double-precision floating-point intermediate result for external use.
                    231:  *----------------------------------------------------------------------------*/
                    232: floatx80 getFloatInternalOverflow( void );
                    233: floatx80 getFloatInternalUnderflow( void );
                    234: floatx80 getFloatInternalRoundedAll( void );
                    235: floatx80 getFloatInternalRoundedSome( void );
                    236: floatx80 getFloatInternalUnrounded( void );
                    237: floatx80 getFloatInternalFloatx80( void );
                    238: uint64_t getFloatInternalGRS( void );
                    239: 
                    240: static inline void set_float_detect_tininess(int val, float_status *status)
                    241: {
                    242:     status->float_detect_tininess = val;
                    243: }
                    244: static inline void set_float_rounding_mode(int val, float_status *status)
                    245: {
                    246:     status->float_rounding_mode = val;
                    247: }
                    248: static inline void set_float_exception_flags(int val, float_status *status)
                    249: {
                    250:     status->float_exception_flags = val;
                    251: }
                    252: static inline void set_floatx80_rounding_precision(int val,
                    253:                                                    float_status *status)
                    254: {
                    255:     status->floatx80_rounding_precision = val;
                    256: }
                    257: static inline void set_flush_to_zero(flag val, float_status *status)
                    258: {
                    259:     status->flush_to_zero = val;
                    260: }
                    261: static inline void set_flush_inputs_to_zero(flag val, float_status *status)
                    262: {
                    263:     status->flush_inputs_to_zero = val;
                    264: }
                    265: static inline void set_default_nan_mode(flag val, float_status *status)
                    266: {
                    267:     status->default_nan_mode = val;
                    268: }
                    269: static inline void set_snan_bit_is_one(flag val, float_status *status)
                    270: {
                    271:     status->snan_bit_is_one = val;
                    272: }
                    273: static inline int get_float_detect_tininess(float_status *status)
                    274: {
                    275:     return status->float_detect_tininess;
                    276: }
                    277: static inline int get_float_rounding_mode(float_status *status)
                    278: {
                    279:     return status->float_rounding_mode;
                    280: }
                    281: static inline int get_float_exception_flags(float_status *status)
                    282: {
                    283:     return status->float_exception_flags;
                    284: }
                    285: static inline int get_floatx80_rounding_precision(float_status *status)
                    286: {
                    287:     return status->floatx80_rounding_precision;
                    288: }
                    289: static inline flag get_flush_to_zero(float_status *status)
                    290: {
                    291:     return status->flush_to_zero;
                    292: }
                    293: static inline flag get_flush_inputs_to_zero(float_status *status)
                    294: {
                    295:     return status->flush_inputs_to_zero;
                    296: }
                    297: static inline flag get_default_nan_mode(float_status *status)
                    298: {
                    299:     return status->default_nan_mode;
                    300: }
                    301: 
                    302: /*----------------------------------------------------------------------------
                    303: | Routine to raise any or all of the software IEC/IEEE floating-point
                    304: | exception flags.
                    305: *----------------------------------------------------------------------------*/
                    306: //void float_raise(uint8_t flags, float_status *status);
                    307: 
                    308: 
                    309: /*----------------------------------------------------------------------------
                    310:  | The pattern for a default generated single-precision NaN.
                    311:  *----------------------------------------------------------------------------*/
                    312: #define float32_default_nan 0x7FFFFFFF
                    313: 
                    314: /*----------------------------------------------------------------------------
                    315:  | The pattern for a default generated double-precision NaN.
                    316:  *----------------------------------------------------------------------------*/
                    317: #define float64_default_nan LIT64( 0x7FFFFFFFFFFFFFFF )
                    318: 
                    319: /*----------------------------------------------------------------------------
                    320:  | The pattern for a default generated extended double-precision NaN.  The
                    321:  | `high' and `low' values hold the most- and least-significant bits,
                    322:  | respectively.
                    323:  *----------------------------------------------------------------------------*/
                    324: #define floatx80_default_nan_high 0x7FFF
                    325: #define floatx80_default_nan_low  LIT64( 0xFFFFFFFFFFFFFFFF )
                    326: 
                    327: /*----------------------------------------------------------------------------
                    328:  | The pattern for a default generated extended double-precision infinity.
                    329:  *----------------------------------------------------------------------------*/
                    330: #define floatx80_default_infinity_low  LIT64( 0x0000000000000000 )
                    331: 
                    332: /*----------------------------------------------------------------------------
                    333: | If `a' is denormal and we are in flush-to-zero mode then set the
                    334: | input-denormal exception and return zero. Otherwise just return the value.
                    335: *----------------------------------------------------------------------------*/
                    336: float64 float64_squash_input_denormal(float64 a, float_status *status);
                    337: 
                    338: /*----------------------------------------------------------------------------
                    339: | Options to indicate which negations to perform in float*_muladd()
                    340: | Using these differs from negating an input or output before calling
                    341: | the muladd function in that this means that a NaN doesn't have its
                    342: | sign bit inverted before it is propagated.
                    343: | We also support halving the result before rounding, as a special
                    344: | case to support the ARM fused-sqrt-step instruction FRSQRTS.
                    345: *----------------------------------------------------------------------------*/
                    346: enum {
                    347:     float_muladd_negate_c = 1,
                    348:     float_muladd_negate_product = 2,
                    349:     float_muladd_negate_result = 4,
                    350:     float_muladd_halve_result = 8,
                    351: };
                    352: 
                    353: /*----------------------------------------------------------------------------
                    354: | Software IEC/IEEE integer-to-floating-point conversion routines.
                    355: *----------------------------------------------------------------------------*/
                    356: 
                    357: floatx80 int32_to_floatx80(int32_t);
                    358: floatx80 int64_to_floatx80(int64_t);
                    359: 
                    360: /*----------------------------------------------------------------------------
                    361: | Software IEC/IEEE single-precision conversion routines.
                    362: *----------------------------------------------------------------------------*/
                    363: floatx80 float32_to_floatx80(float32, float_status *status);
                    364: floatx80 float32_to_floatx80_allowunnormal(float32, float_status *status);
                    365: 
                    366: /*----------------------------------------------------------------------------
                    367: | Software IEC/IEEE double-precision conversion routines.
                    368: *----------------------------------------------------------------------------*/
                    369: floatx80 float64_to_floatx80(float64, float_status *status);
                    370: 
                    371: floatx80 float64_to_floatx80_allowunnormal( float64 a, float_status *status );
                    372: 
                    373: /*----------------------------------------------------------------------------
                    374: | Software IEC/IEEE extended double-precision conversion routines.
                    375: *----------------------------------------------------------------------------*/
                    376: int32_t floatx80_to_int32(floatx80, float_status *status);
                    377: #ifdef SOFTFLOAT_68K
                    378: int16_t floatx80_to_int16(floatx80, float_status *status);
                    379: int8_t floatx80_to_int8(floatx80, float_status *status);
                    380: #endif
                    381: int32_t floatx80_to_int32_round_to_zero(floatx80, float_status *status);
                    382: int64_t floatx80_to_int64(floatx80, float_status *status);
                    383: float32 floatx80_to_float32(floatx80, float_status *status);
                    384: float64 floatx80_to_float64(floatx80, float_status *status);
                    385: #ifdef SOFTFLOAT_68K
                    386: floatx80 floatx80_to_floatx80( floatx80, float_status *status);
                    387: floatx80 floatdecimal_to_floatx80(floatx80, float_status *status);
                    388: floatx80 floatx80_to_floatdecimal(floatx80, int32_t*, float_status *status);
                    389: #endif
                    390: 
                    391: uint64_t extractFloatx80Frac( floatx80 a );
                    392: int32_t extractFloatx80Exp( floatx80 a );
                    393: flag extractFloatx80Sign( floatx80 a );
                    394: 
                    395: floatx80 floatx80_round_to_int_toward_zero( floatx80 a, float_status *status);
                    396: floatx80 floatx80_round_to_float32( floatx80, float_status *status );
                    397: floatx80 floatx80_round_to_float64( floatx80, float_status *status );
                    398: floatx80 floatx80_round32( floatx80, float_status *status);
                    399: floatx80 floatx80_round64( floatx80, float_status *status);
                    400: 
                    401: flag floatx80_eq( floatx80, floatx80, float_status *status);
                    402: flag floatx80_le( floatx80, floatx80, float_status *status);
                    403: flag floatx80_lt( floatx80, floatx80, float_status *status);
                    404: 
                    405: #ifdef SOFTFLOAT_68K
                    406: // functions are in softfloat.c
                    407: floatx80 roundSaveFloatx80Internal( int8_t roundingPrecision, flag zSign, int32_t zExp, uint64_t zSig0, uint64_t zSig1, float_status *status );
                    408: void getRoundedFloatInternal( int8_t roundingPrecision, flag *pzSign, int32_t *pzExp, uint64_t *pzSig );
                    409: floatx80 roundSigAndPackFloatx80( int8_t roundingPrecision, flag zSign, int32_t zExp, uint64_t zSig0, uint64_t zSig1, float_status *status );
                    410: floatx80 floatx80_move( floatx80 a, float_status *status );
                    411: floatx80 floatx80_abs( floatx80 a, float_status *status );
                    412: floatx80 floatx80_neg( floatx80 a, float_status *status );
                    413: floatx80 floatx80_getexp( floatx80 a, float_status *status );
                    414: floatx80 floatx80_getman( floatx80 a, float_status *status );
                    415: floatx80 floatx80_scale(floatx80 a, floatx80 b, float_status *status );
                    416: floatx80 floatx80_rem( floatx80 a, floatx80 b, uint64_t *q, flag *s, float_status *status );
                    417: floatx80 floatx80_mod( floatx80 a, floatx80 b, uint64_t *q, flag *s, float_status *status );
                    418: floatx80 floatx80_sglmul( floatx80 a, floatx80 b, float_status *status );
                    419: floatx80 floatx80_sgldiv( floatx80 a, floatx80 b, float_status *status );
                    420: floatx80 floatx80_cmp( floatx80 a, floatx80 b, float_status *status );
                    421: floatx80 floatx80_tst( floatx80 a, float_status *status );
                    422: 
                    423: // functions are in softfloat_fpsp.c
                    424: floatx80 floatx80_acos(floatx80 a, float_status *status);
                    425: floatx80 floatx80_asin(floatx80 a, float_status *status);
                    426: floatx80 floatx80_atan(floatx80 a, float_status *status);
                    427: floatx80 floatx80_atanh(floatx80 a, float_status *status);
                    428: floatx80 floatx80_cos(floatx80 a, float_status *status);
                    429: floatx80 floatx80_cosh(floatx80 a, float_status *status);
                    430: floatx80 floatx80_etox(floatx80 a, float_status *status);
                    431: floatx80 floatx80_etoxm1(floatx80 a, float_status *status);
                    432: floatx80 floatx80_log10(floatx80 a, float_status *status);
                    433: floatx80 floatx80_log2(floatx80 a, float_status *status);
                    434: floatx80 floatx80_logn(floatx80 a, float_status *status);
                    435: floatx80 floatx80_lognp1(floatx80 a, float_status *status);
                    436: floatx80 floatx80_sin(floatx80 a, float_status *status);
                    437: floatx80 floatx80_sinh(floatx80 a, float_status *status);
                    438: floatx80 floatx80_tan(floatx80 a, float_status *status);
                    439: floatx80 floatx80_tanh(floatx80 a, float_status *status);
                    440: floatx80 floatx80_tentox(floatx80 a, float_status *status);
                    441: floatx80 floatx80_twotox(floatx80 a, float_status *status);
                    442: #endif
                    443: 
                    444: // functions originally internal to softfloat.c
                    445: void normalizeFloatx80Subnormal( uint64_t aSig, int32_t *zExpPtr, uint64_t *zSigPtr );
                    446: floatx80 packFloatx80( flag zSign, int32_t zExp, uint64_t zSig );
                    447: floatx80 roundAndPackFloatx80(int8_t roundingPrecision, flag zSign, int32_t zExp, uint64_t zSig0, uint64_t zSig1, float_status *status);
                    448: 
                    449: /*----------------------------------------------------------------------------
                    450: | Software IEC/IEEE extended double-precision operations.
                    451: *----------------------------------------------------------------------------*/
                    452: floatx80 floatx80_round_to_int(floatx80, float_status *status);
                    453: floatx80 floatx80_add(floatx80, floatx80, float_status *status);
                    454: floatx80 floatx80_sub(floatx80, floatx80, float_status *status);
                    455: floatx80 floatx80_mul(floatx80, floatx80, float_status *status);
                    456: floatx80 floatx80_div(floatx80, floatx80, float_status *status);
                    457: floatx80 floatx80_sqrt(floatx80, float_status *status);
                    458: floatx80 floatx80_normalize(floatx80);
                    459: floatx80 floatx80_denormalize(floatx80, flag);
                    460: 
                    461: static inline int floatx80_is_zero_or_denormal(floatx80 a)
                    462: {
                    463:     return (a.high & 0x7fff) == 0;
                    464: }
                    465: 
                    466: static inline int floatx80_is_any_nan(floatx80 a)
                    467: {
                    468:     return ((a.high & 0x7fff) == 0x7fff) && (a.low<<1);
                    469: }
                    470: 
                    471: /*----------------------------------------------------------------------------
                    472: | Return whether the given value is an invalid floatx80 encoding.
                    473: | Invalid floatx80 encodings arise when the integer bit is not set, but
                    474: | the exponent is not zero. The only times the integer bit is permitted to
                    475: | be zero is in subnormal numbers and the value zero.
                    476: | This includes what the Intel software developer's manual calls pseudo-NaNs,
                    477: | pseudo-infinities and un-normal numbers. It does not include
                    478: | pseudo-denormals, which must still be correctly handled as inputs even
                    479: | if they are never generated as outputs.
                    480: *----------------------------------------------------------------------------*/
                    481: static inline bool floatx80_invalid_encoding(floatx80 a)
                    482: {
                    483:     return (a.low & (1ULL << 63)) == 0 && (a.high & 0x7FFF) != 0 && (a.high & 0x7FFF) != 0x7FFF;
                    484: }
                    485: 
                    486: #define floatx80_zero make_floatx80(0x0000, 0x0000000000000000LL)
                    487: #define floatx80_one make_floatx80(0x3fff, 0x8000000000000000LL)
                    488: #define floatx80_ln2 make_floatx80(0x3ffe, 0xb17217f7d1cf79acLL)
                    489: #define floatx80_pi make_floatx80(0x4000, 0xc90fdaa22168c235LL)
                    490: #define floatx80_half make_floatx80(0x3ffe, 0x8000000000000000LL)
                    491: #define floatx80_infinity make_floatx80(0x7fff, 0x8000000000000000LL)
                    492: 
                    493: #endif /* SOFTFLOAT_H */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.