diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-10-07 14:36:38 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-10-07 14:36:38 +0000 |
commit | c4740c5d51c91bf89e34c9a38e7e8f7ddf9fd2fa (patch) | |
tree | 2b9ac40e2ddfd76e458ab91dc73fbb371682b0f1 /gcc/tree-vect-stmts.c | |
parent | 421b11b1634f1ed9bb7e8022af8124f2c2b1b7b3 (diff) | |
download | gcc-c4740c5d51c91bf89e34c9a38e7e8f7ddf9fd2fa.tar.gz |
2010-10-07 Richard Guenther <rguenther@suse.de>
* machmode.h (mode_for_vector): Declare.
* stor-layout.c (mode_for_vector): New function, split out from ...
(layout_type): ... here.
* tree-vectorizer.h (current_vector_size): Declare.
* tree-vect-stmts.c (perm_mask_for_reverse): Check if the
mask vector type is available.
(get_vectype_for_scalar_type): Rename to ...
(get_vectype_for_scalar_type_and_size): ... this. Get a vector
size argument.
(get_vectype_for_scalar_type): New wrapper around
get_vectype_for_scalar_type_and_size using current_vector_size.
(get_same_sized_vectype): Use get_vectype_for_scalar_type_and_size.
* tree-vect-loop.c (vect_analyze_loop_2): Split out core part
of vect_analyze_loop here.
(vect_analyze_loop): Loop over vector sizes calling vect_analyze_loop_3.
* tree-vect-slp.c (vect_slp_analyze_bb): Set current_vector_size
to autodetect.
* config/i386/i386.c (ix86_vectorize_builtin_conversion): Fix
V8SF to V8SI conversion builtin.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@165116 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-vect-stmts.c')
-rw-r--r-- | gcc/tree-vect-stmts.c | 42 |
1 files changed, 34 insertions, 8 deletions
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 8fba200f874..6d0c1126d59 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -3455,7 +3455,8 @@ perm_mask_for_reverse (tree vectype, tree *mask) mask_type = get_vectype_for_scalar_type (mask_element_type); nunits = TYPE_VECTOR_SUBPARTS (vectype); - if (TYPE_VECTOR_SUBPARTS (vectype) != TYPE_VECTOR_SUBPARTS (mask_type)) + if (!mask_type + || TYPE_VECTOR_SUBPARTS (vectype) != TYPE_VECTOR_SUBPARTS (mask_type)) return NULL; for (i = 0; i < nunits; i++) @@ -4784,13 +4785,13 @@ free_stmt_vec_info (gimple stmt) } -/* Function get_vectype_for_scalar_type. +/* Function get_vectype_for_scalar_type_and_size. - Returns the vector type corresponding to SCALAR_TYPE as supported + Returns the vector type corresponding to SCALAR_TYPE and SIZE as supported by the target. */ -tree -get_vectype_for_scalar_type (tree scalar_type) +static tree +get_vectype_for_scalar_type_and_size (tree scalar_type, unsigned size) { enum machine_mode inner_mode = TYPE_MODE (scalar_type); enum machine_mode simd_mode; @@ -4818,7 +4819,12 @@ get_vectype_for_scalar_type (tree scalar_type) && GET_MODE_CLASS (inner_mode) != MODE_FLOAT) return NULL_TREE; - simd_mode = targetm.vectorize.preferred_simd_mode (inner_mode); + /* If no size was supplied use the mode the target prefers. Otherwise + lookup a vector mode of the specified size. */ + if (size == 0) + simd_mode = targetm.vectorize.preferred_simd_mode (inner_mode); + else + simd_mode = mode_for_vector (inner_mode, size / nbytes); nunits = GET_MODE_SIZE (simd_mode) / nbytes; if (nunits <= 1) return NULL_TREE; @@ -4850,15 +4856,35 @@ get_vectype_for_scalar_type (tree scalar_type) return vectype; } +unsigned int current_vector_size; + +/* Function get_vectype_for_scalar_type. + + Returns the vector type corresponding to SCALAR_TYPE as supported + by the target. */ + +tree +get_vectype_for_scalar_type (tree scalar_type) +{ + tree vectype; + vectype = get_vectype_for_scalar_type_and_size (scalar_type, + current_vector_size); + if (vectype + && current_vector_size == 0) + current_vector_size = GET_MODE_SIZE (TYPE_MODE (vectype)); + return vectype; +} + /* Function get_same_sized_vectype Returns a vector type corresponding to SCALAR_TYPE of size VECTOR_TYPE if supported by the target. */ tree -get_same_sized_vectype (tree scalar_type, tree vector_type ATTRIBUTE_UNUSED) +get_same_sized_vectype (tree scalar_type, tree vector_type) { - return get_vectype_for_scalar_type (scalar_type); + return get_vectype_for_scalar_type_and_size + (scalar_type, GET_MODE_SIZE (TYPE_MODE (vector_type))); } /* Function vect_is_simple_use. |