diff options
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index c165e34..78fc11f 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -7355,6 +7355,12 @@ fold_builtin_floor (tree fndecl, tree arglist) } } + /* Fold floor (x) where x is nonnegative to trunc (x). */ + if (tree_expr_nonnegative_p (arg)) + return build_function_call_expr (mathfn_built_in (TREE_TYPE (arg), + BUILT_IN_TRUNC), + arglist); + return fold_trunc_transparent_mathfn (fndecl, arglist); } @@ -7473,6 +7479,18 @@ fold_builtin_int_roundingfn (tree fndecl, tree arglist) } } + switch (DECL_FUNCTION_CODE (fndecl)) + { + CASE_FLT_FN (BUILT_IN_LFLOOR): + CASE_FLT_FN (BUILT_IN_LLFLOOR): + /* Fold lfloor (x) where x is nonnegative to FIX_TRUNC (x). */ + if (tree_expr_nonnegative_p (arg)) + return fold_build1 (FIX_TRUNC_EXPR, TREE_TYPE (TREE_TYPE (fndecl)), + arg); + break; + default:; + } + return fold_fixed_mathfn (fndecl, arglist); } |