diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-07-10 08:25:20 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-07-10 08:25:20 +0000 |
commit | ebf4f7640c6e22a7a4e84be1d1a67f194e9517a3 (patch) | |
tree | 92ca34cfac26d6253011a1acbd60501bca8cdf7a /gcc/tree-vect-patterns.c | |
parent | 64cd118d7079bfbd29c1b37f18f61a7306bfc3c5 (diff) |
Move vector highpart emulation to the optabs layer
* expmed.c (expmed_mult_highpart): Rename from expand_mult_highpart.
(expmed_mult_highpart_optab): Rename from expand_mult_highpart_optab.
* optabs.c (can_mult_highpart_p): New.
(expand_mult_highpart): New.
* expr.c (expand_expr_real_2) [MULT_HIGHPART_EXPR): Use it.
* tree-vect-generic.c (expand_vector_operations_1): Don't expand
by pieces if can_mult_highpart_p.
(expand_vector_divmod): Use can_mult_highpart_p and always
generate MULT_HIGHPART_EXPR.
* tree-vect-patterns.c (vect_recog_divmod_pattern): Likewise.
* tree-vect-stmts.c (vectorizable_operation): Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@189407 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-vect-patterns.c')
-rw-r--r-- | gcc/tree-vect-patterns.c | 23 |
1 files changed, 3 insertions, 20 deletions
diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c index 3f57e5dcf8b..ab9e927549d 100644 --- a/gcc/tree-vect-patterns.c +++ b/gcc/tree-vect-patterns.c @@ -1642,10 +1642,8 @@ vect_recog_divmod_pattern (VEC (gimple, heap) **stmts, loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_vinfo); bb_vec_info bb_vinfo = STMT_VINFO_BB_VINFO (stmt_vinfo); optab optab; - tree dummy, q; - enum tree_code dummy_code; + tree q; int dummy_int, prec; - VEC (tree, heap) *dummy_vec; stmt_vec_info def_stmt_vinfo; if (!is_gimple_assign (last_stmt)) @@ -1814,23 +1812,8 @@ vect_recog_divmod_pattern (VEC (gimple, heap) **stmts, || prec > HOST_BITS_PER_WIDE_INT) return NULL; - optab = optab_for_tree_code (MULT_HIGHPART_EXPR, vectype, optab_default); - if (optab == NULL - || optab_handler (optab, TYPE_MODE (vectype)) == CODE_FOR_nothing) - { - tree witype = build_nonstandard_integer_type (prec * 2, - TYPE_UNSIGNED (itype)); - tree vecwtype = get_vectype_for_scalar_type (witype); - - if (vecwtype == NULL_TREE) - return NULL; - if (!supportable_widening_operation (WIDEN_MULT_EXPR, last_stmt, - vecwtype, vectype, - &dummy, &dummy, &dummy_code, - &dummy_code, &dummy_int, - &dummy_vec)) - return NULL; - } + if (!can_mult_highpart_p (TYPE_MODE (vectype), TYPE_UNSIGNED (itype))) + return NULL; STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo) = NULL; |