diff options
Diffstat (limited to 'gcc/fortran/f95-lang.c')
-rw-r--r-- | gcc/fortran/f95-lang.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/gcc/fortran/f95-lang.c b/gcc/fortran/f95-lang.c index 8e8591a..66cd3a3 100644 --- a/gcc/fortran/f95-lang.c +++ b/gcc/fortran/f95-lang.c @@ -563,6 +563,7 @@ gfc_builtin_function (tree decl) #define ATTR_NOTHROW_LEAF_LIST (ECF_NOTHROW | ECF_LEAF) #define ATTR_NOTHROW_LEAF_MALLOC_LIST (ECF_NOTHROW | ECF_LEAF | ECF_MALLOC) #define ATTR_CONST_NOTHROW_LEAF_LIST (ECF_NOTHROW | ECF_LEAF | ECF_CONST) +#define ATTR_PURE_NOTHROW_LEAF_LIST (ECF_NOTHROW | ECF_LEAF | ECF_PURE) #define ATTR_NOTHROW_LIST (ECF_NOTHROW) #define ATTR_CONST_NOTHROW_LIST (ECF_NOTHROW | ECF_CONST) @@ -683,6 +684,8 @@ gfc_init_builtin_functions (void) tree ftype, ptype; tree builtin_types[(int) BT_LAST + 1]; + int attr; + build_builtin_fntypes (mfunc_float, float_type_node); build_builtin_fntypes (mfunc_double, double_type_node); build_builtin_fntypes (mfunc_longdouble, long_double_type_node); @@ -770,6 +773,32 @@ gfc_init_builtin_functions (void) BUILT_IN_NEXTAFTERF, "nextafterf", ATTR_CONST_NOTHROW_LEAF_LIST); + /* Some built-ins depend on rounding mode. Depending on compilation options, they + will be "pure" or "const". */ + attr = flag_rounding_math ? ATTR_PURE_NOTHROW_LEAF_LIST : ATTR_CONST_NOTHROW_LEAF_LIST; + + gfc_define_builtin ("__builtin_rintl", mfunc_longdouble[0], + BUILT_IN_RINTL, "rintl", attr); + gfc_define_builtin ("__builtin_rint", mfunc_double[0], + BUILT_IN_RINT, "rint", attr); + gfc_define_builtin ("__builtin_rintf", mfunc_float[0], + BUILT_IN_RINTF, "rintf", attr); + + gfc_define_builtin ("__builtin_remainderl", mfunc_longdouble[1], + BUILT_IN_REMAINDERL, "remainderl", attr); + gfc_define_builtin ("__builtin_remainder", mfunc_double[1], + BUILT_IN_REMAINDER, "remainder", attr); + gfc_define_builtin ("__builtin_remainderf", mfunc_float[1], + BUILT_IN_REMAINDERF, "remainderf", attr); + + gfc_define_builtin ("__builtin_logbl", mfunc_longdouble[0], + BUILT_IN_LOGBL, "logbl", ATTR_CONST_NOTHROW_LEAF_LIST); + gfc_define_builtin ("__builtin_logb", mfunc_double[0], + BUILT_IN_LOGB, "logb", ATTR_CONST_NOTHROW_LEAF_LIST); + gfc_define_builtin ("__builtin_logbf", mfunc_float[0], + BUILT_IN_LOGBF, "logbf", ATTR_CONST_NOTHROW_LEAF_LIST); + + gfc_define_builtin ("__builtin_frexpl", mfunc_longdouble[4], BUILT_IN_FREXPL, "frexpl", ATTR_NOTHROW_LEAF_LIST); gfc_define_builtin ("__builtin_frexp", mfunc_double[4], @@ -960,6 +989,34 @@ gfc_init_builtin_functions (void) void_type_node, NULL_TREE); gfc_define_builtin ("__builtin_isnan", ftype, BUILT_IN_ISNAN, "__builtin_isnan", ATTR_CONST_NOTHROW_LEAF_LIST); + gfc_define_builtin ("__builtin_isfinite", ftype, BUILT_IN_ISFINITE, + "__builtin_isfinite", ATTR_CONST_NOTHROW_LEAF_LIST); + gfc_define_builtin ("__builtin_isnormal", ftype, BUILT_IN_ISNORMAL, + "__builtin_isnormal", ATTR_CONST_NOTHROW_LEAF_LIST); + + ftype = build_function_type_list (integer_type_node, void_type_node, + void_type_node, NULL_TREE); + gfc_define_builtin ("__builtin_isunordered", ftype, BUILT_IN_ISUNORDERED, + "__builtin_isunordered", ATTR_CONST_NOTHROW_LEAF_LIST); + gfc_define_builtin ("__builtin_islessequal", ftype, BUILT_IN_ISLESSEQUAL, + "__builtin_islessequal", ATTR_CONST_NOTHROW_LEAF_LIST); + gfc_define_builtin ("__builtin_isgreaterequal", ftype, + BUILT_IN_ISGREATEREQUAL, "__builtin_isgreaterequal", + ATTR_CONST_NOTHROW_LEAF_LIST); + + ftype = build_function_type_list (integer_type_node, + float_type_node, NULL_TREE); + gfc_define_builtin("__builtin_signbitf", ftype, BUILT_IN_SIGNBITF, + "signbitf", ATTR_CONST_NOTHROW_LEAF_LIST); + ftype = build_function_type_list (integer_type_node, + double_type_node, NULL_TREE); + gfc_define_builtin("__builtin_signbit", ftype, BUILT_IN_SIGNBIT, + "signbit", ATTR_CONST_NOTHROW_LEAF_LIST); + ftype = build_function_type_list (integer_type_node, + long_double_type_node, NULL_TREE); + gfc_define_builtin("__builtin_signbitl", ftype, BUILT_IN_SIGNBITL, + "signbitl", ATTR_CONST_NOTHROW_LEAF_LIST); + #define DEF_PRIMITIVE_TYPE(ENUM, VALUE) \ builtin_types[(int) ENUM] = VALUE; |