Richard Biener <richard.guent...@gmail.com> writes: > On Thu, Oct 1, 2015 at 3:59 PM, Bernd Schmidt <bschm...@redhat.com> wrote: >> On 10/01/2015 03:51 PM, Richard Sandiford wrote: >>> >>> We have a global 1/2 and a cached 1/3, but recalculate 1/4, 1/6 and 1/9 >>> each time we need them. That seems a bit arbitrary and makes the folding >>> code more noisy (especially once it's moved to match.pd). >>> >>> This patch caches the other three constants too. Bootstrapped & >>> regression-tested on x86_64-linux-gnu. OK to install? >> >> >> Looks reasonable enough. > > Given > > /* Returns the special REAL_VALUE_TYPE corresponding to 1/3. */ > > const REAL_VALUE_TYPE * > dconst_third_ptr (void) > { > static REAL_VALUE_TYPE value; > > /* Initialize mathematical constants for constant folding builtins. > These constants need to be given to at least 160 bits precision. */ > if (value.cl == rvc_zero) > { > real_arithmetic (&value, RDIV_EXPR, &dconst1, real_digit (3)); > } > return &value; > } > > I wonder if it makes sense to have > > template<int a, int b> > const REAL_VALUE_TYPE & > dconst (void) > { > static REAL_VALUE_TYPE value; > if (value.cl == rvc_zero) > real_arithmetic (&value, RDIV_EXPR, real_digit (a), real_digit (b)); > return value; > } > > instead which allows us to use > > dconst<1,2>() > > in place of dconst_half () and allows arbitrary extra cached constants to be > added (well, double-check that, but I think the function static should be > a .comdat).
You suggested on IRC that we do the same for the integral constants, so e.g. dconst0 becomes dconst<0> (). Here's the result. Like I said, I think this may be a case of "be careful what you wish for". Bootstrapped & regression-tested on x86_64-linux-gnu. Also tested by building one target per CPU directory and checking that there were no new warnings and no changes in testsuite output at -O2. OK to install? Thanks, Richard gcc/ada/ * gcc-interface/trans.c (convert_with_check): Use dconst template instead of static variables. gcc/c-family/ * c-common.c (c_common_truthvalue_conversion): Use dconst template instead of static variables. * c-lex.c (interpret_float): Likewise. * c-ubsan.c (ubsan_instrument_division): Likewise. gcc/java/ * decl.c (java_init_decl_processing): Use dconst template instead of static variables. gcc/ * real.h (dconst0, dconst1, dconst2, dconstm1, dconsthalf): Delete. (dconst_third, dconst_third_ptr): Delete. (real_from_fraction): Declare. (dconst): New function. * real.c (real_from_fraction): New function. (real_digit, dconst_third_ptr): Delete. (exact_real_inverse, real_to_decimal_for_mode, decimal_integer_string) (ten_to_mptwo, times_pten): Use dconst instead of real_digit. (real_powi, real_floor, real_ceil, real_round): Use dconst instead of static variables. * emit-rtl.c (dconst0, dconst1, dconst2, dconstm1, dconsthalf): Delete. (init_emit_once): Don't initialize them. * builtins.c (fold_builtin_sqrt, fold_builtin_cbrt): Use dconst instead of static variables. Also use dconst<1, 6> and dconst<1, 9> instead of deriving them from doncst_third. (expand_builtin_cexpi, expand_builtin_signbit, fold_builtin_cabs) (fold_builtin_pow, fold_builtin_powi, fold_builtin_signbit) (fold_builtin_modf, fold_builtin_classify, fold_builtin_fpclassify) (fold_builtin_1, fold_builtin_2): Use dconst instead of static variables. * doc/match-and-simplify.texi: Likewise (in examples). * config/aarch64/aarch64.c (aarch64_float_const_zero_rtx_p): Likewise. * config/c6x/c6x.md (divsf3, divdf3): Likewise. * config/fr30/fr30.c (fr30_const_double_is_zero): Likewise. * config/i386/i386.c (standard_80387_constant_p): Likewise. (ix86_expand_convert_uns_didf_sse, ix86_expand_convert_uns_sidf_sse) (ix86_expand_convert_sign_didf_sse, ix86_expand_convert_uns_sisf_sse) (ix86_expand_vector_convert_uns_vsivsf): Likewise. (ix86_expand_adjust_ufix_to_sfix_si, ix86_emit_i387_round): Likewise. (ix86_emit_swsqrtsf, ix86_gen_TWO52, ix86_expand_lround): Likewise. (ix86_expand_floorceildf_32, ix86_expand_floorceil): Likewise. (ix86_expand_rounddf_32, ix86_expand_truncdf_32): Likewise. (ix86_expand_round, ix86_expand_round_sse4): Likewise. * config/i386/i386.md (fixuns_trunc<mode>si2): Likewise. * config/i386/sse.md (vec_unpacku_float_hi_v4si): Likewise. (vec_unpacku_float_lo_v4si, vec_unpacku_float_hi_v8si): Likewise. (vec_unpacku_float_hi_v16si, vec_unpacku_float_lo_v8si): Likewise. (vec_unpacku_float_lo_v16si, round<mode>2): Likewise. * config/m68k/m68k.c (floating_exact_log2): Likewise. * config/rs6000/rs6000.c (rs6000_emit_swdiv): Likewise. (rs6000_scale_v2df): Likewise. * config/rs6000/rs6000.md (*cmptf_internal2): Likewise. * config/sh/sh.c (fp_zero_operand, fp_one_operand): Likewise. * config/xtensa/predicates.md (const_float_1_operand): Likewise. * cprop.c (implicit_set_cond_p): Likewise. * dfp.c (decimal_to_decnumber): Likewise. * expmed.c (expand_mult): Likewise. * fold-const.c (const_binop, distribute_real_division): Likewise. (fold_binary_loc): Likewise. * match.pd: Likewise throughout. * simplify-rtx.c (simplify_binary_operation_1): Likewise. (simplify_const_binary_operation): Likewise. * tree-call-cdce.c (check_pow): Likewise. (gen_conditions_for_pow_cst_base): Likewise. * tree-chrec.c (chrec_fold_plus_poly_poly): Likewise. (chrec_fold_multiply_poly_poly, chrec_fold_plus_1): Likewise. * tree-complex.c (some_nonzerop, get_component_ssa_name): Likewise. (expand_complex_multiplication): Likewise. * tree-inline.c (estimate_num_insns): Likewise. * tree-scalar-evolution.c (add_to_evolution_1): Likewise. (add_to_evolution): Likewise. * tree-ssa-dom.c (record_equality): Likewise. * tree-ssa-math-opts.c (powi_as_mults): Likewise. (representable_as_half_series_p, expand_pow_as_sqrts): Likewise. (pass_cse_sincos::execute): Likewise. (pass_optimize_widening_mul::execute): Likewise. (gimple_expand_builtin_pow): Likewise. Use dconst instead of local variables for 3 and 1/4. * tree-ssa-uncprop.c (associate_equivalences_with_edges): Use dconst instead of static variables. * tree-vect-loop.c (get_initial_def_for_reduction): Likewise. * tree-vect-patterns.c (vect_recog_pow_pattern): Likewise. * tree-vect-slp.c (vect_get_constant_vectors): Likewise. * tree.c (build_one_cst, build_minus_one_cst, build_zero_cst) (real_zerop, real_onep, real_minus_onep): Likewise. * ubsan.c (ubsan_instrument_float_cast): Likewise. diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index f1e2dcb..f00dfee 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -9048,7 +9048,7 @@ convert_with_check (Entity_Id gnat_type, tree gnu_expr, bool overflowp, /* Compute the exact value calc_type'Pred (0.5) at compile time. */ fmt = REAL_MODE_FORMAT (TYPE_MODE (calc_type)); real_2expN (&half_minus_pred_half, -(fmt->p) - 1, TYPE_MODE (calc_type)); - real_arithmetic (&pred_half, MINUS_EXPR, &dconsthalf, + real_arithmetic (&pred_half, MINUS_EXPR, &dconst<1, 2> (), &half_minus_pred_half); gnu_pred_half = build_real (calc_type, pred_half); diff --git a/gcc/builtins.c b/gcc/builtins.c index 89bea60..85ba6dd 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -2659,7 +2659,7 @@ expand_builtin_cexpi (tree exp, rtx target) } narg = fold_build2_loc (loc, COMPLEX_EXPR, ctype, - build_real (type, dconst0), arg); + build_real (type, dconst<0> ()), arg); /* Make sure not to fold the cexp call again. */ call = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (fn)), fn); @@ -4983,7 +4983,7 @@ expand_builtin_signbit (tree exp, rtx target) gcc_assert (!fmt->has_signed_zero || !HONOR_SIGNED_ZEROS (fmode)); arg = fold_build2_loc (loc, LT_EXPR, TREE_TYPE (exp), arg, - build_real (TREE_TYPE (arg), dconst0)); + build_real (TREE_TYPE (arg), dconst<0> ())); return expand_expr (arg, target, VOIDmode, EXPAND_NORMAL); } @@ -7642,7 +7642,7 @@ fold_builtin_cabs (location_t loc, tree arg, tree type, tree fndecl) static tree build_complex_cproj (tree type, bool neg) { - REAL_VALUE_TYPE rinf, rzero = dconst0; + REAL_VALUE_TYPE rinf, rzero = dconst<0> (); real_inf (&rinf); rzero.sign = neg; @@ -7720,7 +7720,7 @@ fold_builtin_sqrt (location_t loc, tree arg, tree type) return NULL_TREE; /* Calculate the result when the argument is a constant. */ - if ((res = do_mpfr_arg1 (arg, type, mpfr_sqrt, &dconst0, NULL, true))) + if ((res = do_mpfr_arg1 (arg, type, mpfr_sqrt, &dconst<0> (), NULL, true))) return res; /* Optimize sqrt(expN(x)) = expN(x*0.5). */ @@ -7730,7 +7730,7 @@ fold_builtin_sqrt (location_t loc, tree arg, tree type) tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg), 0); arg = fold_build2_loc (loc, MULT_EXPR, type, CALL_EXPR_ARG (arg, 0), - build_real (type, dconsthalf)); + build_real (type, dconst<1, 2> ())); return build_call_expr_loc (loc, expfn, 1, arg); } @@ -7742,20 +7742,10 @@ fold_builtin_sqrt (location_t loc, tree arg, tree type) if (powfn) { tree arg0 = CALL_EXPR_ARG (arg, 0); - tree tree_root; - /* The inner root was either sqrt or cbrt. */ - /* This was a conditional expression but it triggered a bug - in Sun C 5.5. */ - REAL_VALUE_TYPE dconstroot; - if (BUILTIN_SQRT_P (fcode)) - dconstroot = dconsthalf; - else - dconstroot = dconst_third (); - - /* Adjust for the outer root. */ - SET_REAL_EXP (&dconstroot, REAL_EXP (&dconstroot) - 1); - tree_root = build_real_truncate (type, dconstroot); - return build_call_expr_loc (loc, powfn, 2, arg0, tree_root); + tree arg1 = (BUILTIN_SQRT_P (fcode) + ? build_real (type, dconst<1, 4> ()) + : build_real_truncate (type, dconst<1, 6> ())); + return build_call_expr_loc (loc, powfn, 2, arg0, arg1); } } @@ -7772,7 +7762,7 @@ fold_builtin_sqrt (location_t loc, tree arg, tree type) if (!tree_expr_nonnegative_p (arg0)) arg0 = build1 (ABS_EXPR, type, arg0); narg1 = fold_build2_loc (loc, MULT_EXPR, type, arg1, - build_real (type, dconsthalf)); + build_real (type, dconst<1, 2> ())); return build_call_expr_loc (loc, powfn, 2, arg0, narg1); } @@ -7803,7 +7793,7 @@ fold_builtin_cbrt (location_t loc, tree arg, tree type) tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg), 0); arg = fold_build2_loc (loc, MULT_EXPR, type, CALL_EXPR_ARG (arg, 0), - build_real_truncate (type, dconst_third ())); + build_real_truncate (type, dconst<1, 3> ())); return build_call_expr_loc (loc, expfn, 1, arg); } @@ -7815,11 +7805,7 @@ fold_builtin_cbrt (location_t loc, tree arg, tree type) if (powfn) { tree arg0 = CALL_EXPR_ARG (arg, 0); - tree tree_root; - REAL_VALUE_TYPE dconstroot = dconst_third (); - - SET_REAL_EXP (&dconstroot, REAL_EXP (&dconstroot) - 1); - tree_root = build_real_truncate (type, dconstroot); + tree tree_root = build_real_truncate (type, dconst<1, 6> ()); return build_call_expr_loc (loc, powfn, 2, arg0, tree_root); } } @@ -7834,12 +7820,7 @@ fold_builtin_cbrt (location_t loc, tree arg, tree type) if (powfn) { - tree tree_root; - REAL_VALUE_TYPE dconstroot; - - real_arithmetic (&dconstroot, MULT_EXPR, - dconst_third_ptr (), dconst_third_ptr ()); - tree_root = build_real_truncate (type, dconstroot); + tree tree_root = build_real_truncate (type, dconst<1, 9> ()); return build_call_expr_loc (loc, powfn, 2, arg0, tree_root); } } @@ -7855,7 +7836,7 @@ 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); - tree c = build_real_truncate (type, dconst_third ()); + tree c = build_real_truncate (type, dconst<1, 3> ()); tree narg01 = fold_build2_loc (loc, MULT_EXPR, type, arg01, c); return build_call_expr_loc (loc, powfn, 2, arg00, narg01); } @@ -8407,7 +8388,8 @@ fold_builtin_pow (location_t loc, tree fndecl, tree arg0, tree arg1, tree type) /* Optimize pow(1.0,y) = 1.0. */ if (real_onep (arg0)) - return omit_one_operand_loc (loc, type, build_real (type, dconst1), arg1); + return omit_one_operand_loc (loc, type, + build_real (type, dconst<1> ()), arg1); if (TREE_CODE (arg1) == REAL_CST && !TREE_OVERFLOW (arg1)) @@ -8419,22 +8401,22 @@ fold_builtin_pow (location_t loc, tree fndecl, tree arg0, tree arg1, tree type) c = TREE_REAL_CST (arg1); /* Optimize pow(x,0.0) = 1.0. */ - if (real_equal (&c, &dconst0)) - return omit_one_operand_loc (loc, type, build_real (type, dconst1), - arg0); + if (real_equal (&c, &dconst<0> ())) + return omit_one_operand_loc (loc, type, + build_real (type, dconst<1> ()), arg0); /* Optimize pow(x,1.0) = x. */ - if (real_equal (&c, &dconst1)) + if (real_equal (&c, &dconst<1> ())) return arg0; /* Optimize pow(x,-1.0) = 1.0/x. */ - if (real_equal (&c, &dconstm1)) + if (real_equal (&c, &dconst<-1> ())) return fold_build2_loc (loc, RDIV_EXPR, type, - build_real (type, dconst1), arg0); + build_real (type, dconst<1> ()), arg0); /* Optimize pow(x,0.5) = sqrt(x). */ if (flag_unsafe_math_optimizations - && real_equal (&c, &dconsthalf)) + && real_equal (&c, &dconst<1, 2> ())) { tree sqrtfn = mathfn_built_in (type, BUILT_IN_SQRT); @@ -8446,7 +8428,7 @@ fold_builtin_pow (location_t loc, tree fndecl, tree arg0, tree arg1, tree type) if (flag_unsafe_math_optimizations) { const REAL_VALUE_TYPE dconstroot - = real_value_truncate (TYPE_MODE (type), dconst_third ()); + = real_value_truncate (TYPE_MODE (type), dconst<1, 3> ()); if (real_equal (&c, &dconstroot)) { @@ -8467,7 +8449,7 @@ fold_builtin_pow (location_t loc, tree fndecl, tree arg0, tree arg1, tree type) && !TREE_OVERFLOW (arg0) && (n > 0 || (!flag_trapping_math && !flag_errno_math) - || !real_equal (&TREE_REAL_CST (arg0), &dconst0))) + || !real_equal (&TREE_REAL_CST (arg0), &dconst<0> ()))) { REAL_VALUE_TYPE x; bool inexact; @@ -8506,7 +8488,7 @@ fold_builtin_pow (location_t loc, tree fndecl, tree arg0, tree arg1, tree type) { tree narg0 = CALL_EXPR_ARG (arg0, 0); tree narg1 = fold_build2_loc (loc, MULT_EXPR, type, arg1, - build_real (type, dconsthalf)); + build_real (type, dconst<1, 2> ())); return build_call_expr_loc (loc, fndecl, 2, narg0, narg1); } @@ -8516,7 +8498,7 @@ 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)) { - tree c = build_real_truncate (type, dconst_third ()); + tree c = build_real_truncate (type, dconst<1, 3> ()); tree narg1 = fold_build2_loc (loc, MULT_EXPR, type, arg1, c); return build_call_expr_loc (loc, fndecl, 2, arg, narg1); } @@ -8552,7 +8534,8 @@ fold_builtin_powi (location_t loc, tree fndecl ATTRIBUTE_UNUSED, /* Optimize pow(1.0,y) = 1.0. */ if (real_onep (arg0)) - return omit_one_operand_loc (loc, type, build_real (type, dconst1), arg1); + return omit_one_operand_loc (loc, type, + build_real (type, dconst<1> ()), arg1); if (tree_fits_shwi_p (arg1)) { @@ -8570,8 +8553,8 @@ fold_builtin_powi (location_t loc, tree fndecl ATTRIBUTE_UNUSED, /* Optimize pow(x,0) = 1.0. */ if (c == 0) - return omit_one_operand_loc (loc, type, build_real (type, dconst1), - arg0); + return omit_one_operand_loc (loc, type, + build_real (type, dconst<1> ()), arg0); /* Optimize pow(x,1) = x. */ if (c == 1) @@ -8580,7 +8563,7 @@ fold_builtin_powi (location_t loc, tree fndecl ATTRIBUTE_UNUSED, /* Optimize pow(x,-1) = 1.0/x. */ if (c == -1) return fold_build2_loc (loc, RDIV_EXPR, type, - build_real (type, dconst1), arg0); + build_real (type, dconst<1> ()), arg0); } return NULL_TREE; @@ -8922,7 +8905,8 @@ fold_builtin_signbit (location_t loc, tree arg, tree type) if (!HONOR_SIGNED_ZEROS (arg)) return fold_convert (type, fold_build2_loc (loc, LT_EXPR, boolean_type_node, arg, - build_real (TREE_TYPE (arg), dconst0))); + build_real (TREE_TYPE (arg), + dconst<0> ()))); return NULL_TREE; } @@ -9398,7 +9382,7 @@ fold_builtin_modf (location_t loc, tree arg0, tree arg1, tree rettype) break; case rvc_inf: /* For +-Inf, return (*arg1 = arg0, +-0). */ - frac = dconst0; + frac = dconst<0> (); frac.sign = value->sign; trunc = *value; break; @@ -9536,7 +9520,7 @@ fold_builtin_classify (location_t loc, tree fndecl, tree arg, int builtin_index) { r = TREE_REAL_CST (arg); if (real_isinf (&r)) - return real_compare (GT_EXPR, &r, &dconst0) + return real_compare (GT_EXPR, &r, &dconst<0> ()) ? integer_one_node : integer_minus_one_node; else return integer_zero_node; @@ -9651,7 +9635,7 @@ fold_builtin_fpclassify (location_t loc, tree *args, int nargs) (x == 0 ? FP_ZERO : FP_SUBNORMAL))). */ tmp = fold_build2_loc (loc, EQ_EXPR, integer_type_node, arg, - build_real (type, dconst0)); + build_real (type, dconst<0> ())); res = fold_build3_loc (loc, COND_EXPR, integer_type_node, tmp, fp_zero, fp_subnormal); @@ -9967,13 +9951,13 @@ fold_builtin_1 (location_t loc, tree fndecl, tree arg0) CASE_FLT_FN (BUILT_IN_ASIN): if (validate_arg (arg0, REAL_TYPE)) return do_mpfr_arg1 (arg0, type, mpfr_asin, - &dconstm1, &dconst1, true); + &dconst<-1> (), &dconst<1> (), true); break; CASE_FLT_FN (BUILT_IN_ACOS): if (validate_arg (arg0, REAL_TYPE)) return do_mpfr_arg1 (arg0, type, mpfr_acos, - &dconstm1, &dconst1, true); + &dconst<-1> (), &dconst<1> (), true); break; CASE_FLT_FN (BUILT_IN_ATAN): @@ -9989,13 +9973,13 @@ fold_builtin_1 (location_t loc, tree fndecl, tree arg0) CASE_FLT_FN (BUILT_IN_ACOSH): if (validate_arg (arg0, REAL_TYPE)) return do_mpfr_arg1 (arg0, type, mpfr_acosh, - &dconst1, NULL, true); + &dconst<1> (), NULL, true); break; CASE_FLT_FN (BUILT_IN_ATANH): if (validate_arg (arg0, REAL_TYPE)) return do_mpfr_arg1 (arg0, type, mpfr_atanh, - &dconstm1, &dconst1, false); + &dconst<-1> (), &dconst<1> (), false); break; CASE_FLT_FN (BUILT_IN_SIN): @@ -10062,23 +10046,25 @@ fold_builtin_1 (location_t loc, tree fndecl, tree arg0) CASE_FLT_FN (BUILT_IN_LOG): if (validate_arg (arg0, REAL_TYPE)) - return do_mpfr_arg1 (arg0, type, mpfr_log, &dconst0, NULL, false); + return do_mpfr_arg1 (arg0, type, mpfr_log, &dconst<0> (), NULL, false); break; CASE_FLT_FN (BUILT_IN_LOG2): if (validate_arg (arg0, REAL_TYPE)) - return do_mpfr_arg1 (arg0, type, mpfr_log2, &dconst0, NULL, false); + return do_mpfr_arg1 (arg0, type, mpfr_log2, + &dconst<0> (), NULL, false); break; CASE_FLT_FN (BUILT_IN_LOG10): if (validate_arg (arg0, REAL_TYPE)) - return do_mpfr_arg1 (arg0, type, mpfr_log10, &dconst0, NULL, false); + return do_mpfr_arg1 (arg0, type, mpfr_log10, + &dconst<0> (), NULL, false); break; CASE_FLT_FN (BUILT_IN_LOG1P): if (validate_arg (arg0, REAL_TYPE)) return do_mpfr_arg1 (arg0, type, mpfr_log1p, - &dconstm1, NULL, false); + &dconst<-1> (), NULL, false); break; CASE_FLT_FN (BUILT_IN_J0): @@ -10096,13 +10082,13 @@ fold_builtin_1 (location_t loc, tree fndecl, tree arg0) CASE_FLT_FN (BUILT_IN_Y0): if (validate_arg (arg0, REAL_TYPE)) return do_mpfr_arg1 (arg0, type, mpfr_y0, - &dconst0, NULL, false); + &dconst<0> (), NULL, false); break; CASE_FLT_FN (BUILT_IN_Y1): if (validate_arg (arg0, REAL_TYPE)) return do_mpfr_arg1 (arg0, type, mpfr_y1, - &dconst0, NULL, false); + &dconst<0> (), NULL, false); break; CASE_FLT_FN (BUILT_IN_NAN): @@ -10247,7 +10233,7 @@ fold_builtin_2 (location_t loc, tree fndecl, tree arg0, tree arg1) if (validate_arg (arg0, INTEGER_TYPE) && validate_arg (arg1, REAL_TYPE)) return do_mpfr_bessel_n (arg0, arg1, type, mpfr_yn, - &dconst0, false); + &dconst<0> (), false); break; CASE_FLT_FN (BUILT_IN_DREM): diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 4b64a44..9d1126b 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -4983,7 +4983,7 @@ c_common_truthvalue_conversion (location_t location, tree expr) : truthvalue_true_node; case REAL_CST: - return real_compare (NE_EXPR, &TREE_REAL_CST (expr), &dconst0) + return real_compare (NE_EXPR, &TREE_REAL_CST (expr), &dconst<0> ()) ? truthvalue_true_node : truthvalue_false_node; diff --git a/gcc/c-family/c-lex.c b/gcc/c-family/c-lex.c index c69f4a6..30db6a9 100644 --- a/gcc/c-family/c-lex.c +++ b/gcc/c-family/c-lex.c @@ -914,9 +914,9 @@ interpret_float (const cpp_token *token, unsigned int flags, } } /* We also give a warning if the value underflows. */ - else if (real_equal (&real, &dconst0) + else if (real_equal (&real, &dconst<0> ()) || (const_type != type - && real_equal (&real_trunc, &dconst0))) + && real_equal (&real_trunc, &dconst<0> ()))) { REAL_VALUE_TYPE realvoidmode; int oflow = real_from_string (&realvoidmode, copy); @@ -924,7 +924,7 @@ interpret_float (const cpp_token *token, unsigned int flags, : (oflow < 0 ? OT_UNDERFLOW : OT_OVERFLOW)); if (!(flags & CPP_N_USERDEF)) { - if (oflow < 0 || !real_equal (&realvoidmode, &dconst0)) + if (oflow < 0 || !real_equal (&realvoidmode, &dconst<0> ())) warning (OPT_Woverflow, "floating constant truncated to zero"); } } diff --git a/gcc/c-family/c-ubsan.c b/gcc/c-family/c-ubsan.c index 672762c..68b76b8 100644 --- a/gcc/c-family/c-ubsan.c +++ b/gcc/c-family/c-ubsan.c @@ -65,7 +65,7 @@ ubsan_instrument_division (location_t loc, tree op0, tree op1) else if (TREE_CODE (type) == REAL_TYPE && (flag_sanitize & SANITIZE_FLOAT_DIVIDE)) t = fold_build2 (EQ_EXPR, boolean_type_node, - op1, build_real (type, dconst0)); + op1, build_real (type, dconst<0> ())); else return NULL_TREE; diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index c9fe368..7fe1831 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -3768,7 +3768,7 @@ aarch64_float_const_zero_rtx_p (rtx x) if (REAL_VALUE_MINUS_ZERO (*CONST_DOUBLE_REAL_VALUE (x))) return !HONOR_SIGNED_ZEROS (GET_MODE (x)); - return real_equal (CONST_DOUBLE_REAL_VALUE (x), &dconst0); + return real_equal (CONST_DOUBLE_REAL_VALUE (x), &dconst<0> ()); } /* Return the fixed registers used for condition codes. */ diff --git a/gcc/config/c6x/c6x.md b/gcc/config/c6x/c6x.md index fa89587..7824cd7 100644 --- a/gcc/config/c6x/c6x.md +++ b/gcc/config/c6x/c6x.md @@ -2809,7 +2809,8 @@ "TARGET_FP && flag_reciprocal_math" { operands[3] = force_reg (SFmode, - const_double_from_real_value (dconst2, SFmode)); + const_double_from_real_value (dconst<2> (), + SFmode)); operands[4] = gen_reg_rtx (SFmode); operands[5] = gen_reg_rtx (SFmode); operands[6] = gen_reg_rtx (SFmode); @@ -2834,7 +2835,8 @@ "TARGET_FP && flag_reciprocal_math" { operands[3] = force_reg (DFmode, - const_double_from_real_value (dconst2, DFmode)); + const_double_from_real_value (dconst<2> (), + DFmode)); operands[4] = gen_reg_rtx (DFmode); operands[5] = gen_reg_rtx (DFmode); operands[6] = gen_reg_rtx (DFmode); diff --git a/gcc/config/fr30/fr30.c b/gcc/config/fr30/fr30.c index 6afd5d4..20ab6e4 100644 --- a/gcc/config/fr30/fr30.c +++ b/gcc/config/fr30/fr30.c @@ -889,7 +889,7 @@ fr30_const_double_is_zero (rtx operand) if (operand == NULL || GET_CODE (operand) != CONST_DOUBLE) return 0; - return real_equal (CONST_DOUBLE_REAL_VALUE (operand), &dconst0); + return real_equal (CONST_DOUBLE_REAL_VALUE (operand), &dconst<0> ()); } /*}}}*/ diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index d59b59b..5591f78 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -10511,7 +10511,7 @@ standard_80387_constant_p (rtx x) fldz;fchs or fld1;fchs sequence. */ if (real_isnegzero (r)) return 8; - if (real_identical (r, &dconstm1)) + if (real_identical (r, &dconst<-1> ())) return 9; return 0; @@ -20296,8 +20296,8 @@ ix86_expand_convert_uns_didf_sse (rtx target, rtx input) /* Subtract off those 0x1.0p52 and 0x1.0p84 biases, to produce values in [0,2**32-1] and [0]+[2**32,2**64-1] respectively. */ - real_ldexp (&bias_lo_rvt, &dconst1, 52); - real_ldexp (&bias_hi_rvt, &dconst1, 84); + real_ldexp (&bias_lo_rvt, &dconst<1> (), 52); + real_ldexp (&bias_hi_rvt, &dconst<1> (), 84); biases = const_double_from_real_value (bias_lo_rvt, DFmode); x = const_double_from_real_value (bias_hi_rvt, DFmode); biases = gen_rtx_CONST_VECTOR (V2DFmode, gen_rtvec (2, biases, x)); @@ -20339,7 +20339,7 @@ ix86_expand_convert_uns_sidf_sse (rtx target, rtx input) fp = gen_reg_rtx (DFmode); emit_insn (gen_floatsidf2 (fp, x)); - real_ldexp (&TWO31r, &dconst1, 31); + real_ldexp (&TWO31r, &dconst<1> (), 31); x = const_double_from_real_value (TWO31r, DFmode); x = expand_simple_binop (DFmode, PLUS, fp, x, target, 0, OPTAB_DIRECT); @@ -20361,7 +20361,7 @@ ix86_expand_convert_sign_didf_sse (rtx target, rtx input) emit_insn (gen_floatsidf2 (fp_hi, gen_highpart (SImode, input))); - real_ldexp (&TWO32r, &dconst1, 32); + real_ldexp (&TWO32r, &dconst<1> (), 32); x = const_double_from_real_value (TWO32r, DFmode); fp_hi = expand_simple_binop (DFmode, MULT, fp_hi, x, fp_hi, 0, OPTAB_DIRECT); @@ -20381,7 +20381,7 @@ ix86_expand_convert_uns_sisf_sse (rtx target, rtx input) REAL_VALUE_TYPE ONE16r; rtx fp_hi, fp_lo, int_hi, int_lo, x; - real_ldexp (&ONE16r, &dconst1, 16); + real_ldexp (&ONE16r, &dconst<1> (), 16); x = const_double_from_real_value (ONE16r, SFmode); int_lo = expand_simple_binop (SImode, AND, input, GEN_INT(0xffff), NULL, 0, OPTAB_DIRECT); @@ -20425,7 +20425,7 @@ ix86_expand_vector_convert_uns_vsivsf (rtx target, rtx val) emit_insn (cvt (tmp[3], tmp[1])); tmp[4] = gen_reg_rtx (fltmode); emit_insn (cvt (tmp[4], tmp[2])); - real_ldexp (&TWO16r, &dconst1, 16); + real_ldexp (&TWO16r, &dconst<1> (), 16); tmp[5] = const_double_from_real_value (TWO16r, SFmode); tmp[5] = force_reg (fltmode, ix86_build_const_vector (fltmode, 1, tmp[5])); tmp[6] = expand_simple_binop (fltmode, MULT, tmp[4], tmp[5], NULL_RTX, 1, @@ -20454,7 +20454,7 @@ ix86_expand_adjust_ufix_to_sfix_si (rtx val, rtx *xorp) for (i = 0; i < 3; i++) tmp[i] = gen_reg_rtx (mode); - real_ldexp (&TWO31r, &dconst1, 31); + real_ldexp (&TWO31r, &dconst<1> (), 31); two31r = const_double_from_real_value (TWO31r, scalarmode); two31r = ix86_build_const_vector (mode, 1, two31r); two31r = force_reg (mode, two31r); @@ -47089,7 +47089,7 @@ void ix86_emit_i387_round (rtx op0, rtx op1) e2 = gen_reg_rtx (inmode); res = gen_reg_rtx (outmode); - half = const_double_from_real_value (dconsthalf, inmode); + half = const_double_from_real_value (dconst<1, 2> (), inmode); /* round(a) = sgn(a) * floor(fabs(a) + 0.5) */ @@ -47223,7 +47223,7 @@ void ix86_emit_swsqrtsf (rtx res, rtx a, machine_mode mode, real_from_integer (&r, VOIDmode, -3, SIGNED); mthree = const_double_from_real_value (r, SFmode); - real_arithmetic (&r, NEGATE_EXPR, &dconsthalf, NULL); + real_arithmetic (&r, NEGATE_EXPR, &dconst<1, 2> (), NULL); mhalf = const_double_from_real_value (r, SFmode); unspec = UNSPEC_RSQRT; @@ -47508,7 +47508,7 @@ ix86_gen_TWO52 (machine_mode mode) REAL_VALUE_TYPE TWO52r; rtx TWO52; - real_ldexp (&TWO52r, &dconst1, mode == DFmode ? 52 : 23); + real_ldexp (&TWO52r, &dconst<1> (), mode == DFmode ? 52 : 23); TWO52 = const_double_from_real_value (TWO52r, mode); TWO52 = force_reg (mode, TWO52); @@ -47532,7 +47532,8 @@ ix86_expand_lround (rtx op0, rtx op1) /* load nextafter (0.5, 0.0) */ fmt = REAL_MODE_FORMAT (mode); real_2expN (&half_minus_pred_half, -(fmt->p) - 1, mode); - real_arithmetic (&pred_half, MINUS_EXPR, &dconsthalf, &half_minus_pred_half); + real_arithmetic (&pred_half, MINUS_EXPR, &dconst<1, 2> (), + &half_minus_pred_half); /* adj = copysign (0.5, op1) */ adj = force_reg (mode, const_double_from_real_value (pred_half, mode)); @@ -47664,7 +47665,8 @@ ix86_expand_floorceildf_32 (rtx operand0, rtx operand1, bool do_floor) /* generate 1.0 or -1.0 */ one = force_reg (mode, const_double_from_real_value (do_floor - ? dconst1 : dconstm1, mode)); + ? dconst<1> () + : dconst<-1> (), mode)); /* Compensate: xa = xa - (xa > operand1 ? 1 : 0) */ tmp = ix86_expand_sse_compare_mask (UNGT, xa, res, !do_floor); @@ -47723,7 +47725,7 @@ ix86_expand_floorceil (rtx operand0, rtx operand1, bool do_floor) expand_float (xa, xi, 0); /* generate 1.0 */ - one = force_reg (mode, const_double_from_real_value (dconst1, mode)); + one = force_reg (mode, const_double_from_real_value (dconst<1> (), mode)); /* Compensate: xa = xa - (xa > operand1 ? 1 : 0) */ tmp = ix86_expand_sse_compare_mask (UNGT, xa, res, !do_floor); @@ -47788,7 +47790,8 @@ ix86_expand_rounddf_32 (rtx operand0, rtx operand1) dxa = expand_simple_binop (mode, MINUS, xa2, xa, NULL_RTX, 0, OPTAB_DIRECT); /* generate 0.5, 1.0 and -0.5 */ - half = force_reg (mode, const_double_from_real_value (dconsthalf, mode)); + half = force_reg (mode, const_double_from_real_value (dconst<1, 2> (), + mode)); one = expand_simple_binop (mode, PLUS, half, half, NULL_RTX, 0, OPTAB_DIRECT); mhalf = expand_simple_binop (mode, MINUS, half, one, NULL_RTX, 0, OPTAB_DIRECT); @@ -47898,7 +47901,7 @@ ix86_expand_truncdf_32 (rtx operand0, rtx operand1) emit_move_insn (res, tmp); /* generate 1.0 */ - one = force_reg (mode, const_double_from_real_value (dconst1, mode)); + one = force_reg (mode, const_double_from_real_value (dconst<1> (), mode)); /* Compensate: res = xa2 - (res > xa ? 1 : 0) */ mask = ix86_expand_sse_compare_mask (UNGT, res, xa, false); @@ -47946,7 +47949,8 @@ ix86_expand_round (rtx operand0, rtx operand1) /* load nextafter (0.5, 0.0) */ fmt = REAL_MODE_FORMAT (mode); real_2expN (&half_minus_pred_half, -(fmt->p) - 1, mode); - real_arithmetic (&pred_half, MINUS_EXPR, &dconsthalf, &half_minus_pred_half); + real_arithmetic (&pred_half, MINUS_EXPR, &dconst<1, 2> (), + &half_minus_pred_half); /* xa = xa + 0.5 */ half = force_reg (mode, const_double_from_real_value (pred_half, mode)); @@ -47997,7 +48001,8 @@ ix86_expand_round_sse4 (rtx op0, rtx op1) /* load nextafter (0.5, 0.0) */ fmt = REAL_MODE_FORMAT (mode); real_2expN (&half_minus_pred_half, -(fmt->p) - 1, mode); - real_arithmetic (&pred_half, MINUS_EXPR, &dconsthalf, &half_minus_pred_half); + real_arithmetic (&pred_half, MINUS_EXPR, &dconst<1, 2> (), + &half_minus_pred_half); half = const_double_from_real_value (pred_half, mode); /* e1 = copysign (0.5, op1) */ diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 5fcebb5..140bc0f 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -4643,7 +4643,7 @@ if (optimize_insn_for_size_p ()) FAIL; - real_ldexp (&TWO31r, &dconst1, 31); + real_ldexp (&TWO31r, &dconst<1> (), 31); two31 = const_double_from_real_value (TWO31r, mode); two31 = ix86_build_const_vector (vecmode, true, two31); operands[2] = force_reg (vecmode, two31); diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index 9b7a338..a016b26 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -5432,7 +5432,7 @@ rtx x; int i; - real_ldexp (&TWO32r, &dconst1, 32); + real_ldexp (&TWO32r, &dconst<1> (), 32); x = const_double_from_real_value (TWO32r, DFmode); operands[3] = force_reg (V2DFmode, CONST0_RTX (V2DFmode)); @@ -5463,7 +5463,7 @@ rtx x; int i; - real_ldexp (&TWO32r, &dconst1, 32); + real_ldexp (&TWO32r, &dconst<1> (), 32); x = const_double_from_real_value (TWO32r, DFmode); operands[3] = force_reg (V2DFmode, CONST0_RTX (V2DFmode)); @@ -5483,7 +5483,7 @@ rtx x, tmp[6]; int i; - real_ldexp (&TWO32r, &dconst1, 32); + real_ldexp (&TWO32r, &dconst<1> (), 32); x = const_double_from_real_value (TWO32r, DFmode); tmp[0] = force_reg (V4DFmode, CONST0_RTX (V4DFmode)); @@ -5508,7 +5508,7 @@ REAL_VALUE_TYPE TWO32r; rtx k, x, tmp[4]; - real_ldexp (&TWO32r, &dconst1, 32); + real_ldexp (&TWO32r, &dconst<1> (), 32); x = const_double_from_real_value (TWO32r, DFmode); tmp[0] = force_reg (V8DFmode, CONST0_RTX (V8DFmode)); @@ -5534,7 +5534,7 @@ rtx x, tmp[5]; int i; - real_ldexp (&TWO32r, &dconst1, 32); + real_ldexp (&TWO32r, &dconst<1> (), 32); x = const_double_from_real_value (TWO32r, DFmode); tmp[0] = force_reg (V4DFmode, CONST0_RTX (V4DFmode)); @@ -5557,7 +5557,7 @@ REAL_VALUE_TYPE TWO32r; rtx k, x, tmp[3]; - real_ldexp (&TWO32r, &dconst1, 32); + real_ldexp (&TWO32r, &dconst<1> (), 32); x = const_double_from_real_value (TWO32r, DFmode); tmp[0] = force_reg (V8DFmode, CONST0_RTX (V8DFmode)); @@ -14881,7 +14881,8 @@ /* load nextafter (0.5, 0.0) */ fmt = REAL_MODE_FORMAT (scalar_mode); real_2expN (&half_minus_pred_half, -(fmt->p) - 1, scalar_mode); - real_arithmetic (&pred_half, MINUS_EXPR, &dconsthalf, &half_minus_pred_half); + real_arithmetic (&pred_half, MINUS_EXPR, &dconst<1, 2> (), + &half_minus_pred_half); half = const_double_from_real_value (pred_half, scalar_mode); vec_half = ix86_build_const_vector (<MODE>mode, true, half); diff --git a/gcc/config/m68k/m68k.c b/gcc/config/m68k/m68k.c index bfc19f3..e7226ac 100644 --- a/gcc/config/m68k/m68k.c +++ b/gcc/config/m68k/m68k.c @@ -4365,7 +4365,7 @@ floating_exact_log2 (rtx x) r = CONST_DOUBLE_REAL_VALUE (x); - if (real_less (r, &dconst1)) + if (real_less (r, &dconst<1> ())) return 0; exp = real_exponent (r); diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index c00d730..39a9a75 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -31944,7 +31944,7 @@ rs6000_emit_swdiv (rtx dst, rtx n, rtx d, bool note_p) gcc_assert (code != CODE_FOR_nothing); - one = rs6000_load_constant_and_splat (mode, dconst1); + one = rs6000_load_constant_and_splat (mode, dconst<1> ()); /* x0 = 1./d estimate */ x0 = gen_reg_rtx (mode); @@ -32684,7 +32684,7 @@ rs6000_scale_v2df (rtx tgt, rtx src, int scale) rtvec v = rtvec_alloc (2); rtx elt; rtx scale_vec = gen_reg_rtx (V2DFmode); - (void)real_powi (&r_pow, DFmode, &dconst2, hwi_scale); + (void)real_powi (&r_pow, DFmode, &dconst<2> (), hwi_scale); elt = const_double_from_real_value (r_pow, DFmode); RTVEC_ELT (v, 0) = elt; RTVEC_ELT (v, 1) = elt; diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index cf40f10..ae4f492 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -10578,7 +10578,7 @@ operands[14] = force_const_mem (DFmode, const_double_from_real_value (rv, DFmode)); operands[15] = force_const_mem (DFmode, - const_double_from_real_value (dconst0, + const_double_from_real_value (dconst<0> (), DFmode)); if (TARGET_TOC) { diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index 92e9f9f..f7543d1 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -10005,8 +10005,7 @@ fp_zero_operand (rtx op) if (GET_MODE (op) != SFmode) return false; - r = CONST_DOUBLE_REAL_VALUE (op); - return real_equal (r, &dconst0) && ! REAL_VALUE_MINUS_ZERO (*r); + return real_equal (r, &dconst<0> ()) && ! REAL_VALUE_MINUS_ZERO (*r); } /* Returns true if OP is a floating point value with value 1.0. */ @@ -10016,7 +10015,7 @@ fp_one_operand (rtx op) if (GET_MODE (op) != SFmode) return false; - return real_equal (CONST_DOUBLE_REAL_VALUE (op), &dconst1); + return real_equal (CONST_DOUBLE_REAL_VALUE (op), &dconst<1> ()); } /* Return the TLS type for TLS symbols. */ diff --git a/gcc/config/xtensa/predicates.md b/gcc/config/xtensa/predicates.md index 00f2370..81e5ebe 100644 --- a/gcc/config/xtensa/predicates.md +++ b/gcc/config/xtensa/predicates.md @@ -150,7 +150,7 @@ (define_predicate "const_float_1_operand" (match_code "const_double") { - return real_equal (CONST_DOUBLE_REAL_VALUE (op), &dconst1); + return real_equal (CONST_DOUBLE_REAL_VALUE (op), &dconst<1> ()); }) (define_predicate "fpmem_offset_operand" diff --git a/gcc/cprop.c b/gcc/cprop.c index 4cb8586..f983350 100644 --- a/gcc/cprop.c +++ b/gcc/cprop.c @@ -1352,7 +1352,7 @@ implicit_set_cond_p (const_rtx cond) /* ??? The complex and vector checks are not implemented yet. We just always return zero for them. */ if (CONST_DOUBLE_AS_FLOAT_P (cst) - && real_equal (CONST_DOUBLE_REAL_VALUE (cst), &dconst0)) + && real_equal (CONST_DOUBLE_REAL_VALUE (cst), &dconst<0> ())) return 0; else return 0; diff --git a/gcc/dfp.c b/gcc/dfp.c index ceb43d1..6dbdcad 100644 --- a/gcc/dfp.c +++ b/gcc/dfp.c @@ -115,22 +115,22 @@ decimal_to_decnumber (const REAL_VALUE_TYPE *r, decNumber *dn) /* dconst{1,2,m1,half} are used in various places in the middle-end and optimizers, allow them here as an exception by converting them to decimal. */ - if (memcmp (r, &dconst1, sizeof (*r)) == 0) + if (memcmp (r, &dconst<1> (), sizeof (*r)) == 0) { decNumberFromString (dn, "1", &set); break; } - if (memcmp (r, &dconst2, sizeof (*r)) == 0) + if (memcmp (r, &dconst<2> (), sizeof (*r)) == 0) { decNumberFromString (dn, "2", &set); break; } - if (memcmp (r, &dconstm1, sizeof (*r)) == 0) + if (memcmp (r, &dconst<-1> (), sizeof (*r)) == 0) { decNumberFromString (dn, "-1", &set); break; } - if (memcmp (r, &dconsthalf, sizeof (*r)) == 0) + if (memcmp (r, &dconst<1, 2> (), sizeof (*r)) == 0) { decNumberFromString (dn, "0.5", &set); break; diff --git a/gcc/doc/match-and-simplify.texi b/gcc/doc/match-and-simplify.texi index c5c2b7e..cc1f573 100644 --- a/gcc/doc/match-and-simplify.texi +++ b/gcc/doc/match-and-simplify.texi @@ -165,7 +165,7 @@ chain conditions avoiding nesting @code{if}s too much: (switch /* a CMP (-0) -> a CMP 0 */ (if (REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (@@1))) - (cmp @@0 @{ build_real (TREE_TYPE (@@1), dconst0); @})) + (cmp @@0 @{ build_real (TREE_TYPE (@@1), dconst<0> ()); @})) /* x != NaN is always true, other ops are always false. */ (if (REAL_VALUE_ISNAN (TREE_REAL_CST (@@1)) && ! HONOR_SNANS (@@1)) @@ -180,7 +180,7 @@ Is equal to (switch /* a CMP (-0) -> a CMP 0 */ (if (REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (@@1))) - (cmp @@0 @{ build_real (TREE_TYPE (@@1), dconst0); @}) + (cmp @@0 @{ build_real (TREE_TYPE (@@1), dconst<0> ()); @}) /* x != NaN is always true, other ops are always false. */ (if (REAL_VALUE_ISNAN (TREE_REAL_CST (@@1)) && ! HONOR_SNANS (@@1)) @@ -310,7 +310,8 @@ be added to a new @code{for}. For example (define_operator_list POW BUILT_IN_POWF BUILT_IN_POW BUILT_IN_POWL) (simplify (SQRT (POW @@0 @@1)) - (POW (abs @@0) (mult @@1 @{ built_real (TREE_TYPE (@@1), dconsthalf); @}))) + (POW (abs @@0) (mult @@1 @{ build_real (TREE_TYPE (@@1), + dconst<1, 2> ()); @}))) @end smallexample is the same as @@ -320,7 +321,8 @@ is the same as POW (BUILT_IN_POWF BUILT_IN_POW BUILT_IN_POWL) (simplify (SQRT (POW @@0 @@1)) - (POW (abs @@0) (mult @@1 @{ built_real (TREE_TYPE (@@1), dconsthalf); @})))) + (POW (abs @@0) (mult @@1 @{ build_real (TREE_TYPE (@@1), + dconst<1, 2> ()); @})))) @end smallexample Another building block are @code{with} expressions in the diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index c418c24..7d1dc5e 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -104,12 +104,6 @@ rtx const_tiny_rtx[4][(int) MAX_MACHINE_MODE]; rtx const_true_rtx; -REAL_VALUE_TYPE dconst0; -REAL_VALUE_TYPE dconst1; -REAL_VALUE_TYPE dconst2; -REAL_VALUE_TYPE dconstm1; -REAL_VALUE_TYPE dconsthalf; - /* Record fixed-point constant 0 and 1. */ FIXED_VALUE_TYPE fconst0[MAX_FCONST0]; FIXED_VALUE_TYPE fconst1[MAX_FCONST1]; @@ -5878,7 +5872,6 @@ init_emit_once (void) { int i; machine_mode mode; - machine_mode double_mode; /* Initialize the CONST_INT, CONST_WIDE_INT, CONST_DOUBLE, CONST_FIXED, and memory attribute hash tables. */ @@ -5917,20 +5910,10 @@ init_emit_once (void) double_mode = mode_for_size (DOUBLE_TYPE_SIZE, MODE_FLOAT, 0); - real_from_integer (&dconst0, double_mode, 0, SIGNED); - real_from_integer (&dconst1, double_mode, 1, SIGNED); - real_from_integer (&dconst2, double_mode, 2, SIGNED); - - dconstm1 = dconst1; - dconstm1.sign = 1; - - dconsthalf = dconst1; - SET_REAL_EXP (&dconsthalf, REAL_EXP (&dconsthalf) - 1); - for (i = 0; i < 3; i++) { const REAL_VALUE_TYPE *const r = - (i == 0 ? &dconst0 : i == 1 ? &dconst1 : &dconst2); + (i == 0 ? &dconst<0> () : i == 1 ? &dconst<1> () : &dconst<2> ()); for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode; diff --git a/gcc/expmed.c b/gcc/expmed.c index 93cf508..6327993 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -3235,7 +3235,7 @@ expand_mult (machine_mode mode, rtx op0, rtx op1, rtx target, /* Expand x*2.0 as x+x. */ if (CONST_DOUBLE_AS_FLOAT_P (scalar_op1) - && real_equal (CONST_DOUBLE_REAL_VALUE (scalar_op1), &dconst2)) + && real_equal (CONST_DOUBLE_REAL_VALUE (scalar_op1), &dconst<2> ())) { op0 = force_reg (GET_MODE (op0), op0); return expand_binop (mode, add_optab, op0, op0, diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 2851a29..60149c8 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -1176,7 +1176,7 @@ const_binop (enum tree_code code, tree arg1, tree arg2) /* Don't perform operation if it would raise a division by zero exception. */ if (code == RDIV_EXPR - && real_equal (&d2, &dconst0) + && real_equal (&d2, &dconst<0> ()) && (flag_trapping_math || ! MODE_HAS_INFINITIES (mode))) return NULL_TREE; @@ -3600,9 +3600,9 @@ distribute_real_division (location_t loc, enum tree_code code, tree type, r0 = TREE_REAL_CST (TREE_OPERAND (arg0, 1)); r1 = TREE_REAL_CST (TREE_OPERAND (arg1, 1)); if (!mul0) - real_arithmetic (&r0, RDIV_EXPR, &dconst1, &r0); + real_arithmetic (&r0, RDIV_EXPR, &dconst<1> (), &r0); if (!mul1) - real_arithmetic (&r1, RDIV_EXPR, &dconst1, &r1); + real_arithmetic (&r1, RDIV_EXPR, &dconst<1> (), &r1); real_arithmetic (&r0, code, &r0, &r1); return fold_build2_loc (loc, MULT_EXPR, type, TREE_OPERAND (arg0, 0), @@ -9914,7 +9914,7 @@ fold_binary_loc (location_t loc, if (powfn) { - tree arg = build_real (type, dconst2); + tree arg = build_real (type, dconst<2> ()); return build_call_expr_loc (loc, powfn, 2, arg0, arg); } } diff --git a/gcc/java/decl.c b/gcc/java/decl.c index c035fe0..6bb3aa1 100644 --- a/gcc/java/decl.c +++ b/gcc/java/decl.c @@ -669,8 +669,8 @@ java_init_decl_processing (void) double_type_node)); layout_type (double_type_node); - float_zero_node = build_real (float_type_node, dconst0); - double_zero_node = build_real (double_type_node, dconst0); + float_zero_node = build_real (float_type_node, dconst<0> ()); + double_zero_node = build_real (double_type_node, dconst<0> ()); /* These are the vtables for arrays of primitives. */ boolean_array_vtable = create_primitive_vtable ("boolean"); diff --git a/gcc/match.pd b/gcc/match.pd index 9962b0a..8e2069b 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -1298,7 +1298,7 @@ along with GCC; see the file COPYING3. If not see (simplify (plus @0 @0) (if (SCALAR_FLOAT_TYPE_P (type)) - (mult @0 { build_real (type, dconst2); }))) + (mult @0 { build_real (type, dconst<2> ()); }))) (simplify (minus integer_zerop @1) @@ -1598,7 +1598,7 @@ along with GCC; see the file COPYING3. If not see (switch /* a CMP (-0) -> a CMP 0 */ (if (REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (@1))) - (cmp @0 { build_real (TREE_TYPE (@1), dconst0); })) + (cmp @0 { build_real (TREE_TYPE (@1), dconst<0> ()); })) /* x != NaN is always true, other ops are always false. */ (if (REAL_VALUE_ISNAN (TREE_REAL_CST (@1)) && ! HONOR_SNANS (@1)) @@ -1694,7 +1694,7 @@ along with GCC; see the file COPYING3. If not see (if (cmp == NE_EXPR || !HONOR_NANS (@0)) { constant_boolean_node (true, type); }) /* sqrt(x) > y is the same as x >= 0, if y is negative. */ - (ge @0 { build_real (TREE_TYPE (@0), dconst0); }))) + (ge @0 { build_real (TREE_TYPE (@0), dconst<0> ()); }))) (if (cmp == GT_EXPR || cmp == GE_EXPR) (with { @@ -1731,11 +1731,11 @@ along with GCC; see the file COPYING3. If not see /* sqrt(x) < y is x >= 0 when y is very large and we don't care about Infinities. */ (if (! HONOR_INFINITIES (@0)) - (ge @0 { build_real (TREE_TYPE (@0), dconst0); })) + (ge @0 { build_real (TREE_TYPE (@0), dconst<0> ()); })) /* sqrt(x) < y is x >= 0 && x != +Inf, when y is large. */ (if (GENERIC) (truth_andif - (ge @0 { build_real (TREE_TYPE (@0), dconst0); }) + (ge @0 { build_real (TREE_TYPE (@0), dconst<0> ()); }) (ne @0 { build_real (TREE_TYPE (@0), c2); })))) /* sqrt(x) < c is the same as x < c*c, if we ignore NaNs. */ (if (! HONOR_NANS (@0)) @@ -1743,7 +1743,7 @@ along with GCC; see the file COPYING3. If not see /* sqrt(x) < c is the same as x >= 0 && x < c*c. */ (if (GENERIC) (truth_andif - (ge @0 { build_real (TREE_TYPE (@0), dconst0); }) + (ge @0 { build_real (TREE_TYPE (@0), dconst<0> ()); }) (cmp @0 { build_real (TREE_TYPE (@0), c2); })))))))))))) /* Unordered tests if either argument is a NaN. */ @@ -2193,7 +2193,7 @@ along with GCC; see the file COPYING3. If not see break; CASE_FLT_FN (BUILT_IN_EXP2): /* Prepare to do logN(exp2(exponent) -> exponent*logN(2). */ - x = build_real (type, dconst2); + x = build_real (type, dconst<2> ()); break; CASE_FLT_FN (BUILT_IN_EXP10): CASE_FLT_FN (BUILT_IN_POW10): @@ -2221,11 +2221,11 @@ along with GCC; see the file COPYING3. If not see { CASE_FLT_FN (BUILT_IN_SQRT): /* Prepare to do logN(sqrt(x) -> 0.5*logN(x). */ - x = build_real (type, dconsthalf); + x = build_real (type, dconst<1, 2> ()); break; CASE_FLT_FN (BUILT_IN_CBRT): /* Prepare to do logN(cbrt(x) -> (1/3)*logN(x). */ - x = build_real_truncate (type, dconst_third ()); + x = build_real_truncate (type, dconst<1, 3> ()); break; default: gcc_unreachable (); diff --git a/gcc/real.c b/gcc/real.c index 49d6739..fb77502 100644 --- a/gcc/real.c +++ b/gcc/real.c @@ -111,7 +111,6 @@ static void decimal_integer_string (char *, const REAL_VALUE_TYPE *, static const REAL_VALUE_TYPE * ten_to_ptwo (int); static const REAL_VALUE_TYPE * ten_to_mptwo (int); -static const REAL_VALUE_TYPE * real_digit (int); static void times_pten (REAL_VALUE_TYPE *, int); static void round_for_format (const struct real_format *, REAL_VALUE_TYPE *); @@ -1273,7 +1272,7 @@ real_identical (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b) bool exact_real_inverse (machine_mode mode, REAL_VALUE_TYPE *r) { - const REAL_VALUE_TYPE *one = real_digit (1); + const REAL_VALUE_TYPE *one = &dconst<1> (); REAL_VALUE_TYPE u; int i; @@ -1579,7 +1578,7 @@ real_to_decimal_for_mode (char *str, const REAL_VALUE_TYPE *r_orig, if (digits > max_digits) digits = max_digits; - one = real_digit (1); + one = &dconst<1> (); ten = ten_to_ptwo (0); sign = r.sign; @@ -2225,6 +2224,22 @@ real_from_integer (REAL_VALUE_TYPE *r, machine_mode mode, real_convert (r, mode, r); } +/* Set VALUE to A/B, in maximum precision. */ + +void +real_from_fraction (REAL_VALUE_TYPE *value, int a, int b) +{ + if (b == 1) + real_from_integer (value, VOIDmode, a, SIGNED); + else + { + REAL_VALUE_TYPE areal, breal; + real_from_integer (&areal, VOIDmode, a, SIGNED); + real_from_integer (&breal, VOIDmode, b, SIGNED); + real_arithmetic (value, RDIV_EXPR, &areal, &breal); + } +} + /* Render R, an integral value, as a floating point constant with no specified exponent. */ @@ -2252,7 +2267,7 @@ decimal_integer_string (char *str, const REAL_VALUE_TYPE *r_orig, digits = dec_exp + 1; gcc_assert ((digits + 2) < (int)buf_size); - pten = *real_digit (1); + pten = dconst<1> (); times_pten (&pten, dec_exp); p = str; @@ -2326,27 +2341,11 @@ ten_to_mptwo (int n) gcc_assert (n < EXP_BITS); if (tens[n].cl == rvc_zero) - do_divide (&tens[n], real_digit (1), ten_to_ptwo (n)); + do_divide (&tens[n], &dconst<1> (), ten_to_ptwo (n)); return &tens[n]; } -/* Returns N. */ - -static const REAL_VALUE_TYPE * -real_digit (int n) -{ - static REAL_VALUE_TYPE num[10]; - - gcc_assert (n >= 0); - gcc_assert (n <= 9); - - if (n > 0 && num[n].cl == rvc_zero) - real_from_integer (&num[n], VOIDmode, n, UNSIGNED); - - return &num[n]; -} - /* Multiply R by 10**EXP. */ static void @@ -2359,7 +2358,7 @@ times_pten (REAL_VALUE_TYPE *r, int exp) if (negative) { exp = -exp; - pten = *real_digit (1); + pten = dconst<1> (); rr = &pten; } else @@ -2395,22 +2394,6 @@ dconst_e_ptr (void) return &value; } -/* Returns the special REAL_VALUE_TYPE corresponding to 1/3. */ - -const REAL_VALUE_TYPE * -dconst_third_ptr (void) -{ - static REAL_VALUE_TYPE value; - - /* Initialize mathematical constants for constant folding builtins. - These constants need to be given to at least 160 bits precision. */ - if (value.cl == rvc_zero) - { - real_arithmetic (&value, RDIV_EXPR, &dconst1, real_digit (3)); - } - return &value; -} - /* Returns the special REAL_VALUE_TYPE corresponding to sqrt(2). */ const REAL_VALUE_TYPE * @@ -4878,7 +4861,7 @@ real_powi (REAL_VALUE_TYPE *r, machine_mode mode, if (n == 0) { - *r = dconst1; + *r = dconst<1> (); return false; } else if (n < 0) @@ -4906,7 +4889,7 @@ real_powi (REAL_VALUE_TYPE *r, machine_mode mode, } if (neg) - inexact |= do_divide (&t, &dconst1, &t); + inexact |= do_divide (&t, &dconst<1> (), &t); real_convert (r, mode, &t); return inexact; @@ -4935,7 +4918,7 @@ real_floor (REAL_VALUE_TYPE *r, machine_mode mode, do_fix_trunc (&t, x); if (! real_identical (&t, x) && x->sign) - do_add (&t, &t, &dconstm1, 0); + do_add (&t, &t, &dconst<-1> (), 0); if (mode != VOIDmode) real_convert (r, mode, &t); else @@ -4953,7 +4936,7 @@ real_ceil (REAL_VALUE_TYPE *r, machine_mode mode, do_fix_trunc (&t, x); if (! real_identical (&t, x) && ! x->sign) - do_add (&t, &t, &dconst1, 0); + do_add (&t, &t, &dconst<1> (), 0); if (mode != VOIDmode) real_convert (r, mode, &t); else @@ -4967,7 +4950,7 @@ void real_round (REAL_VALUE_TYPE *r, machine_mode mode, const REAL_VALUE_TYPE *x) { - do_add (r, x, &dconsthalf, x->sign); + do_add (r, x, &dconst<1, 2> (), x->sign); do_fix_trunc (r, r); if (mode != VOIDmode) real_convert (r, mode, r); diff --git a/gcc/real.h b/gcc/real.h index 1497279..72e1a04 100644 --- a/gcc/real.h +++ b/gcc/real.h @@ -403,22 +403,12 @@ extern void real_ldexp (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, int); /* Constant real values 0, 1, 2, -1 and 0.5. */ -extern REAL_VALUE_TYPE dconst0; -extern REAL_VALUE_TYPE dconst1; -extern REAL_VALUE_TYPE dconst2; -extern REAL_VALUE_TYPE dconstm1; -extern REAL_VALUE_TYPE dconsthalf; - -#define dconst_e() (*dconst_e_ptr ()) -#define dconst_third() (*dconst_third_ptr ()) -#define dconst_sqrt2() (*dconst_sqrt2_ptr ()) +#define dconst_e() (*dconst_e_ptr ()) +#define dconst_sqrt2() (*dconst_sqrt2_ptr ()) /* Function to return the real value special constant 'e'. */ extern const REAL_VALUE_TYPE * dconst_e_ptr (void); -/* Returns the special REAL_VALUE_TYPE corresponding to 1/3. */ -extern const REAL_VALUE_TYPE * dconst_third_ptr (void); - /* Returns the special REAL_VALUE_TYPE corresponding to sqrt(2). */ extern const REAL_VALUE_TYPE * dconst_sqrt2_ptr (void); @@ -473,6 +463,26 @@ extern void get_max_float (const struct real_format *, char *, size_t); extern wide_int real_to_integer (const REAL_VALUE_TYPE *, bool *, int); extern void real_from_integer (REAL_VALUE_TYPE *, machine_mode, const wide_int_ref &, signop); +extern void real_from_fraction (REAL_VALUE_TYPE *, int, int); + +/* Return a constant A/B, in maximum precision. */ +template<int a, int b> +inline const REAL_VALUE_TYPE & +dconst (void) +{ + static REAL_VALUE_TYPE value; + if (value.cl == rvc_zero) + real_from_fraction (&value, a, b); + return value; +} + +/* Return a real for integer constant A. */ +template<int a> +inline const REAL_VALUE_TYPE & +dconst (void) +{ + return dconst<a, 1> (); +} #endif #endif /* ! GCC_REAL_H */ diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index 1f91afc..2e0afdd 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -2464,11 +2464,11 @@ simplify_binary_operation_1 (enum rtx_code code, machine_mode mode, { const REAL_VALUE_TYPE *d1 = CONST_DOUBLE_REAL_VALUE (trueop1); - if (real_equal (d1, &dconst2)) + if (real_equal (d1, &dconst<2> ())) return simplify_gen_binary (PLUS, mode, op0, copy_rtx (op0)); if (!HONOR_SNANS (mode) - && real_equal (d1, &dconstm1)) + && real_equal (d1, &dconst<-1> ())) return simplify_gen_unary (NEG, mode, op0, mode); } @@ -3093,17 +3093,17 @@ simplify_binary_operation_1 (enum rtx_code code, machine_mode mode, const REAL_VALUE_TYPE *d1 = CONST_DOUBLE_REAL_VALUE (trueop1); /* x/-1.0 is -x. */ - if (real_equal (d1, &dconstm1) + if (real_equal (d1, &dconst<-1> ()) && !HONOR_SNANS (mode)) return simplify_gen_unary (NEG, mode, op0, mode); /* Change FP division by a constant into multiplication. Only do this with -freciprocal-math. */ if (flag_reciprocal_math - && !real_equal (d1, &dconst0)) + && !real_equal (d1, &dconst<0> ())) { REAL_VALUE_TYPE d; - real_arithmetic (&d, RDIV_EXPR, &dconst1, d1); + real_arithmetic (&d, RDIV_EXPR, &dconst<1> (), d1); tem = const_double_from_real_value (d, mode); return simplify_gen_binary (MULT, mode, op0, tem); } @@ -3862,7 +3862,7 @@ simplify_const_binary_operation (enum rtx_code code, machine_mode mode, return 0; if (code == DIV - && real_equal (&f1, &dconst0) + && real_equal (&f1, &dconst<0> ()) && (flag_trapping_math || ! MODE_HAS_INFINITIES (mode))) return 0; @@ -3895,9 +3895,9 @@ simplify_const_binary_operation (enum rtx_code code, machine_mode mode, if (code == MULT && MODE_HAS_INFINITIES (mode) && HONOR_NANS (mode) && flag_trapping_math - && ((REAL_VALUE_ISINF (f0) && real_equal (&f1, &dconst0)) + && ((REAL_VALUE_ISINF (f0) && real_equal (&f1, &dconst<0> ())) || (REAL_VALUE_ISINF (f1) - && real_equal (&f0, &dconst0)))) + && real_equal (&f0, &dconst<0> ())))) /* Inf * 0 = NaN plus exception. */ return 0; diff --git a/gcc/tree-call-cdce.c b/gcc/tree-call-cdce.c index 112a325..640e7e5 100644 --- a/gcc/tree-call-cdce.c +++ b/gcc/tree-call-cdce.c @@ -199,9 +199,9 @@ check_pow (gcall *pow_call) /* Only handle a fixed range of constant. */ REAL_VALUE_TYPE mv; REAL_VALUE_TYPE bcv = TREE_REAL_CST (base); - if (real_equal (&bcv, &dconst1)) + if (real_equal (&bcv, &dconst<1> ())) return false; - if (real_less (&bcv, &dconst1)) + if (real_less (&bcv, &dconst<1> ())) return false; real_from_integer (&mv, TYPE_MODE (TREE_TYPE (base)), 256, UNSIGNED); if (real_less (&mv, &bcv)) @@ -420,8 +420,8 @@ gen_conditions_for_pow_cst_base (tree base, tree expn, sure it is consistent with check_pow. */ REAL_VALUE_TYPE mv; REAL_VALUE_TYPE bcv = TREE_REAL_CST (base); - gcc_assert (!real_equal (&bcv, &dconst1) - && !real_less (&bcv, &dconst1)); + gcc_assert (!real_equal (&bcv, &dconst<1> ()) + && !real_less (&bcv, &dconst<1> ())); real_from_integer (&mv, TYPE_MODE (TREE_TYPE (base)), 256, UNSIGNED); gcc_assert (!real_less (&mv, &bcv)); diff --git a/gcc/tree-chrec.c b/gcc/tree-chrec.c index 649c9fe..4a67eb5 100644 --- a/gcc/tree-chrec.c +++ b/gcc/tree-chrec.c @@ -132,7 +132,7 @@ chrec_fold_plus_poly_poly (enum tree_code code, chrec_fold_minus (type, poly0, CHREC_LEFT (poly1)), chrec_fold_multiply (type, CHREC_RIGHT (poly1), SCALAR_FLOAT_TYPE_P (type) - ? build_real (type, dconstm1) + ? build_real (type, dconst<-1> ()) : build_int_cst_type (type, -1))); } @@ -233,7 +233,7 @@ chrec_fold_multiply_poly_poly (tree type, t1 = chrec_fold_plus (type, t1, t2); /* "2*b*d". */ t2 = chrec_fold_multiply (type, SCALAR_FLOAT_TYPE_P (type) - ? build_real (type, dconst2) + ? build_real (type, dconst<2> ()) : build_int_cst (type, 2), t2); var = CHREC_VARIABLE (poly0); @@ -326,7 +326,7 @@ chrec_fold_plus_1 (enum tree_code code, tree type, chrec_fold_minus (type, op0, CHREC_LEFT (op1)), chrec_fold_multiply (type, CHREC_RIGHT (op1), SCALAR_FLOAT_TYPE_P (type) - ? build_real (type, dconstm1) + ? build_real (type, dconst<-1> ()) : build_int_cst_type (type, -1))); CASE_CONVERT: diff --git a/gcc/tree-complex.c b/gcc/tree-complex.c index 93c0a54..2dce4dc 100644 --- a/gcc/tree-complex.c +++ b/gcc/tree-complex.c @@ -118,7 +118,7 @@ some_nonzerop (tree t) cannot be treated the same as operations with a real or imaginary operand if we care about the signs of zeros in the result. */ if (TREE_CODE (t) == REAL_CST && !flag_signed_zeros) - zerop = real_identical (&TREE_REAL_CST (t), &dconst0); + zerop = real_identical (&TREE_REAL_CST (t), &dconst<0> ()); else if (TREE_CODE (t) == FIXED_CST) zerop = fixed_zerop (t); else if (TREE_CODE (t) == INTEGER_CST) @@ -495,7 +495,7 @@ get_component_ssa_name (tree ssa_name, bool imag_p) { tree inner_type = TREE_TYPE (TREE_TYPE (ssa_name)); if (SCALAR_FLOAT_TYPE_P (inner_type)) - return build_real (inner_type, dconst0); + return build_real (inner_type, dconst<0> ()); else return build_int_cst (inner_type, 0); } @@ -1021,7 +1021,7 @@ expand_complex_multiplication (gimple_stmt_iterator *gsi, tree inner_type, case PAIR (ONLY_IMAG, ONLY_REAL): rr = ar; if (TREE_CODE (ai) == REAL_CST - && real_identical (&TREE_REAL_CST (ai), &dconst1)) + && real_identical (&TREE_REAL_CST (ai), &dconst<1> ())) ri = br; else ri = gimplify_build2 (gsi, MULT_EXPR, inner_type, ai, br); diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 9b525f3..0758895 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -4094,7 +4094,7 @@ estimate_num_insns (gimple *stmt, eni_weights *weights) if (TREE_CODE (gimple_call_arg (stmt, 1)) == REAL_CST && (real_equal (&TREE_REAL_CST (gimple_call_arg (stmt, 1)), - &dconst2))) + &dconst<2> ()))) return estimate_operator_cost (MULT_EXPR, weights, gimple_call_arg (stmt, 0), gimple_call_arg (stmt, 0)); diff --git a/gcc/tree-scalar-evolution.c b/gcc/tree-scalar-evolution.c index 0753bf3..e3f94fa 100644 --- a/gcc/tree-scalar-evolution.c +++ b/gcc/tree-scalar-evolution.c @@ -638,7 +638,7 @@ add_to_evolution_1 (unsigned loop_nb, tree chrec_before, tree to_add, var = loop_nb; left = chrec_before; right = SCALAR_FLOAT_TYPE_P (type) - ? build_real (type, dconst0) + ? build_real (type, dconst<0> ()) : build_int_cst (type, 0); } else @@ -840,7 +840,7 @@ add_to_evolution (unsigned loop_nb, tree chrec_before, enum tree_code code, if (code == MINUS_EXPR) to_add = chrec_fold_multiply (type, to_add, SCALAR_FLOAT_TYPE_P (type) - ? build_real (type, dconstm1) + ? build_real (type, dconst<-1> ()) : build_int_cst_type (type, -1)); res = add_to_evolution_1 (loop_nb, chrec_before, to_add, at_stmt); diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index c226da5..5919c84 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -1158,7 +1158,7 @@ record_equality (tree x, tree y, class const_and_copies *const_and_copies) nonzero. */ if (HONOR_SIGNED_ZEROS (x) && (TREE_CODE (y) != REAL_CST - || real_equal (&dconst0, &TREE_REAL_CST (y)))) + || real_equal (&dconst<0> (), &TREE_REAL_CST (y)))) return; const_and_copies->record_const_or_copy (x, y, prev_x); diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c index 39c027c..288daef 100644 --- a/gcc/tree-ssa-math-opts.c +++ b/gcc/tree-ssa-math-opts.c @@ -1003,7 +1003,7 @@ powi_as_mults (gimple_stmt_iterator *gsi, location_t loc, tree target; if (n == 0) - return build_real (type, dconst1); + return build_real (type, dconst<1> ()); memset (cache, 0, sizeof (cache)); cache[1] = arg0; @@ -1015,7 +1015,7 @@ powi_as_mults (gimple_stmt_iterator *gsi, location_t loc, /* If the original exponent was negative, reciprocate the result. */ target = make_temp_ssa_name (type, NULL, "powmult"); div_stmt = gimple_build_assign (target, RDIV_EXPR, - build_real (type, dconst1), result); + build_real (type, dconst<1> ()), result); gimple_set_location (div_stmt, loc); gsi_insert_before (gsi, div_stmt, GSI_SAME_STMT); @@ -1128,7 +1128,7 @@ bool representable_as_half_series_p (REAL_VALUE_TYPE c, unsigned n, struct pow_synth_sqrt_info *info) { - REAL_VALUE_TYPE factor = dconsthalf; + REAL_VALUE_TYPE factor = dconst<1, 2> (); REAL_VALUE_TYPE remainder = c; info->deepest = 0; @@ -1145,7 +1145,7 @@ representable_as_half_series_p (REAL_VALUE_TYPE c, unsigned n, /* We have hit zero. The number is representable as a sum of powers of 0.5. */ - if (real_equal (&res, &dconst0)) + if (real_equal (&res, &dconst<0> ())) { info->factors[i] = true; info->deepest = i + 1; @@ -1160,7 +1160,7 @@ representable_as_half_series_p (REAL_VALUE_TYPE c, unsigned n, else info->factors[i] = false; - real_arithmetic (&factor, MULT_EXPR, &factor, &dconsthalf); + real_arithmetic (&factor, MULT_EXPR, &factor, &dconst<1, 2> ()); } return false; } @@ -1320,8 +1320,8 @@ expand_pow_as_sqrts (gimple_stmt_iterator *gsi, location_t loc, real_arithmetic (&frac_part, MINUS_EXPR, &exp, &whole_part); - REAL_VALUE_TYPE ceil_whole = dconst0; - REAL_VALUE_TYPE ceil_fract = dconst0; + REAL_VALUE_TYPE ceil_whole = dconst<0> (); + REAL_VALUE_TYPE ceil_fract = dconst<0> (); if (neg_exp) { @@ -1367,7 +1367,7 @@ expand_pow_as_sqrts (gimple_stmt_iterator *gsi, location_t loc, memset (cache, 0, (max_depth + 1) * sizeof (tree)); - tree integer_res = n == 0 ? build_real (type, dconst1) : arg0; + tree integer_res = n == 0 ? build_real (type, dconst<1> ()) : arg0; /* Calculate the integer part of the exponent. */ if (n > 1) @@ -1447,7 +1447,7 @@ expand_pow_as_sqrts (gimple_stmt_iterator *gsi, location_t loc, res = fract_res; res = build_and_insert_binop (gsi, loc, "powrootrecip", RDIV_EXPR, - build_real (type, dconst1), res); + build_real (type, dconst<1> ()), res); } else { @@ -1470,17 +1470,13 @@ static tree gimple_expand_builtin_pow (gimple_stmt_iterator *gsi, location_t loc, tree arg0, tree arg1) { - REAL_VALUE_TYPE c, cint, dconst1_3, dconst1_4, dconst1_6; - REAL_VALUE_TYPE c2, dconst3; + REAL_VALUE_TYPE c, c2, cint, dconst1_3, dconst1_6; HOST_WIDE_INT n; tree type, sqrtfn, cbrtfn, sqrt_arg0, result, cbrt_x, powi_cbrt_x; machine_mode mode; bool speed_p = optimize_bb_for_speed_p (gsi_bb (*gsi)); bool hw_sqrt_exists, c_is_int, c2_is_int; - dconst1_4 = dconst1; - SET_REAL_EXP (&dconst1_4, REAL_EXP (&dconst1_4) - 2); - /* If the exponent isn't a constant, there's nothing of interest to be done. */ if (TREE_CODE (arg1) != REAL_CST) @@ -1509,7 +1505,7 @@ gimple_expand_builtin_pow (gimple_stmt_iterator *gsi, location_t loc, unless signed zeros must be maintained. pow(-0,0.5) = +0, while sqrt(-0) = -0. */ if (sqrtfn - && real_equal (&c, &dconsthalf) + && real_equal (&c, &dconst<1, 2> ()) && !HONOR_SIGNED_ZEROS (mode)) return build_and_insert_call (gsi, loc, sqrtfn, arg0); @@ -1522,7 +1518,7 @@ gimple_expand_builtin_pow (gimple_stmt_iterator *gsi, location_t loc, of 1./3. actually has an even denominator. The correct value of cbrt(x) is a negative real value. */ cbrtfn = mathfn_built_in (type, BUILT_IN_CBRT); - dconst1_3 = real_value_truncate (mode, dconst_third ()); + dconst1_3 = real_value_truncate (mode, dconst<1, 3> ()); if (flag_unsafe_math_optimizations && cbrtfn @@ -1556,7 +1552,7 @@ gimple_expand_builtin_pow (gimple_stmt_iterator *gsi, location_t loc, if (flag_unsafe_math_optimizations && sqrtfn && hw_sqrt_exists - && (speed_p || real_equal (&c, &dconst1_4)) + && (speed_p || real_equal (&c, &dconst<1, 4> ())) && !HONOR_SIGNED_ZEROS (mode)) { unsigned int max_depth = speed_p @@ -1570,7 +1566,7 @@ gimple_expand_builtin_pow (gimple_stmt_iterator *gsi, location_t loc, return expand_with_sqrts; } - real_arithmetic (&c2, MULT_EXPR, &c, &dconst2); + real_arithmetic (&c2, MULT_EXPR, &c, &dconst<2> ()); n = real_to_integer (&c2); real_from_integer (&cint, VOIDmode, n, SIGNED); c2_is_int = real_identical (&c2, &cint); @@ -1584,12 +1580,11 @@ gimple_expand_builtin_pow (gimple_stmt_iterator *gsi, location_t loc, different from pow(x, 1./3.) due to rounding and behavior with negative x, we need to constrain this transformation to unsafe math and positive x or finite math. */ - real_from_integer (&dconst3, VOIDmode, 3, SIGNED); - real_arithmetic (&c2, MULT_EXPR, &c, &dconst3); + real_arithmetic (&c2, MULT_EXPR, &c, &dconst<3> ()); real_round (&c2, mode, &c2); n = real_to_integer (&c2); real_from_integer (&cint, VOIDmode, n, SIGNED); - real_arithmetic (&c2, RDIV_EXPR, &cint, &dconst3); + real_arithmetic (&c2, RDIV_EXPR, &cint, &dconst<3> ()); real_convert (&c2, mode, &c2); if (flag_unsafe_math_optimizations @@ -1634,7 +1629,8 @@ gimple_expand_builtin_pow (gimple_stmt_iterator *gsi, location_t loc, /* If n is negative, reciprocate the result. */ if (n < 0) result = build_and_insert_binop (gsi, loc, "powroot", RDIV_EXPR, - build_real (type, dconst1), result); + build_real (type, dconst<1> ()), + result); return result; } @@ -1793,8 +1789,8 @@ pass_cse_sincos::execute (function *fun) t0 = TREE_TYPE (arg0); t1 = TREE_TYPE (arg1); - one = build_real (t0, dconst1); - minus_one = build_real (t0, dconstm1); + one = build_real (t0, dconst<1> ()); + minus_one = build_real (t0, dconst<-1> ()); cond = make_temp_ssa_name (t1, NULL, "powi_cond"); stmt = gimple_build_assign (cond, BIT_AND_EXPR, @@ -3591,7 +3587,7 @@ pass_optimize_widening_mul::execute (function *fun) if (TREE_CODE (gimple_call_arg (stmt, 1)) == REAL_CST && real_equal (&TREE_REAL_CST (gimple_call_arg (stmt, 1)), - &dconst2) + &dconst<2> ()) && convert_mult_to_fma (stmt, gimple_call_arg (stmt, 0), gimple_call_arg (stmt, 0))) diff --git a/gcc/tree-ssa-uncprop.c b/gcc/tree-ssa-uncprop.c index 0f16c50..c247db7 100644 --- a/gcc/tree-ssa-uncprop.c +++ b/gcc/tree-ssa-uncprop.c @@ -153,7 +153,7 @@ associate_equivalences_with_edges (void) this value unless we know that the value is nonzero. */ if (HONOR_SIGNED_ZEROS (op0) && (TREE_CODE (op1) != REAL_CST - || real_equal (&dconst0, &TREE_REAL_CST (op1)))) + || real_equal (&dconst<0> (), &TREE_REAL_CST (op1)))) continue; equivalency = XNEW (struct edge_equivalency); diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 63e29aa..7d23428 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -3821,7 +3821,7 @@ get_initial_def_for_reduction (gimple *stmt, tree init_val, int i; bool nested_in_vect_loop = false; tree init_value; - REAL_VALUE_TYPE real_init_val = dconst0; + REAL_VALUE_TYPE real_init_val = dconst<0> (); int int_init_val = 0; gimple *def_stmt = NULL; @@ -3886,7 +3886,7 @@ get_initial_def_for_reduction (gimple *stmt, tree init_val, if (code == MULT_EXPR) { - real_init_val = dconst1; + real_init_val = dconst<1> (); int_init_val = 1; } diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c index 48b5298..e78de75 100644 --- a/gcc/tree-vect-patterns.c +++ b/gcc/tree-vect-patterns.c @@ -1084,7 +1084,7 @@ vect_recog_pow_pattern (vec<gimple *> *stmts, tree *type_in, if ((tree_fits_shwi_p (exp) && tree_to_shwi (exp) == 2) || (TREE_CODE (exp) == REAL_CST - && real_equal (&TREE_REAL_CST (exp), &dconst2))) + && real_equal (&TREE_REAL_CST (exp), &dconst<2> ()))) { *type_in = TREE_TYPE (base); @@ -1095,7 +1095,7 @@ vect_recog_pow_pattern (vec<gimple *> *stmts, tree *type_in, /* Catch square root. */ if (TREE_CODE (exp) == REAL_CST - && real_equal (&TREE_REAL_CST (exp), &dconsthalf)) + && real_equal (&TREE_REAL_CST (exp), &dconst<1, 2> ())) { tree newfn = mathfn_built_in (TREE_TYPE (base), BUILT_IN_SQRT); *type_in = get_vectype_for_scalar_type (TREE_TYPE (base)); diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index 7a2d623..3b8e26b 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -2617,7 +2617,7 @@ vect_get_constant_vectors (tree op, slp_tree slp_node, case BIT_IOR_EXPR: case BIT_XOR_EXPR: if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (op))) - neutral_op = build_real (TREE_TYPE (op), dconst0); + neutral_op = build_real (TREE_TYPE (op), dconst<0> ()); else neutral_op = build_int_cst (TREE_TYPE (op), 0); @@ -2625,7 +2625,7 @@ vect_get_constant_vectors (tree op, slp_tree slp_node, case MULT_EXPR: if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (op))) - neutral_op = build_real (TREE_TYPE (op), dconst1); + neutral_op = build_real (TREE_TYPE (op), dconst<1> ()); else neutral_op = build_int_cst (TREE_TYPE (op), 1); diff --git a/gcc/tree.c b/gcc/tree.c index f78a2c2..ef70b03 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -1991,7 +1991,7 @@ build_one_cst (tree type) return build_int_cst (type, 1); case REAL_TYPE: - return build_real (type, dconst1); + return build_real (type, dconst<1> ()); case FIXED_POINT_TYPE: /* We can only generate 1 for accum types. */ @@ -2044,7 +2044,7 @@ build_minus_one_cst (tree type) return build_int_cst (type, -1); case REAL_TYPE: - return build_real (type, dconstm1); + return build_real (type, dconst<-1> ()); case FIXED_POINT_TYPE: /* We can only generate 1 for accum types. */ @@ -2084,7 +2084,7 @@ build_zero_cst (tree type) return build_int_cst (type, 0); case REAL_TYPE: - return build_real (type, dconst0); + return build_real (type, dconst<0> ()); case FIXED_POINT_TYPE: return build_fixed (type, FCONST0 (TYPE_MODE (type))); @@ -2554,7 +2554,7 @@ real_zerop (const_tree expr) switch (TREE_CODE (expr)) { case REAL_CST: - return real_equal (&TREE_REAL_CST (expr), &dconst0) + return real_equal (&TREE_REAL_CST (expr), &dconst<0> ()) && !(DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (expr)))); case COMPLEX_CST: return real_zerop (TREE_REALPART (expr)) @@ -2584,7 +2584,7 @@ real_onep (const_tree expr) switch (TREE_CODE (expr)) { case REAL_CST: - return real_equal (&TREE_REAL_CST (expr), &dconst1) + return real_equal (&TREE_REAL_CST (expr), &dconst<1> ()) && !(DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (expr)))); case COMPLEX_CST: return real_onep (TREE_REALPART (expr)) @@ -2613,7 +2613,7 @@ real_minus_onep (const_tree expr) switch (TREE_CODE (expr)) { case REAL_CST: - return real_equal (&TREE_REAL_CST (expr), &dconstm1) + return real_equal (&TREE_REAL_CST (expr), &dconst<-1> ()) && !(DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (expr)))); case COMPLEX_CST: return real_minus_onep (TREE_REALPART (expr)) diff --git a/gcc/ubsan.c b/gcc/ubsan.c index af586e3..fe2491c 100644 --- a/gcc/ubsan.c +++ b/gcc/ubsan.c @@ -1496,7 +1496,7 @@ ubsan_instrument_float_cast (location_t loc, tree type, tree expr, tree arg) in EXPR_TYPE, e.g. if TYPE is 64-bit long long and EXPR_TYPE is IEEE single float, but TYPE_MAX_VALUE + 1.0 is either representable or infinity. */ - REAL_VALUE_TYPE maxval = dconst1; + REAL_VALUE_TYPE maxval = dconst<1> (); SET_REAL_EXP (&maxval, REAL_EXP (&maxval) + prec - !uns_p); real_convert (&maxval, mode, &maxval); max = build_real (expr_type, maxval); @@ -1508,10 +1508,10 @@ ubsan_instrument_float_cast (location_t loc, tree type, tree expr, tree arg) { /* TYPE_MIN_VALUE is generally representable (or -inf), but TYPE_MIN_VALUE - 1.0 might not be. */ - REAL_VALUE_TYPE minval = dconstm1, minval2; + REAL_VALUE_TYPE minval = dconst<-1> (), minval2; SET_REAL_EXP (&minval, REAL_EXP (&minval) + prec - 1); real_convert (&minval, mode, &minval); - real_arithmetic (&minval2, MINUS_EXPR, &minval, &dconst1); + real_arithmetic (&minval2, MINUS_EXPR, &minval, &dconst<1> ()); real_convert (&minval2, mode, &minval2); if (real_compare (EQ_EXPR, &minval, &minval2) && !real_isinf (&minval)) @@ -1522,7 +1522,7 @@ ubsan_instrument_float_cast (location_t loc, tree type, tree expr, tree arg) of base digits, we want to subtract a number that will be 1 << (REAL_MODE_FORMAT (mode)->p - 1) times smaller than minval. */ - minval2 = dconst1; + minval2 = dconst<1> (); gcc_assert (prec > REAL_MODE_FORMAT (mode)->p); SET_REAL_EXP (&minval2, REAL_EXP (&minval2) + prec - 1