re PR libquadmath/81848 (Add PowerPC support to libquadmath)
authorMichael Meissner <meissner@linux.vnet.ibm.com>
Fri, 1 Sep 2017 22:10:57 +0000 (22:10 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Fri, 1 Sep 2017 22:10:57 +0000 (22:10 +0000)
2017-09-01  Michael Meissner  <meissner@linux.vnet.ibm.com>

PR libquadmath/81848
* configure.ac (powerpc*-linux*): Use attribute mode KC to create
complex __float128 on PowerPC instead of attribute mode TC.
* quadmath.h (__complex128): Likewise.
* configure: Regenerate.
* math/cbrtq.c (CBRT2): Use __float128 not long double.
(CBRT4): Likewise.
(CBRT2I): Likewise.
(CBRT4I): Likewise.
* math/j0q.c (U0): Likewise.
* math/sqrtq.c (sqrtq): Don't depend on implicit conversion
between __float128, instead explicitly convert the __float128
value to long double because the PowerPC does not allow __float128
and long double in the same expression.

From-SVN: r251613

libquadmath/ChangeLog
libquadmath/configure
libquadmath/configure.ac
libquadmath/math/cbrtq.c
libquadmath/math/j0q.c
libquadmath/math/sqrtq.c
libquadmath/quadmath.h

index bc37c3f66ba93d51426725530707b4464c74f2b0..c897d33a2bcef673e21dae1b94a81387575f92c7 100644 (file)
@@ -1,3 +1,20 @@
+2017-09-01  Michael Meissner  <meissner@linux.vnet.ibm.com>
+
+       PR libquadmath/81848
+       * configure.ac (powerpc*-linux*): Use attribute mode KC to create
+       complex __float128 on PowerPC instead of attribute mode TC.
+       * quadmath.h (__complex128): Likewise.
+       * configure: Regenerate.
+       * math/cbrtq.c (CBRT2): Use __float128 not long double.
+       (CBRT4): Likewise.
+       (CBRT2I): Likewise.
+       (CBRT4I): Likewise.
+       * math/j0q.c (U0): Likewise.
+       * math/sqrtq.c (sqrtq): Don't depend on implicit conversion
+       between __float128, instead explicitly convert the __float128
+       value to long double because the PowerPC does not allow __float128
+       and long double in the same expression.
+
 2017-07-19  Gerald Pfeifer  <gerald@pfeifer.com>
 
        * math/powq.c (powq): Use uint32_t instead of u_int32_t.
index d2f13bf7751e5dbfad167d93823832b9a3cd92fc..b1dc7f385378292dca7b5b3027e1d0a6761e7153 100755 (executable)
@@ -12516,7 +12516,11 @@ else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
+    #if (!defined(_ARCH_PPC)) || defined(__LONG_DOUBLE_IEEE128__)
     typedef _Complex float __attribute__((mode(TC))) __complex128;
+    #else
+    typedef _Complex float __attribute__((mode(KC))) __complex128;
+    #endif
 
     __float128 foo (__float128 x)
     {
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
+    #if (!defined(_ARCH_PPC)) || defined(__LONG_DOUBLE_IEEE128__)
     typedef _Complex float __attribute__((mode(TC))) __complex128;
+    #else
+    typedef _Complex float __attribute__((mode(KC))) __complex128;
+    #endif
 
     __float128 foo (__float128 x)
     {
index 41fbe1259ee0c13c5cfdfdce0308b2de0ffc0086..4226524caf85a3e5697327f0959254e0611db90a 100644 (file)
@@ -210,7 +210,11 @@ AM_CONDITIONAL(LIBQUAD_USE_SYMVER_SUN, [test "x$quadmath_use_symver" = xsun])
 
 AC_CACHE_CHECK([whether __float128 is supported], [libquad_cv_have_float128],
   [GCC_TRY_COMPILE_OR_LINK([
+    #if (!defined(_ARCH_PPC)) || defined(__LONG_DOUBLE_IEEE128__)
     typedef _Complex float __attribute__((mode(TC))) __complex128;
+    #else
+    typedef _Complex float __attribute__((mode(KC))) __complex128;
+    #endif
 
     __float128 foo (__float128 x)
     {
index 2567d4d5bd3985799be80e6bbd1f947c1b1479c7..a7a36f953cd97d511218987f438124ae54bcae50 100644 (file)
@@ -56,10 +56,10 @@ Adapted for glibc October, 2001.
 
 #include "quadmath-imp.h"
 
-static const long double CBRT2 = 1.259921049894873164767210607278228350570251Q;
-static const long double CBRT4 = 1.587401051968199474751705639272308260391493Q;
-static const long double CBRT2I = 0.7937005259840997373758528196361541301957467Q;
-static const long double CBRT4I = 0.6299605249474365823836053036391141752851257Q;
+static const __float128 CBRT2 = 1.259921049894873164767210607278228350570251Q;
+static const __float128 CBRT4 = 1.587401051968199474751705639272308260391493Q;
+static const __float128 CBRT2I = 0.7937005259840997373758528196361541301957467Q;
+static const __float128 CBRT4I = 0.6299605249474365823836053036391141752851257Q;
 
 
 __float128
index c6e482b1c51cf60ceafd641986f9647a4dd00c1f..2dc93d5292f3aa5f073fe07c84109f1fda2eeab1 100644 (file)
@@ -816,7 +816,7 @@ static __float128 Y0_2D[NY0_2D + 1] = {
  /* 1.000000000000000000000000000000000000000E0 */
 };
 
-static const long double U0 = -7.3804295108687225274343927948483016310862e-02Q;
+static const __float128 U0 = -7.3804295108687225274343927948483016310862e-02Q;
 
 /* Bessel function of the second kind, order zero.  */
 
index f63c0d1f6d2749f235a611173b5c17291a7217d7..56ea5d3243c06df2276689849b448eebacae6367 100644 (file)
@@ -32,14 +32,17 @@ sqrtq (const __float128 x)
   }
 
 #ifdef HAVE_SQRTL
-  if (x <= LDBL_MAX && x >= LDBL_MIN)
   {
-    /* Use long double result as starting point.  */
-    y = sqrtl ((long double) x);
-
-    /* One Newton iteration.  */
-    y -= 0.5q * (y - x / y);
-    return y;
+    long double xl = (long double) x;
+    if (xl <= LDBL_MAX && xl >= LDBL_MIN)
+      {
+       /* Use long double result as starting point.  */
+       y = (__float128) sqrtl (xl);
+
+       /* One Newton iteration.  */
+       y -= 0.5q * (y - x / y);
+       return y;
+      }
   }
 #endif
 
index 1555304c7f928355584fd6c09fd1bbb15905c5ef..95487b7d6efe68f7dd4babfc414ea4abe6afe2b7 100644 (file)
@@ -29,7 +29,11 @@ extern "C" {
 
 /* Define the complex type corresponding to __float128
    ("_Complex __float128" is not allowed) */
+#if (!defined(_ARCH_PPC)) || defined(__LONG_DOUBLE_IEEE128__)
 typedef _Complex float __attribute__((mode(TC))) __complex128;
+#else
+typedef _Complex float __attribute__((mode(KC))) __complex128;
+#endif
 
 #ifdef __cplusplus
 # define __quadmath_throw throw ()