]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/86324 (testsuite test divkc3-1.c FAILs when compiling with -mabi=ieeelon...
authorPeter Bergner <bergner@linux.ibm.com>
Fri, 6 Jul 2018 21:05:48 +0000 (21:05 +0000)
committerPeter Bergner <bergner@gcc.gnu.org>
Fri, 6 Jul 2018 21:05:48 +0000 (16:05 -0500)
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

12 files changed:
gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c-attribs.c
gcc/config/rs6000/rs6000.c
gcc/doc/tm.texi
gcc/doc/tm.texi.in
gcc/target.def
gcc/targhooks.c
gcc/targhooks.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/pr86324-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pr86324-2.c [new file with mode: 0644]

index 5c096fa4dc3766649ba7058d4b9017676435ef58..c4ac3ea9ef50d9bc275140348523ef0b49822131 100644 (file)
@@ -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.
index 24eaf6ad6328ecd11bb42894770ee30e13b77781..4193200895ff17e2a840e3d1c83b8b1f858fdfba 100644 (file)
@@ -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
index 73901bdf47c1c21f056ddf40bc413a2b98fc605e..f91add488bbb5d39365beec2f6b6c37d803c9e4c 100644 (file)
@@ -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))
        {
index f815221b1afcdad8d3bf4b10f21aebf32ad14ebb..197607214ff52e6f97f1b78c71a656bb95ace0f7 100644 (file)
@@ -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)
index 057d650a61f519ab8bbfe5b947becbf3856b273e..7e2cdc2f2026ab727fe396a987ae0ced5899f6b3 100644 (file)
@@ -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
index 7579423668e33fb8fe6e1c1043530b08c009eae7..b7b0e8ac8dc47c7604ef2bb54d0d80c559542375 100644 (file)
@@ -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
index 472a593c3466d5cd48a9c8c1d9c875cb22848f60..112c77222a96c7e77d400e3858cab60014c1bf90 100644 (file)
@@ -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.  */
index 51b0dcac111cba45413223e3d44bf565956d23e4..7315f1a9797e32a3d34ad412b45f34992119d6b5 100644 (file)
@@ -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.
index b6a8fa544f709ad1e5a63495fb97f321041ab727..4107e22d97c1373aa01f0f802e4bdd7d98e9a69a 100644 (file)
@@ -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);
index 373c3bba9334ab36b286259986c58861b63e53cf..fd01045f3e21815ba8e02d01ed55c3a58d578925 100644 (file)
@@ -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 (file)
index 0000000..66d9a90
--- /dev/null
@@ -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 (file)
index 0000000..2bd7cb3
--- /dev/null
@@ -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;
+}