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