diff options
author | Jan Hubicka <jh@suse.cz> | 2003-01-25 12:08:38 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2003-01-25 11:08:38 +0000 |
commit | 27a6aa72db18e4db31d278e2c215f2e97003fed9 (patch) | |
tree | bc0779caa5e2de92be82d96a6cc20c3feba386ca /gcc/builtins.c | |
parent | cd68f4e4c2a39e5cf91a91cde8fddfda4be456b3 (diff) | |
download | gcc-27a6aa72db18e4db31d278e2c215f2e97003fed9.zip gcc-27a6aa72db18e4db31d278e2c215f2e97003fed9.tar.gz gcc-27a6aa72db18e4db31d278e2c215f2e97003fed9.tar.bz2 |
builtins.c (fold_trunc_transparent_mathfn): New function.
* builtins.c (fold_trunc_transparent_mathfn): New function.
(fold_builtin): Use it.
* convert.c (convert_to_real): Re-enable code to convert
math functions; add support for floor familly functions.
From-SVN: r61764
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index 851fc27..d544410 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -157,6 +157,7 @@ static tree fold_builtin_classify_type PARAMS ((tree)); static tree fold_builtin_inf PARAMS ((tree, int)); static tree fold_builtin_nan PARAMS ((tree, tree, int)); static int validate_arglist PARAMS ((tree, ...)); +static tree fold_trunc_transparent_mathfn PARAMS ((tree)); /* Return the alignment in bits of EXP, a pointer valued expression. But don't return more than MAX_ALIGN no matter what. @@ -4423,6 +4424,36 @@ fold_builtin_nan (arglist, type, quiet) return build_real (type, real); } +/* EXP is assumed to me builtin call where truncation can be propagated + across (for instance floor((double)f) == (double)floorf (f). + Do the transformation. */ +static tree +fold_trunc_transparent_mathfn (exp) + tree exp; +{ + tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0); + tree arglist = TREE_OPERAND (exp, 1); + enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl); + + if (optimize && validate_arglist (arglist, REAL_TYPE, VOID_TYPE)) + { + tree arg0 = strip_float_extensions (TREE_VALUE (arglist)); + tree ftype = TREE_TYPE (exp); + tree newtype = TREE_TYPE (arg0); + tree decl; + + if (TYPE_PRECISION (newtype) < TYPE_PRECISION (ftype) + && (decl = mathfn_built_in (newtype, fcode))) + { + arglist = + build_tree_list (NULL_TREE, fold (convert (newtype, arg0))); + return convert (ftype, + build_function_call_expr (decl, arglist)); + } + } + return 0; +} + /* Used by constant folding to eliminate some builtin calls early. EXP is the CALL_EXPR of a call to a builtin function. */ @@ -4574,6 +4605,23 @@ fold_builtin (exp) case BUILT_IN_NANSL: return fold_builtin_nan (arglist, TREE_TYPE (TREE_TYPE (fndecl)), false); + case BUILT_IN_FLOOR: + case BUILT_IN_FLOORF: + case BUILT_IN_FLOORL: + case BUILT_IN_CEIL: + case BUILT_IN_CEILF: + case BUILT_IN_CEILL: + case BUILT_IN_TRUNC: + case BUILT_IN_TRUNCF: + case BUILT_IN_TRUNCL: + case BUILT_IN_ROUND: + case BUILT_IN_ROUNDF: + case BUILT_IN_ROUNDL: + case BUILT_IN_NEARBYINT: + case BUILT_IN_NEARBYINTF: + case BUILT_IN_NEARBYINTL: + return fold_trunc_transparent_mathfn (exp); + default: break; } |