diff options
author | Martin Liska <mliska@suse.cz> | 2018-11-27 14:06:48 +0100 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2018-11-27 13:06:48 +0000 |
commit | facf0354cfdaa555f376311b9d3c8fec79747f09 (patch) | |
tree | 3ef0c2c2a134b5685f82b8144402a410645d79a7 /gcc/fortran/trans-intrinsic.c | |
parent | 2ff5ffb623e17b6bb81532394cb1f42fe7b354c8 (diff) | |
download | gcc-facf0354cfdaa555f376311b9d3c8fec79747f09.zip gcc-facf0354cfdaa555f376311b9d3c8fec79747f09.tar.gz gcc-facf0354cfdaa555f376311b9d3c8fec79747f09.tar.bz2 |
Support simd function declarations via a pre-include.
2018-11-27 Martin Liska <mliska@suse.cz>
* config/gnu-user.h (TARGET_F951_OPTIONS): New.
* gcc.c (find_fortran_preinclude_file): New function
to handle Fortran pre-include.
2018-11-27 Martin Liska <mliska@suse.cz>
* decl.c (gfc_match_gcc_builtin): New function.
* gfortran.h (struct vect_builtin_tuple): New.
(gfc_adjust_builtins): Likewise.
* lang-specs.h (TARGET_F951_OPTIONS): New.
(F951_OPTIONS): Use it.
* lang.opt: Add new option -fpre-include.
* match.h (gfc_match_gcc_builtin): Declare new function.
* parse.c (decode_gcc_attribute): Handle builtin.
(parse_progunit): Call gfc_adjust_builtins.
* scanner.c (gfc_new_file): Load pre-included header file
when provided.
* trans-intrinsic.c (add_simd_flag_for_built_in): New.
(gfc_adjust_builtins): Likewise.
2018-11-27 Martin Liska <mliska@suse.cz>
* gfortran.dg/simd-builtins-1.f90: New test.
* gfortran.dg/simd-builtins-1.h: New test.
* gfortran.dg/simd-builtins-2.f90: New test.
* gfortran.dg/simd-builtins-3.f90: New test.
* gfortran.dg/simd-builtins-3.h: New test.
* gfortran.dg/simd-builtins-4.f: New test.
* gfortran.dg/simd-builtins-4.h: New test.
* gfortran.dg/simd-builtins-5.f: New test.
* gfortran.dg/simd-builtins-6.f90: New test.
From-SVN: r266509
Diffstat (limited to 'gcc/fortran/trans-intrinsic.c')
-rw-r--r-- | gcc/fortran/trans-intrinsic.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c index 4ae2b32..40a7491 100644 --- a/gcc/fortran/trans-intrinsic.c +++ b/gcc/fortran/trans-intrinsic.c @@ -597,7 +597,77 @@ define_quad_builtin (const char *name, tree type, bool is_const) return fndecl; } +/* Add SIMD attribute for FNDECL built-in if the built-in + name is in VECTORIZED_BUILTINS. */ +static void +add_simd_flag_for_built_in (tree fndecl) +{ + if (gfc_vectorized_builtins == NULL + || fndecl == NULL_TREE) + return; + + const char *name = IDENTIFIER_POINTER (DECL_NAME (fndecl)); + int *clauses = gfc_vectorized_builtins->get (name); + if (clauses) + { + for (unsigned i = 0; i < 3; i++) + if (*clauses & (1 << i)) + { + gfc_simd_clause simd_type = (gfc_simd_clause)*clauses; + tree omp_clause = NULL_TREE; + if (simd_type == SIMD_NONE) + ; /* No SIMD clause. */ + else + { + omp_clause_code code + = (simd_type == SIMD_INBRANCH + ? OMP_CLAUSE_INBRANCH : OMP_CLAUSE_NOTINBRANCH); + omp_clause = build_omp_clause (UNKNOWN_LOCATION, code); + omp_clause = build_tree_list (NULL_TREE, omp_clause); + } + + DECL_ATTRIBUTES (fndecl) + = tree_cons (get_identifier ("omp declare simd"), omp_clause, + DECL_ATTRIBUTES (fndecl)); + } + } +} + + /* Set SIMD attribute to all built-in functions that are mentioned + in gfc_vectorized_builtins vector. */ + +void +gfc_adjust_builtins (void) +{ + gfc_intrinsic_map_t *m; + for (m = gfc_intrinsic_map; + m->id != GFC_ISYM_NONE || m->double_built_in != END_BUILTINS; m++) + { + add_simd_flag_for_built_in (m->real4_decl); + add_simd_flag_for_built_in (m->complex4_decl); + add_simd_flag_for_built_in (m->real8_decl); + add_simd_flag_for_built_in (m->complex8_decl); + add_simd_flag_for_built_in (m->real10_decl); + add_simd_flag_for_built_in (m->complex10_decl); + add_simd_flag_for_built_in (m->real16_decl); + add_simd_flag_for_built_in (m->complex16_decl); + add_simd_flag_for_built_in (m->real16_decl); + add_simd_flag_for_built_in (m->complex16_decl); + } + + /* Release all strings. */ + if (gfc_vectorized_builtins != NULL) + { + for (hash_map<nofree_string_hash, int>::iterator it + = gfc_vectorized_builtins->begin (); + it != gfc_vectorized_builtins->end (); ++it) + free (CONST_CAST (char *, (*it).first)); + + delete gfc_vectorized_builtins; + gfc_vectorized_builtins = NULL; + } +} /* Initialize function decls for library functions. The external functions are created as required. Builtin functions are added here. */ |