aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-10-07 14:35:38 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-10-07 14:35:38 +0000
commit767f865fb828fba54459911661d15289e1a42930 (patch)
tree6f561e813aa0ca8ad15d3002a912e9e02e3da749 /gcc
parentcc4b51708785f9482c6b2874daafa4fcc121d5d1 (diff)
downloadgcc-767f865fb828fba54459911661d15289e1a42930.zip
gcc-767f865fb828fba54459911661d15289e1a42930.tar.gz
gcc-767f865fb828fba54459911661d15289e1a42930.tar.bz2
target.def (autovectorize_vector_sizes): New target hook.
2010-10-07 Richard Guenther <rguenther@suse.de> * target.def (autovectorize_vector_sizes): New target hook. * targhooks.c (default_autovectorize_vector_sizes): New function. * targhooks.h (default_autovectorize_vector_sizes): Declare. * doc/tm.texi.in (TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES): Document. * doc/tm.texi: Update. * config/i386/i386.c (ix86_autovectorize_vector_sizes): New function. (TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES): Define. From-SVN: r165115
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/config/i386/i386.c12
-rw-r--r--gcc/doc/tm.texi7
-rw-r--r--gcc/doc/tm.texi.in7
-rw-r--r--gcc/target.def9
-rw-r--r--gcc/targhooks.c9
-rw-r--r--gcc/targhooks.h1
7 files changed, 56 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 20df6bb..94eada1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,16 @@
2010-10-07 Richard Guenther <rguenther@suse.de>
+ * target.def (autovectorize_vector_sizes): New target hook.
+ * targhooks.c (default_autovectorize_vector_sizes): New function.
+ * targhooks.h (default_autovectorize_vector_sizes): Declare.
+ * doc/tm.texi.in (TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES):
+ Document.
+ * doc/tm.texi: Update.
+ * config/i386/i386.c (ix86_autovectorize_vector_sizes): New function.
+ (TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES): Define.
+
+2010-10-07 Richard Guenther <rguenther@suse.de>
+
* target.def (units_per_simd_word): Rename to ...
(preferred_simd_mode): ... this. Return mode instead of size.
* targhooks.c (default_units_per_simd_word): Rename to ...
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 74ded78..39308cf 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -32993,6 +32993,15 @@ ix86_preferred_simd_mode (enum machine_mode mode)
return word_mode;
}
+/* If AVX is enabled then try vectorizing with both 256bit and 128bit
+ vectors. */
+
+static unsigned int
+ix86_autovectorize_vector_sizes (void)
+{
+ return TARGET_AVX ? 32 | 16 : 0;
+}
+
/* Initialize the GCC target structure. */
#undef TARGET_RETURN_IN_MEMORY
#define TARGET_RETURN_IN_MEMORY ix86_return_in_memory
@@ -33253,6 +33262,9 @@ ix86_preferred_simd_mode (enum machine_mode mode)
#undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE
#define TARGET_VECTORIZE_PREFERRED_SIMD_MODE \
ix86_preferred_simd_mode
+#undef TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES
+#define TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES \
+ ix86_autovectorize_vector_sizes
#undef TARGET_SET_CURRENT_FUNCTION
#define TARGET_SET_CURRENT_FUNCTION ix86_set_current_function
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index afa1971..faa7250 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -5750,6 +5750,13 @@ equal to @code{word_mode}, because the vectorizer can do some
transformations even in absence of specialized @acronym{SIMD} hardware.
@end deftypefn
+@deftypefn {Target Hook} {unsigned int} TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES (void)
+This hook should return a mask of sizes that should be iterated over
+after trying to autovectorize using the vector size derived from the
+mode returned by @code{TARGET_VECTORIZE_PREFERRED_SIMD_MODE}.
+The default is zero which means to not iterate over other vector sizes.
+@end deftypefn
+
@node Anchored Addresses
@section Anchored Addresses
@cindex anchored addresses
diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
index 8489027..cdd9a22 100644
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -5748,6 +5748,13 @@ equal to @code{word_mode}, because the vectorizer can do some
transformations even in absence of specialized @acronym{SIMD} hardware.
@end deftypefn
+@hook TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES
+This hook should return a mask of sizes that should be iterated over
+after trying to autovectorize using the vector size derived from the
+mode returned by @code{TARGET_VECTORIZE_PREFERRED_SIMD_MODE}.
+The default is zero which means to not iterate over other vector sizes.
+@end deftypefn
+
@node Anchored Addresses
@section Anchored Addresses
@cindex anchored addresses
diff --git a/gcc/target.def b/gcc/target.def
index f104ae8..266870a 100644
--- a/gcc/target.def
+++ b/gcc/target.def
@@ -889,6 +889,15 @@ DEFHOOK
(enum machine_mode mode),
default_preferred_simd_mode)
+/* Returns a mask of vector sizes to iterate over when auto-vectorizing
+ after processing the preferred one derived from preferred_simd_mode. */
+DEFHOOK
+(autovectorize_vector_sizes,
+ "",
+ unsigned int,
+ (void),
+ default_autovectorize_vector_sizes)
+
HOOK_VECTOR_END (vectorize)
#undef HOOK_PREFIX
diff --git a/gcc/targhooks.c b/gcc/targhooks.c
index 0a65b2a..9d7ebc0 100644
--- a/gcc/targhooks.c
+++ b/gcc/targhooks.c
@@ -985,6 +985,15 @@ default_preferred_simd_mode (enum machine_mode mode ATTRIBUTE_UNUSED)
return word_mode;
}
+/* By default only the size derived from the preferred vector mode
+ is tried. */
+
+unsigned int
+default_autovectorize_vector_sizes (void)
+{
+ return 0;
+}
+
/* Determine whether or not a pointer mode is valid. Assume defaults
of ptr_mode or Pmode - can be overridden. */
bool
diff --git a/gcc/targhooks.h b/gcc/targhooks.h
index a705d7e..920c9183 100644
--- a/gcc/targhooks.h
+++ b/gcc/targhooks.h
@@ -87,6 +87,7 @@ default_builtin_support_vector_misalignment (enum machine_mode mode,
const_tree,
int, bool);
extern enum machine_mode default_preferred_simd_mode (enum machine_mode mode);
+extern unsigned int default_autovectorize_vector_sizes (void);
/* These are here, and not in hooks.[ch], because not all users of
hooks.h include tm.h, and thus we don't have CUMULATIVE_ARGS. */