Home | History | Annotate | Line # | Download | only in testfloat
systfloat.c revision 1.5
      1  1.5  ross /* $NetBSD: systfloat.c,v 1.5 2001/03/22 12:22:18 ross 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.5  ross __RCSID("$NetBSD: systfloat.c,v 1.5 2001/03/22 12:22:18 ross 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.4  ross fp_except
     79  1.4  ross syst_float_flags_clear(void)
     80  1.4  ross {
     81  1.5  ross     return fpsetsticky(0)
     82  1.5  ross 	& (FP_X_IMP | FP_X_UFL | FP_X_OFL | FP_X_DZ | FP_X_INV);
     83  1.4  ross }
     84  1.4  ross 
     85  1.4  ross void
     86  1.4  ross syst_float_set_rounding_mode(fp_rnd direction)
     87  1.4  ross {
     88  1.4  ross     fpsetround(direction);
     89  1.4  ross     fpsetmask(0);
     90  1.4  ross }
     91  1.1  ross 
     92  1.1  ross float32 syst_int32_to_float32( int32 a )
     93  1.1  ross {
     94  1.1  ross     float32 z;
     95  1.1  ross 
     96  1.1  ross     *( (float *) &z ) = a;
     97  1.1  ross     return z;
     98  1.1  ross 
     99  1.1  ross }
    100  1.1  ross 
    101  1.1  ross float64 syst_int32_to_float64( int32 a )
    102  1.1  ross {
    103  1.1  ross     float64 z;
    104  1.1  ross 
    105  1.1  ross     *( (double *) &z ) = a;
    106  1.1  ross     return z;
    107  1.1  ross 
    108  1.1  ross }
    109  1.1  ross 
    110  1.1  ross #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 )
    111  1.1  ross 
    112  1.1  ross floatx80 syst_int32_to_floatx80( int32 a )
    113  1.1  ross {
    114  1.1  ross     floatx80 z;
    115  1.1  ross 
    116  1.1  ross     *( (long double *) &z ) = a;
    117  1.1  ross     return z;
    118  1.1  ross 
    119  1.1  ross }
    120  1.1  ross 
    121  1.1  ross #endif
    122  1.1  ross 
    123  1.1  ross #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 )
    124  1.1  ross 
    125  1.1  ross float128 syst_int32_to_float128( int32 a )
    126  1.1  ross {
    127  1.1  ross     float128 z;
    128  1.1  ross 
    129  1.1  ross     *( (long double *) &z ) = a;
    130  1.1  ross     return z;
    131  1.1  ross 
    132  1.1  ross }
    133  1.1  ross 
    134  1.1  ross #endif
    135  1.1  ross 
    136  1.1  ross #ifdef BITS64
    137  1.1  ross 
    138  1.1  ross float32 syst_int64_to_float32( int64 a )
    139  1.1  ross {
    140  1.1  ross     float32 z;
    141  1.1  ross 
    142  1.1  ross     *( (float *) &z ) = a;
    143  1.1  ross     return z;
    144  1.1  ross 
    145  1.1  ross }
    146  1.1  ross 
    147  1.1  ross float64 syst_int64_to_float64( int64 a )
    148  1.1  ross {
    149  1.1  ross     float64 z;
    150  1.1  ross 
    151  1.1  ross     *( (double *) &z ) = a;
    152  1.1  ross     return z;
    153  1.1  ross 
    154  1.1  ross }
    155  1.1  ross 
    156  1.1  ross #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 )
    157  1.1  ross 
    158  1.1  ross floatx80 syst_int64_to_floatx80( int64 a )
    159  1.1  ross {
    160  1.1  ross     floatx80 z;
    161  1.1  ross 
    162  1.1  ross     *( (long double *) &z ) = a;
    163  1.1  ross     return z;
    164  1.1  ross 
    165  1.1  ross }
    166  1.1  ross 
    167  1.1  ross #endif
    168  1.1  ross 
    169  1.1  ross #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 )
    170  1.1  ross 
    171  1.1  ross float128 syst_int64_to_float128( int64 a )
    172  1.1  ross {
    173  1.1  ross     float128 z;
    174  1.1  ross 
    175  1.1  ross     *( (long double *) &z ) = a;
    176  1.1  ross     return z;
    177  1.1  ross 
    178  1.1  ross }
    179  1.1  ross 
    180  1.1  ross #endif
    181  1.1  ross 
    182  1.1  ross #endif
    183  1.1  ross 
    184  1.1  ross int32 syst_float32_to_int32_round_to_zero( float32 a )
    185  1.1  ross {
    186  1.1  ross 
    187  1.1  ross     return *( (float *) &a );
    188  1.1  ross 
    189  1.1  ross }
    190  1.1  ross 
    191  1.1  ross #ifdef BITS64
    192  1.1  ross 
    193  1.1  ross int64 syst_float32_to_int64_round_to_zero( float32 a )
    194  1.1  ross {
    195  1.1  ross 
    196  1.1  ross     return *( (float *) &a );
    197  1.1  ross 
    198  1.1  ross }
    199  1.1  ross 
    200  1.1  ross #endif
    201  1.1  ross 
    202  1.1  ross float64 syst_float32_to_float64( float32 a )
    203  1.1  ross {
    204  1.1  ross     float64 z;
    205  1.1  ross 
    206  1.1  ross     *( (double *) &z ) = *( (float *) &a );
    207  1.1  ross     return z;
    208  1.1  ross 
    209  1.1  ross }
    210  1.1  ross 
    211  1.1  ross #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 )
    212  1.1  ross 
    213  1.1  ross floatx80 syst_float32_to_floatx80( float32 a )
    214  1.1  ross {
    215  1.1  ross     floatx80 z;
    216  1.1  ross 
    217  1.1  ross     *( (long double *) &z ) = *( (float *) &a );
    218  1.1  ross     return z;
    219  1.1  ross 
    220  1.1  ross }
    221  1.1  ross 
    222  1.1  ross #endif
    223  1.1  ross 
    224  1.1  ross #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 )
    225  1.1  ross 
    226  1.1  ross float128 syst_float32_to_float128( float32 a )
    227  1.1  ross {
    228  1.1  ross     float128 z;
    229  1.1  ross 
    230  1.1  ross     *( (long double *) &z ) = *( (float *) &a );
    231  1.1  ross     return z;
    232  1.1  ross 
    233  1.1  ross }
    234  1.1  ross 
    235  1.1  ross #endif
    236  1.1  ross 
    237  1.1  ross float32 syst_float32_add( float32 a, float32 b )
    238  1.1  ross {
    239  1.1  ross     float32 z;
    240  1.1  ross 
    241  1.1  ross     *( (float *) &z ) = *( (float *) &a ) + *( (float *) &b );
    242  1.1  ross     return z;
    243  1.1  ross 
    244  1.1  ross }
    245  1.1  ross 
    246  1.1  ross float32 syst_float32_sub( float32 a, float32 b )
    247  1.1  ross {
    248  1.1  ross     float32 z;
    249  1.1  ross 
    250  1.1  ross     *( (float *) &z ) = *( (float *) &a ) - *( (float *) &b );
    251  1.1  ross     return z;
    252  1.1  ross 
    253  1.1  ross }
    254  1.1  ross 
    255  1.1  ross float32 syst_float32_mul( float32 a, float32 b )
    256  1.1  ross {
    257  1.1  ross     float32 z;
    258  1.1  ross 
    259  1.1  ross     *( (float *) &z ) = *( (float *) &a ) * *( (float *) &b );
    260  1.1  ross     return z;
    261  1.1  ross 
    262  1.1  ross }
    263  1.1  ross 
    264  1.1  ross float32 syst_float32_div( float32 a, float32 b )
    265  1.1  ross {
    266  1.1  ross     float32 z;
    267  1.1  ross 
    268  1.1  ross     *( (float *) &z ) = *( (float *) &a ) / *( (float *) &b );
    269  1.1  ross     return z;
    270  1.1  ross 
    271  1.1  ross }
    272  1.1  ross 
    273  1.1  ross flag syst_float32_eq( float32 a, float32 b )
    274  1.1  ross {
    275  1.1  ross 
    276  1.1  ross     return ( *( (float *) &a ) == *( (float *) &b ) );
    277  1.1  ross 
    278  1.1  ross }
    279  1.1  ross 
    280  1.1  ross flag syst_float32_le( float32 a, float32 b )
    281  1.1  ross {
    282  1.1  ross 
    283  1.1  ross     return ( *( (float *) &a ) <= *( (float *) &b ) );
    284  1.1  ross 
    285  1.1  ross }
    286  1.1  ross 
    287  1.1  ross flag syst_float32_lt( float32 a, float32 b )
    288  1.1  ross {
    289  1.1  ross 
    290  1.1  ross     return ( *( (float *) &a ) < *( (float *) &b ) );
    291  1.1  ross 
    292  1.1  ross }
    293  1.1  ross 
    294  1.1  ross int32 syst_float64_to_int32_round_to_zero( float64 a )
    295  1.1  ross {
    296  1.1  ross 
    297  1.1  ross     return *( (double *) &a );
    298  1.1  ross 
    299  1.1  ross }
    300  1.1  ross 
    301  1.1  ross #ifdef BITS64
    302  1.1  ross 
    303  1.1  ross int64 syst_float64_to_int64_round_to_zero( float64 a )
    304  1.1  ross {
    305  1.1  ross 
    306  1.1  ross     return *( (double *) &a );
    307  1.1  ross 
    308  1.1  ross }
    309  1.1  ross 
    310  1.1  ross #endif
    311  1.1  ross 
    312  1.1  ross float32 syst_float64_to_float32( float64 a )
    313  1.1  ross {
    314  1.1  ross     float32 z;
    315  1.1  ross 
    316  1.1  ross     *( (float *) &z ) = *( (double *) &a );
    317  1.1  ross     return z;
    318  1.1  ross 
    319  1.1  ross }
    320  1.1  ross 
    321  1.1  ross #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 )
    322  1.1  ross 
    323  1.1  ross floatx80 syst_float64_to_floatx80( float64 a )
    324  1.1  ross {
    325  1.1  ross     floatx80 z;
    326  1.1  ross 
    327  1.1  ross     *( (long double *) &z ) = *( (double *) &a );
    328  1.1  ross     return z;
    329  1.1  ross 
    330  1.1  ross }
    331  1.1  ross 
    332  1.1  ross #endif
    333  1.1  ross 
    334  1.1  ross #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 )
    335  1.1  ross 
    336  1.1  ross float128 syst_float64_to_float128( float64 a )
    337  1.1  ross {
    338  1.1  ross     float128 z;
    339  1.1  ross 
    340  1.1  ross     *( (long double *) &z ) = *( (double *) &a );
    341  1.1  ross     return z;
    342  1.1  ross 
    343  1.1  ross }
    344  1.1  ross 
    345  1.1  ross #endif
    346  1.1  ross 
    347  1.1  ross float64 syst_float64_add( float64 a, float64 b )
    348  1.1  ross {
    349  1.1  ross     float64 z;
    350  1.1  ross 
    351  1.1  ross     *( (double *) &z ) = *( (double *) &a ) + *( (double *) &b );
    352  1.1  ross     return z;
    353  1.1  ross 
    354  1.1  ross }
    355  1.1  ross 
    356  1.1  ross float64 syst_float64_sub( float64 a, float64 b )
    357  1.1  ross {
    358  1.1  ross     float64 z;
    359  1.1  ross 
    360  1.1  ross     *( (double *) &z ) = *( (double *) &a ) - *( (double *) &b );
    361  1.1  ross     return z;
    362  1.1  ross 
    363  1.1  ross }
    364  1.1  ross 
    365  1.1  ross float64 syst_float64_mul( float64 a, float64 b )
    366  1.1  ross {
    367  1.1  ross     float64 z;
    368  1.1  ross 
    369  1.1  ross     *( (double *) &z ) = *( (double *) &a ) * *( (double *) &b );
    370  1.1  ross     return z;
    371  1.1  ross 
    372  1.1  ross }
    373  1.1  ross 
    374  1.1  ross float64 syst_float64_div( float64 a, float64 b )
    375  1.1  ross {
    376  1.1  ross     float64 z;
    377  1.1  ross 
    378  1.1  ross     *( (double *) &z ) = *( (double *) &a ) / *( (double *) &b );
    379  1.1  ross     return z;
    380  1.1  ross 
    381  1.1  ross }
    382  1.1  ross 
    383  1.1  ross float64 syst_float64_sqrt( float64 a )
    384  1.1  ross {
    385  1.1  ross     float64 z;
    386  1.1  ross 
    387  1.1  ross     *( (double *) &z ) = sqrt( *( (double *) &a ) );
    388  1.1  ross     return z;
    389  1.1  ross 
    390  1.1  ross }
    391  1.1  ross 
    392  1.1  ross flag syst_float64_eq( float64 a, float64 b )
    393  1.1  ross {
    394  1.1  ross 
    395  1.1  ross     return ( *( (double *) &a ) == *( (double *) &b ) );
    396  1.1  ross 
    397  1.1  ross }
    398  1.1  ross 
    399  1.1  ross flag syst_float64_le( float64 a, float64 b )
    400  1.1  ross {
    401  1.1  ross 
    402  1.1  ross     return ( *( (double *) &a ) <= *( (double *) &b ) );
    403  1.1  ross 
    404  1.1  ross }
    405  1.1  ross 
    406  1.1  ross flag syst_float64_lt( float64 a, float64 b )
    407  1.1  ross {
    408  1.1  ross 
    409  1.1  ross     return ( *( (double *) &a ) < *( (double *) &b ) );
    410  1.1  ross 
    411  1.1  ross }
    412  1.1  ross 
    413  1.1  ross #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 )
    414  1.1  ross 
    415  1.1  ross int32 syst_floatx80_to_int32_round_to_zero( floatx80 a )
    416  1.1  ross {
    417  1.1  ross 
    418  1.1  ross     return *( (long double *) &a );
    419  1.1  ross 
    420  1.1  ross }
    421  1.1  ross 
    422  1.1  ross #ifdef BITS64
    423  1.1  ross 
    424  1.1  ross int64 syst_floatx80_to_int64_round_to_zero( floatx80 a )
    425  1.1  ross {
    426  1.1  ross 
    427  1.1  ross     return *( (long double *) &a );
    428  1.1  ross 
    429  1.1  ross }
    430  1.1  ross 
    431  1.1  ross #endif
    432  1.1  ross 
    433  1.1  ross float32 syst_floatx80_to_float32( floatx80 a )
    434  1.1  ross {
    435  1.1  ross     float32 z;
    436  1.1  ross 
    437  1.1  ross     *( (float *) &z ) = *( (long double *) &a );
    438  1.1  ross     return z;
    439  1.1  ross 
    440  1.1  ross }
    441  1.1  ross 
    442  1.1  ross float64 syst_floatx80_to_float64( floatx80 a )
    443  1.1  ross {
    444  1.1  ross     float64 z;
    445  1.1  ross 
    446  1.1  ross     *( (double *) &z ) = *( (long double *) &a );
    447  1.1  ross     return z;
    448  1.1  ross 
    449  1.1  ross }
    450  1.1  ross 
    451  1.1  ross floatx80 syst_floatx80_add( floatx80 a, floatx80 b )
    452  1.1  ross {
    453  1.1  ross     floatx80 z;
    454  1.1  ross 
    455  1.1  ross     *( (long double *) &z ) =
    456  1.1  ross         *( (long double *) &a ) + *( (long double *) &b );
    457  1.1  ross     return z;
    458  1.1  ross 
    459  1.1  ross }
    460  1.1  ross 
    461  1.1  ross floatx80 syst_floatx80_sub( floatx80 a, floatx80 b )
    462  1.1  ross {
    463  1.1  ross     floatx80 z;
    464  1.1  ross 
    465  1.1  ross     *( (long double *) &z ) =
    466  1.1  ross         *( (long double *) &a ) - *( (long double *) &b );
    467  1.1  ross     return z;
    468  1.1  ross 
    469  1.1  ross }
    470  1.1  ross 
    471  1.1  ross floatx80 syst_floatx80_mul( floatx80 a, floatx80 b )
    472  1.1  ross {
    473  1.1  ross     floatx80 z;
    474  1.1  ross 
    475  1.1  ross     *( (long double *) &z ) =
    476  1.1  ross         *( (long double *) &a ) * *( (long double *) &b );
    477  1.1  ross     return z;
    478  1.1  ross 
    479  1.1  ross }
    480  1.1  ross 
    481  1.1  ross floatx80 syst_floatx80_div( floatx80 a, floatx80 b )
    482  1.1  ross {
    483  1.1  ross     floatx80 z;
    484  1.1  ross 
    485  1.1  ross     *( (long double *) &z ) =
    486  1.1  ross         *( (long double *) &a ) / *( (long double *) &b );
    487  1.1  ross     return z;
    488  1.1  ross 
    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.1  ross 
    494  1.1  ross     return ( *( (long double *) &a ) == *( (long double *) &b ) );
    495  1.1  ross 
    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.1  ross 
    501  1.1  ross     return ( *( (long double *) &a ) <= *( (long double *) &b ) );
    502  1.1  ross 
    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.1  ross 
    508  1.1  ross     return ( *( (long double *) &a ) < *( (long double *) &b ) );
    509  1.1  ross 
    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.1  ross 
    519  1.1  ross     return *( (long double *) &a );
    520  1.1  ross 
    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.1  ross 
    528  1.1  ross     return *( (long double *) &a );
    529  1.1  ross 
    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.1  ross     float32 z;
    537  1.1  ross 
    538  1.1  ross     *( (float *) &z ) = *( (long double *) &a );
    539  1.1  ross     return z;
    540  1.1  ross 
    541  1.1  ross }
    542  1.1  ross 
    543  1.1  ross float64 syst_float128_to_float64( float128 a )
    544  1.1  ross {
    545  1.1  ross     float64 z;
    546  1.1  ross 
    547  1.1  ross     *( (double *) &z ) = *( (long double *) &a );
    548  1.1  ross     return z;
    549  1.1  ross 
    550  1.1  ross }
    551  1.1  ross 
    552  1.1  ross float128 syst_float128_add( float128 a, float128 b )
    553  1.1  ross {
    554  1.1  ross     float128 z;
    555  1.1  ross 
    556  1.1  ross     *( (long double *) &z ) =
    557  1.1  ross         *( (long double *) &a ) + *( (long double *) &b );
    558  1.1  ross     return z;
    559  1.1  ross 
    560  1.1  ross }
    561  1.1  ross 
    562  1.1  ross float128 syst_float128_sub( float128 a, float128 b )
    563  1.1  ross {
    564  1.1  ross     float128 z;
    565  1.1  ross 
    566  1.1  ross     *( (long double *) &z ) =
    567  1.1  ross         *( (long double *) &a ) - *( (long double *) &b );
    568  1.1  ross     return z;
    569  1.1  ross 
    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.1  ross     float128 z;
    575  1.1  ross 
    576  1.1  ross     *( (long double *) &z ) =
    577  1.1  ross         *( (long double *) &a ) * *( (long double *) &b );
    578  1.1  ross     return z;
    579  1.1  ross 
    580  1.1  ross }
    581  1.1  ross 
    582  1.1  ross float128 syst_float128_div( float128 a, float128 b )
    583  1.1  ross {
    584  1.1  ross     float128 z;
    585  1.1  ross 
    586  1.1  ross     *( (long double *) &z ) =
    587  1.1  ross         *( (long double *) &a ) / *( (long double *) &b );
    588  1.1  ross     return z;
    589  1.1  ross 
    590  1.1  ross }
    591  1.1  ross 
    592  1.1  ross flag syst_float128_eq( float128 a, float128 b )
    593  1.1  ross {
    594  1.1  ross 
    595  1.1  ross     return ( *( (long double *) &a ) == *( (long double *) &b ) );
    596  1.1  ross 
    597  1.1  ross }
    598  1.1  ross 
    599  1.1  ross flag syst_float128_le( float128 a, float128 b )
    600  1.1  ross {
    601  1.1  ross 
    602  1.1  ross     return ( *( (long double *) &a ) <= *( (long double *) &b ) );
    603  1.1  ross 
    604  1.1  ross }
    605  1.1  ross 
    606  1.1  ross flag syst_float128_lt( float128 a, float128 b )
    607  1.1  ross {
    608  1.1  ross 
    609  1.1  ross     return ( *( (long double *) &a ) < *( (long double *) &b ) );
    610  1.1  ross 
    611  1.1  ross }
    612  1.1  ross 
    613  1.1  ross #endif
    614  1.1  ross 
    615