Home | History | Annotate | Line # | Download | only in testfloat
systfloat.c revision 1.7
      1  1.7  matt /*	$NetBSD: systfloat.c,v 1.7 2004/04/15 19:01:57 matt Exp $	*/
      2  1.3  ross 
      3  1.3  ross /* This is a derivative work. */
      4  1.3  ross 
      5  1.3  ross /*-
      6  1.3  ross  * Copyright (c) 2001 The NetBSD Foundation, Inc.
      7  1.3  ross  * All rights reserved.
      8  1.3  ross  *
      9  1.3  ross  * This code is derived from software contributed to The NetBSD Foundation
     10  1.3  ross  * by Ross Harvey.
     11  1.3  ross  *
     12  1.3  ross  * Redistribution and use in source and binary forms, with or without
     13  1.3  ross  * modification, are permitted provided that the following conditions
     14  1.3  ross  * are met:
     15  1.3  ross  * 1. Redistributions of source code must retain the above copyright
     16  1.3  ross  *    notice, this list of conditions and the following disclaimer.
     17  1.3  ross  * 2. Redistributions in binary form must reproduce the above copyright
     18  1.3  ross  *    notice, this list of conditions and the following disclaimer in the
     19  1.3  ross  *    documentation and/or other materials provided with the distribution.
     20  1.3  ross  * 3. All advertising materials mentioning features or use of this software
     21  1.3  ross  *    must display the following acknowledgement:
     22  1.3  ross  *        This product includes software developed by the NetBSD
     23  1.3  ross  *        Foundation, Inc. and its contributors.
     24  1.3  ross  * 4. Neither the name of The NetBSD Foundation nor the names of its
     25  1.3  ross  *    contributors may be used to endorse or promote products derived
     26  1.3  ross  *    from this software without specific prior written permission.
     27  1.3  ross  *
     28  1.3  ross  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     29  1.3  ross  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     30  1.3  ross  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     31  1.3  ross  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     32  1.3  ross  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     33  1.3  ross  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     34  1.3  ross  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     35  1.3  ross  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     36  1.3  ross  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     37  1.3  ross  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     38  1.3  ross  * POSSIBILITY OF SUCH DAMAGE.
     39  1.3  ross  */
     40  1.1  ross 
     41  1.1  ross /*
     42  1.1  ross ===============================================================================
     43  1.1  ross 
     44  1.1  ross This C source file is part of TestFloat, Release 2a, a package of programs
     45  1.1  ross for testing the correctness of floating-point arithmetic complying to the
     46  1.1  ross IEC/IEEE Standard for Floating-Point.
     47  1.1  ross 
     48  1.1  ross Written by John R. Hauser.  More information is available through the Web
     49  1.1  ross page `http://HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/TestFloat.html'.
     50  1.1  ross 
     51  1.1  ross THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort
     52  1.1  ross has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
     53  1.1  ross TIMES RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO
     54  1.1  ross PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
     55  1.1  ross AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
     56  1.1  ross 
     57  1.1  ross Derivative works are acceptable, even for commercial purposes, so long as
     58  1.1  ross (1) they include prominent notice that the work is derivative, and (2) they
     59  1.1  ross include prominent notice akin to these four paragraphs for those parts of
     60  1.1  ross this code that are retained.
     61  1.1  ross 
     62  1.1  ross ===============================================================================
     63  1.1  ross */
     64  1.1  ross 
     65  1.4  ross #include <sys/cdefs.h>
     66  1.4  ross #ifndef __lint
     67  1.7  matt __RCSID("$NetBSD: systfloat.c,v 1.7 2004/04/15 19:01:57 matt Exp $");
     68  1.4  ross #endif
     69  1.4  ross 
     70  1.1  ross #include <math.h>
     71  1.4  ross #include <ieeefp.h>
     72  1.1  ross #include "milieu.h"
     73  1.1  ross #include "softfloat.h"
     74  1.1  ross #include "systfloat.h"
     75  1.4  ross #include "systflags.h"
     76  1.4  ross #include "systmodes.h"
     77  1.4  ross 
     78  1.7  matt typedef union {
     79  1.7  matt     float32 f32;
     80  1.7  matt     float f;
     81  1.7  matt } union32;
     82  1.7  matt typedef union {
     83  1.7  matt     float64 f64;
     84  1.7  matt     double d;
     85  1.7  matt } union64;
     86  1.7  matt #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 )
     87  1.7  matt typedef union {
     88  1.7  matt     floatx80 fx80;
     89  1.7  matt     long double ld;
     90  1.7  matt } unionx80;
     91  1.7  matt #endif
     92  1.7  matt #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 )
     93  1.7  matt typedef union {
     94  1.7  matt     float128 f128;
     95  1.7  matt     long double ld;
     96  1.7  matt } union128;
     97  1.7  matt #endif
     98  1.7  matt 
     99  1.4  ross fp_except
    100  1.4  ross syst_float_flags_clear(void)
    101  1.4  ross {
    102  1.5  ross     return fpsetsticky(0)
    103  1.5  ross 	& (FP_X_IMP | FP_X_UFL | FP_X_OFL | FP_X_DZ | FP_X_INV);
    104  1.4  ross }
    105  1.4  ross 
    106  1.4  ross void
    107  1.4  ross syst_float_set_rounding_mode(fp_rnd direction)
    108  1.4  ross {
    109  1.4  ross     fpsetround(direction);
    110  1.4  ross     fpsetmask(0);
    111  1.4  ross }
    112  1.1  ross 
    113  1.1  ross float32 syst_int32_to_float32( int32 a )
    114  1.1  ross {
    115  1.7  matt     const union32 uz = { .f = a };
    116  1.1  ross 
    117  1.7  matt     return uz.f32;
    118  1.1  ross 
    119  1.1  ross }
    120  1.1  ross 
    121  1.1  ross float64 syst_int32_to_float64( int32 a )
    122  1.1  ross {
    123  1.7  matt     const union64 uz = { .d = a };
    124  1.1  ross 
    125  1.7  matt     return uz.f64;
    126  1.1  ross 
    127  1.1  ross }
    128  1.1  ross 
    129  1.1  ross #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 )
    130  1.1  ross 
    131  1.1  ross floatx80 syst_int32_to_floatx80( int32 a )
    132  1.1  ross {
    133  1.7  matt     const unionx80 uz = { .ld = a };
    134  1.1  ross 
    135  1.7  matt     return uz.fx80;
    136  1.1  ross 
    137  1.1  ross }
    138  1.1  ross 
    139  1.1  ross #endif
    140  1.1  ross 
    141  1.1  ross #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 )
    142  1.1  ross 
    143  1.1  ross float128 syst_int32_to_float128( int32 a )
    144  1.1  ross {
    145  1.7  matt     const union128 uz = { .ld = a };
    146  1.1  ross 
    147  1.7  matt     return uz.f128;
    148  1.1  ross 
    149  1.1  ross }
    150  1.1  ross 
    151  1.1  ross #endif
    152  1.1  ross 
    153  1.1  ross #ifdef BITS64
    154  1.1  ross 
    155  1.1  ross float32 syst_int64_to_float32( int64 a )
    156  1.1  ross {
    157  1.7  matt     const union32 uz = { .f = a };
    158  1.1  ross 
    159  1.7  matt     return uz.f32;
    160  1.1  ross }
    161  1.1  ross 
    162  1.1  ross float64 syst_int64_to_float64( int64 a )
    163  1.1  ross {
    164  1.7  matt     const union64 uz = { .d = a };
    165  1.1  ross 
    166  1.7  matt     return uz.f64;
    167  1.1  ross }
    168  1.1  ross 
    169  1.1  ross #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 )
    170  1.1  ross 
    171  1.1  ross floatx80 syst_int64_to_floatx80( int64 a )
    172  1.1  ross {
    173  1.7  matt     const unionx80 uz = { .ld = a };
    174  1.1  ross 
    175  1.7  matt     return uz.fx80;
    176  1.1  ross }
    177  1.1  ross 
    178  1.1  ross #endif
    179  1.1  ross 
    180  1.1  ross #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 )
    181  1.1  ross 
    182  1.1  ross float128 syst_int64_to_float128( int64 a )
    183  1.1  ross {
    184  1.7  matt     const union128 uz = { .ld = a };
    185  1.1  ross 
    186  1.7  matt     return uz.f128;
    187  1.1  ross }
    188  1.1  ross 
    189  1.1  ross #endif
    190  1.1  ross 
    191  1.1  ross #endif
    192  1.1  ross 
    193  1.1  ross int32 syst_float32_to_int32_round_to_zero( float32 a )
    194  1.1  ross {
    195  1.7  matt     const union32 uz = { .f32 = a };
    196  1.1  ross 
    197  1.7  matt     return uz.f;
    198  1.1  ross 
    199  1.1  ross }
    200  1.1  ross 
    201  1.1  ross #ifdef BITS64
    202  1.1  ross 
    203  1.1  ross int64 syst_float32_to_int64_round_to_zero( float32 a )
    204  1.1  ross {
    205  1.7  matt     const union32 uz = { .f32 = a };
    206  1.1  ross 
    207  1.7  matt     return uz.f;
    208  1.1  ross }
    209  1.1  ross 
    210  1.1  ross #endif
    211  1.1  ross 
    212  1.1  ross float64 syst_float32_to_float64( float32 a )
    213  1.1  ross {
    214  1.7  matt     const union32 ua = { .f32 = a };
    215  1.7  matt     union64 uz;
    216  1.1  ross 
    217  1.7  matt     uz.d = ua.f;
    218  1.7  matt     return uz.f64;
    219  1.1  ross 
    220  1.1  ross }
    221  1.1  ross 
    222  1.1  ross #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 )
    223  1.1  ross 
    224  1.1  ross floatx80 syst_float32_to_floatx80( float32 a )
    225  1.1  ross {
    226  1.7  matt     const union32 ua = { .f32 = a };
    227  1.7  matt     unionx80 uz;
    228  1.1  ross 
    229  1.7  matt     uz.ld = ua.f;
    230  1.7  matt     return uz.fx80;
    231  1.1  ross }
    232  1.1  ross 
    233  1.1  ross #endif
    234  1.1  ross 
    235  1.1  ross #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 )
    236  1.1  ross 
    237  1.1  ross float128 syst_float32_to_float128( float32 a )
    238  1.1  ross {
    239  1.7  matt     const union32 ua = { .f32 = a };
    240  1.7  matt     union128 ub;
    241  1.1  ross 
    242  1.7  matt     ub.ld = ua.f;
    243  1.7  matt     return ub.f128;
    244  1.1  ross }
    245  1.1  ross 
    246  1.1  ross #endif
    247  1.1  ross 
    248  1.1  ross float32 syst_float32_add( float32 a, float32 b )
    249  1.1  ross {
    250  1.7  matt     const union32 ua = { .f32 = a }, ub = { .f32 = b };
    251  1.7  matt     union32 uz;
    252  1.1  ross 
    253  1.7  matt     uz.f = ua.f + ub.f;
    254  1.7  matt     return uz.f32;
    255  1.1  ross }
    256  1.1  ross 
    257  1.1  ross float32 syst_float32_sub( float32 a, float32 b )
    258  1.1  ross {
    259  1.7  matt     const union32 ua = { .f32 = a }, ub = { .f32 = b };
    260  1.7  matt     union32 uz;
    261  1.1  ross 
    262  1.7  matt     uz.f = ua.f - ub.f;
    263  1.7  matt     return uz.f32;
    264  1.1  ross }
    265  1.1  ross 
    266  1.1  ross float32 syst_float32_mul( float32 a, float32 b )
    267  1.1  ross {
    268  1.7  matt     const union32 ua = { .f32 = a }, ub = { .f32 = b };
    269  1.7  matt     union32 uz;
    270  1.1  ross 
    271  1.7  matt     uz.f = ua.f * ub.f;
    272  1.7  matt     return uz.f32;
    273  1.1  ross }
    274  1.1  ross 
    275  1.1  ross float32 syst_float32_div( float32 a, float32 b )
    276  1.1  ross {
    277  1.7  matt     const union32 ua = { .f32 = a }, ub = { .f32 = b };
    278  1.7  matt     union32 uz;
    279  1.1  ross 
    280  1.7  matt     uz.f = ua.f / ub.f;
    281  1.7  matt     return uz.f32;
    282  1.1  ross }
    283  1.1  ross 
    284  1.1  ross flag syst_float32_eq( float32 a, float32 b )
    285  1.1  ross {
    286  1.7  matt     const union32 ua = { .f32 = a }, ub = { .f32 = b };
    287  1.1  ross 
    288  1.7  matt     return ua.f == ub.f;
    289  1.1  ross }
    290  1.1  ross 
    291  1.1  ross flag syst_float32_le( float32 a, float32 b )
    292  1.1  ross {
    293  1.7  matt     const union32 ua = { .f32 = a }, ub = { .f32 = b };
    294  1.1  ross 
    295  1.7  matt     return ua.f <= ub.f;
    296  1.1  ross }
    297  1.1  ross 
    298  1.1  ross flag syst_float32_lt( float32 a, float32 b )
    299  1.1  ross {
    300  1.7  matt     const union32 ua = { .f32 = a }, ub = { .f32 = b };
    301  1.1  ross 
    302  1.7  matt     return ua.f < ub.f;
    303  1.1  ross }
    304  1.1  ross 
    305  1.1  ross int32 syst_float64_to_int32_round_to_zero( float64 a )
    306  1.1  ross {
    307  1.7  matt     const union64 uz = { .f64 = a };
    308  1.1  ross 
    309  1.7  matt     return uz.d;
    310  1.1  ross }
    311  1.1  ross 
    312  1.1  ross #ifdef BITS64
    313  1.1  ross 
    314  1.1  ross int64 syst_float64_to_int64_round_to_zero( float64 a )
    315  1.1  ross {
    316  1.7  matt     const union64 uz = { .f64 = a };
    317  1.1  ross 
    318  1.7  matt     return uz.d;
    319  1.1  ross }
    320  1.1  ross 
    321  1.1  ross #endif
    322  1.1  ross 
    323  1.1  ross float32 syst_float64_to_float32( float64 a )
    324  1.1  ross {
    325  1.7  matt     const union64 ua = { .f64 = a };
    326  1.7  matt     union32 uz;
    327  1.1  ross 
    328  1.7  matt     uz.f = ua.d;
    329  1.7  matt     return uz.f32;
    330  1.1  ross }
    331  1.1  ross 
    332  1.1  ross #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 )
    333  1.1  ross 
    334  1.1  ross floatx80 syst_float64_to_floatx80( float64 a )
    335  1.1  ross {
    336  1.7  matt     const union64 ua = { .f64 = a };
    337  1.7  matt     unionx80 u;
    338  1.1  ross 
    339  1.7  matt     u.ld = ua.d;
    340  1.7  matt     return u.fx80;
    341  1.1  ross }
    342  1.1  ross 
    343  1.1  ross #endif
    344  1.1  ross 
    345  1.1  ross #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 )
    346  1.1  ross 
    347  1.1  ross float128 syst_float64_to_float128( float64 a )
    348  1.1  ross {
    349  1.7  matt     const union64 ua = { .f64 = a };
    350  1.7  matt     union128 uz;
    351  1.1  ross 
    352  1.7  matt     uz.ld = ua.d;
    353  1.7  matt     return uz.f128;
    354  1.1  ross }
    355  1.1  ross 
    356  1.1  ross #endif
    357  1.1  ross 
    358  1.1  ross float64 syst_float64_add( float64 a, float64 b )
    359  1.1  ross {
    360  1.7  matt     const union64 ua = { .f64 = a }, ub = { .f64 = b };
    361  1.7  matt     union64 uz;
    362  1.1  ross 
    363  1.7  matt     uz.d = ua.d + ub.d;
    364  1.7  matt     return uz.f64;
    365  1.1  ross }
    366  1.1  ross 
    367  1.1  ross float64 syst_float64_sub( float64 a, float64 b )
    368  1.1  ross {
    369  1.7  matt     const union64 ua = { .f64 = a }, ub = { .f64 = b };
    370  1.7  matt     union64 uz;
    371  1.1  ross 
    372  1.7  matt     uz.d = ua.d - ub.d;
    373  1.7  matt     return uz.f64;
    374  1.1  ross }
    375  1.1  ross 
    376  1.1  ross float64 syst_float64_mul( float64 a, float64 b )
    377  1.1  ross {
    378  1.7  matt     const union64 ua = { .f64 = a }, ub = { .f64 = b };
    379  1.7  matt     union64 uz;
    380  1.1  ross 
    381  1.7  matt     uz.d = ua.d * ub.d;
    382  1.7  matt     return uz.f64;
    383  1.1  ross }
    384  1.1  ross 
    385  1.1  ross float64 syst_float64_div( float64 a, float64 b )
    386  1.1  ross {
    387  1.7  matt     const union64 ua = { .f64 = a }, ub = { .f64 = b };
    388  1.7  matt     union64 uz;
    389  1.1  ross 
    390  1.7  matt     uz.d = ua.d / ub.d;
    391  1.7  matt     return uz.f64;
    392  1.1  ross }
    393  1.1  ross 
    394  1.1  ross float64 syst_float64_sqrt( float64 a )
    395  1.1  ross {
    396  1.7  matt     const union64 ua = { .f64 = a };
    397  1.7  matt     union64 uz;
    398  1.1  ross 
    399  1.7  matt     uz.d = sqrt(ua.d);
    400  1.7  matt     return uz.f64;
    401  1.1  ross }
    402  1.1  ross 
    403  1.1  ross flag syst_float64_eq( float64 a, float64 b )
    404  1.1  ross {
    405  1.7  matt     const union64 ua = { .f64 = a }, ub = { .f64 = b };
    406  1.1  ross 
    407  1.7  matt     return ua.d == ub.d;
    408  1.1  ross }
    409  1.1  ross 
    410  1.1  ross flag syst_float64_le( float64 a, float64 b )
    411  1.1  ross {
    412  1.7  matt     const union64 ua = { .f64 = a }, ub = { .f64 = b };
    413  1.1  ross 
    414  1.7  matt     return ua.d <= ub.d;
    415  1.1  ross }
    416  1.1  ross 
    417  1.1  ross flag syst_float64_lt( float64 a, float64 b )
    418  1.1  ross {
    419  1.7  matt     const union64 ua = { .f64 = a }, ub = { .f64 = b };
    420  1.1  ross 
    421  1.7  matt     return ua.d < ub.d;
    422  1.1  ross }
    423  1.1  ross 
    424  1.1  ross #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 )
    425  1.1  ross 
    426  1.1  ross int32 syst_floatx80_to_int32_round_to_zero( floatx80 a )
    427  1.1  ross {
    428  1.7  matt     const unionx80 uz = { .fx80 = a };
    429  1.1  ross 
    430  1.7  matt     return uz.ld;
    431  1.1  ross }
    432  1.1  ross 
    433  1.1  ross #ifdef BITS64
    434  1.1  ross 
    435  1.1  ross int64 syst_floatx80_to_int64_round_to_zero( floatx80 a )
    436  1.1  ross {
    437  1.7  matt     const unionx80 uz = { .fx80 = a };
    438  1.1  ross 
    439  1.7  matt     return uz.ld;
    440  1.1  ross }
    441  1.1  ross 
    442  1.1  ross #endif
    443  1.1  ross 
    444  1.1  ross float32 syst_floatx80_to_float32( floatx80 a )
    445  1.1  ross {
    446  1.7  matt     const unionx80 ua = { .fx80 = a };
    447  1.7  matt     union32 uz;
    448  1.1  ross 
    449  1.7  matt     uz.f = ua.ld;
    450  1.7  matt     return uz.f32;
    451  1.1  ross }
    452  1.1  ross 
    453  1.1  ross float64 syst_floatx80_to_float64( floatx80 a )
    454  1.1  ross {
    455  1.7  matt     const unionx80 ua = { .fx80 = a };
    456  1.7  matt     union64 uz;
    457  1.1  ross 
    458  1.7  matt     uz.d = ua.ld;
    459  1.7  matt     return uz.f64;
    460  1.1  ross }
    461  1.1  ross 
    462  1.1  ross floatx80 syst_floatx80_add( floatx80 a, floatx80 b )
    463  1.1  ross {
    464  1.7  matt     const unionx80 ua = { .fx80 = a }, ub = { .fx80 = b };
    465  1.7  matt     unionx80 uz;
    466  1.1  ross 
    467  1.7  matt     uz.ld = ua.ld + ub.ld;
    468  1.7  matt     return uz.fx80;
    469  1.1  ross }
    470  1.1  ross 
    471  1.1  ross floatx80 syst_floatx80_sub( floatx80 a, floatx80 b )
    472  1.1  ross {
    473  1.7  matt     const unionx80 ua = { .fx80 = a }, ub = { .fx80 = b };
    474  1.7  matt     unionx80 uz;
    475  1.1  ross 
    476  1.7  matt     uz.ld = ua.ld - ub.ld;
    477  1.7  matt     return uz.fx80;
    478  1.1  ross }
    479  1.1  ross 
    480  1.1  ross floatx80 syst_floatx80_mul( floatx80 a, floatx80 b )
    481  1.1  ross {
    482  1.7  matt     const unionx80 ua = { .fx80 = a }, ub = { .fx80 = b };
    483  1.7  matt     unionx80 uz;
    484  1.1  ross 
    485  1.7  matt     uz.ld = ua.ld * ub.ld;
    486  1.7  matt     return uz.fx80;
    487  1.1  ross }
    488  1.1  ross 
    489  1.1  ross floatx80 syst_floatx80_div( floatx80 a, floatx80 b )
    490  1.1  ross {
    491  1.7  matt     const unionx80 ua = { .fx80 = a }, ub = { .fx80 = b };
    492  1.7  matt     unionx80 uz;
    493  1.1  ross 
    494  1.7  matt     uz.ld = ua.ld / ub.ld;
    495  1.7  matt     return uz.fx80;
    496  1.1  ross }
    497  1.1  ross 
    498  1.1  ross flag syst_floatx80_eq( floatx80 a, floatx80 b )
    499  1.1  ross {
    500  1.7  matt     const unionx80 ua = { .fx80 = a }, ub = { .fx80 = b };
    501  1.1  ross 
    502  1.7  matt     return ua.ld == ub.ld;
    503  1.1  ross }
    504  1.1  ross 
    505  1.1  ross flag syst_floatx80_le( floatx80 a, floatx80 b )
    506  1.1  ross {
    507  1.7  matt     const unionx80 ua = { .fx80 = a }, ub = { .fx80 = b };
    508  1.1  ross 
    509  1.7  matt     return ua.ld <= ub.ld;
    510  1.1  ross }
    511  1.1  ross 
    512  1.1  ross flag syst_floatx80_lt( floatx80 a, floatx80 b )
    513  1.1  ross {
    514  1.7  matt     const unionx80 ua = { .fx80 = a }, ub = { .fx80 = b };
    515  1.1  ross 
    516  1.7  matt     return ua.ld < ub.ld;
    517  1.1  ross }
    518  1.1  ross 
    519  1.1  ross #endif
    520  1.1  ross 
    521  1.1  ross #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 )
    522  1.1  ross 
    523  1.1  ross int32 syst_float128_to_int32_round_to_zero( float128 a )
    524  1.1  ross {
    525  1.7  matt     const union128 ua = { .f128 = a };
    526  1.1  ross 
    527  1.7  matt     return ua.ld;
    528  1.1  ross }
    529  1.1  ross 
    530  1.1  ross #ifdef BITS64
    531  1.1  ross 
    532  1.1  ross int64 syst_float128_to_int64_round_to_zero( float128 a )
    533  1.1  ross {
    534  1.7  matt     const union128 ua = { .f128 = a };
    535  1.1  ross 
    536  1.7  matt     return ua.ld;
    537  1.1  ross }
    538  1.1  ross 
    539  1.1  ross #endif
    540  1.1  ross 
    541  1.1  ross float32 syst_float128_to_float32( float128 a )
    542  1.1  ross {
    543  1.7  matt     const union128 ua = { .f128 = a };
    544  1.7  matt     union32 uz;
    545  1.1  ross 
    546  1.7  matt     uz.f = ua.ld;
    547  1.7  matt     return uz.f32;
    548  1.1  ross 
    549  1.1  ross }
    550  1.1  ross 
    551  1.1  ross float64 syst_float128_to_float64( float128 a )
    552  1.1  ross {
    553  1.7  matt     const union128 ua = { .f128 = a };
    554  1.7  matt     union64 uz;
    555  1.1  ross 
    556  1.7  matt     uz.d = ua.ld;
    557  1.7  matt     return uz.f64;
    558  1.1  ross }
    559  1.1  ross 
    560  1.1  ross float128 syst_float128_add( float128 a, float128 b )
    561  1.1  ross {
    562  1.7  matt     const union128 ua = { .f128 = a }, ub = { .f128 = b };
    563  1.7  matt     union128 uz;
    564  1.1  ross 
    565  1.7  matt     uz.ld = ua.ld + ub.ld;
    566  1.7  matt     return uz.f128;
    567  1.1  ross 
    568  1.1  ross }
    569  1.1  ross 
    570  1.1  ross float128 syst_float128_sub( float128 a, float128 b )
    571  1.1  ross {
    572  1.7  matt     const union128 ua = { .f128 = a }, ub = { .f128 = b };
    573  1.7  matt     union128 uz;
    574  1.1  ross 
    575  1.7  matt     uz.ld = ua.ld - ub.ld;
    576  1.7  matt     return uz.f128;
    577  1.1  ross }
    578  1.1  ross 
    579  1.1  ross float128 syst_float128_mul( float128 a, float128 b )
    580  1.1  ross {
    581  1.7  matt     const union128 ua = { .f128 = a }, ub = { .f128 = b };
    582  1.7  matt     union128 uz;
    583  1.1  ross 
    584  1.7  matt     uz.ld = ua.ld * ub.ld;
    585  1.7  matt     return uz.f128;
    586  1.1  ross }
    587  1.1  ross 
    588  1.1  ross float128 syst_float128_div( float128 a, float128 b )
    589  1.1  ross {
    590  1.7  matt     const union128 ua = { .f128 = a }, ub = { .f128 = b };
    591  1.7  matt     union128 uz;
    592  1.1  ross 
    593  1.7  matt     uz.ld = ua.ld / ub.ld;
    594  1.7  matt     return uz.f128;
    595  1.1  ross }
    596  1.1  ross 
    597  1.1  ross flag syst_float128_eq( float128 a, float128 b )
    598  1.1  ross {
    599  1.7  matt     const union128 ua = { .f128 = a }, ub = { .f128 = b };
    600  1.1  ross 
    601  1.7  matt     return ua.ld == ub.ld;
    602  1.1  ross }
    603  1.1  ross 
    604  1.1  ross flag syst_float128_le( float128 a, float128 b )
    605  1.1  ross {
    606  1.7  matt     const union128 ua = { .f128 = a }, ub = { .f128 = b };
    607  1.1  ross 
    608  1.7  matt     return ua.ld <= ub.ld;
    609  1.1  ross }
    610  1.1  ross 
    611  1.1  ross flag syst_float128_lt( float128 a, float128 b )
    612  1.1  ross {
    613  1.7  matt     const union128 ua = { .f128 = a }, ub = { .f128 = b };
    614  1.1  ross 
    615  1.7  matt     return ua.ld < ub.ld;
    616  1.1  ross }
    617  1.1  ross 
    618  1.1  ross #endif
    619