diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2015-10-05 13:37:15 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2015-10-05 13:37:15 +0000 |
commit | 73463c5e847ca23a8f51ef5b8ad8a19c99696799 (patch) | |
tree | 1e4a42eb36f306f1da5a94e136fcbde03c213296 /gcc/builtins.c | |
parent | 5b295a81dd8e7650d334dc71581e64d5736bc3ab (diff) | |
download | gcc-73463c5e847ca23a8f51ef5b8ad8a19c99696799.zip gcc-73463c5e847ca23a8f51ef5b8ad8a19c99696799.tar.gz gcc-73463c5e847ca23a8f51ef5b8ad8a19c99696799.tar.bz2 |
Add a build_real_truncate helper function
...which simplifies the match.pd patterns I'm about to add.
Bootstrapped & regression-tested on x86_64-linux-gnu.
gcc/
* real.h (build_real_truncate): Declare.
* tree.c (build_real_truncate): New function.
(strip_float_extensions): Use it.
* builtins.c (fold_builtin_cabs, fold_builtin_sqrt, fold_builtin_cbrt)
(fold_builtin_hypot, fold_builtin_pow): Likewise.
* match.pd: Likewise.
From-SVN: r228483
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 43 |
1 files changed, 14 insertions, 29 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index 9a81a18..89bea60 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -7592,12 +7592,10 @@ fold_builtin_cabs (location_t loc, tree arg, tree type, tree fndecl) if (flag_unsafe_math_optimizations && operand_equal_p (real, imag, OEP_PURE_SAME)) { - const REAL_VALUE_TYPE sqrt2_trunc - = real_value_truncate (TYPE_MODE (type), dconst_sqrt2 ()); STRIP_NOPS (real); return fold_build2_loc (loc, MULT_EXPR, type, - fold_build1_loc (loc, ABS_EXPR, type, real), - build_real (type, sqrt2_trunc)); + fold_build1_loc (loc, ABS_EXPR, type, real), + build_real_truncate (type, dconst_sqrt2 ())); } } @@ -7756,8 +7754,7 @@ fold_builtin_sqrt (location_t loc, tree arg, tree type) /* Adjust for the outer root. */ SET_REAL_EXP (&dconstroot, REAL_EXP (&dconstroot) - 1); - dconstroot = real_value_truncate (TYPE_MODE (type), dconstroot); - tree_root = build_real (type, dconstroot); + tree_root = build_real_truncate (type, dconstroot); return build_call_expr_loc (loc, powfn, 2, arg0, tree_root); } } @@ -7804,11 +7801,9 @@ fold_builtin_cbrt (location_t loc, tree arg, tree type) if (BUILTIN_EXPONENT_P (fcode)) { tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg), 0); - const REAL_VALUE_TYPE third_trunc = - real_value_truncate (TYPE_MODE (type), dconst_third ()); arg = fold_build2_loc (loc, MULT_EXPR, type, - CALL_EXPR_ARG (arg, 0), - build_real (type, third_trunc)); + CALL_EXPR_ARG (arg, 0), + build_real_truncate (type, dconst_third ())); return build_call_expr_loc (loc, expfn, 1, arg); } @@ -7824,8 +7819,7 @@ fold_builtin_cbrt (location_t loc, tree arg, tree type) REAL_VALUE_TYPE dconstroot = dconst_third (); SET_REAL_EXP (&dconstroot, REAL_EXP (&dconstroot) - 1); - dconstroot = real_value_truncate (TYPE_MODE (type), dconstroot); - tree_root = build_real (type, dconstroot); + tree_root = build_real_truncate (type, dconstroot); return build_call_expr_loc (loc, powfn, 2, arg0, tree_root); } } @@ -7845,8 +7839,7 @@ fold_builtin_cbrt (location_t loc, tree arg, tree type) real_arithmetic (&dconstroot, MULT_EXPR, dconst_third_ptr (), dconst_third_ptr ()); - dconstroot = real_value_truncate (TYPE_MODE (type), dconstroot); - tree_root = build_real (type, dconstroot); + tree_root = build_real_truncate (type, dconstroot); return build_call_expr_loc (loc, powfn, 2, arg0, tree_root); } } @@ -7862,10 +7855,8 @@ fold_builtin_cbrt (location_t loc, tree arg, tree type) if (tree_expr_nonnegative_p (arg00)) { tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg), 0); - const REAL_VALUE_TYPE dconstroot - = real_value_truncate (TYPE_MODE (type), dconst_third ()); - tree narg01 = fold_build2_loc (loc, MULT_EXPR, type, arg01, - build_real (type, dconstroot)); + tree c = build_real_truncate (type, dconst_third ()); + tree narg01 = fold_build2_loc (loc, MULT_EXPR, type, arg01, c); return build_call_expr_loc (loc, powfn, 2, arg00, narg01); } } @@ -8391,13 +8382,9 @@ fold_builtin_hypot (location_t loc, tree fndecl, /* hypot(x,x) -> fabs(x)*sqrt(2). */ if (flag_unsafe_math_optimizations && operand_equal_p (arg0, arg1, OEP_PURE_SAME)) - { - const REAL_VALUE_TYPE sqrt2_trunc - = real_value_truncate (TYPE_MODE (type), dconst_sqrt2 ()); - return fold_build2_loc (loc, MULT_EXPR, type, - fold_build1_loc (loc, ABS_EXPR, type, arg0), - build_real (type, sqrt2_trunc)); - } + return fold_build2_loc (loc, MULT_EXPR, type, + fold_build1_loc (loc, ABS_EXPR, type, arg0), + build_real_truncate (type, dconst_sqrt2 ())); return NULL_TREE; } @@ -8529,10 +8516,8 @@ fold_builtin_pow (location_t loc, tree fndecl, tree arg0, tree arg1, tree type) tree arg = CALL_EXPR_ARG (arg0, 0); if (tree_expr_nonnegative_p (arg)) { - const REAL_VALUE_TYPE dconstroot - = real_value_truncate (TYPE_MODE (type), dconst_third ()); - tree narg1 = fold_build2_loc (loc, MULT_EXPR, type, arg1, - build_real (type, dconstroot)); + tree c = build_real_truncate (type, dconst_third ()); + tree narg1 = fold_build2_loc (loc, MULT_EXPR, type, arg1, c); return build_call_expr_loc (loc, fndecl, 2, arg, narg1); } } |