mathbuiltins.def: Do not defined huge_val built-in.

* mathbuiltins.def: Do not defined huge_val built-in.
	* trans-const.c (gfc_build_inf_or_huge): New function.
	* trans-const.h (gfc_build_inf_or_huge): New prototype.
	* f95-lang.c (gfc_init_builtin_functions): Don't defined
	huge_val built-ins.
	* trans-intrinsic.c (gfc_build_intrinsic_lib_fndecls): We don't
	have functions of type (*) (void) anymore.
	(gfc_conv_intrinsic_minmaxloc): Call gfc_build_inf_or_huge.
	(gfc_conv_intrinsic_nearest): Call gfc_build_inf_or_huge instead
	of generating a call to huge_val().

From-SVN: r164216
This commit is contained in:
Francois-Xavier Coudert 2010-09-11 16:34:20 +00:00 committed by François-Xavier Coudert
parent 616f12900d
commit a67189d490
6 changed files with 43 additions and 24 deletions

View File

@ -1,3 +1,16 @@
2010-09-11 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
* mathbuiltins.def: Do not defined huge_val built-in.
* trans-const.c (gfc_build_inf_or_huge): New function.
* trans-const.h (gfc_build_inf_or_huge): New prototype.
* f95-lang.c (gfc_init_builtin_functions): Don't defined
huge_val built-ins.
* trans-intrinsic.c (gfc_build_intrinsic_lib_fndecls): We don't
have functions of type (*) (void) anymore.
(gfc_conv_intrinsic_minmaxloc): Call gfc_build_inf_or_huge.
(gfc_conv_intrinsic_nearest): Call gfc_build_inf_or_huge instead
of generating a call to huge_val().
2010-09-11 Mikael Morin <mikael@gcc.gnu.org>
* gfortran.h (gfc_expr): Remove inline_noncopying_intrinsic attribute.

View File

@ -856,13 +856,6 @@ gfc_init_builtin_functions (void)
gfc_define_builtin ("__builtin_fmodf", mfunc_float[1],
BUILT_IN_FMODF, "fmodf", true);
gfc_define_builtin ("__builtin_huge_vall", mfunc_longdouble[3],
BUILT_IN_HUGE_VALL, "__builtin_huge_vall", true);
gfc_define_builtin ("__builtin_huge_val", mfunc_double[3],
BUILT_IN_HUGE_VAL, "__builtin_huge_val", true);
gfc_define_builtin ("__builtin_huge_valf", mfunc_float[3],
BUILT_IN_HUGE_VALF, "__builtin_huge_valf", true);
/* lround{f,,l} and llround{f,,l} */
ftype = build_function_type_list (long_integer_type_node,
float_type_node, NULL_TREE);

View File

@ -62,7 +62,6 @@ OTHER_BUILTIN (CPOW, "cpow", cpow, true)
OTHER_BUILTIN (FABS, "fabs", 1, true)
OTHER_BUILTIN (FMOD, "fmod", 2, true)
OTHER_BUILTIN (FREXP, "frexp", frexp, false)
OTHER_BUILTIN (HUGE_VAL, "huge_val", 0, true)
OTHER_BUILTIN (LLROUND, "llround", llround, true)
OTHER_BUILTIN (LROUND, "lround", lround, true)
OTHER_BUILTIN (NEXTAFTER, "nextafter", 2, true)

View File

@ -235,6 +235,26 @@ gfc_conv_mpfr_to_tree (mpfr_t f, int kind, int is_snan)
return build_real (type, real);
}
/* Returns a real constant that is +Infinity if the target
supports infinities for this floating-point mode, and
+HUGE_VAL otherwise (the largest representable number). */
tree
gfc_build_inf_or_huge (tree type, int kind)
{
if (HONOR_INFINITIES (TYPE_MODE (type)))
{
REAL_VALUE_TYPE real;
real_inf (&real);
return build_real (type, real);
}
else
{
int k = gfc_validate_kind (BT_REAL, kind, false);
return gfc_conv_mpfr_to_tree (gfc_real_kinds[k].huge, kind, 0);
}
}
/* Converts a backend tree into a real constant. */
void

View File

@ -27,6 +27,10 @@ void gfc_conv_tree_to_mpz (mpz_t, tree);
tree gfc_conv_mpfr_to_tree (mpfr_t, int, int);
void gfc_conv_tree_to_mpfr (mpfr_ptr, tree);
/* Build a tree containing a real infinity (or HUGE if infinities are
not supported for the given type. */
tree gfc_build_inf_or_huge (tree, int);
/* Build a tree for a constant. Must be an EXPR_CONSTANT gfc_expr.
For CHARACTER literal constants, the caller still has to set the
string length as a separate operation. */

View File

@ -621,13 +621,11 @@ gfc_build_intrinsic_lib_fndecls (void)
C99-like library functions. For now, we only handle __float128
q-suffixed functions. */
tree tmp, func_0, func_1, func_2, func_cabs, func_frexp;
tree tmp, func_1, func_2, func_cabs, func_frexp;
tree func_lround, func_llround, func_scalbn, func_cpow;
memset (quad_decls, 0, sizeof(tree) * (END_BUILTINS + 1));
/* type (*) (void) */
func_0 = build_function_type (float128_type_node, void_list_node);
/* type (*) (type) */
tmp = tree_cons (NULL_TREE, float128_type_node, void_list_node);
func_1 = build_function_type (float128_type_node, tmp);
@ -2490,22 +2488,14 @@ gfc_conv_intrinsic_minmaxloc (gfc_se * se, gfc_expr * expr, enum tree_code op)
}
limit = gfc_create_var (gfc_typenode_for_spec (&arrayexpr->ts), "limit");
n = gfc_validate_kind (arrayexpr->ts.type, arrayexpr->ts.kind, false);
switch (arrayexpr->ts.type)
{
case BT_REAL:
if (HONOR_INFINITIES (DECL_MODE (limit)))
{
REAL_VALUE_TYPE real;
real_inf (&real);
tmp = build_real (TREE_TYPE (limit), real);
}
else
tmp = gfc_conv_mpfr_to_tree (gfc_real_kinds[n].huge,
arrayexpr->ts.kind, 0);
tmp = gfc_build_inf_or_huge (TREE_TYPE (limit), arrayexpr->ts.kind);
break;
case BT_INTEGER:
n = gfc_validate_kind (arrayexpr->ts.type, arrayexpr->ts.kind, false);
tmp = gfc_conv_mpz_to_tree (gfc_integer_kinds[n].huge,
arrayexpr->ts.kind);
break;
@ -4242,12 +4232,12 @@ gfc_conv_intrinsic_nearest (gfc_se * se, gfc_expr * expr)
nextafter = gfc_builtin_decl_for_float_kind (BUILT_IN_NEXTAFTER, expr->ts.kind);
copysign = gfc_builtin_decl_for_float_kind (BUILT_IN_COPYSIGN, expr->ts.kind);
huge_val = gfc_builtin_decl_for_float_kind (BUILT_IN_HUGE_VAL, expr->ts.kind);
type = gfc_typenode_for_spec (&expr->ts);
gfc_conv_intrinsic_function_args (se, expr, args, 2);
tmp = build_call_expr_loc (input_location, copysign, 2,
build_call_expr_loc (input_location, huge_val, 0),
huge_val = gfc_build_inf_or_huge (type, expr->ts.kind);
tmp = build_call_expr_loc (input_location, copysign, 2, huge_val,
fold_convert (type, args[1]));
se->expr = build_call_expr_loc (input_location, nextafter, 2,
fold_convert (type, args[0]), tmp);