aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Meissner <meissner@linux.vnet.ibm.com>2018-01-17 23:16:03 +0000
committerMichael Meissner <meissner@gcc.gnu.org>2018-01-17 23:16:03 +0000
commita3b11faf7e1920d972eb98b86dc826b107f979a0 (patch)
tree4de4f82bacc49399d88181969b4c547efd8df8e8
parenta533fc76359bf0dfedc15be83f0bfd886712a4b3 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/config/rs6000/rs6000.c17
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gcc.target/powerpc/gnuattr1.c15
-rw-r--r--gcc/testsuite/gcc.target/powerpc/gnuattr2.c17
-rw-r--r--gcc/testsuite/gcc.target/powerpc/gnuattr3.c15
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);
+}