/* Stub for defining degree-valued trigonometric functions in libgfortran. Copyright (C) 2020-2023 Free Software Foundation, Inc. Contributed by Steven G. Kargl and Fritz Reese This file is part of the GNU Fortran runtime library (libgfortran). Libgfortran is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. Libgfortran is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. Under Section 7 of GPL version 3, you are granted additional permissions described in the GCC Runtime Library Exception, version 3.1, as published by the Free Software Foundation. You should have received a copy of the GNU General Public License and a copy of the GCC Runtime Library Exception along with this program; see the files COPYING3 and COPYING.RUNTIME respectively. If not, see . */ /* This replaces all GMP/MPFR functions used by trigd.inc with native versions. The precision is defined by FTYPE defined before including this file. The module which includes this file must define the following: KIND -- floating point kind (4, 8, 10, 16) HAVE_INFINITY_KIND -- defined iff the platform has GFC_REAL__INFINITY TINY [optional] -- subtract from 1 under the above condition if set COSD_SMALL [optional] -- for x <= COSD_SMALL, COSD(x) = 1 if set SIND_SMALL [optional] -- for x <= SIND_SMALL, SIND(x) = D2R(x) if set COSD30 -- literal value of COSD(30) to the precision of FTYPE PIO180H -- upper bits of pi/180 for FMA PIO180L -- lower bits of pi/180 for FMA */ /* FTYPE := GFC_REAL_ */ #define FTYPE CONCAT_EXPAND(GFC_REAL_,KIND) /* LITERAL_SUFFIX := GFC_REAL__LITERAL_SUFFIX */ #define LITERAL_SUFFIX CONCAT_EXPAND(FTYPE,_LITERAL_SUFFIX) /* LITERAL(X) := GFC_REAL__LITERAL(X) */ #define LITERAL(x) CONCAT_EXPAND(x,LITERAL_SUFFIX) #define SIND CONCAT_EXPAND(sind_r, KIND) #define COSD CONCAT_EXPAND(cosd_r, KIND) #define TAND CONCAT_EXPAND(tand_r, KIND) #ifdef HAVE_INFINITY_KIND /* GFC_REAL_X_INFINITY */ #define INFINITY_KIND CONCAT_EXPAND(FTYPE, _INFINITY) #else /* GFC_REAL_X_HUGE */ #define INFINITY_KIND CONCAT_EXPAND(FTYPE, _HUGE) #endif #define CONCAT(x,y) x ## y #define CONCAT_EXPAND(x,y) CONCAT(x,y) #ifndef COPYSIGN #define COPYSIGN LITERAL(copysign) #define FMOD LITERAL(fmod) #define FABS LITERAL(fabs) #define FMA LITERAL(fma) #define SIN LITERAL(sin) #define COS LITERAL(cos) #define TAN LITERAL(tan) #endif #ifdef TINY #define TINY_LITERAL LITERAL(TINY) #endif #ifdef COSD_SMALL #define COSD_SMALL_LITERAL LITERAL(COSD_SMALL) #endif #ifdef SIND_SMALL #define SIND_SMALL_LITERAL LITERAL(SIND_SMALL) #endif #define COSD30_LITERAL LITERAL(COSD30) #define PIO180H_LITERAL LITERAL(PIO180H) #define PIO180L_LITERAL LITERAL(PIO180L) #define ITYPE int #define GFC_RND_MODE 0 #define RETTYPE FTYPE #define RETURN(x) return (x) #define ISFINITE(x) isfinite(x) #define mpfr_init(x) do { } while (0) #define mpfr_init_set_ui(x, v, rnd) (x = (v)) #define mpfr_clear(x) do { } while (0) #define mpfr_swap(x, y) do { FTYPE z = y; y = x; x = z; } while (0) #define mpfr_copysign(rop, op1, op2, rnd) rop = COPYSIGN((op1), (op2)) #define mpfr_fmod(rop, x, d, rnd) (rop = FMOD((x), (d))) #define mpfr_abs(rop, op, rnd) (rop = FABS(op)) #define mpfr_cmp_ld(x, y) ((x) - (y)) #define mpfr_cmp_ui(x, n) ((x) - (n)) #define mpfr_zero_p(x) ((x) == 0) #define mpfr_set(rop, x, rnd) (rop = (x)) #define mpfr_set_zero(rop, s) (rop = COPYSIGN(0, (s))) #define mpfr_set_inf(rop, s) (rop = ((s)*-2 + 1) * INFINITY_KIND) #define mpfr_set_ui(rop, n, rnd) (rop = (n)) #define mpfr_set_si(rop, n, rnd) (rop = (n)) #define mpfr_set_ld(rop, x, rnd) (rop = (x)) #define mpfr_set_si_2exp(rop, op, exp, rnd) (rop = (0x1.p##exp)) #define mpfr_get_z(rop, x, rnd) ((rop = (int)(x)), (rop - (x))) #define mpfr_mul(rop, op1, op2, rnd) (rop = ((op1) * (op2))) #define mpfr_sub_d(rop, op1, op2, rnd) (rop = ((op1) - (op2))) #define mpfr_sub_ui(rop, op1, op2, rnd) (rop = ((op1) - (op2))) #define mpfr_sub(rop, op1, op2, rnd) (rop = ((op1) - (op2))) #define mpfr_ui_sub(rop, op1, op2, rnd) (rop = ((op1) - (op2))) #define mpfr_neg(rop, op, rnd) (rop = -(op)) #define mpfr_sin(rop, x, rnd) (rop = SIN(x)) #define mpfr_cos(rop, x, rnd) (rop = COS(x)) #define mpfr_tan(rop, x, rnd) (rop = TAN(x)) #define mpz_init(n) do { } while (0) #define mpz_clear(x) do { } while (0) #define mpz_cmp_ui(x, y) ((x) - (y)) #define mpz_divisible_ui_p(n, d) ((n) % (d) == 0) #define D2R(x) (x = FMA((x), PIO180H_LITERAL, (x) * PIO180L_LITERAL)) #define SET_COSD30(x) (x = COSD30_LITERAL) #ifdef SIND extern FTYPE SIND (FTYPE); export_proto (SIND); #endif #ifdef COSD extern FTYPE COSD (FTYPE); export_proto (COSD); #endif #ifdef TAND extern FTYPE TAND (FTYPE); export_proto (TAND); #endif #include "trigd.inc" #undef FTYPE #undef LITERAL_SUFFIX #undef LITERAL #undef CONCAT3 #undef CONCAT3_EXPAND #undef CONCAT #undef CONCAT_EXPAND #undef SIND #undef COSD #undef TAND #undef INFINITY_KIND #undef COPYSIGN #undef FMOD #undef FABS #undef FMA #undef SIN #undef COS #undef TAN #undef TINY_LITERAL #undef COSD_SMALL_LITERAL #undef SIND_SMALL_LITERAL #undef COSD30_LITERAL #undef PIO180H_LITERAL #undef PIO180L_LITERAL #undef ITYPE #undef GFC_RND_MODE #undef RETTYPE #undef RETURN #undef ISFINITE #undef mpfr_signbit #undef mpfr_init #undef mpfr_init_set_ui #undef mpfr_clear #undef mpfr_swap #undef mpfr_fmod #undef mpfr_abs #undef mpfr_cmp_ld #undef mpfr_cmp_ui #undef mpfr_zero_p #undef mpfr_set #undef mpfr_set_zero #undef mpfr_set_inf #undef mpfr_set_ui #undef mpfr_set_si #undef mpfr_set_ld #undef mpfr_set_si_2exp #undef mpfr_get_z #undef mpfr_mul_si #undef mpfr_sub_d #undef mpfr_sub_ui #undef mpfr_sub #undef mpfr_ui_sub #undef mpfr_neg #undef mpfr_sin #undef mpfr_cos #undef mpfr_tan #undef mpz_init #undef mpz_clear #undef mpz_cmp_ui #undef mpz_divisible_ui_p #undef FMA #undef D2R #undef SET_COSD30 /* vim: set ft=c: */