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