diff options
author | Richard Guenther <rguenther@suse.de> | 2010-11-04 10:56:22 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2010-11-04 10:56:22 +0000 |
commit | 1694907238eb106bf7ac0e4eaedaa77bc7719b6d (patch) | |
tree | 5b089e25b51a9c3914b5055c84f8d83414072dab /gcc/fold-const.c | |
parent | 47853c73001ded810bfe6e4ca7f7ef34be600681 (diff) | |
download | gcc-1694907238eb106bf7ac0e4eaedaa77bc7719b6d.zip gcc-1694907238eb106bf7ac0e4eaedaa77bc7719b6d.tar.gz gcc-1694907238eb106bf7ac0e4eaedaa77bc7719b6d.tar.bz2 |
tree.def (FMA_EXPR): New tree code.
2010-11-04 Richard Guenther <rguenther@suse.de>
Richard Henderson <rth@redhat.com>
* tree.def (FMA_EXPR): New tree code.
* expr.c (expand_expr_real_2): Add FMA_EXPR expansion code.
* gimple.c (gimple_rhs_class_table): FMA_EXPR is a GIMPLE_TERNARY_RHS.
* tree-cfg.c (verify_gimple_assign_ternary): Verify FMA_EXPR types.
* tree-inline.c (estimate_operator_cost): Handle FMA_EXPR.
* gimple-pretty-print.c (dump_ternary_rhs): Likewise.
* tree-ssa-math-opts.c (convert_mult_to_fma): New function.
(execute_optimize_widening_mul): Call it. Reorganize to allow
dead stmt removal. Move TODO flags ...
(pass_optimize_widening_mul): ... here.
* flag-types.h (enum fp_contract_mode): New enum.
* common.opt (flag_fp_contract_mode): New variable.
(-ffp-contract): New option.
* opts.c (common_handle_option): Handle it.
* doc/invoke.texi (-ffp-contract): Document.
* tree.h (fold_fma): Declare.
* builtins.c (fold_fma): New function.
(fold_builtin_fma): Likewise.
(fold_builtin_3): Call it for fma.
* fold-const.c (fold_ternary_loc): Fold FMA_EXPR.
* optabs.c (optab_for_tree_code): Handle FMA_EXPR.
* config/i386/sse.md (fms<mode>4, fnma<mode>, fnms<mode>4):
New expanders.
* doc/md.texi (fms<mode>4, fnma<mode>, fnms<mode>4): Document new
named patterns.
* genopinit.c (optabs): Initialize fms_optab, fnma_optab and fnms_optab.
* optabs.h (enum optab_index): Add OTI_fms, OTI_fnma and OTI_fnms.
(fms_optab, fnma_optab, fnms_optab): New defines.
* gimplify.c (gimplify_expr): Handle binary truth expressions
explicitly. Handle FMA_EXPR.
* tree-vect-stmts.c (vectorizable_operation): Handle ternary
operations.
* gcc.target/i386/fma4-vector-2.c: New testcase.
Co-Authored-By: Richard Henderson <rth@redhat.com>
From-SVN: r166304
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r-- | gcc/fold-const.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index da890f1..b6a9814 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -13281,10 +13281,10 @@ contains_label_p (tree st) tree fold_ternary_loc (location_t loc, enum tree_code code, tree type, - tree op0, tree op1, tree op2) + tree op0, tree op1, tree op2) { tree tem; - tree arg0 = NULL_TREE, arg1 = NULL_TREE; + tree arg0 = NULL_TREE, arg1 = NULL_TREE, arg2 = NULL_TREE; enum tree_code_class kind = TREE_CODE_CLASS (code); gcc_assert (IS_EXPR_CODE_CLASS (kind) @@ -13312,6 +13312,12 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type, STRIP_NOPS (arg1); } + if (op2) + { + arg2 = op2; + STRIP_NOPS (arg2); + } + switch (code) { case COMPONENT_REF: @@ -13610,6 +13616,17 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type, return NULL_TREE; + case FMA_EXPR: + /* For integers we can decompose the FMA if possible. */ + if (TREE_CODE (arg0) == INTEGER_CST + && TREE_CODE (arg1) == INTEGER_CST) + return fold_build2_loc (loc, PLUS_EXPR, type, + const_binop (MULT_EXPR, arg0, arg1), arg2); + if (integer_zerop (arg2)) + return fold_build2_loc (loc, MULT_EXPR, type, arg0, arg1); + + return fold_fma (loc, type, arg0, arg1, arg2); + default: return NULL_TREE; } /* switch (code) */ |