/* Stub for defining degree-valued trigonometric functions in libgfortran.
   Copyright (C) 2020-2022 Free Software Foundation, Inc.
   Contributed by Steven G. Kargl <kargl@gcc.gnu.org>
   and Fritz Reese <foreese@gcc.gnu.org>

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
<http://www.gnu.org/licenses/>.  */

/*
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_<KIND>_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_<K> */
#define FTYPE CONCAT_EXPAND(GFC_REAL_,KIND)

/* LITERAL_SUFFIX := GFC_REAL_<K>_LITERAL_SUFFIX */
#define LITERAL_SUFFIX CONCAT_EXPAND(FTYPE,_LITERAL_SUFFIX)

/* LITERAL(X) := GFC_REAL_<K>_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: */
