aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/intrinsic.c
diff options
context:
space:
mode:
authorFritz Reese <foreese@gcc.gnu.org>2020-04-07 11:59:36 -0400
committerFritz Reese <foreese@gcc.gnu.org>2020-04-07 13:18:38 -0400
commit57391ddaf39f7cb85825c32e83feb1435889da51 (patch)
treefa7a024410eba781d9676526155c893830cb9f9b /gcc/fortran/intrinsic.c
parent2daa92ac4b51387e55e88ee48bdc2fab7ba25981 (diff)
downloadgcc-57391ddaf39f7cb85825c32e83feb1435889da51.zip
gcc-57391ddaf39f7cb85825c32e83feb1435889da51.tar.gz
gcc-57391ddaf39f7cb85825c32e83feb1435889da51.tar.bz2
Fix PR fortran/93871 and re-implement degree-valued trigonometric intrinsics.
2020-04-01 Fritz Reese <foreese@gcc.gnu.org> Steven G. Kargl <kargl@gcc.gnu.org> gcc/fortran/ChangeLog PR fortran/93871 * gfortran.h (GFC_ISYM_ACOSD, GFC_ISYM_ASIND, GFC_ISYM_ATAN2D, GFC_ISYM_ATAND, GFC_ISYM_COSD, GFC_ISYM_COTAND, GFC_ISYM_SIND, GFC_ISYM_TAND): New. * intrinsic.c (add_functions): Remove check for flag_dec_math. Give degree trig functions simplification and name resolution functions (e.g, gfc_simplify_atrigd () and gfc_resolve_atrigd ()). (do_simplify): Remove special casing of degree trig functions. * intrinsic.h (gfc_simplify_acosd, gfc_simplify_asind, gfc_simplify_atand, gfc_simplify_cosd, gfc_simplify_cotand, gfc_simplify_sind, gfc_simplify_tand, gfc_resolve_trigd2): Add new prototypes. (gfc_simplify_atrigd, gfc_simplify_trigd, gfc_resolve_cotan, resolve_atrigd): Remove prototypes of deleted functions. * iresolve.c (is_trig_resolved, copy_replace_function_shallow, gfc_resolve_cotan, get_radians, get_degrees, resolve_trig_call, gfc_resolve_atrigd, gfc_resolve_atan2d): Delete functions. (gfc_resolve_trigd, gfc_resolve_trigd2): Resolve to library functions. * simplify.c (rad2deg, deg2rad, gfc_simplify_acosd, gfc_simplify_asind, gfc_simplify_atand, gfc_simplify_atan2d, gfc_simplify_cosd, gfc_simplify_sind, gfc_simplify_tand, gfc_simplify_cotand): New functions. (gfc_simplify_atan2): Fix error message. (simplify_trig_call, gfc_simplify_trigd, gfc_simplify_atrigd, radians_f): Delete functions. * trans-intrinsic.c: Add LIB_FUNCTION decls for sind, cosd, tand. (rad2deg, gfc_conv_intrinsic_atrigd, gfc_conv_intrinsic_cotan, gfc_conv_intrinsic_cotand, gfc_conv_intrinsic_atan2d): New functions. (gfc_conv_intrinsic_function): Handle ACOSD, ASIND, ATAND, COTAN, COTAND, ATAN2D. * trigd_fe.inc: New file. Included by simplify.c to implement simplify_sind, simplify_cosd, simplify_tand with code common to the libgfortran implementation. gcc/testsuite/ChangeLog PR fortran/93871 * gfortran.dg/dec_math.f90: Extend coverage to real(10) and real(16). * gfortran.dg/dec_math_2.f90: New test. * gfortran.dg/dec_math_3.f90: Likewise. * gfortran.dg/dec_math_4.f90: Likewise. * gfortran.dg/dec_math_5.f90: Likewise. libgfortran/ChangeLog PR fortran/93871 * Makefile.am, Makefile.in: New make rule for intrinsics/trigd.c. * gfortran.map: New routines for {sind, cosd, tand}X{r4, r8, r10, r16}. * intrinsics/trigd.c, intrinsics/trigd_lib.inc, intrinsics/trigd.inc: New files. Defines native degree-valued trig functions.
Diffstat (limited to 'gcc/fortran/intrinsic.c')
-rw-r--r--gcc/fortran/intrinsic.c193
1 files changed, 99 insertions, 94 deletions
diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c
index 3012187..17f5efc 100644
--- a/gcc/fortran/intrinsic.c
+++ b/gcc/fortran/intrinsic.c
@@ -3281,116 +3281,130 @@ add_functions (void)
make_generic ("loc", GFC_ISYM_LOC, GFC_STD_GNU);
- if (flag_dec_math)
- {
- add_sym_1 ("acosd", GFC_ISYM_ACOS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL,
- dr, GFC_STD_GNU,
- gfc_check_fn_r, gfc_simplify_atrigd, gfc_resolve_atrigd,
- x, BT_REAL, dr, REQUIRED);
-
- add_sym_1 ("dacosd", GFC_ISYM_ACOS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL,
- dd, GFC_STD_GNU,
- gfc_check_fn_d, gfc_simplify_atrigd, gfc_resolve_atrigd,
- x, BT_REAL, dd, REQUIRED);
- make_generic ("acosd", GFC_ISYM_ACOS, GFC_STD_GNU);
+ /* The next of intrinsic subprogram are the degree trignometric functions.
+ These were hidden behind the -fdec-math option, but are now simply
+ included as extensions to the set of intrinsic subprograms. */
- add_sym_1 ("asind", GFC_ISYM_ASIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL,
- dr, GFC_STD_GNU,
- gfc_check_fn_r, gfc_simplify_atrigd, gfc_resolve_atrigd,
- x, BT_REAL, dr, REQUIRED);
+ add_sym_1 ("acosd", GFC_ISYM_ACOSD, CLASS_ELEMENTAL, ACTUAL_YES,
+ BT_REAL, dr, GFC_STD_GNU,
+ gfc_check_fn_r, gfc_simplify_acosd, gfc_resolve_trigd,
+ x, BT_REAL, dr, REQUIRED);
- add_sym_1 ("dasind", GFC_ISYM_ASIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL,
- dd, GFC_STD_GNU,
- gfc_check_fn_d, gfc_simplify_atrigd, gfc_resolve_atrigd,
- x, BT_REAL, dd, REQUIRED);
+ add_sym_1 ("dacosd", GFC_ISYM_ACOSD, CLASS_ELEMENTAL, ACTUAL_YES,
+ BT_REAL, dd, GFC_STD_GNU,
+ gfc_check_fn_d, gfc_simplify_acosd, gfc_resolve_trigd,
+ x, BT_REAL, dd, REQUIRED);
- make_generic ("asind", GFC_ISYM_ASIN, GFC_STD_GNU);
+ make_generic ("acosd", GFC_ISYM_ACOSD, GFC_STD_GNU);
- add_sym_1 ("atand", GFC_ISYM_ATAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL,
- dr, GFC_STD_GNU,
- gfc_check_fn_r, gfc_simplify_atrigd, gfc_resolve_atrigd,
- x, BT_REAL, dr, REQUIRED);
+ add_sym_1 ("asind", GFC_ISYM_ASIND, CLASS_ELEMENTAL, ACTUAL_YES,
+ BT_REAL, dr, GFC_STD_GNU,
+ gfc_check_fn_r, gfc_simplify_asind, gfc_resolve_trigd,
+ x, BT_REAL, dr, REQUIRED);
- add_sym_1 ("datand", GFC_ISYM_ATAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL,
- dd, GFC_STD_GNU,
- gfc_check_fn_d, gfc_simplify_atrigd, gfc_resolve_atrigd,
- x, BT_REAL, dd, REQUIRED);
+ add_sym_1 ("dasind", GFC_ISYM_ASIND, CLASS_ELEMENTAL, ACTUAL_YES,
+ BT_REAL, dd, GFC_STD_GNU,
+ gfc_check_fn_d, gfc_simplify_asind, gfc_resolve_trigd,
+ x, BT_REAL, dd, REQUIRED);
- make_generic ("atand", GFC_ISYM_ATAN, GFC_STD_GNU);
+ make_generic ("asind", GFC_ISYM_ASIND, GFC_STD_GNU);
- add_sym_2 ("atan2d",GFC_ISYM_ATAN2,CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL,
- dr, GFC_STD_GNU,
- gfc_check_atan2, gfc_simplify_atan2d, gfc_resolve_atan2d,
- y, BT_REAL, dr, REQUIRED, x, BT_REAL, dr, REQUIRED);
+ add_sym_1 ("atand", GFC_ISYM_ATAND, CLASS_ELEMENTAL, ACTUAL_YES,
+ BT_REAL, dr, GFC_STD_GNU,
+ gfc_check_fn_r, gfc_simplify_atand, gfc_resolve_trigd,
+ x, BT_REAL, dr, REQUIRED);
- add_sym_2 ("datan2d",GFC_ISYM_ATAN2,CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL,
- dd, GFC_STD_GNU,
- gfc_check_datan2, gfc_simplify_atan2d, gfc_resolve_atan2d,
- y, BT_REAL, dd, REQUIRED, x, BT_REAL, dd, REQUIRED);
+ add_sym_1 ("datand", GFC_ISYM_ATAND, CLASS_ELEMENTAL, ACTUAL_YES,
+ BT_REAL, dd, GFC_STD_GNU,
+ gfc_check_fn_d, gfc_simplify_atand, gfc_resolve_trigd,
+ x, BT_REAL, dd, REQUIRED);
- make_generic ("atan2d", GFC_ISYM_ATAN2, GFC_STD_GNU);
+ make_generic ("atand", GFC_ISYM_ATAND, GFC_STD_GNU);
- add_sym_1 ("cosd", GFC_ISYM_COS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL,
- dr, GFC_STD_GNU,
- gfc_check_fn_r, gfc_simplify_trigd, gfc_resolve_trigd,
- x, BT_REAL, dr, REQUIRED);
+ add_sym_2 ("atan2d", GFC_ISYM_ATAN2D, CLASS_ELEMENTAL, ACTUAL_YES,
+ BT_REAL, dr, GFC_STD_GNU,
+ gfc_check_atan2, gfc_simplify_atan2d, gfc_resolve_trigd2,
+ y, BT_REAL, dr, REQUIRED,
+ x, BT_REAL, dr, REQUIRED);
- add_sym_1 ("dcosd", GFC_ISYM_COS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL,
- dd, GFC_STD_GNU,
- gfc_check_fn_d, gfc_simplify_trigd, gfc_resolve_trigd,
- x, BT_REAL, dd, REQUIRED);
+ add_sym_2 ("datan2d", GFC_ISYM_ATAN2D, CLASS_ELEMENTAL, ACTUAL_YES,
+ BT_REAL, dd, GFC_STD_GNU,
+ gfc_check_datan2, gfc_simplify_atan2d, gfc_resolve_trigd2,
+ y, BT_REAL, dd, REQUIRED,
+ x, BT_REAL, dd, REQUIRED);
- make_generic ("cosd", GFC_ISYM_COS, GFC_STD_GNU);
+ make_generic ("atan2d", GFC_ISYM_ATAN2D, GFC_STD_GNU);
- add_sym_1 ("cotan", GFC_ISYM_COTAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL,
- dr, GFC_STD_GNU,
- gfc_check_fn_rc2008, gfc_simplify_cotan, gfc_resolve_cotan,
- x, BT_REAL, dr, REQUIRED);
+ add_sym_1 ("cosd", GFC_ISYM_COSD, CLASS_ELEMENTAL, ACTUAL_YES,
+ BT_REAL, dr, GFC_STD_GNU,
+ gfc_check_fn_r, gfc_simplify_cosd, gfc_resolve_trigd,
+ x, BT_REAL, dr, REQUIRED);
- add_sym_1 ("dcotan", GFC_ISYM_COTAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL,
- dd, GFC_STD_GNU,
- gfc_check_fn_d, gfc_simplify_cotan, gfc_resolve_cotan,
- x, BT_REAL, dd, REQUIRED);
+ add_sym_1 ("dcosd", GFC_ISYM_COSD, CLASS_ELEMENTAL, ACTUAL_YES,
+ BT_REAL, dd, GFC_STD_GNU,
+ gfc_check_fn_d, gfc_simplify_cosd, gfc_resolve_trigd,
+ x, BT_REAL, dd, REQUIRED);
- make_generic ("cotan", GFC_ISYM_COTAN, GFC_STD_GNU);
+ make_generic ("cosd", GFC_ISYM_COSD, GFC_STD_GNU);
- add_sym_1 ("cotand", GFC_ISYM_COTAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL,
- dr, GFC_STD_GNU,
- gfc_check_fn_r, gfc_simplify_trigd, gfc_resolve_trigd,
- x, BT_REAL, dr, REQUIRED);
+ add_sym_1 ("cotan", GFC_ISYM_COTAN, CLASS_ELEMENTAL, ACTUAL_YES,
+ BT_REAL, dr, GFC_STD_GNU,
+ gfc_check_fn_rc2008, gfc_simplify_cotan, gfc_resolve_trigd,
+ x, BT_REAL, dr, REQUIRED);
- add_sym_1 ("dcotand",GFC_ISYM_COTAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL,
- dd, GFC_STD_GNU,
- gfc_check_fn_d, gfc_simplify_trigd, gfc_resolve_trigd,
- x, BT_REAL, dd, REQUIRED);
+ add_sym_1 ("dcotan", GFC_ISYM_COTAN, CLASS_ELEMENTAL, ACTUAL_YES,
+ BT_REAL, dd, GFC_STD_GNU,
+ gfc_check_fn_d, gfc_simplify_cotan, gfc_resolve_trigd,
+ x, BT_REAL, dd, REQUIRED);
- make_generic ("cotand", GFC_ISYM_COTAN, GFC_STD_GNU);
+ add_sym_1 ("ccotan", GFC_ISYM_COTAN, CLASS_ELEMENTAL, ACTUAL_YES,
+ BT_COMPLEX, dz, GFC_STD_GNU,
+ NULL, gfc_simplify_cotan, gfc_resolve_trigd,
+ x, BT_COMPLEX, dz, REQUIRED);
- add_sym_1 ("sind", GFC_ISYM_SIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL,
- dr, GFC_STD_GNU,
- gfc_check_fn_r, gfc_simplify_trigd, gfc_resolve_trigd,
- x, BT_REAL, dr, REQUIRED);
+ add_sym_1 ("zcotan", GFC_ISYM_COTAN, CLASS_ELEMENTAL, ACTUAL_YES,
+ BT_COMPLEX, dd, GFC_STD_GNU,
+ NULL, gfc_simplify_cotan, gfc_resolve_trigd,
+ x, BT_COMPLEX, dd, REQUIRED);
- add_sym_1 ("dsind", GFC_ISYM_SIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL,
- dd, GFC_STD_GNU,
- gfc_check_fn_d, gfc_simplify_trigd, gfc_resolve_trigd,
- x, BT_REAL, dd, REQUIRED);
+ make_generic ("cotan", GFC_ISYM_COTAN, GFC_STD_GNU);
- make_generic ("sind", GFC_ISYM_SIN, GFC_STD_GNU);
+ add_sym_1 ("cotand", GFC_ISYM_COTAND, CLASS_ELEMENTAL, ACTUAL_YES,
+ BT_REAL, dr, GFC_STD_GNU,
+ gfc_check_fn_r, gfc_simplify_cotand, gfc_resolve_trigd,
+ x, BT_REAL, dr, REQUIRED);
- add_sym_1 ("tand", GFC_ISYM_TAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL,
- dr, GFC_STD_GNU,
- gfc_check_fn_r, gfc_simplify_trigd, gfc_resolve_trigd,
- x, BT_REAL, dr, REQUIRED);
+ add_sym_1 ("dcotand", GFC_ISYM_COTAND, CLASS_ELEMENTAL, ACTUAL_YES,
+ BT_REAL, dd, GFC_STD_GNU,
+ gfc_check_fn_d, gfc_simplify_cotand, gfc_resolve_trigd,
+ x, BT_REAL, dd, REQUIRED);
- add_sym_1 ("dtand", GFC_ISYM_TAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL,
- dd, GFC_STD_GNU,
- gfc_check_fn_d, gfc_simplify_trigd, gfc_resolve_trigd,
- x, BT_REAL, dd, REQUIRED);
+ make_generic ("cotand", GFC_ISYM_COTAND, GFC_STD_GNU);
- make_generic ("tand", GFC_ISYM_TAN, GFC_STD_GNU);
- }
+ add_sym_1 ("sind", GFC_ISYM_SIND, CLASS_ELEMENTAL, ACTUAL_YES,
+ BT_REAL, dr, GFC_STD_GNU,
+ gfc_check_fn_r, gfc_simplify_sind, gfc_resolve_trigd,
+ x, BT_REAL, dr, REQUIRED);
+
+ add_sym_1 ("dsind", GFC_ISYM_SIND, CLASS_ELEMENTAL, ACTUAL_YES,
+ BT_REAL, dd, GFC_STD_GNU,
+ gfc_check_fn_d, gfc_simplify_sind, gfc_resolve_trigd,
+ x, BT_REAL, dd, REQUIRED);
+
+ make_generic ("sind", GFC_ISYM_SIND, GFC_STD_GNU);
+
+ add_sym_1 ("tand", GFC_ISYM_TAND, CLASS_ELEMENTAL, ACTUAL_YES,
+ BT_REAL, dr, GFC_STD_GNU,
+ gfc_check_fn_r, gfc_simplify_tand, gfc_resolve_trigd,
+ x, BT_REAL, dr, REQUIRED);
+
+ add_sym_1 ("dtand", GFC_ISYM_TAND, CLASS_ELEMENTAL, ACTUAL_YES,
+ BT_REAL, dd, GFC_STD_GNU,
+ gfc_check_fn_d, gfc_simplify_tand, gfc_resolve_trigd,
+ x, BT_REAL, dd, REQUIRED);
+
+ make_generic ("tand", GFC_ISYM_TAND, GFC_STD_GNU);
/* The following function is internally used for coarray libray functions.
"make_from_module" makes it inaccessible for external users. */
@@ -4566,15 +4580,6 @@ do_simplify (gfc_intrinsic_sym *specific, gfc_expr *e)
goto finish;
}
- /* Some math intrinsics need to wrap the original expression. */
- if (specific->simplify.f1 == gfc_simplify_trigd
- || specific->simplify.f1 == gfc_simplify_atrigd
- || specific->simplify.f1 == gfc_simplify_cotan)
- {
- result = (*specific->simplify.f1) (e);
- goto finish;
- }
-
if (specific->simplify.f1 == NULL)
{
result = NULL;