gcc/ChangeLog:
* c-family/c-common.cc (c_common_related_vtype): New.
* c-family/c-common.h: Declare.
* c/c-objc-common.h: Likwise.
* cp/cp-objcp-common.h: Likewise.
* langhooks-def.h: Declare new hook.
---
gcc/c-family/c-common.cc | 15 +++++++++++++++
gcc/c-family/c-common.h | 1 +
gcc/c/c-objc-common.h | 2 ++
gcc/cp/cp-objcp-common.h | 2 ++
gcc/langhooks-def.h | 2 ++
gcc/langhooks.h | 4 ++++
6 files changed, 26 insertions(+)
diff --git a/gcc/c-family/c-common.cc b/gcc/c-family/c-common.cc
index 49508fe9ee6..0895c24ba97 100644
--- a/gcc/c-family/c-common.cc
+++ b/gcc/c-family/c-common.cc
@@ -2665,6 +2665,21 @@ c_common_type_for_mode (machine_mode mode, int
unsignedp)
return NULL_TREE;
}
+/* Given MODE, and INNER_MODE find a vector mode made up of INNER_MODE.
*/
+
+tree
+c_common_related_vtype_for_mode (machine_mode mode, scalar_mode
inner_mode,
+ int unsignedp)
+{
+ gcc_assert (VECTOR_MODE_P (mode));
+ gcc_assert (!VECTOR_MODE_P (inner_mode));
+
+ opt_machine_mode wvmode = targetm.vectorize.related_mode
+ (mode, inner_mode, GET_MODE_NUNITS (mode));
+ tree type = c_common_type_for_mode (wvmode.require (), unsignedp);
+ return type;
+}
+
tree
c_common_unsigned_type (tree type)
{
diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h
index ea6c2975056..0178a106343 100644
--- a/gcc/c-family/c-common.h
+++ b/gcc/c-family/c-common.h
@@ -874,6 +874,7 @@ extern bool c_common_handle_option (size_t, const char
*, HOST_WIDE_INT, int,
const struct cl_option_handlers *);
extern bool default_handle_c_option (size_t, const char *, int);
extern tree c_common_type_for_mode (machine_mode, int);
+extern tree c_common_related_vtype_for_mode (machine_mode, scalar_mode,
int);
extern tree c_common_type_for_size (unsigned int, int);
extern tree c_common_fixed_point_type_for_size (unsigned int, unsigned
int,
int, int);
diff --git a/gcc/c/c-objc-common.h b/gcc/c/c-objc-common.h
index 84bd3571ffc..93c753e4885 100644
--- a/gcc/c/c-objc-common.h
+++ b/gcc/c/c-objc-common.h
@@ -97,6 +97,8 @@ static const scoped_attribute_specs *const
c_objc_attribute_table[] =
#define LANG_HOOKS_SIMULATE_RECORD_DECL c_simulate_record_decl
#undef LANG_HOOKS_TYPE_FOR_MODE
#define LANG_HOOKS_TYPE_FOR_MODE c_common_type_for_mode
+#undef LANG_HOOKS_RELATED_VTYPE_FOR_MODE
+#define LANG_HOOKS_RELATED_VTYPE_FOR_MODE c_common_related_vtype_for_mode
#undef LANG_HOOKS_TYPE_FOR_SIZE
#define LANG_HOOKS_TYPE_FOR_SIZE c_common_type_for_size
#undef LANG_HOOKS_INCOMPLETE_TYPE_ERROR
diff --git a/gcc/cp/cp-objcp-common.h b/gcc/cp/cp-objcp-common.h
index 13fb80c2da5..821c7bdc881 100644
--- a/gcc/cp/cp-objcp-common.h
+++ b/gcc/cp/cp-objcp-common.h
@@ -151,6 +151,8 @@ static const scoped_attribute_specs *const
cp_objcp_attribute_table[] =
#define LANG_HOOKS_SIMULATE_RECORD_DECL cxx_simulate_record_decl
#undef LANG_HOOKS_TYPE_FOR_MODE
#define LANG_HOOKS_TYPE_FOR_MODE c_common_type_for_mode
+#undef LANG_HOOKS_RELATED_VTYPE_FOR_MODE
+#define LANG_HOOKS_RELATED_VTYPE_FOR_MODE c_common_related_vtype_for_mode
#undef LANG_HOOKS_TYPE_FOR_SIZE
#define LANG_HOOKS_TYPE_FOR_SIZE c_common_type_for_size
#undef LANG_HOOKS_INCOMPLETE_TYPE_ERROR
diff --git a/gcc/langhooks-def.h b/gcc/langhooks-def.h
index 6b34d324ab5..69a354639c3 100644
--- a/gcc/langhooks-def.h
+++ b/gcc/langhooks-def.h
@@ -221,6 +221,7 @@ extern tree lhd_unit_size_without_reusable_padding
(tree);
#define LANG_HOOKS_TYPE_DWARF_ATTRIBUTE lhd_type_dwarf_attribute
#define LANG_HOOKS_UNIT_SIZE_WITHOUT_REUSABLE_PADDING
lhd_unit_size_without_reusable_padding
#define LANG_HOOKS_CLASSTYPE_AS_BASE hook_tree_const_tree_null
+#define LANG_HOOKS_RELATED_VTYPE_FOR_MODE NULL
#define LANG_HOOKS_FOR_TYPES_INITIALIZER { \
LANG_HOOKS_MAKE_TYPE, \
@@ -228,6 +229,7 @@ extern tree lhd_unit_size_without_reusable_padding
(tree);
LANG_HOOKS_SIMULATE_RECORD_DECL, \
LANG_HOOKS_CLASSIFY_RECORD, \
LANG_HOOKS_TYPE_FOR_MODE, \
+ LANG_HOOKS_RELATED_VTYPE_FOR_MODE, \
LANG_HOOKS_TYPE_FOR_SIZE, \
LANG_HOOKS_GENERIC_TYPE_P, \
LANG_HOOKS_GET_ARGUMENT_PACK_ELEMS, \
diff --git a/gcc/langhooks.h b/gcc/langhooks.h
index dc8d878c7fb..45dbea481c7 100644
--- a/gcc/langhooks.h
+++ b/gcc/langhooks.h
@@ -87,6 +87,10 @@ struct lang_hooks_for_types
mode. */
tree (*type_for_mode) (machine_mode, int);
+ /* Given MODE, SCALAR_MODE and UNSIGNEDP, return a suitable vector
type-tree
+ where the element is of SCALAR_MODE and related to MODE. */
+ tree (*related_vtype_for_mode) (machine_mode, scalar_mode, int);
+
/* Given PRECISION and UNSIGNEDP, return a suitable type-tree for an
integer type with at least that precision. */
tree (*type_for_size) (unsigned, int);