changeset 15936:be4d9abe9bd0

sqrtl: Simplify for platforms where 'long double' == 'double'. * lib/sqrtl.c (sqrtl) [HAVE_SAME_LONG_DOUBLE_AS_DOUBLE]: New alternative implementation. * m4/sqrtl.m4 (gl_FUNC_SQRTL): Require gl_LONG_DOUBLE_VS_DOUBLE. Determine SQRTL_LIBM according to HAVE_SAME_LONG_DOUBLE_AS_DOUBLE. * modules/sqrtl (Depends-on): Update conditions.
author Bruno Haible <bruno@clisp.org>
date Mon, 10 Oct 2011 23:46:26 +0200
parents f964f4ef47e5
children 16cba28a5e86
files ChangeLog lib/sqrtl.c m4/sqrtl.m4 modules/sqrtl
diffstat 4 files changed, 58 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2011-10-10  Bruno Haible  <bruno@clisp.org>
+
+	sqrtl: Simplify for platforms where 'long double' == 'double'.
+	* lib/sqrtl.c (sqrtl) [HAVE_SAME_LONG_DOUBLE_AS_DOUBLE]: New
+	alternative implementation.
+	* m4/sqrtl.m4 (gl_FUNC_SQRTL): Require gl_LONG_DOUBLE_VS_DOUBLE.
+	Determine SQRTL_LIBM according to HAVE_SAME_LONG_DOUBLE_AS_DOUBLE.
+	* modules/sqrtl (Depends-on): Update conditions.
+
 2011-10-10  Bruno Haible  <bruno@clisp.org>
 
 	ldexpl: Simplify for platforms where 'long double' == 'double'.
--- a/lib/sqrtl.c
+++ b/lib/sqrtl.c
@@ -23,7 +23,17 @@
 /* Specification.  */
 #include <math.h>
 
-#include <float.h>
+#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+
+long double
+sqrtl (long double x)
+{
+  return sqrt (x);
+}
+
+#else
+
+# include <float.h>
 
 /* A simple Newton-Raphson method. */
 long double
@@ -57,3 +67,5 @@
 
   return y;
 }
+
+#endif
--- a/m4/sqrtl.m4
+++ b/m4/sqrtl.m4
@@ -1,4 +1,4 @@
-# sqrtl.m4 serial 5
+# sqrtl.m4 serial 6
 dnl Copyright (C) 2010-2011 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -7,6 +7,8 @@
 AC_DEFUN([gl_FUNC_SQRTL],
 [
   AC_REQUIRE([gl_MATH_H_DEFAULTS])
+  AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
+
   dnl Persuade glibc <math.h> to declare sqrtl().
   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
 
@@ -56,30 +58,35 @@
     HAVE_DECL_SQRTL=0
     HAVE_SQRTL=0
     dnl Find libraries needed to link lib/sqrtl.c.
-    AC_REQUIRE([gl_FUNC_ISNANL])
-    AC_REQUIRE([gl_FUNC_FREXPL])
-    AC_REQUIRE([gl_FUNC_LDEXPL])
-    AC_REQUIRE([gl_FUNC_SQRT])
-    dnl Append $ISNANL_LIBM to SQRTL_LIBM, avoiding gratuitous duplicates.
-    case " $SQRTL_LIBM " in
-      *" $ISNANL_LIBM "*) ;;
-      *) SQRTL_LIBM="$SQRTL_LIBM $ISNANL_LIBM" ;;
-    esac
-    dnl Append $FREXPL_LIBM to SQRTL_LIBM, avoiding gratuitous duplicates.
-    case " $SQRTL_LIBM " in
-      *" $FREXPL_LIBM "*) ;;
-      *) SQRTL_LIBM="$SQRTL_LIBM $FREXPL_LIBM" ;;
-    esac
-    dnl Append $LDEXPL_LIBM to SQRTL_LIBM, avoiding gratuitous duplicates.
-    case " $SQRTL_LIBM " in
-      *" $LDEXPL_LIBM "*) ;;
-      *) SQRTL_LIBM="$SQRTL_LIBM $LDEXPL_LIBM" ;;
-    esac
-    dnl Append $SQRT_LIBM to SQRTL_LIBM, avoiding gratuitous duplicates.
-    case " $SQRTL_LIBM " in
-      *" $SQRT_LIBM "*) ;;
-      *) SQRTL_LIBM="$SQRTL_LIBM $SQRT_LIBM" ;;
-    esac
+    if test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1; then
+      AC_REQUIRE([gl_FUNC_SQRT])
+      SQRTL_LIBM="$SQRT_LIBM"
+    else
+      AC_REQUIRE([gl_FUNC_ISNANL])
+      AC_REQUIRE([gl_FUNC_FREXPL])
+      AC_REQUIRE([gl_FUNC_LDEXPL])
+      AC_REQUIRE([gl_FUNC_SQRT])
+      dnl Append $ISNANL_LIBM to SQRTL_LIBM, avoiding gratuitous duplicates.
+      case " $SQRTL_LIBM " in
+        *" $ISNANL_LIBM "*) ;;
+        *) SQRTL_LIBM="$SQRTL_LIBM $ISNANL_LIBM" ;;
+      esac
+      dnl Append $FREXPL_LIBM to SQRTL_LIBM, avoiding gratuitous duplicates.
+      case " $SQRTL_LIBM " in
+        *" $FREXPL_LIBM "*) ;;
+        *) SQRTL_LIBM="$SQRTL_LIBM $FREXPL_LIBM" ;;
+      esac
+      dnl Append $LDEXPL_LIBM to SQRTL_LIBM, avoiding gratuitous duplicates.
+      case " $SQRTL_LIBM " in
+        *" $LDEXPL_LIBM "*) ;;
+        *) SQRTL_LIBM="$SQRTL_LIBM $LDEXPL_LIBM" ;;
+      esac
+      dnl Append $SQRT_LIBM to SQRTL_LIBM, avoiding gratuitous duplicates.
+      case " $SQRTL_LIBM " in
+        *" $SQRT_LIBM "*) ;;
+        *) SQRTL_LIBM="$SQRTL_LIBM $SQRT_LIBM" ;;
+      esac
+    fi
   fi
   AC_SUBST([SQRTL_LIBM])
 ])
--- a/modules/sqrtl
+++ b/modules/sqrtl
@@ -8,11 +8,11 @@
 Depends-on:
 math
 extensions
-float           [test $HAVE_SQRTL = 0]
-isnanl          [test $HAVE_SQRTL = 0]
-frexpl          [test $HAVE_SQRTL = 0]
-ldexpl          [test $HAVE_SQRTL = 0]
 sqrt            [test $HAVE_SQRTL = 0]
+float           [test $HAVE_SQRTL = 0 && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 0]
+isnanl          [test $HAVE_SQRTL = 0 && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 0]
+frexpl          [test $HAVE_SQRTL = 0 && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 0]
+ldexpl          [test $HAVE_SQRTL = 0 && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 0]
 
 configure.ac:
 gl_FUNC_SQRTL