From patchwork Mon Dec 2 14:46:17 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Liebler X-Patchwork-Id: 36436 Received: (qmail 61888 invoked by alias); 2 Dec 2019 15:52:06 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 61877 invoked by uid 89); 2 Dec 2019 15:52:06 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-22.1 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_ASCII_DIVIDERS, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.1 spammy=5013 X-HELO: mx0a-001b2d01.pphosted.com From: Stefan Liebler To: libc-alpha@sourceware.org Cc: Stefan Liebler Subject: [PATCH 13/13] Use GCC builtins for copysign functions if desired. Date: Mon, 2 Dec 2019 15:46:17 +0100 In-Reply-To: <1575297977-2589-1-git-send-email-stli@linux.ibm.com> References: <1575297977-2589-1-git-send-email-stli@linux.ibm.com> x-cbid: 19120214-4275-0000-0000-00000389D7C6 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 19120214-4276-0000-0000-0000389D7268 Message-Id: <1575297977-2589-14-git-send-email-stli@linux.ibm.com> This patch is using the corresponding GCC builtin for copysignf, copysign, copysignl and copysignf128 if the USE_FUNCTION_BUILTIN macros are defined to one in math-use-builtins.h. This is the case for s390 if build with at least --march=z196 --mzarch. Otherwise the generic implementation is used. Note: z196 is no typo but a bug in GCC! --- sysdeps/generic/math-use-builtins.h | 5 +++++ sysdeps/ieee754/dbl-64/s_copysign.c | 8 ++++++- sysdeps/ieee754/float128/float128_private.h | 3 +++ sysdeps/ieee754/flt-32/s_copysignf.c | 21 ++++++++++++------- sysdeps/ieee754/ldbl-128/s_copysignl.c | 23 ++++++++++++++------- sysdeps/s390/fpu/math-use-builtins.h | 9 ++++++++ 6 files changed, 53 insertions(+), 16 deletions(-) diff --git a/sysdeps/generic/math-use-builtins.h b/sysdeps/generic/math-use-builtins.h index 34ca438a8c..a22d787791 100644 --- a/sysdeps/generic/math-use-builtins.h +++ b/sysdeps/generic/math-use-builtins.h @@ -51,4 +51,9 @@ #define USE_ROUNDL_BUILTIN 0 #define USE_ROUNDF128_BUILTIN 0 +#define USE_COPYSIGN_BUILTIN 0 +#define USE_COPYSIGNF_BUILTIN 0 +#define USE_COPYSIGNL_BUILTIN 0 +#define USE_COPYSIGNF128_BUILTIN 0 + #endif /* math-use-builtins.h */ diff --git a/sysdeps/ieee754/dbl-64/s_copysign.c b/sysdeps/ieee754/dbl-64/s_copysign.c index 589b088c95..0be1a6420f 100644 --- a/sysdeps/ieee754/dbl-64/s_copysign.c +++ b/sysdeps/ieee754/dbl-64/s_copysign.c @@ -10,7 +10,9 @@ * ==================================================== */ -#if defined(LIBM_SCCS) && !defined(lint) +#include + +#if ! USE_COPYSIGN_BUILTIN && defined (LIBM_SCCS) && ! defined (lint) static char rcsid[] = "$NetBSD: s_copysign.c,v 1.8 1995/05/10 20:46:57 jtc Exp $"; #endif @@ -28,10 +30,14 @@ static char rcsid[] = "$NetBSD: s_copysign.c,v 1.8 1995/05/10 20:46:57 jtc Exp $ double __copysign (double x, double y) { +#if USE_COPYSIGN_BUILTIN + return __builtin_copysign (x, y); +#else uint32_t hx, hy; GET_HIGH_WORD (hx, x); GET_HIGH_WORD (hy, y); SET_HIGH_WORD (x, (hx & 0x7fffffff) | (hy & 0x80000000)); return x; +#endif } libm_alias_double (__copysign, copysign) diff --git a/sysdeps/ieee754/float128/float128_private.h b/sysdeps/ieee754/float128/float128_private.h index a6c76ce364..7f7f904152 100644 --- a/sysdeps/ieee754/float128/float128_private.h +++ b/sysdeps/ieee754/float128/float128_private.h @@ -152,6 +152,8 @@ #define USE_TRUNCL_BUILTIN USE_TRUNCF128_BUILTIN #undef USE_ROUNDL_BUILTIN #define USE_ROUNDL_BUILTIN USE_ROUNDF128_BUILTIN +#undef USE_COPYSIGNL_BUILTIN +#define USE_COPYSIGNL_BUILTIN USE_COPYSIGNF128_BUILTIN /* IEEE function renames. */ #define __ieee754_acoshl __ieee754_acoshf128 @@ -361,6 +363,7 @@ #define __builtin_ceill __builtin_ceilf128 #define __builtin_truncl __builtin_truncf128 #define __builtin_roundl __builtin_roundf128 +#define __builtin_copysignl __builtin_copysignf128 /* Get the constant suffix from bits/floatn-compat.h. */ #define L(x) __f128 (x) diff --git a/sysdeps/ieee754/flt-32/s_copysignf.c b/sysdeps/ieee754/flt-32/s_copysignf.c index 77d1d90e92..9a9e6389cd 100644 --- a/sysdeps/ieee754/flt-32/s_copysignf.c +++ b/sysdeps/ieee754/flt-32/s_copysignf.c @@ -13,7 +13,9 @@ * ==================================================== */ -#if defined(LIBM_SCCS) && !defined(lint) +#include + +#if ! USE_COPYSIGNF_BUILTIN && defined (LIBM_SCCS) && ! defined (lint) static char rcsid[] = "$NetBSD: s_copysignf.c,v 1.4 1995/05/10 20:46:59 jtc Exp $"; #endif @@ -28,12 +30,17 @@ static char rcsid[] = "$NetBSD: s_copysignf.c,v 1.4 1995/05/10 20:46:59 jtc Exp #include #include -float __copysignf(float x, float y) +float +__copysignf (float x, float y) { - uint32_t ix,iy; - GET_FLOAT_WORD(ix,x); - GET_FLOAT_WORD(iy,y); - SET_FLOAT_WORD(x,(ix&0x7fffffff)|(iy&0x80000000)); - return x; +#if USE_COPYSIGNF_BUILTIN + return __builtin_copysignf (x, y); +#else + uint32_t ix, iy; + GET_FLOAT_WORD (ix, x); + GET_FLOAT_WORD (iy, y); + SET_FLOAT_WORD (x, (ix & 0x7fffffff) | (iy & 0x80000000)); + return x; +#endif } libm_alias_float (__copysign, copysign) diff --git a/sysdeps/ieee754/ldbl-128/s_copysignl.c b/sysdeps/ieee754/ldbl-128/s_copysignl.c index a501139f71..6095b7fc73 100644 --- a/sysdeps/ieee754/ldbl-128/s_copysignl.c +++ b/sysdeps/ieee754/ldbl-128/s_copysignl.c @@ -13,7 +13,9 @@ * ==================================================== */ -#if defined(LIBM_SCCS) && !defined(lint) +#include + +#if ! USE_COPYSIGNL_BUILTIN && defined (LIBM_SCCS) && ! defined (lint) static char rcsid[] = "$NetBSD: $"; #endif @@ -28,13 +30,18 @@ static char rcsid[] = "$NetBSD: $"; #include #include -_Float128 __copysignl(_Float128 x, _Float128 y) +_Float128 +__copysignl (_Float128 x, _Float128 y) { - uint64_t hx,hy; - GET_LDOUBLE_MSW64(hx,x); - GET_LDOUBLE_MSW64(hy,y); - SET_LDOUBLE_MSW64(x,(hx&0x7fffffffffffffffULL) - |(hy&0x8000000000000000ULL)); - return x; +#if USE_COPYSIGNL_BUILTIN + return __builtin_copysignl (x, y); +#else + uint64_t hx, hy; + GET_LDOUBLE_MSW64 (hx, x); + GET_LDOUBLE_MSW64 (hy, y); + SET_LDOUBLE_MSW64 (x, (hx & 0x7fffffffffffffffULL) + | (hy & 0x8000000000000000ULL)); + return x; +#endif } libm_alias_ldouble (__copysign, copysign) diff --git a/sysdeps/s390/fpu/math-use-builtins.h b/sysdeps/s390/fpu/math-use-builtins.h index 5838a31c50..ed2a05775f 100644 --- a/sysdeps/s390/fpu/math-use-builtins.h +++ b/sysdeps/s390/fpu/math-use-builtins.h @@ -50,6 +50,13 @@ # define USE_ROUNDF_BUILTIN 1 # define USE_ROUNDL_BUILTIN 1 +/* GCC emits the z9-ec zarch "copy sign" instruction for these + builtins if build with at least --march=z196 -mzarch. + Note: z196 is no typo but a bug in GCC! */ +# define USE_COPYSIGN_BUILTIN 1 +# define USE_COPYSIGNF_BUILTIN 1 +# define USE_COPYSIGNL_BUILTIN 1 + # if __GNUC_PREREQ (8, 1) # define USE_NEARBYINTF128_BUILTIN 1 # define USE_RINTF128_BUILTIN 1 @@ -57,6 +64,7 @@ # define USE_CEILF128_BUILTIN 1 # define USE_TRUNCF128_BUILTIN 1 # define USE_ROUNDF128_BUILTIN 1 +# define USE_COPYSIGNF128_BUILTIN 1 # else # define USE_NEARBYINTF128_BUILTIN 0 # define USE_RINTF128_BUILTIN 0 @@ -64,6 +72,7 @@ # define USE_CEILF128_BUILTIN 0 # define USE_TRUNCF128_BUILTIN 0 # define USE_ROUNDF128_BUILTIN 0 +# define USE_COPYSIGNF128_BUILTIN 0 # endif #else