+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
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))
+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
--- /dev/null
+/* { 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++;
+}
--- /dev/null
+/* { 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++;
+}
--- /dev/null
+/* { 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);
+}