From patchwork Thu Dec 5 15:40:18 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Liebler X-Patchwork-Id: 36533 Received: (qmail 17801 invoked by alias); 5 Dec 2019 15:40:29 -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 17786 invoked by uid 89); 5 Dec 2019 15:40:29 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-22.2 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= X-HELO: mx0a-001b2d01.pphosted.com Subject: Re: [PATCH 13/13] Use GCC builtins for copysign functions if desired. To: Joseph Myers Cc: libc-alpha@sourceware.org References: <1575297977-2589-1-git-send-email-stli@linux.ibm.com> <1575297977-2589-14-git-send-email-stli@linux.ibm.com> From: Stefan Liebler Date: Thu, 5 Dec 2019 16:40:18 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.2.0 MIME-Version: 1.0 In-Reply-To: x-cbid: 19120515-0028-0000-0000-000003C569CD X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 19120515-0029-0000-0000-000024888C67 Message-Id: <2a2fb103-51f1-a1bd-badc-17706e1c5156@linux.ibm.com> On 12/4/19 9:43 PM, Joseph Myers wrote: > On Wed, 4 Dec 2019, Stefan Liebler wrote: > >> Okay. Then I've removed the macros for float and double and call the builtins >> unconditionally. >> But I still need the long double version as the f128 builtin is not available >> with every GCC version. > > I think the _Float128 version could be defined to 1 for GCC 7 and later > (so both long double and _Float128 versions could be removed once we > require GCC 7 or later to build glibc). > Okay. I've defined it to 1 for GCC 7 and later. Bye Stefan commit 8eae596471235a9baf3e6cf4e4d6bdeb121855cb Author: Stefan Liebler Date: Mon Dec 2 15:32:44 2019 +0100 Use GCC builtins for copysign functions if desired. This patch is always using the corresponding GCC builtin for copysignf, copysign, and is using the builtin for copysignl, copysignf128 if the USE_FUNCTION_BUILTIN macros are defined to one in math-use-builtins.h. Altough the long double version is enabled by default we still need the macro and the alternative implementation as the _Float128 version of the builtin is not available with all supported GCC versions. diff --git a/sysdeps/generic/math-use-builtins.h b/sysdeps/generic/math-use-builtins.h index 34ca438a8c..770b54ce61 100644 --- a/sysdeps/generic/math-use-builtins.h +++ b/sysdeps/generic/math-use-builtins.h @@ -19,6 +19,8 @@ #ifndef MATH_USE_BUILTINS_H #define MATH_USE_BUILTINS_H 1 +#include /* For __GNUC_PREREQ. */ + /* Define these macros to 1 to use __builtin_xyz instead of the generic implementation. */ #define USE_NEARBYINT_BUILTIN 0 @@ -51,4 +53,11 @@ #define USE_ROUNDL_BUILTIN 0 #define USE_ROUNDF128_BUILTIN 0 +#define USE_COPYSIGNL_BUILTIN 1 +#if __GNUC_PREREQ (7, 0) +# define USE_COPYSIGNF128_BUILTIN 1 +#else +# define USE_COPYSIGNF128_BUILTIN 0 +#endif + #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..94025b7854 100644 --- a/sysdeps/ieee754/dbl-64/s_copysign.c +++ b/sysdeps/ieee754/dbl-64/s_copysign.c @@ -10,7 +10,7 @@ * ==================================================== */ -#if defined(LIBM_SCCS) && !defined(lint) +#if defined (LIBM_SCCS) && ! defined (lint) static char rcsid[] = "$NetBSD: s_copysign.c,v 1.8 1995/05/10 20:46:57 jtc Exp $"; #endif @@ -22,16 +22,11 @@ static char rcsid[] = "$NetBSD: s_copysign.c,v 1.8 1995/05/10 20:46:57 jtc Exp $ #define NO_MATH_REDIRECT #include -#include #include double __copysign (double x, double y) { - uint32_t hx, hy; - GET_HIGH_WORD (hx, x); - GET_HIGH_WORD (hy, y); - SET_HIGH_WORD (x, (hx & 0x7fffffff) | (hy & 0x80000000)); - return x; + return __builtin_copysign (x, y); } 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..1c097d313f 100644 --- a/sysdeps/ieee754/flt-32/s_copysignf.c +++ b/sysdeps/ieee754/flt-32/s_copysignf.c @@ -13,7 +13,7 @@ * ==================================================== */ -#if defined(LIBM_SCCS) && !defined(lint) +#if defined (LIBM_SCCS) && ! defined (lint) static char rcsid[] = "$NetBSD: s_copysignf.c,v 1.4 1995/05/10 20:46:59 jtc Exp $"; #endif @@ -25,15 +25,11 @@ static char rcsid[] = "$NetBSD: s_copysignf.c,v 1.4 1995/05/10 20:46:59 jtc Exp #define NO_MATH_REDIRECT #include -#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; + return __builtin_copysignf (x, y); } 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..cd722ad884 100644 --- a/sysdeps/s390/fpu/math-use-builtins.h +++ b/sysdeps/s390/fpu/math-use-builtins.h @@ -50,6 +50,11 @@ # 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_COPYSIGNL_BUILTIN 1 + # if __GNUC_PREREQ (8, 1) # define USE_NEARBYINTF128_BUILTIN 1 # define USE_RINTF128_BUILTIN 1 @@ -57,6 +62,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 +70,7 @@ # define USE_CEILF128_BUILTIN 0 # define USE_TRUNCF128_BUILTIN 0 # define USE_ROUNDF128_BUILTIN 0 +# define USE_COPYSIGNF128_BUILTIN 0 # endif #else