a2cf7d
From e93b17fad37a61f7ae9a663c617926b0f510921a Mon Sep 17 00:00:00 2001
a2cf7d
From: Stefan Liebler <stli@linux.ibm.com>
a2cf7d
Date: Wed, 11 Dec 2019 15:09:24 +0100
a2cf7d
Subject: [PATCH 13/28] Use GCC builtins for copysign functions if desired.
a2cf7d
a2cf7d
This patch is always using the corresponding GCC builtin for copysignf, copysign,
a2cf7d
and is using the builtin for copysignl, copysignf128 if the USE_FUNCTION_BUILTIN
a2cf7d
macros are defined to one in math-use-builtins.h.
a2cf7d
a2cf7d
Altough the long double version is enabled by default we still need
a2cf7d
the macro and the alternative implementation as the _Float128 version
a2cf7d
of the builtin is not available with all supported GCC versions.
a2cf7d
a2cf7d
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
a2cf7d
(cherry picked from commit f818afdd3b29d7eef2010448457c9f5c16e684cd)
a2cf7d
---
a2cf7d
 sysdeps/generic/math-use-builtins.h         |  9 +++++++++
a2cf7d
 sysdeps/ieee754/dbl-64/s_copysign.c         |  9 ++-------
a2cf7d
 sysdeps/ieee754/float128/float128_private.h |  3 +++
a2cf7d
 sysdeps/ieee754/flt-32/s_copysignf.c        | 12 ++++--------
a2cf7d
 sysdeps/ieee754/ldbl-128/s_copysignl.c      |  6 ++++++
a2cf7d
 sysdeps/s390/fpu/math-use-builtins.h        |  7 +++++++
a2cf7d
 6 files changed, 31 insertions(+), 15 deletions(-)
a2cf7d
a2cf7d
diff --git a/sysdeps/generic/math-use-builtins.h b/sysdeps/generic/math-use-builtins.h
a2cf7d
index 34ca438a8c..770b54ce61 100644
a2cf7d
--- a/sysdeps/generic/math-use-builtins.h
a2cf7d
+++ b/sysdeps/generic/math-use-builtins.h
a2cf7d
@@ -19,6 +19,8 @@
a2cf7d
 #ifndef MATH_USE_BUILTINS_H
a2cf7d
 #define MATH_USE_BUILTINS_H	1
a2cf7d
 
a2cf7d
+#include <features.h> /* For __GNUC_PREREQ.  */
a2cf7d
+
a2cf7d
 /* Define these macros to 1 to use __builtin_xyz instead of the
a2cf7d
    generic implementation.  */
a2cf7d
 #define USE_NEARBYINT_BUILTIN 0
a2cf7d
@@ -51,4 +53,11 @@
a2cf7d
 #define USE_ROUNDL_BUILTIN 0
a2cf7d
 #define USE_ROUNDF128_BUILTIN 0
a2cf7d
 
a2cf7d
+#define USE_COPYSIGNL_BUILTIN 1
a2cf7d
+#if __GNUC_PREREQ (7, 0)
a2cf7d
+# define USE_COPYSIGNF128_BUILTIN 1
a2cf7d
+#else
a2cf7d
+# define USE_COPYSIGNF128_BUILTIN 0
a2cf7d
+#endif
a2cf7d
+
a2cf7d
 #endif /* math-use-builtins.h */
a2cf7d
diff --git a/sysdeps/ieee754/dbl-64/s_copysign.c b/sysdeps/ieee754/dbl-64/s_copysign.c
a2cf7d
index ab81d732ab..b95f1575d9 100644
a2cf7d
--- a/sysdeps/ieee754/dbl-64/s_copysign.c
a2cf7d
+++ b/sysdeps/ieee754/dbl-64/s_copysign.c
a2cf7d
@@ -10,7 +10,7 @@
a2cf7d
  * ====================================================
a2cf7d
  */
a2cf7d
 
a2cf7d
-#if defined(LIBM_SCCS) && !defined(lint)
a2cf7d
+#if defined (LIBM_SCCS) && ! defined (lint)
a2cf7d
 static char rcsid[] = "$NetBSD: s_copysign.c,v 1.8 1995/05/10 20:46:57 jtc Exp $";
a2cf7d
 #endif
a2cf7d
 
a2cf7d
@@ -21,16 +21,11 @@ static char rcsid[] = "$NetBSD: s_copysign.c,v 1.8 1995/05/10 20:46:57 jtc Exp $
a2cf7d
  */
a2cf7d
 
a2cf7d
 #include <math.h>
a2cf7d
-#include <math_private.h>
a2cf7d
 #include <libm-alias-double.h>
a2cf7d
 
a2cf7d
 double
a2cf7d
 __copysign (double x, double y)
a2cf7d
 {
a2cf7d
-  uint32_t hx, hy;
a2cf7d
-  GET_HIGH_WORD (hx, x);
a2cf7d
-  GET_HIGH_WORD (hy, y);
a2cf7d
-  SET_HIGH_WORD (x, (hx & 0x7fffffff) | (hy & 0x80000000));
a2cf7d
-  return x;
a2cf7d
+  return __builtin_copysign (x, y);
a2cf7d
 }
a2cf7d
 libm_alias_double (__copysign, copysign)
a2cf7d
diff --git a/sysdeps/ieee754/float128/float128_private.h b/sysdeps/ieee754/float128/float128_private.h
a2cf7d
index 3297a71e44..077df0e09f 100644
a2cf7d
--- a/sysdeps/ieee754/float128/float128_private.h
a2cf7d
+++ b/sysdeps/ieee754/float128/float128_private.h
a2cf7d
@@ -151,6 +151,8 @@
a2cf7d
 #define USE_TRUNCL_BUILTIN USE_TRUNCF128_BUILTIN
a2cf7d
 #undef USE_ROUNDL_BUILTIN
a2cf7d
 #define USE_ROUNDL_BUILTIN USE_ROUNDF128_BUILTIN
a2cf7d
+#undef USE_COPYSIGNL_BUILTIN
a2cf7d
+#define USE_COPYSIGNL_BUILTIN USE_COPYSIGNF128_BUILTIN
a2cf7d
 
a2cf7d
 /* IEEE function renames.  */
a2cf7d
 #define __ieee754_acoshl __ieee754_acoshf128
a2cf7d
@@ -358,6 +360,7 @@
a2cf7d
 #define __builtin_ceill __builtin_ceilf128
a2cf7d
 #define __builtin_truncl __builtin_truncf128
a2cf7d
 #define __builtin_roundl __builtin_roundf128
a2cf7d
+#define __builtin_copysignl __builtin_copysignf128
a2cf7d
 
a2cf7d
 /* Get the constant suffix from bits/floatn-compat.h.  */
a2cf7d
 #define L(x) __f128 (x)
a2cf7d
diff --git a/sysdeps/ieee754/flt-32/s_copysignf.c b/sysdeps/ieee754/flt-32/s_copysignf.c
a2cf7d
index 3c4ac7ce68..0247abd152 100644
a2cf7d
--- a/sysdeps/ieee754/flt-32/s_copysignf.c
a2cf7d
+++ b/sysdeps/ieee754/flt-32/s_copysignf.c
a2cf7d
@@ -13,7 +13,7 @@
a2cf7d
  * ====================================================
a2cf7d
  */
a2cf7d
 
a2cf7d
-#if defined(LIBM_SCCS) && !defined(lint)
a2cf7d
+#if defined (LIBM_SCCS) && ! defined (lint)
a2cf7d
 static char rcsid[] = "$NetBSD: s_copysignf.c,v 1.4 1995/05/10 20:46:59 jtc Exp $";
a2cf7d
 #endif
a2cf7d
 
a2cf7d
@@ -24,15 +24,11 @@ static char rcsid[] = "$NetBSD: s_copysignf.c,v 1.4 1995/05/10 20:46:59 jtc Exp
a2cf7d
  */
a2cf7d
 
a2cf7d
 #include <math.h>
a2cf7d
-#include <math_private.h>
a2cf7d
 #include <libm-alias-float.h>
a2cf7d
 
a2cf7d
-float __copysignf(float x, float y)
a2cf7d
+float
a2cf7d
+__copysignf (float x, float y)
a2cf7d
 {
a2cf7d
-	uint32_t ix,iy;
a2cf7d
-	GET_FLOAT_WORD(ix,x);
a2cf7d
-	GET_FLOAT_WORD(iy,y);
a2cf7d
-	SET_FLOAT_WORD(x,(ix&0x7fffffff)|(iy&0x80000000));
a2cf7d
-        return x;
a2cf7d
+  return __builtin_copysignf (x, y);
a2cf7d
 }
a2cf7d
 libm_alias_float (__copysign, copysign)
a2cf7d
diff --git a/sysdeps/ieee754/ldbl-128/s_copysignl.c b/sysdeps/ieee754/ldbl-128/s_copysignl.c
a2cf7d
index d23e0f72ea..4cae8612dc 100644
a2cf7d
--- a/sysdeps/ieee754/ldbl-128/s_copysignl.c
a2cf7d
+++ b/sysdeps/ieee754/ldbl-128/s_copysignl.c
a2cf7d
@@ -26,14 +26,20 @@ static char rcsid[] = "$NetBSD: $";
a2cf7d
 #include <math.h>
a2cf7d
 #include <math_private.h>
a2cf7d
 #include <libm-alias-ldouble.h>
a2cf7d
+#include <math-use-builtins.h>
a2cf7d
 
a2cf7d
 _Float128 __copysignl(_Float128 x, _Float128 y)
a2cf7d
 {
a2cf7d
+#if USE_COPYSIGNL_BUILTIN
a2cf7d
+  return __builtin_copysignl (x, y);
a2cf7d
+#else
a2cf7d
+  /* Use generic implementation.  */
a2cf7d
 	uint64_t hx,hy;
a2cf7d
 	GET_LDOUBLE_MSW64(hx,x);
a2cf7d
 	GET_LDOUBLE_MSW64(hy,y);
a2cf7d
 	SET_LDOUBLE_MSW64(x,(hx&0x7fffffffffffffffULL)
a2cf7d
 			    |(hy&0x8000000000000000ULL));
a2cf7d
         return x;
a2cf7d
+#endif /* ! USE_COPYSIGNL_BUILTIN  */
a2cf7d
 }
a2cf7d
 libm_alias_ldouble (__copysign, copysign)
a2cf7d
diff --git a/sysdeps/s390/fpu/math-use-builtins.h b/sysdeps/s390/fpu/math-use-builtins.h
a2cf7d
index 51cb9f91ab..4c4aad2ab5 100644
a2cf7d
--- a/sysdeps/s390/fpu/math-use-builtins.h
a2cf7d
+++ b/sysdeps/s390/fpu/math-use-builtins.h
a2cf7d
@@ -101,4 +101,11 @@
a2cf7d
 
a2cf7d
 #endif /* ! HAVE_S390_MIN_Z196_ZARCH_ASM_SUPPORT  */
a2cf7d
 
a2cf7d
+#define USE_COPYSIGNL_BUILTIN 1
a2cf7d
+#if __GNUC_PREREQ (7, 0)
a2cf7d
+# define USE_COPYSIGNF128_BUILTIN 1
a2cf7d
+#else
a2cf7d
+# define USE_COPYSIGNF128_BUILTIN 0
a2cf7d
+#endif
a2cf7d
+
a2cf7d
 #endif /* math-use-builtins.h */
a2cf7d
-- 
a2cf7d
2.18.2
a2cf7d