diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2011-01-03 13:25:25 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@gcc.gnu.org> | 2011-01-03 13:25:25 +0000 |
commit | 2fa6eeff4bc0992a96c11b7bf1f81a98f1c91545 (patch) | |
tree | 53939f008421c14a6c8f29d18f19fdf2ea509836 /gcc | |
parent | 76df0ae6df0c70f20b19c9e407892fb17b2643cc (diff) | |
download | gcc-2fa6eeff4bc0992a96c11b7bf1f81a98f1c91545.zip gcc-2fa6eeff4bc0992a96c11b7bf1f81a98f1c91545.tar.gz gcc-2fa6eeff4bc0992a96c11b7bf1f81a98f1c91545.tar.bz2 |
tree-vect-generic.c (expand_vector_operations_1): When using vector/ vector optab to expand vector/scalar shift...
* tree-vect-generic.c (expand_vector_operations_1): When using vector/
vector optab to expand vector/scalar shift, update gimple to vector.
From-SVN: r168423
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/tree-vect-generic.c | 19 |
2 files changed, 23 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 517704f..477380f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-01-03 Ulrich Weigand <Ulrich.Weigand@de.ibm.com> + + * tree-vect-generic.c (expand_vector_operations_1): When using vector/ + vector optab to expand vector/scalar shift, update gimple to vector. + 2011-01-03 Martin Jambor <mjambor@suse.cz> * cgraphunit.c (verify_cgraph_node): Verify there is no direct call to diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c index 3f58240..82fc615 100644 --- a/gcc/tree-vect-generic.c +++ b/gcc/tree-vect-generic.c @@ -520,7 +520,24 @@ expand_vector_operations_1 (gimple_stmt_iterator *gsi) /* Try for a vector/scalar shift, and if we don't have one, see if we have a vector/vector shift */ else if (!vector_scalar_shift) - op = optab_for_tree_code (code, type, optab_vector); + { + op = optab_for_tree_code (code, type, optab_vector); + + if (op && (optab_handler (op, TYPE_MODE (type)) + != CODE_FOR_nothing)) + { + /* Transform vector <op> scalar => vector <op> {x,x,x,x}. */ + int n_parts = TYPE_VECTOR_SUBPARTS (type); + int part_size = tree_low_cst (TYPE_SIZE (TREE_TYPE (type)), 1); + tree part_type = lang_hooks.types.type_for_size (part_size, 1); + tree vect_type = build_vector_type (part_type, n_parts); + + rhs2 = fold_convert (part_type, rhs2); + rhs2 = build_vector_from_val (vect_type, rhs2); + gimple_assign_set_rhs2 (stmt, rhs2); + update_stmt (stmt); + } + } } else op = optab_for_tree_code (code, type, optab_default); |