rs6000.c (rs6000_emit_move): If we load or store a long double type...
authorMichael Meissner <meissner@linux.vnet.ibm.com>
Wed, 17 Jan 2018 23:16:03 +0000 (23:16 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Wed, 17 Jan 2018 23:16:03 +0000 (23:16 +0000)
[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

gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/gnuattr1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/gnuattr2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/gnuattr3.c [new file with mode: 0644]

index 6091649b65df84b8c52e770d79bfec1f448d71fb..e01194cf720afb87c3e5a218cd72650af67b5562 100644 (file)
@@ -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
index be54cc02bb743a092f144d4a231324abe9d8ccdd..93432f6d5271d5313d6dadb0536c87dbbdfbab75 100644 (file)
@@ -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))
index 364d044c721f27df2e6a3b51d0887c58581ac91f..ad23ad741ef8c805b65a47cef92953569415272b 100644 (file)
@@ -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 (file)
index 0000000..cf46777
--- /dev/null
@@ -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 (file)
index 0000000..32a4ba2
--- /dev/null
@@ -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 (file)
index 0000000..bd5a64f
--- /dev/null
@@ -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);
+}