Home | History | Annotate | Line # | Download | only in gcc
fp-test.cc revision 1.1.1.1
      1  1.1  mrg /* fp-test.cc - Check that all floating-point operations are available.
      2  1.1  mrg    Copyright (C) 1995-2022 Free Software Foundation, Inc.
      3  1.1  mrg    Contributed by Ronald F. Guilmette <rfg (at) monkeys.com>.
      4  1.1  mrg 
      5  1.1  mrg    This file is part of GCC.
      6  1.1  mrg 
      7  1.1  mrg    GCC is free software; you can redistribute it and/or modify it
      8  1.1  mrg    under the terms of the GNU General Public License as published by
      9  1.1  mrg    the Free Software Foundation; either version 3, or (at your option)
     10  1.1  mrg    any later version.
     11  1.1  mrg 
     12  1.1  mrg    GCC is distributed in the hope that it will be useful, but WITHOUT
     13  1.1  mrg    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     14  1.1  mrg    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
     15  1.1  mrg    License for more details.
     16  1.1  mrg 
     17  1.1  mrg    You should have received a copy of the GNU General Public License
     18  1.1  mrg    along with GCC; see the file COPYING3.  If not see
     19  1.1  mrg    <http://www.gnu.org/licenses/>.  */
     20  1.1  mrg 
     21  1.1  mrg /* This is a trivial test program which may be useful to people who are
     22  1.1  mrg    porting the GCC or G++ compilers to a new system.  The intent here is
     23  1.1  mrg    merely to check that all floating-point operations have been provided
     24  1.1  mrg    by the port. (Note that I say ``provided'' rather than ``implemented''.)
     25  1.1  mrg 
     26  1.1  mrg    To use this file, simply compile it (with GCC or G++) and then try to
     27  1.1  mrg    link it in the normal way (also using GCC or G++ respectively).  If
     28  1.1  mrg    all of the floating -point operations (including conversions) have
     29  1.1  mrg    been provided, then this file will link without incident.  If however
     30  1.1  mrg    one or more of the primitive floating-point operations have not been
     31  1.1  mrg    properly provided, you will get link-time errors indicating which
     32  1.1  mrg    floating-point operations are unavailable.
     33  1.1  mrg 
     34  1.1  mrg    This file will typically be used when porting the GNU compilers to
     35  1.1  mrg    some system which lacks floating-point hardware, and for which
     36  1.1  mrg    software emulation routines (for FP ops) are needed in order to
     37  1.1  mrg    complete the port.  */
     38  1.1  mrg 
     39  1.1  mrg #if 0
     40  1.1  mrg #include <math.h>
     41  1.1  mrg #endif
     42  1.1  mrg 
     43  1.1  mrg extern double acos (double);
     44  1.1  mrg extern double asin (double);
     45  1.1  mrg extern double atan (double);
     46  1.1  mrg extern double atan2 (double, double);
     47  1.1  mrg extern double cos (double);
     48  1.1  mrg extern double sin (double);
     49  1.1  mrg extern double tan (double);
     50  1.1  mrg extern double cosh (double);
     51  1.1  mrg extern double sinh (double);
     52  1.1  mrg extern double tanh (double);
     53  1.1  mrg extern double exp (double);
     54  1.1  mrg extern double frexp (double, int *);
     55  1.1  mrg extern double ldexp (double, int);
     56  1.1  mrg extern double log (double);
     57  1.1  mrg extern double log10 (double);
     58  1.1  mrg extern double modf (double, double *);
     59  1.1  mrg extern double pow (double, double);
     60  1.1  mrg extern double sqrt (double);
     61  1.1  mrg extern double ceil (double);
     62  1.1  mrg extern double fabs (double);
     63  1.1  mrg extern double floor (double);
     64  1.1  mrg extern double fmod (double, double);
     65  1.1  mrg 
     66  1.1  mrg int i1, i2 = 2;
     67  1.1  mrg 
     68  1.1  mrg volatile signed char sc;
     69  1.1  mrg volatile unsigned char uc;
     70  1.1  mrg 
     71  1.1  mrg volatile signed short ss;
     72  1.1  mrg volatile unsigned short us;
     73  1.1  mrg 
     74  1.1  mrg volatile signed int si;
     75  1.1  mrg volatile unsigned int ui;
     76  1.1  mrg 
     77  1.1  mrg volatile signed long sl;
     78  1.1  mrg volatile unsigned long ul;
     79  1.1  mrg 
     80  1.1  mrg volatile float f1 = 1.0, f2 = 1.0, f3 = 1.0;
     81  1.1  mrg volatile double d1 = 1.0, d2 = 1.0, d3 = 1.0;
     82  1.1  mrg volatile long double D1 = 1.0, D2 = 1.0, D3 = 1.0;
     83  1.1  mrg 
     84  1.1  mrg int
     85  1.1  mrg main (void)
     86  1.1  mrg {
     87  1.1  mrg   /* TYPE: float */
     88  1.1  mrg 
     89  1.1  mrg   f1 = -f2;
     90  1.1  mrg   f1 = f2 + f3;
     91  1.1  mrg   f1 = f2 - f3;
     92  1.1  mrg   f1 = f2 * f3;
     93  1.1  mrg   f1 = f2 / f3;
     94  1.1  mrg   f1 += f2;
     95  1.1  mrg   f1 -= f2;
     96  1.1  mrg   f1 *= f2;
     97  1.1  mrg   f1 /= f2;
     98  1.1  mrg 
     99  1.1  mrg   si = f1 == f2;
    100  1.1  mrg   si = f1 != f2;
    101  1.1  mrg   si = f1 > f2;
    102  1.1  mrg   si = f1 < f2;
    103  1.1  mrg   si = f1 >= f2;
    104  1.1  mrg   si = f1 <= f2;
    105  1.1  mrg 
    106  1.1  mrg   si = __builtin_isgreater (f1, f2);
    107  1.1  mrg   si = __builtin_isgreaterequal (f1, f2);
    108  1.1  mrg   si = __builtin_isless (f1, f2);
    109  1.1  mrg   si = __builtin_islessequal (f1, f2);
    110  1.1  mrg   si = __builtin_islessgreater (f1, f2);
    111  1.1  mrg   si = __builtin_isunordered (f1, f2);
    112  1.1  mrg 
    113  1.1  mrg   sc = f1;
    114  1.1  mrg   uc = f1;
    115  1.1  mrg   ss = f1;
    116  1.1  mrg   us = f1;
    117  1.1  mrg   si = f1;
    118  1.1  mrg   ui = f1;
    119  1.1  mrg   sl = f1;
    120  1.1  mrg   ul = f1;
    121  1.1  mrg   d1 = f1;
    122  1.1  mrg   D1 = f1;
    123  1.1  mrg 
    124  1.1  mrg   f1 = sc;
    125  1.1  mrg   f1 = uc;
    126  1.1  mrg   f1 = ss;
    127  1.1  mrg   f1 = us;
    128  1.1  mrg   f1 = si;
    129  1.1  mrg   f1 = ui;
    130  1.1  mrg   f1 = sl;
    131  1.1  mrg   f1 = ul;
    132  1.1  mrg   f1 = d1;
    133  1.1  mrg   f1 = D1;
    134  1.1  mrg 
    135  1.1  mrg   d1 = -d2;
    136  1.1  mrg   d1 = d2 + d3;
    137  1.1  mrg   d1 = d2 - d3;
    138  1.1  mrg   d1 = d2 * d3;
    139  1.1  mrg   d1 = d2 / d3;
    140  1.1  mrg   d1 += d2;
    141  1.1  mrg   d1 -= d2;
    142  1.1  mrg   d1 *= d2;
    143  1.1  mrg   d1 /= d2;
    144  1.1  mrg 
    145  1.1  mrg   si = d1 == d2;
    146  1.1  mrg   si = d1 != d2;
    147  1.1  mrg   si = d1 > d2;
    148  1.1  mrg   si = d1 < d2;
    149  1.1  mrg   si = d1 >= d2;
    150  1.1  mrg   si = d1 <= d2;
    151  1.1  mrg 
    152  1.1  mrg   si = __builtin_isgreater (d1, d2);
    153  1.1  mrg   si = __builtin_isgreaterequal (d1, d2);
    154  1.1  mrg   si = __builtin_isless (d1, d2);
    155  1.1  mrg   si = __builtin_islessequal (d1, d2);
    156  1.1  mrg   si = __builtin_islessgreater (d1, d2);
    157  1.1  mrg   si = __builtin_isunordered (d1, d2);
    158  1.1  mrg 
    159  1.1  mrg   sc = d1;
    160  1.1  mrg   uc = d1;
    161  1.1  mrg   ss = d1;
    162  1.1  mrg   us = d1;
    163  1.1  mrg   si = d1;
    164  1.1  mrg   ui = d1;
    165  1.1  mrg   sl = d1;
    166  1.1  mrg   ul = d1;
    167  1.1  mrg   f1 = d1;
    168  1.1  mrg   D1 = d1;
    169  1.1  mrg 
    170  1.1  mrg   d1 = sc;
    171  1.1  mrg   d1 = uc;
    172  1.1  mrg   d1 = ss;
    173  1.1  mrg   d1 = us;
    174  1.1  mrg   d1 = si;
    175  1.1  mrg   d1 = ui;
    176  1.1  mrg   d1 = sl;
    177  1.1  mrg   d1 = ul;
    178  1.1  mrg   d1 = f1;
    179  1.1  mrg   d1 = D1;
    180  1.1  mrg 
    181  1.1  mrg   D1 = -D2;
    182  1.1  mrg   D1 = D2 + D3;
    183  1.1  mrg   D1 = D2 - D3;
    184  1.1  mrg   D1 = D2 * D3;
    185  1.1  mrg   D1 = D2 / D3;
    186  1.1  mrg   D1 += D2;
    187  1.1  mrg   D1 -= D2;
    188  1.1  mrg   D1 *= D2;
    189  1.1  mrg   D1 /= D2;
    190  1.1  mrg 
    191  1.1  mrg   si = D1 == D2;
    192  1.1  mrg   si = D1 != D2;
    193  1.1  mrg   si = D1 > D2;
    194  1.1  mrg   si = D1 < D2;
    195  1.1  mrg   si = D1 >= D2;
    196  1.1  mrg   si = D1 <= D2;
    197  1.1  mrg 
    198  1.1  mrg   si = __builtin_isgreater (D1, D2);
    199  1.1  mrg   si = __builtin_isgreaterequal (D1, D2);
    200  1.1  mrg   si = __builtin_isless (D1, D2);
    201  1.1  mrg   si = __builtin_islessequal (D1, D2);
    202  1.1  mrg   si = __builtin_islessgreater (D1, D2);
    203  1.1  mrg   si = __builtin_isunordered (D1, D2);
    204  1.1  mrg 
    205  1.1  mrg   sc = D1;
    206  1.1  mrg   uc = D1;
    207  1.1  mrg   ss = D1;
    208  1.1  mrg   us = D1;
    209  1.1  mrg   si = D1;
    210  1.1  mrg   ui = D1;
    211  1.1  mrg   sl = D1;
    212  1.1  mrg   ul = D1;
    213  1.1  mrg   f1 = D1;
    214  1.1  mrg   d1 = D1;
    215  1.1  mrg 
    216  1.1  mrg   D1 = sc;
    217  1.1  mrg   D1 = uc;
    218  1.1  mrg   D1 = ss;
    219  1.1  mrg   D1 = us;
    220  1.1  mrg   D1 = si;
    221  1.1  mrg   D1 = ui;
    222  1.1  mrg   D1 = sl;
    223  1.1  mrg   D1 = ul;
    224  1.1  mrg   D1 = f1;
    225  1.1  mrg   D1 = d1;
    226  1.1  mrg 
    227  1.1  mrg   d1 = acos (d2);
    228  1.1  mrg   d1 = asin (d2);
    229  1.1  mrg   d1 = atan (d2);
    230  1.1  mrg   d1 = atan2 (d2, d3);
    231  1.1  mrg   d1 = cos (d2);
    232  1.1  mrg   d1 = sin (d2);
    233  1.1  mrg   d1 = tan (d2);
    234  1.1  mrg   d1 = cosh (d2);
    235  1.1  mrg   d1 = sinh (d2);
    236  1.1  mrg   d1 = tanh (d2);
    237  1.1  mrg   d1 = exp (d2);
    238  1.1  mrg   d1 = frexp (d2, &i1);
    239  1.1  mrg   d1 = ldexp (d2, i2);
    240  1.1  mrg   d1 = log (d2);
    241  1.1  mrg   d1 = log10 (d2);
    242  1.1  mrg   d1 = modf (d2, &d3);
    243  1.1  mrg   d1 = pow (d2, d3);
    244  1.1  mrg   d1 = sqrt (d2);
    245  1.1  mrg   d1 = ceil (d2);
    246  1.1  mrg   d1 = fabs (d2);
    247  1.1  mrg   d1 = floor (d2);
    248  1.1  mrg   d1 = fmod (d2, d3);
    249  1.1  mrg 
    250  1.1  mrg   return 0;
    251  1.1  mrg }
    252