PowerPC: Adjust float128/ibm128 warnings.
authorMichael Meissner <meissner@linux.ibm.com>
Fri, 30 Oct 2020 02:15:10 +0000 (22:15 -0400)
committerMichael Meissner <meissner@linux.ibm.com>
Fri, 30 Oct 2020 02:15:10 +0000 (22:15 -0400)
This patch ccombines two patches:

1) If GLIBC is 2.32 or newer, and the language is C or C++, allow the user to
   change the long double type without having to use -Wno-psabi.

2) Adjust the warnings for intermixing __float128 and __ibm128 to accomidate
   the future change to allow long double to use the IEEE 128-bit format.

gcc/
2020-10-29  Michael Meissner  <meissner@linux.ibm.com>

* config/rs6000/rs6000.c (rs6000_option_override_internal): Allow
long double type to be changed for C/C++ if glibc 2.32 or newer.
(rs6000_invalid_binary_op): Update error messages about mixing IBM
long double and IEEE 128-bit.

gcc/testsuite/
2020-10-27  Michael Meissner  <meissner@linux.ibm.com>

* gcc.target/powerpc/float128-mix-2.c: New test.
* gcc.target/powerpc/float128-mix-3.c: New test.
* gcc.target/powerpc/float128-mix.c: Update failure messages.

gcc/config/rs6000/rs6000.c
gcc/testsuite/gcc.target/powerpc/float128-mix-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/float128-mix-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/float128-mix.c

index 4d528a3..bcd4c4a 100644 (file)
@@ -4158,8 +4158,15 @@ rs6000_option_override_internal (bool global_init_p)
 
       if (rs6000_ieeequad != TARGET_IEEEQUAD_DEFAULT && TARGET_LONG_DOUBLE_128)
        {
+         /* Determine if the user can change the default long double type at
+            compilation time.  Only C and C++ support this, and you need GLIBC
+            2.32 or newer.  Only issue one warning.  */
          static bool warned_change_long_double;
-         if (!warned_change_long_double)
+
+         if (!warned_change_long_double
+             && (!OPTION_GLIBC
+                 || (!lang_GNU_C () && !lang_GNU_CXX ())
+                 || ((TARGET_GLIBC_MAJOR * 1000) + TARGET_GLIBC_MINOR) < 2032))
            {
              warned_change_long_double = true;
              if (TARGET_IEEEQUAD)
@@ -14392,22 +14399,10 @@ rs6000_invalid_binary_op (int op ATTRIBUTE_UNUSED,
 
   if (!TARGET_FLOAT128_CVT)
     {
-      if ((mode1 == KFmode && mode2 == IFmode)
-         || (mode1 == IFmode && mode2 == KFmode))
-       return N_("__float128 and __ibm128 cannot be used in the same "
-                 "expression");
-
-      if (TARGET_IEEEQUAD
-         && ((mode1 == IFmode && mode2 == TFmode)
-             || (mode1 == TFmode && mode2 == IFmode)))
-       return N_("__ibm128 and long double cannot be used in the same "
-                 "expression");
-
-      if (!TARGET_IEEEQUAD
-         && ((mode1 == KFmode && mode2 == TFmode)
-             || (mode1 == TFmode && mode2 == KFmode)))
-       return N_("__float128 and long double cannot be used in the same "
-                 "expression");
+      if ((FLOAT128_IEEE_P (mode1) && FLOAT128_IBM_P (mode2))
+         || (FLOAT128_IBM_P (mode1) && FLOAT128_IEEE_P (mode2)))
+       return N_("Invalid mixing of IEEE 128-bit and IBM 128-bit floating "
+                 "point types");
     }
 
   return NULL;
diff --git a/gcc/testsuite/gcc.target/powerpc/float128-mix-2.c b/gcc/testsuite/gcc.target/powerpc/float128-mix-2.c
new file mode 100644 (file)
index 0000000..6122713
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-require-effective-target ppc_float128_sw } */
+/* { dg-options "-O2 -mvsx -Wno-psabi -mabi=ieeelongdouble -mlong-double-128" } */
+
+/* Test to make sure that __float128 and long double do not generate errors if
+   long double uses the IEEE 128-bit format.  */
+__float128
+add (__float128 a, long double b)
+{
+  return a+b;
+}
+
+long double
+sub (long double a, __float128 b)
+{
+  return a-b;
+}
diff --git a/gcc/testsuite/gcc.target/powerpc/float128-mix-3.c b/gcc/testsuite/gcc.target/powerpc/float128-mix-3.c
new file mode 100644 (file)
index 0000000..a2582bb
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-require-effective-target ppc_float128_sw } */
+/* { dg-options "-O2 -mvsx -Wno-psabi -mabi=ibmlongdouble -mlong-double-128" } */
+
+/* Test to make sure that __float128 and __ibm128 cannot be combined
+   together.  */
+__float128
+add (__float128 a, __ibm128 b)
+{
+  return a+b;  /* { dg-error "IEEE 128-bit and IBM 128-bit floating point" } */
+}
+
+__ibm128
+sub (__ibm128 a, __float128 b)
+{
+  return a-b;  /* { dg-error "IEEE 128-bit and IBM 128-bit floating point" } */
+}
index 71f840c..48e651c 100644 (file)
@@ -1,15 +1,17 @@
-/* { dg-do compile { target { powerpc*-*-linux* } } } */
-/* { dg-require-effective-target powerpc_vsx_ok } */
-/* { dg-options "-O2 -mvsx" } */
+/* { dg-require-effective-target ppc_float128_sw } */
+/* { dg-options "-O2 -mvsx -Wno-psabi -mabi=ibmlongdouble -mlong-double-128" } */
 
-
-/* Test to make sure that __float128 and long double cannot be combined together.  */
-__float128 add (__float128 a, long double b)
+/* Test to make sure that __float128 and long double cannot be combined
+   together, when long double uses the IBM extended double format, and
+   __float128 uses the IEEE 128-bit format.  */
+__float128
+add (__float128 a, long double b)
 {
-  return a+b;  /* { dg-error "__float128 and long double cannot be used in the same expression" } */
+  return a+b;  /* { dg-error "IEEE 128-bit and IBM 128-bit floating point" } */
 }
 
-__ibm128 sub (long double a, __float128 b)
+long double
+sub (long double a, __float128 b)
 {
-  return a-b;  /* { dg-error "__float128 and long double cannot be used in the same expression" } */
+  return a-b;  /* { dg-error "IEEE 128-bit and IBM 128-bit floating point" } */
 }