1/* Stub for defining degree-valued trigonometric functions in libgfortran.
2   Copyright (C) 2020-2022 Free Software Foundation, Inc.
3   Contributed by Steven G. Kargl <kargl@gcc.gnu.org>
4   and Fritz Reese <foreese@gcc.gnu.org>
5
6This file is part of the GNU Fortran runtime library (libgfortran).
7
8Libgfortran is free software; you can redistribute it and/or
9modify it under the terms of the GNU General Public
10License as published by the Free Software Foundation; either
11version 3 of the License, or (at your option) any later version.
12
13Libgfortran is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16GNU General Public License for more details.
17
18Under Section 7 of GPL version 3, you are granted additional
19permissions described in the GCC Runtime Library Exception, version
203.1, as published by the Free Software Foundation.
21
22You should have received a copy of the GNU General Public License and
23a copy of the GCC Runtime Library Exception along with this program;
24see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
25<http://www.gnu.org/licenses/>.  */
26
27/*
28This replaces all GMP/MPFR functions used by trigd.inc with native versions.
29The precision is defined by FTYPE defined before including this file.
30The module which includes this file must define the following:
31
32KIND               -- floating point kind (4, 8, 10, 16)
33HAVE_INFINITY_KIND -- defined iff the platform has GFC_REAL_<KIND>_INFINITY
34
35TINY       [optional] -- subtract from 1 under the above condition if set
36COSD_SMALL [optional] -- for x <= COSD_SMALL, COSD(x) = 1 if set
37SIND_SMALL [optional] -- for x <= SIND_SMALL, SIND(x) = D2R(x) if set
38COSD30                -- literal value of COSD(30) to the precision of FTYPE
39PIO180H               -- upper bits of pi/180 for FMA
40PIO180L               -- lower bits of pi/180 for FMA
41
42 */
43
44/* FTYPE := GFC_REAL_<K> */
45#define FTYPE CONCAT_EXPAND(GFC_REAL_,KIND)
46
47/* LITERAL_SUFFIX := GFC_REAL_<K>_LITERAL_SUFFIX */
48#define LITERAL_SUFFIX CONCAT_EXPAND(FTYPE,_LITERAL_SUFFIX)
49
50/* LITERAL(X) := GFC_REAL_<K>_LITERAL(X) */
51#define LITERAL(x) CONCAT_EXPAND(x,LITERAL_SUFFIX)
52
53#define SIND CONCAT_EXPAND(sind_r, KIND)
54#define COSD CONCAT_EXPAND(cosd_r, KIND)
55#define TAND CONCAT_EXPAND(tand_r, KIND)
56
57#ifdef HAVE_INFINITY_KIND
58/* GFC_REAL_X_INFINITY */
59#define INFINITY_KIND CONCAT_EXPAND(FTYPE, _INFINITY)
60#else
61/* GFC_REAL_X_HUGE */
62#define INFINITY_KIND CONCAT_EXPAND(FTYPE, _HUGE)
63#endif
64
65#define CONCAT(x,y) x ## y
66#define CONCAT_EXPAND(x,y) CONCAT(x,y)
67
68#ifndef COPYSIGN
69#define COPYSIGN LITERAL(copysign)
70#define FMOD LITERAL(fmod)
71#define FABS LITERAL(fabs)
72#define FMA LITERAL(fma)
73#define SIN LITERAL(sin)
74#define COS LITERAL(cos)
75#define TAN LITERAL(tan)
76#endif
77
78#ifdef TINY
79#define TINY_LITERAL LITERAL(TINY)
80#endif
81
82#ifdef COSD_SMALL
83#define COSD_SMALL_LITERAL LITERAL(COSD_SMALL)
84#endif
85
86#ifdef SIND_SMALL
87#define SIND_SMALL_LITERAL LITERAL(SIND_SMALL)
88#endif
89
90#define COSD30_LITERAL LITERAL(COSD30)
91#define PIO180H_LITERAL LITERAL(PIO180H)
92#define PIO180L_LITERAL LITERAL(PIO180L)
93
94#define ITYPE int
95#define GFC_RND_MODE 0
96#define RETTYPE FTYPE
97#define RETURN(x) return (x)
98
99#define ISFINITE(x) isfinite(x)
100#define mpfr_init(x) do { } while (0)
101#define mpfr_init_set_ui(x, v, rnd) (x = (v))
102#define mpfr_clear(x) do { } while (0)
103#define mpfr_swap(x, y) do { FTYPE z = y; y = x; x = z; } while (0)
104#define mpfr_copysign(rop, op1, op2, rnd) rop = COPYSIGN((op1), (op2))
105#define mpfr_fmod(rop, x, d, rnd) (rop = FMOD((x), (d)))
106#define mpfr_abs(rop, op, rnd) (rop = FABS(op))
107#define mpfr_cmp_ld(x, y) ((x) - (y))
108#define mpfr_cmp_ui(x, n) ((x) - (n))
109#define mpfr_zero_p(x) ((x) == 0)
110#define mpfr_set(rop, x, rnd) (rop = (x))
111#define mpfr_set_zero(rop, s) (rop = COPYSIGN(0, (s)))
112#define mpfr_set_inf(rop, s) (rop = ((s)*-2 + 1) * INFINITY_KIND)
113#define mpfr_set_ui(rop, n, rnd) (rop = (n))
114#define mpfr_set_si(rop, n, rnd) (rop = (n))
115#define mpfr_set_ld(rop, x, rnd) (rop = (x))
116#define mpfr_set_si_2exp(rop, op, exp, rnd) (rop = (0x1.p##exp))
117#define mpfr_get_z(rop, x, rnd) ((rop = (int)(x)), (rop - (x)))
118#define mpfr_mul(rop, op1, op2, rnd)    (rop = ((op1) * (op2)))
119#define mpfr_sub_d(rop, op1, op2, rnd)  (rop = ((op1) - (op2)))
120#define mpfr_sub_ui(rop, op1, op2, rnd) (rop = ((op1) - (op2)))
121#define mpfr_sub(rop, op1, op2, rnd)    (rop = ((op1) - (op2)))
122#define mpfr_ui_sub(rop, op1, op2, rnd) (rop = ((op1) - (op2)))
123#define mpfr_neg(rop, op, rnd) (rop = -(op))
124#define mpfr_sin(rop, x, rnd) (rop = SIN(x))
125#define mpfr_cos(rop, x, rnd) (rop = COS(x))
126#define mpfr_tan(rop, x, rnd) (rop = TAN(x))
127
128#define mpz_init(n) do { } while (0)
129#define mpz_clear(x) do { } while (0)
130#define mpz_cmp_ui(x, y) ((x) - (y))
131#define mpz_divisible_ui_p(n, d) ((n) % (d) == 0)
132
133#define D2R(x) (x = FMA((x), PIO180H_LITERAL, (x) * PIO180L_LITERAL))
134
135#define SET_COSD30(x) (x = COSD30_LITERAL)
136
137#ifdef SIND
138extern FTYPE SIND (FTYPE);
139export_proto (SIND);
140#endif
141
142#ifdef COSD
143extern FTYPE COSD (FTYPE);
144export_proto (COSD);
145#endif
146
147#ifdef TAND
148extern FTYPE TAND (FTYPE);
149export_proto (TAND);
150#endif
151
152#include "trigd.inc"
153
154#undef FTYPE
155#undef LITERAL_SUFFIX
156#undef LITERAL
157#undef CONCAT3
158#undef CONCAT3_EXPAND
159#undef CONCAT
160#undef CONCAT_EXPAND
161#undef SIND
162#undef COSD
163#undef TAND
164#undef INFINITY_KIND
165
166#undef COPYSIGN
167#undef FMOD
168#undef FABS
169#undef FMA
170#undef SIN
171#undef COS
172#undef TAN
173
174#undef TINY_LITERAL
175#undef COSD_SMALL_LITERAL
176#undef SIND_SMALL_LITERAL
177#undef COSD30_LITERAL
178#undef PIO180H_LITERAL
179#undef PIO180L_LITERAL
180
181#undef ITYPE
182#undef GFC_RND_MODE
183#undef RETTYPE
184#undef RETURN
185
186#undef ISFINITE
187#undef mpfr_signbit
188
189#undef mpfr_init
190#undef mpfr_init_set_ui
191#undef mpfr_clear
192#undef mpfr_swap
193#undef mpfr_fmod
194#undef mpfr_abs
195#undef mpfr_cmp_ld
196#undef mpfr_cmp_ui
197#undef mpfr_zero_p
198#undef mpfr_set
199#undef mpfr_set_zero
200#undef mpfr_set_inf
201#undef mpfr_set_ui
202#undef mpfr_set_si
203#undef mpfr_set_ld
204#undef mpfr_set_si_2exp
205#undef mpfr_get_z
206#undef mpfr_mul_si
207#undef mpfr_sub_d
208#undef mpfr_sub_ui
209#undef mpfr_sub
210#undef mpfr_ui_sub
211#undef mpfr_neg
212#undef mpfr_sin
213#undef mpfr_cos
214#undef mpfr_tan
215
216#undef mpz_init
217#undef mpz_clear
218#undef mpz_cmp_ui
219#undef mpz_divisible_ui_p
220
221#undef FMA
222#undef D2R
223
224#undef SET_COSD30
225
226
227/* vim: set ft=c: */
228