150397Sobrien/* fp-test.c - Check that all floating-point operations are available. 2132718Skan Copyright (C) 1995, 2000, 2003 Free Software Foundation, Inc. 350397Sobrien Contributed by Ronald F. Guilmette <rfg@monkeys.com>. 450397Sobrien 590075Sobrien This file is part of GCC. 650397Sobrien 790075Sobrien GCC is free software; you can redistribute it and/or modify it 890075Sobrien under the terms of the GNU General Public License as published by 990075Sobrien the Free Software Foundation; either version 2, or (at your option) 1090075Sobrien any later version. 1150397Sobrien 1290075Sobrien GCC is distributed in the hope that it will be useful, but WITHOUT 1390075Sobrien ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 1490075Sobrien or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 1590075Sobrien License for more details. 1650397Sobrien 1790075Sobrien You should have received a copy of the GNU General Public License 1890075Sobrien along with GCC; see the file COPYING. If not, write to the Free 19169689Skan Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 20169689Skan 02110-1301, USA. */ 2150397Sobrien 2250397Sobrien/* This is a trivial test program which may be useful to people who are 2350397Sobrien porting the GCC or G++ compilers to a new system. The intent here is 2450397Sobrien merely to check that all floating-point operations have been provided 2550397Sobrien by the port. (Note that I say ``provided'' rather than ``implemented''.) 2650397Sobrien 2750397Sobrien To use this file, simply compile it (with GCC or G++) and then try to 2850397Sobrien link it in the normal way (also using GCC or G++ respectively). If 2950397Sobrien all of the floating -point operations (including conversions) have 3050397Sobrien been provided, then this file will link without incident. If however 3150397Sobrien one or more of the primitive floating-point operations have not been 3250397Sobrien properly provided, you will get link-time errors indicating which 3350397Sobrien floating-point operations are unavailable. 3450397Sobrien 3550397Sobrien This file will typically be used when porting the GNU compilers to 3650397Sobrien some system which lacks floating-point hardware, and for which 3750397Sobrien software emulation routines (for FP ops) are needed in order to 3850397Sobrien complete the port. */ 3950397Sobrien 4050397Sobrien#if 0 4150397Sobrien#include <math.h> 4250397Sobrien#endif 4350397Sobrien 4450397Sobrienextern double acos (double); 4550397Sobrienextern double asin (double); 4650397Sobrienextern double atan (double); 4750397Sobrienextern double atan2 (double, double); 4850397Sobrienextern double cos (double); 4950397Sobrienextern double sin (double); 5050397Sobrienextern double tan (double); 5150397Sobrienextern double cosh (double); 5250397Sobrienextern double sinh (double); 5350397Sobrienextern double tanh (double); 5450397Sobrienextern double exp (double); 5550397Sobrienextern double frexp (double, int *); 5650397Sobrienextern double ldexp (double, int); 5750397Sobrienextern double log (double); 5850397Sobrienextern double log10 (double); 5950397Sobrienextern double modf (double, double *); 6050397Sobrienextern double pow (double, double); 6150397Sobrienextern double sqrt (double); 6250397Sobrienextern double ceil (double); 6350397Sobrienextern double fabs (double); 6450397Sobrienextern double floor (double); 6550397Sobrienextern double fmod (double, double); 6650397Sobrien 6750397Sobrienint i1, i2 = 2; 6850397Sobrien 6950397Sobrienvolatile signed char sc; 7050397Sobrienvolatile unsigned char uc; 7150397Sobrien 7250397Sobrienvolatile signed short ss; 7350397Sobrienvolatile unsigned short us; 7450397Sobrien 7550397Sobrienvolatile signed int si; 7650397Sobrienvolatile unsigned int ui; 7750397Sobrien 7850397Sobrienvolatile signed long sl; 7950397Sobrienvolatile unsigned long ul; 8050397Sobrien 8150397Sobrienvolatile float f1 = 1.0, f2 = 1.0, f3 = 1.0; 8250397Sobrienvolatile double d1 = 1.0, d2 = 1.0, d3 = 1.0; 8350397Sobrienvolatile long double D1 = 1.0, D2 = 1.0, D3 = 1.0; 8450397Sobrien 8550397Sobrienint 86132718Skanmain (void) 8750397Sobrien{ 8850397Sobrien /* TYPE: float */ 8950397Sobrien 9050397Sobrien f1 = -f2; 9150397Sobrien f1 = f2 + f3; 9250397Sobrien f1 = f2 - f3; 9350397Sobrien f1 = f2 * f3; 9450397Sobrien f1 = f2 / f3; 9550397Sobrien f1 += f2; 9650397Sobrien f1 -= f2; 9750397Sobrien f1 *= f2; 9850397Sobrien f1 /= f2; 9950397Sobrien 10050397Sobrien si = f1 == f2; 10150397Sobrien si = f1 != f2; 10250397Sobrien si = f1 > f2; 10350397Sobrien si = f1 < f2; 10450397Sobrien si = f1 >= f2; 10550397Sobrien si = f1 <= f2; 10650397Sobrien 10790075Sobrien si = __builtin_isgreater (f1, f2); 10890075Sobrien si = __builtin_isgreaterequal (f1, f2); 10990075Sobrien si = __builtin_isless (f1, f2); 11090075Sobrien si = __builtin_islessequal (f1, f2); 11190075Sobrien si = __builtin_islessgreater (f1, f2); 11290075Sobrien si = __builtin_isunordered (f1, f2); 11390075Sobrien 11450397Sobrien sc = f1; 11550397Sobrien uc = f1; 11650397Sobrien ss = f1; 11750397Sobrien us = f1; 11850397Sobrien si = f1; 11950397Sobrien ui = f1; 12050397Sobrien sl = f1; 12150397Sobrien ul = f1; 12250397Sobrien d1 = f1; 12350397Sobrien D1 = f1; 12450397Sobrien 12550397Sobrien f1 = sc; 12650397Sobrien f1 = uc; 12750397Sobrien f1 = ss; 12850397Sobrien f1 = us; 12950397Sobrien f1 = si; 13050397Sobrien f1 = ui; 13150397Sobrien f1 = sl; 13250397Sobrien f1 = ul; 13350397Sobrien f1 = d1; 13450397Sobrien f1 = D1; 13550397Sobrien 13650397Sobrien d1 = -d2; 13750397Sobrien d1 = d2 + d3; 13850397Sobrien d1 = d2 - d3; 13950397Sobrien d1 = d2 * d3; 14050397Sobrien d1 = d2 / d3; 14150397Sobrien d1 += d2; 14250397Sobrien d1 -= d2; 14350397Sobrien d1 *= d2; 14450397Sobrien d1 /= d2; 14550397Sobrien 14650397Sobrien si = d1 == d2; 14750397Sobrien si = d1 != d2; 14850397Sobrien si = d1 > d2; 14950397Sobrien si = d1 < d2; 15050397Sobrien si = d1 >= d2; 15150397Sobrien si = d1 <= d2; 15250397Sobrien 15390075Sobrien si = __builtin_isgreater (d1, d2); 15490075Sobrien si = __builtin_isgreaterequal (d1, d2); 15590075Sobrien si = __builtin_isless (d1, d2); 15690075Sobrien si = __builtin_islessequal (d1, d2); 15790075Sobrien si = __builtin_islessgreater (d1, d2); 15890075Sobrien si = __builtin_isunordered (d1, d2); 15990075Sobrien 16050397Sobrien sc = d1; 16150397Sobrien uc = d1; 16250397Sobrien ss = d1; 16350397Sobrien us = d1; 16450397Sobrien si = d1; 16550397Sobrien ui = d1; 16650397Sobrien sl = d1; 16750397Sobrien ul = d1; 16850397Sobrien f1 = d1; 16950397Sobrien D1 = d1; 17050397Sobrien 17150397Sobrien d1 = sc; 17250397Sobrien d1 = uc; 17350397Sobrien d1 = ss; 17450397Sobrien d1 = us; 17550397Sobrien d1 = si; 17650397Sobrien d1 = ui; 17750397Sobrien d1 = sl; 17850397Sobrien d1 = ul; 17950397Sobrien d1 = f1; 18050397Sobrien d1 = D1; 18150397Sobrien 18250397Sobrien D1 = -D2; 18350397Sobrien D1 = D2 + D3; 18450397Sobrien D1 = D2 - D3; 18550397Sobrien D1 = D2 * D3; 18650397Sobrien D1 = D2 / D3; 18750397Sobrien D1 += D2; 18850397Sobrien D1 -= D2; 18950397Sobrien D1 *= D2; 19050397Sobrien D1 /= D2; 19150397Sobrien 19250397Sobrien si = D1 == D2; 19350397Sobrien si = D1 != D2; 19450397Sobrien si = D1 > D2; 19550397Sobrien si = D1 < D2; 19650397Sobrien si = D1 >= D2; 19750397Sobrien si = D1 <= D2; 19850397Sobrien 19990075Sobrien si = __builtin_isgreater (D1, D2); 20090075Sobrien si = __builtin_isgreaterequal (D1, D2); 20190075Sobrien si = __builtin_isless (D1, D2); 20290075Sobrien si = __builtin_islessequal (D1, D2); 20390075Sobrien si = __builtin_islessgreater (D1, D2); 20490075Sobrien si = __builtin_isunordered (D1, D2); 20590075Sobrien 20650397Sobrien sc = D1; 20750397Sobrien uc = D1; 20850397Sobrien ss = D1; 20950397Sobrien us = D1; 21050397Sobrien si = D1; 21150397Sobrien ui = D1; 21250397Sobrien sl = D1; 21350397Sobrien ul = D1; 21450397Sobrien f1 = D1; 21550397Sobrien d1 = D1; 21650397Sobrien 21750397Sobrien D1 = sc; 21850397Sobrien D1 = uc; 21950397Sobrien D1 = ss; 22050397Sobrien D1 = us; 22150397Sobrien D1 = si; 22250397Sobrien D1 = ui; 22350397Sobrien D1 = sl; 22450397Sobrien D1 = ul; 22550397Sobrien D1 = f1; 22650397Sobrien D1 = d1; 22750397Sobrien 22850397Sobrien d1 = acos (d2); 22950397Sobrien d1 = asin (d2); 23050397Sobrien d1 = atan (d2); 23150397Sobrien d1 = atan2 (d2, d3); 23250397Sobrien d1 = cos (d2); 23350397Sobrien d1 = sin (d2); 23450397Sobrien d1 = tan (d2); 23550397Sobrien d1 = cosh (d2); 23650397Sobrien d1 = sinh (d2); 23750397Sobrien d1 = tanh (d2); 23850397Sobrien d1 = exp (d2); 23950397Sobrien d1 = frexp (d2, &i1); 24050397Sobrien d1 = ldexp (d2, i2); 24150397Sobrien d1 = log (d2); 24250397Sobrien d1 = log10 (d2); 24350397Sobrien d1 = modf (d2, &d3); 24450397Sobrien d1 = pow (d2, d3); 24550397Sobrien d1 = sqrt (d2); 24650397Sobrien d1 = ceil (d2); 24750397Sobrien d1 = fabs (d2); 24850397Sobrien d1 = floor (d2); 24950397Sobrien d1 = fmod (d2, d3); 25050397Sobrien 25150397Sobrien return 0; 25250397Sobrien} 253