aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPeter Bergner <bergner@linux.ibm.com>2018-07-06 21:05:48 +0000
committerPeter Bergner <bergner@gcc.gnu.org>2018-07-06 16:05:48 -0500
commit8de583fc5301987f31e1897e07d545e218b943da (patch)
treee0355f244ec0a61d828a04ab7d1783556b3a2fcd /gcc
parent7cf2b955893a333c6f6e4c60427832e97dd2bff7 (diff)
downloadgcc-8de583fc5301987f31e1897e07d545e218b943da.zip
gcc-8de583fc5301987f31e1897e07d545e218b943da.tar.gz
gcc-8de583fc5301987f31e1897e07d545e218b943da.tar.bz2
re PR target/86324 (testsuite test divkc3-1.c FAILs when compiling with -mabi=ieeelongdouble)
gcc/ PR target/86324 * target.def (translate_mode_attribute): New hook. * targhooks.h (default_translate_mode_attribute): Declare. * targhooks.c (default_translate_mode_attribute): New function. * doc/tm.texi.in (TARGET_TRANSLATE_MODE_ATTRIBUTE): New hook. * doc/tm.texi: Regenerate. * config/rs6000/rs6000.c (TARGET_TRANSLATE_MODE_ATTRIBUTE): Define. (rs6000_translate_mode_attribute): New function. gcc/c-family/ PR target/86324 * c-attribs.c (handle_mode_attribute): Call new translate_mode_attribute target hook. gcc/testsuite/ PR target/86324 gcc.target/powerpc/pr86324-1.c: New test. gcc.target/powerpc/pr86324-2.c: Likewise. From-SVN: r262484
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/c-family/ChangeLog6
-rw-r--r--gcc/c-family/c-attribs.c4
-rw-r--r--gcc/config/rs6000/rs6000.c15
-rw-r--r--gcc/doc/tm.texi8
-rw-r--r--gcc/doc/tm.texi.in2
-rw-r--r--gcc/target.def10
-rw-r--r--gcc/targhooks.c8
-rw-r--r--gcc/targhooks.h1
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.target/powerpc/pr86324-1.c10
-rw-r--r--gcc/testsuite/gcc.target/powerpc/pr86324-2.c10
12 files changed, 91 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5c096fa..c4ac3ea 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+2018-07-06 Peter Bergner <bergner@linux.ibm.com>
+
+ PR target/86324
+ * target.def (translate_mode_attribute): New hook.
+ * targhooks.h (default_translate_mode_attribute): Declare.
+ * targhooks.c (default_translate_mode_attribute): New function.
+ * doc/tm.texi.in (TARGET_TRANSLATE_MODE_ATTRIBUTE): New hook.
+ * doc/tm.texi: Regenerate.
+ * config/rs6000/rs6000.c (TARGET_TRANSLATE_MODE_ATTRIBUTE): Define.
+ (rs6000_translate_mode_attribute): New function.
+
2018-07-06 Paul Koning <ni1d@arrl.net>
* doc/md.texi (define_split): Document DONE and FAIL.
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index 24eaf6a..4193200 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,9 @@
+2018-07-06 Peter Bergner <bergner@linux.ibm.com>
+
+ PR target/86324
+ * c-attribs.c (handle_mode_attribute): Call new translate_mode_attribute
+ target hook.
+
2018-07-05 Nathan Sidwell <nathan@acm.org>
* c-lex.c (fe_file_change): Check SYSTEM_IMPLICIT_EXTERN_C not
diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c
index 73901bd..f91add4 100644
--- a/gcc/c-family/c-attribs.c
+++ b/gcc/c-family/c-attribs.c
@@ -1517,6 +1517,10 @@ handle_mode_attribute (tree *node, tree name, tree args,
return NULL_TREE;
}
+ /* Allow the target a chance to translate MODE into something supported.
+ See PR86324. */
+ mode = targetm.translate_mode_attribute (mode);
+
valid_mode = false;
switch (GET_MODE_CLASS (mode))
{
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index f815221..1976072 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -1802,6 +1802,9 @@ static const struct attribute_spec rs6000_attribute_table[] =
#undef TARGET_EH_RETURN_FILTER_MODE
#define TARGET_EH_RETURN_FILTER_MODE rs6000_eh_return_filter_mode
+#undef TARGET_TRANSLATE_MODE_ATTRIBUTE
+#define TARGET_TRANSLATE_MODE_ATTRIBUTE rs6000_translate_mode_attribute
+
#undef TARGET_SCALAR_MODE_SUPPORTED_P
#define TARGET_SCALAR_MODE_SUPPORTED_P rs6000_scalar_mode_supported_p
@@ -35678,6 +35681,18 @@ rs6000_eh_return_filter_mode (void)
return TARGET_32BIT ? SImode : word_mode;
}
+/* Target hook for translate_mode_attribute. */
+static machine_mode
+rs6000_translate_mode_attribute (machine_mode mode)
+{
+ if ((FLOAT128_IEEE_P (mode)
+ && ieee128_float_type_node == long_double_type_node)
+ || (FLOAT128_IBM_P (mode)
+ && ibm128_float_type_node == long_double_type_node))
+ return COMPLEX_MODE_P (mode) ? E_TCmode : E_TFmode;
+ return mode;
+}
+
/* Target hook for scalar_mode_supported_p. */
static bool
rs6000_scalar_mode_supported_p (scalar_mode mode)
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 057d650..7e2cdc2 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -4255,6 +4255,14 @@ hook returns true for both @code{ptr_mode} and @code{Pmode}.
Define this to return nonzero if the memory reference @var{ref} may alias with the system C library errno location. The default version of this hook assumes the system C library errno location is either a declaration of type int or accessed by dereferencing a pointer to int.
@end deftypefn
+@deftypefn {Target Hook} machine_mode TARGET_TRANSLATE_MODE_ATTRIBUTE (machine_mode @var{mode})
+Define this hook if during mode attribute processing, the port should
+translate machine_mode @var{mode} to another mode. For example, rs6000's
+@code{KFmode}, when it is the same as @code{TFmode}.
+
+The default version of the hook returns that mode that was passed in.
+@end deftypefn
+
@deftypefn {Target Hook} bool TARGET_SCALAR_MODE_SUPPORTED_P (scalar_mode @var{mode})
Define this to return nonzero if the port is prepared to handle
insns involving scalar mode @var{mode}. For a scalar mode to be
diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
index 7579423..b7b0e8a 100644
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -3336,6 +3336,8 @@ stack.
@hook TARGET_REF_MAY_ALIAS_ERRNO
+@hook TARGET_TRANSLATE_MODE_ATTRIBUTE
+
@hook TARGET_SCALAR_MODE_SUPPORTED_P
@hook TARGET_VECTOR_MODE_SUPPORTED_P
diff --git a/gcc/target.def b/gcc/target.def
index 472a593..112c772 100644
--- a/gcc/target.def
+++ b/gcc/target.def
@@ -3310,6 +3310,16 @@ constants can be done inline. The function\n\
HOST_WIDE_INT, (const_tree constant, HOST_WIDE_INT basic_align),
default_constant_alignment)
+DEFHOOK
+(translate_mode_attribute,
+ "Define this hook if during mode attribute processing, the port should\n\
+translate machine_mode @var{mode} to another mode. For example, rs6000's\n\
+@code{KFmode}, when it is the same as @code{TFmode}.\n\
+\n\
+The default version of the hook returns that mode that was passed in.",
+ machine_mode, (machine_mode mode),
+ default_translate_mode_attribute)
+
/* True if MODE is valid for the target. By "valid", we mean able to
be manipulated in non-trivial ways. In particular, this means all
the arithmetic is supported. */
diff --git a/gcc/targhooks.c b/gcc/targhooks.c
index 51b0dca..7315f1a 100644
--- a/gcc/targhooks.c
+++ b/gcc/targhooks.c
@@ -393,6 +393,14 @@ default_mangle_assembler_name (const char *name ATTRIBUTE_UNUSED)
return get_identifier (stripped);
}
+/* The default implementation of TARGET_TRANSLATE_MODE_ATTRIBUTE. */
+
+machine_mode
+default_translate_mode_attribute (machine_mode mode)
+{
+ return mode;
+}
+
/* True if MODE is valid for the target. By "valid", we mean able to
be manipulated in non-trivial ways. In particular, this means all
the arithmetic is supported.
diff --git a/gcc/targhooks.h b/gcc/targhooks.h
index b6a8fa5..4107e22 100644
--- a/gcc/targhooks.h
+++ b/gcc/targhooks.h
@@ -72,6 +72,7 @@ extern void default_print_operand_address (FILE *, machine_mode, rtx);
extern bool default_print_operand_punct_valid_p (unsigned char);
extern tree default_mangle_assembler_name (const char *);
+extern machine_mode default_translate_mode_attribute (machine_mode);
extern bool default_scalar_mode_supported_p (scalar_mode);
extern bool default_libgcc_floating_mode_supported_p (scalar_float_mode);
extern opt_scalar_float_mode default_floatn_mode (int, bool);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 373c3bb..fd01045 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2018-07-06 Peter Bergner <bergner@linux.ibm.com>
+
+ PR target/86324
+ gcc.target/powerpc/pr86324-1.c: New test.
+ gcc.target/powerpc/pr86324-2.c: Likewise.
+
2018-07-06 Tamar Christina <tamar.christina@arm.com>
PR target/84711
diff --git a/gcc/testsuite/gcc.target/powerpc/pr86324-1.c b/gcc/testsuite/gcc.target/powerpc/pr86324-1.c
new file mode 100644
index 0000000..66d9a90
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr86324-1.c
@@ -0,0 +1,10 @@
+/* { dg-do compile { target { powerpc*-*-linux* } } } */
+/* { dg-options "-mlong-double-128 -mabi=ieeelongdouble -Wno-psabi" } */
+
+typedef __complex float cflt_t __attribute__((mode(KC)));
+
+cflt_t
+divide (cflt_t *ptr)
+{
+ return *ptr;
+}
diff --git a/gcc/testsuite/gcc.target/powerpc/pr86324-2.c b/gcc/testsuite/gcc.target/powerpc/pr86324-2.c
new file mode 100644
index 0000000..2bd7cb3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr86324-2.c
@@ -0,0 +1,10 @@
+/* { dg-do compile { target { powerpc*-*-linux* } } } */
+/* { dg-options "-mlong-double-128 -mabi=ibmlongdouble -Wno-psabi" } */
+
+typedef __complex float cflt_t __attribute__((mode(IC)));
+
+cflt_t
+divide (cflt_t *ptr)
+{
+ return *ptr;
+}