1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00

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.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
This commit is contained in:
Stefan Liebler
2019-12-11 15:09:24 +01:00
parent f82996f815
commit f818afdd3b
6 changed files with 31 additions and 15 deletions

View File

@ -19,6 +19,8 @@
#ifndef MATH_USE_BUILTINS_H #ifndef MATH_USE_BUILTINS_H
#define MATH_USE_BUILTINS_H 1 #define MATH_USE_BUILTINS_H 1
#include <features.h> /* For __GNUC_PREREQ. */
/* Define these macros to 1 to use __builtin_xyz instead of the /* Define these macros to 1 to use __builtin_xyz instead of the
generic implementation. */ generic implementation. */
#define USE_NEARBYINT_BUILTIN 0 #define USE_NEARBYINT_BUILTIN 0
@ -51,4 +53,11 @@
#define USE_ROUNDL_BUILTIN 0 #define USE_ROUNDL_BUILTIN 0
#define USE_ROUNDF128_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 */ #endif /* math-use-builtins.h */

View File

@ -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 $"; static char rcsid[] = "$NetBSD: s_copysign.c,v 1.8 1995/05/10 20:46:57 jtc Exp $";
#endif #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 #define NO_MATH_REDIRECT
#include <math.h> #include <math.h>
#include <math_private.h>
#include <libm-alias-double.h> #include <libm-alias-double.h>
double double
__copysign (double x, double y) __copysign (double x, double y)
{ {
uint32_t hx, hy; return __builtin_copysign (x, y);
GET_HIGH_WORD (hx, x);
GET_HIGH_WORD (hy, y);
SET_HIGH_WORD (x, (hx & 0x7fffffff) | (hy & 0x80000000));
return x;
} }
libm_alias_double (__copysign, copysign) libm_alias_double (__copysign, copysign)

View File

@ -152,6 +152,8 @@
#define USE_TRUNCL_BUILTIN USE_TRUNCF128_BUILTIN #define USE_TRUNCL_BUILTIN USE_TRUNCF128_BUILTIN
#undef USE_ROUNDL_BUILTIN #undef USE_ROUNDL_BUILTIN
#define USE_ROUNDL_BUILTIN USE_ROUNDF128_BUILTIN #define USE_ROUNDL_BUILTIN USE_ROUNDF128_BUILTIN
#undef USE_COPYSIGNL_BUILTIN
#define USE_COPYSIGNL_BUILTIN USE_COPYSIGNF128_BUILTIN
/* IEEE function renames. */ /* IEEE function renames. */
#define __ieee754_acoshl __ieee754_acoshf128 #define __ieee754_acoshl __ieee754_acoshf128
@ -361,6 +363,7 @@
#define __builtin_ceill __builtin_ceilf128 #define __builtin_ceill __builtin_ceilf128
#define __builtin_truncl __builtin_truncf128 #define __builtin_truncl __builtin_truncf128
#define __builtin_roundl __builtin_roundf128 #define __builtin_roundl __builtin_roundf128
#define __builtin_copysignl __builtin_copysignf128
/* Get the constant suffix from bits/floatn-compat.h. */ /* Get the constant suffix from bits/floatn-compat.h. */
#define L(x) __f128 (x) #define L(x) __f128 (x)

View File

@ -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 $"; static char rcsid[] = "$NetBSD: s_copysignf.c,v 1.4 1995/05/10 20:46:59 jtc Exp $";
#endif #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 #define NO_MATH_REDIRECT
#include <math.h> #include <math.h>
#include <math_private.h>
#include <libm-alias-float.h> #include <libm-alias-float.h>
float __copysignf(float x, float y) float
__copysignf (float x, float y)
{ {
uint32_t ix,iy; return __builtin_copysignf (x, y);
GET_FLOAT_WORD(ix,x);
GET_FLOAT_WORD(iy,y);
SET_FLOAT_WORD(x,(ix&0x7fffffff)|(iy&0x80000000));
return x;
} }
libm_alias_float (__copysign, copysign) libm_alias_float (__copysign, copysign)

View File

@ -27,14 +27,20 @@ static char rcsid[] = "$NetBSD: $";
#include <math.h> #include <math.h>
#include <math_private.h> #include <math_private.h>
#include <libm-alias-ldouble.h> #include <libm-alias-ldouble.h>
#include <math-use-builtins.h>
_Float128 __copysignl(_Float128 x, _Float128 y) _Float128 __copysignl(_Float128 x, _Float128 y)
{ {
#if USE_COPYSIGNL_BUILTIN
return __builtin_copysignl (x, y);
#else
/* Use generic implementation. */
uint64_t hx,hy; uint64_t hx,hy;
GET_LDOUBLE_MSW64(hx,x); GET_LDOUBLE_MSW64(hx,x);
GET_LDOUBLE_MSW64(hy,y); GET_LDOUBLE_MSW64(hy,y);
SET_LDOUBLE_MSW64(x,(hx&0x7fffffffffffffffULL) SET_LDOUBLE_MSW64(x,(hx&0x7fffffffffffffffULL)
|(hy&0x8000000000000000ULL)); |(hy&0x8000000000000000ULL));
return x; return x;
#endif /* ! USE_COPYSIGNL_BUILTIN */
} }
libm_alias_ldouble (__copysign, copysign) libm_alias_ldouble (__copysign, copysign)

View File

@ -101,4 +101,11 @@
#endif /* ! HAVE_S390_MIN_Z196_ZARCH_ASM_SUPPORT */ #endif /* ! HAVE_S390_MIN_Z196_ZARCH_ASM_SUPPORT */
#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 */ #endif /* math-use-builtins.h */