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