about summary refs log tree commit diff
path: root/sysdeps/ieee754
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2022-04-01 10:19:57 -0300
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2022-05-23 17:49:18 -0300
commitefeb2bd1ab49215325040aa53396a2c19dfd1402 (patch)
tree0dda3bc772c3ac1c2e2b2a8a55a6f75c28e1efe8 /sysdeps/ieee754
parent04b30fe4f85d6e4c0390581a5e90db066a0b2f1f (diff)
downloadglibc-efeb2bd1ab49215325040aa53396a2c19dfd1402.tar.gz
glibc-efeb2bd1ab49215325040aa53396a2c19dfd1402.tar.xz
glibc-efeb2bd1ab49215325040aa53396a2c19dfd1402.zip
math: Add math-use-builtins-fabs (BZ#29027)
Both float, double, and _Float128 are assumed to be supported
(float and double already only uses builtins).  Only long double
is parametrized due GCC bug 29253 which prevents its usage on
powerpc.

It allows to remove i686, ia64, x86_64, powerpc, and sparc arch
specific implementation.

On ia64 it also fixes the sNAN handling:

  math/test-float64x-fabs
  math/test-ldouble-fabs

Checked on x86_64-linux-gnu, i686-linux-gnu, powerpc-linux-gnu,
powerpc64-linux-gnu, sparc64-linux-gnu, and ia64-linux-gnu.
Diffstat (limited to 'sysdeps/ieee754')
-rw-r--r--sysdeps/ieee754/ldbl-128/s_fabsl.c8
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_fabsl.c5
-rw-r--r--sysdeps/ieee754/ldbl-96/s_fabsl.c28
3 files changed, 36 insertions, 5 deletions
diff --git a/sysdeps/ieee754/ldbl-128/s_fabsl.c b/sysdeps/ieee754/ldbl-128/s_fabsl.c
index 7e08980252..f22515fec6 100644
--- a/sysdeps/ieee754/ldbl-128/s_fabsl.c
+++ b/sysdeps/ieee754/ldbl-128/s_fabsl.c
@@ -24,11 +24,9 @@ static char rcsid[] = "$NetBSD: $";
 #include <math_private.h>
 #include <libm-alias-ldouble.h>
 
-_Float128 __fabsl(_Float128 x)
+_Float128
+__fabsl (_Float128 x)
 {
-	uint64_t hx;
-	GET_LDOUBLE_MSW64(hx,x);
-	SET_LDOUBLE_MSW64(x,hx&0x7fffffffffffffffLL);
-        return x;
+  return __builtin_fabsf128 (x);
 }
 libm_alias_ldouble (__fabs, fabs)
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_fabsl.c b/sysdeps/ieee754/ldbl-128ibm/s_fabsl.c
index cba7de6660..7f26315e84 100644
--- a/sysdeps/ieee754/ldbl-128ibm/s_fabsl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/s_fabsl.c
@@ -24,9 +24,13 @@ static char rcsid[] = "$NetBSD: $";
 #include <math.h>
 #include <math_private.h>
 #include <math_ldbl_opt.h>
+#include <math-use-builtins.h>
 
 long double __fabsl(long double x)
 {
+#if USE_FABSL_BUILTIN
+	return __builtin_fabsl (x);
+#else
 	uint64_t hx, lx;
 	double xhi, xlo;
 
@@ -39,5 +43,6 @@ long double __fabsl(long double x)
 	INSERT_WORDS64 (xlo, lx);
 	x = ldbl_pack (xhi, xlo);
 	return x;
+#endif
 }
 long_double_symbol (libm, __fabsl, fabsl);
diff --git a/sysdeps/ieee754/ldbl-96/s_fabsl.c b/sysdeps/ieee754/ldbl-96/s_fabsl.c
new file mode 100644
index 0000000000..0eceb0c997
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-96/s_fabsl.c
@@ -0,0 +1,28 @@
+/* Absolute value of floating-point number.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <math.h>
+#include <libm-alias-ldouble.h>
+#include <math-use-builtins.h>
+
+long double
+__fabsl (long double x)
+{
+  return __builtin_fabsl (x);
+}
+libm_alias_ldouble (__fabs, fabs)