diff options
author | Peter Bergner <bergner@linux.ibm.com> | 2018-07-06 21:05:48 +0000 |
---|---|---|
committer | Peter Bergner <bergner@gcc.gnu.org> | 2018-07-06 16:05:48 -0500 |
commit | 8de583fc5301987f31e1897e07d545e218b943da (patch) | |
tree | e0355f244ec0a61d828a04ab7d1783556b3a2fcd /gcc | |
parent | 7cf2b955893a333c6f6e4c60427832e97dd2bff7 (diff) | |
download | gcc-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/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/c-family/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c-family/c-attribs.c | 4 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 15 | ||||
-rw-r--r-- | gcc/doc/tm.texi | 8 | ||||
-rw-r--r-- | gcc/doc/tm.texi.in | 2 | ||||
-rw-r--r-- | gcc/target.def | 10 | ||||
-rw-r--r-- | gcc/targhooks.c | 8 | ||||
-rw-r--r-- | gcc/targhooks.h | 1 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/pr86324-1.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/pr86324-2.c | 10 |
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; +} |