diff options
author | Richard Henderson <rth@redhat.com> | 2011-10-25 14:29:48 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2011-10-25 14:29:48 -0700 |
commit | 22e4dee74f73108b7dda295f6999276be12b7568 (patch) | |
tree | 646bec23201b08685d3560602023733c6d9f7259 /gcc/expr.c | |
parent | c3962b13f70898c51173b9f3a6bb1e369a84b459 (diff) | |
download | gcc-22e4dee74f73108b7dda295f6999276be12b7568.zip gcc-22e4dee74f73108b7dda295f6999276be12b7568.tar.gz gcc-22e4dee74f73108b7dda295f6999276be12b7568.tar.bz2 |
Change vec_perm checking and expansion level.
The can_vec_perm_p interface changed to use a C integer array. This
allows easy re-use from the rtl level and the gimple level within
the vectorizer. It allows both to determine if a given permutation
is (un-)supported without having to create tree/rtl garbage.
The expand_vec_perm interface changed to use rtl. This allows easy
re-use from the rtl level, so that expand_vec_perm can be used in the
fallback implementation of other optabs.
* target.def (vec_perm_const_ok): Change parameters to mode and
array of indicies.
* doc/tm.texi: Rebuild.
* config/i386/i386.c (ix86_vectorize_vec_perm_const_ok): Change
parameters to mode and array of indicies.
* expr.c (expand_expr_real_2) [VEC_PERM_EXPR]: Expand operands here.
* optabs.c (can_vec_perm_p): Rename from can_vec_perm_expr_p.
Change parameters to mode and array of indicies.
(expand_vec_perm_1): Rename from expand_vec_perm_expr_1.
(expand_vec_perm): Rename from expand_vec_perm_expr. Change
parameters to mode and rtx inputs. Try lowering to QImode
vec_perm_const before trying fully variable permutation.
* optabs.h: Update decls.
* tree-vect-generic.c (lower_vec_perm): Extract array of indices from
VECTOR_CST to pass to can_vec_perm_p.
* tree-vect-slp.c (vect_get_mask_element): Change mask parameter type
from int pointer to unsigned char pointer.
(vect_transform_slp_perm_load): Update for change to can_vec_perm_p.
* tree-vect-stmts.c (perm_mask_for_reverse): Likewise.
From-SVN: r180449
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 8 |
1 files changed, 5 insertions, 3 deletions
@@ -8752,9 +8752,11 @@ expand_expr_real_2 (sepops ops, rtx target, enum machine_mode tmode, goto binop; case VEC_PERM_EXPR: - target = expand_vec_perm_expr (type, treeop0, treeop1, treeop2, target); - gcc_assert (target); - return target; + expand_operands (treeop0, treeop1, target, &op0, &op1, EXPAND_NORMAL); + op2 = expand_normal (treeop2); + temp = expand_vec_perm (mode, op0, op1, op2, target); + gcc_assert (temp); + return temp; case DOT_PROD_EXPR: { |