diff options
author | Michael Meissner <meissner@linux.vnet.ibm.com> | 2018-01-17 23:16:03 +0000 |
---|---|---|
committer | Michael Meissner <meissner@gcc.gnu.org> | 2018-01-17 23:16:03 +0000 |
commit | a3b11faf7e1920d972eb98b86dc826b107f979a0 (patch) | |
tree | 4de4f82bacc49399d88181969b4c547efd8df8e8 | |
parent | a533fc76359bf0dfedc15be83f0bfd886712a4b3 (diff) | |
download | gcc-a3b11faf7e1920d972eb98b86dc826b107f979a0.zip gcc-a3b11faf7e1920d972eb98b86dc826b107f979a0.tar.gz gcc-a3b11faf7e1920d972eb98b86dc826b107f979a0.tar.bz2 |
rs6000.c (rs6000_emit_move): If we load or store a long double type...
[gcc]
2018-01-17 Michael Meissner <meissner@linux.vnet.ibm.com>
* config/rs6000/rs6000.c (rs6000_emit_move): If we load or store a
long double type, set the flags for noting the default long double
type, even if we don't pass or return a long double type.
[gcc/testsuite]
2018-01-17 Michael Meissner <meissner@linux.vnet.ibm.com>
* gcc.target/powerpc/gnuattr1.c: New test to make sure we set the
appropriate .gnu_attribute for the long double type, if we use the
long double type, but do not generate any calls.
* gcc.target/powerpc/gnuattr2.c: Likewise.
* gcc.target/powerpc/gnuattr3.c: Likewise.
From-SVN: r256822
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/gnuattr1.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/gnuattr2.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/gnuattr3.c | 15 |
6 files changed, 78 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6091649..e01194c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-01-17 Michael Meissner <meissner@linux.vnet.ibm.com> + + * config/rs6000/rs6000.c (rs6000_emit_move): If we load or store a + long double type, set the flags for noting the default long double + type, even if we don't pass or return a long double type. + 2018-01-17 Jan Hubicka <hubicka@ucw.cz> PR ipa/83051 diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index be54cc0..93432f6d 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -10494,6 +10494,23 @@ rs6000_emit_move (rtx dest, rtx source, machine_mode mode) gcc_unreachable (); } +#ifdef HAVE_AS_GNU_ATTRIBUTE + /* If we use a long double type, set the flags in .gnu_attribute that say + what the long double type is. This is to allow the linker's warning + message for the wrong long double to be useful, even if the function does + not do a call (for example, doing a 128-bit add on power9 if the long + double type is IEEE 128-bit. Do not set this if __ibm128 or __floa128 are + used if they aren't the default long dobule type. */ + if (rs6000_gnu_attr && (HAVE_LD_PPC_GNU_ATTR_LONG_DOUBLE || TARGET_64BIT)) + { + if (TARGET_LONG_DOUBLE_128 && (mode == TFmode || mode == TCmode)) + rs6000_passes_float = rs6000_passes_long_double = true; + + else if (!TARGET_LONG_DOUBLE_128 && (mode == DFmode || mode == DCmode)) + rs6000_passes_float = rs6000_passes_long_double = true; + } +#endif + /* See if we need to special case SImode/SFmode SUBREG moves. */ if ((mode == SImode || mode == SFmode) && SUBREG_P (source) && rs6000_emit_move_si_sf_subreg (dest, source, mode)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 364d044..ad23ad7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2018-01-17 Michael Meissner <meissner@linux.vnet.ibm.com> + + * gcc.target/powerpc/gnuattr1.c: New test to make sure we set the + appropriate .gnu_attribute for the long double type, if we use the + long double type, but do not generate any calls. + * gcc.target/powerpc/gnuattr2.c: Likewise. + * gcc.target/powerpc/gnuattr3.c: Likewise. + 2018-01-17 Paolo Carlini <paolo.carlini@oracle.com> PR c++/78344 diff --git a/gcc/testsuite/gcc.target/powerpc/gnuattr1.c b/gcc/testsuite/gcc.target/powerpc/gnuattr1.c new file mode 100644 index 0000000..cf46777 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/gnuattr1.c @@ -0,0 +1,15 @@ +/* { dg-do compile { target { powerpc*-linux-* } } } */ +/* { dg-require-effective-target powerpc_vsx_ok } */ +/* { dg-options "-O2 -mvsx -mlong-double-64" } */ +/* { dg-final { scan-assembler "gnu_attribute 4, 9" } } */ + +/* Check that if we can do the long double operation without doing an emulator + call, such as with 64-bit long double support, that we still set the + appropriate .gnu_attribute. */ + +long double a; + +void add1 (void) +{ + a++; +} diff --git a/gcc/testsuite/gcc.target/powerpc/gnuattr2.c b/gcc/testsuite/gcc.target/powerpc/gnuattr2.c new file mode 100644 index 0000000..32a4ba2 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/gnuattr2.c @@ -0,0 +1,17 @@ +/* { dg-do compile { target { powerpc*-linux-* && lp64 } } } */ +/* { dg-require-effective-target powerpc_p9vector_ok } */ +/* { dg-options "-O2 -mpower9-vector -mabi=ieeelongdouble -Wno-psabi" } */ +/* { dg-final { scan-assembler "gnu_attribute 4, 13" } } */ + +/* Check that if we can do the long double operation without doing an emulator + call, such as with IEEE 128-bit hardware support on power9, that we still + set the appropriate .gnu_attribute. The && lp64 is needed, because we can't + enable the IEEE 128-bit hardware instructions on ISA 3.0 (power9) in 32-bit, + because we don't have a TImode available. */ + +long double a; + +void add1 (void) +{ + a++; +} diff --git a/gcc/testsuite/gcc.target/powerpc/gnuattr3.c b/gcc/testsuite/gcc.target/powerpc/gnuattr3.c new file mode 100644 index 0000000..bd5a64f --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/gnuattr3.c @@ -0,0 +1,15 @@ +/* { dg-do compile { target { powerpc*-linux-* } } } */ +/* { dg-require-effective-target powerpc_vsx_ok } */ +/* { dg-options "-O2 -mvsx -mabi=ibmlongdouble -Wno-psabi" } */ +/* { dg-final { scan-assembler "gnu_attribute 4, 5" } } */ + +/* Check that if we can do the long double operation without doing an emulator + call, such as with copysign, that we still set the appropriate + .gnu_attribute. */ + +long double a, b, c; + +void cs (void) +{ + a = __builtin_copysignl (b, c); +} |