Message ID | 20210522002227.2234377-3-ibmibmibm.tw@gmail.com |
---|---|
State | New |
Headers | show |
Series | [v6,1/3] math: redirect roundeven function | expand |
On Fri, May 21, 2021 at 5:23 PM Shen-Ta Hsieh <ibmibmibm.tw@gmail.com> wrote: > > This patch is using the corresponding GCC builtin for roundevenf, > roundeven and roundevenl if the USE_FUNCTION_BUILTIN macros are defined > to one in math-use-builtins.h. > > These builtin functions is supported since GCC 10. > > The code of the generic implementation is not changed. > > Signed-off-by: Shen-Ta Hsieh <ibmibmibm.tw@gmail.com> > --- > sysdeps/generic/math-use-builtins-roundeven.h | 4 ++++ > sysdeps/generic/math-use-builtins.h | 1 + > sysdeps/ieee754/dbl-64/s_roundeven.c | 5 +++++ > sysdeps/ieee754/flt-32/s_roundevenf.c | 5 +++++ > sysdeps/ieee754/ldbl-128/s_roundevenl.c | 5 +++++ > 5 files changed, 20 insertions(+) > create mode 100644 sysdeps/generic/math-use-builtins-roundeven.h > > diff --git a/sysdeps/generic/math-use-builtins-roundeven.h b/sysdeps/generic/math-use-builtins-roundeven.h > new file mode 100644 > index 0000000000..bd2e84c93f > --- /dev/null > +++ b/sysdeps/generic/math-use-builtins-roundeven.h > @@ -0,0 +1,4 @@ > +#define USE_ROUNDEVEN_BUILTIN 0 > +#define USE_ROUNDEVENF_BUILTIN 0 > +#define USE_ROUNDEVENL_BUILTIN 0 > +#define USE_ROUNDEVENF128_BUILTIN 0 > diff --git a/sysdeps/generic/math-use-builtins.h b/sysdeps/generic/math-use-builtins.h > index cc3e9f2201..19d2d1cf3c 100644 > --- a/sysdeps/generic/math-use-builtins.h > +++ b/sysdeps/generic/math-use-builtins.h > @@ -30,6 +30,7 @@ > #include <math-use-builtins-ceil.h> > #include <math-use-builtins-trunc.h> > #include <math-use-builtins-round.h> > +#include <math-use-builtins-roundeven.h> > #include <math-use-builtins-copysign.h> > #include <math-use-builtins-sqrt.h> > #include <math-use-builtins-fma.h> > diff --git a/sysdeps/ieee754/dbl-64/s_roundeven.c b/sysdeps/ieee754/dbl-64/s_roundeven.c > index 5deff3bb8a..88c051e9fe 100644 > --- a/sysdeps/ieee754/dbl-64/s_roundeven.c > +++ b/sysdeps/ieee754/dbl-64/s_roundeven.c > @@ -21,6 +21,7 @@ > #include <math_private.h> > #include <libm-alias-double.h> > #include <stdint.h> > +#include <math-use-builtins.h> > > #define BIAS 0x3ff > #define MANT_DIG 53 > @@ -29,6 +30,9 @@ > double > __roundeven (double x) > { > +#if USE_ROUNDEVEN_BUILTIN > + return __builtin_roundeven (x); > +#else > uint64_t ix, ux; > EXTRACT_WORDS64 (ix, x); > ux = ix & 0x7fffffffffffffffULL; > @@ -66,6 +70,7 @@ __roundeven (double x) > ix &= 0x8000000000000000ULL; > INSERT_WORDS64 (x, ix); > return x; > +#endif /* ! USE_ROUNDEVEN_BUILTIN */ > } > #ifndef __roundeven > libm_alias_double (__roundeven, roundeven) > diff --git a/sysdeps/ieee754/flt-32/s_roundevenf.c b/sysdeps/ieee754/flt-32/s_roundevenf.c > index 2cc0d7b001..4f568579d8 100644 > --- a/sysdeps/ieee754/flt-32/s_roundevenf.c > +++ b/sysdeps/ieee754/flt-32/s_roundevenf.c > @@ -21,6 +21,7 @@ > #include <math.h> > #include <math_private.h> > #include <libm-alias-float.h> > +#include <math-use-builtins.h> > #include <stdint.h> > > #define BIAS 0x7f > @@ -30,6 +31,9 @@ > float > __roundevenf (float x) > { > +#if USE_ROUNDEVENF_BUILTIN > + return __builtin_roundevenf (x); > +#else > uint32_t ix, ux; > GET_FLOAT_WORD (ix, x); > ux = ix & 0x7fffffff; > @@ -67,6 +71,7 @@ __roundevenf (float x) > ix &= 0x80000000; > SET_FLOAT_WORD (x, ix); > return x; > +#endif /* ! USE_ROUNDEVENF_BUILTIN */ > } > #ifndef __roundevenf > libm_alias_float (__roundeven, roundeven) > diff --git a/sysdeps/ieee754/ldbl-128/s_roundevenl.c b/sysdeps/ieee754/ldbl-128/s_roundevenl.c > index 7c9c11fad2..afbf13d4f2 100644 > --- a/sysdeps/ieee754/ldbl-128/s_roundevenl.c > +++ b/sysdeps/ieee754/ldbl-128/s_roundevenl.c > @@ -21,6 +21,7 @@ > #include <math.h> > #include <math_private.h> > #include <libm-alias-ldouble.h> > +#include <math-use-builtins.h> > #include <stdint.h> > > #define BIAS 0x3fff > @@ -30,6 +31,9 @@ > _Float128 > __roundevenl (_Float128 x) > { > +#if USE_ROUNDEVENL_BUILTIN > + return __builtin_roundevenl (x); > +#else > uint64_t hx, lx, uhx; > GET_LDOUBLE_WORDS64 (hx, lx, x); > uhx = hx & 0x7fffffffffffffffULL; > @@ -101,5 +105,6 @@ __roundevenl (_Float128 x) > } > SET_LDOUBLE_WORDS64 (x, hx, lx); > return x; > +#endif /* ! USE_ROUNDEVENL_BUILTIN */ > } > libm_alias_ldouble (__roundeven, roundeven) > -- > 2.31.1 > Do you need to map USE_ROUNDEVENL_BUILTIN to USE_ROUNDEVENF128_BUILTIN in float128_private.h?
Oops, I missed that. I'll add this in this patch, thanks! H.J. Lu <hjl.tools@gmail.com> 於 2021年5月24日 週一 上午3:04寫道: > > On Fri, May 21, 2021 at 5:23 PM Shen-Ta Hsieh <ibmibmibm.tw@gmail.com> wrote: > > > > This patch is using the corresponding GCC builtin for roundevenf, > > roundeven and roundevenl if the USE_FUNCTION_BUILTIN macros are defined > > to one in math-use-builtins.h. > > > > These builtin functions is supported since GCC 10. > > > > The code of the generic implementation is not changed. > > > > Signed-off-by: Shen-Ta Hsieh <ibmibmibm.tw@gmail.com> > > --- > > sysdeps/generic/math-use-builtins-roundeven.h | 4 ++++ > > sysdeps/generic/math-use-builtins.h | 1 + > > sysdeps/ieee754/dbl-64/s_roundeven.c | 5 +++++ > > sysdeps/ieee754/flt-32/s_roundevenf.c | 5 +++++ > > sysdeps/ieee754/ldbl-128/s_roundevenl.c | 5 +++++ > > 5 files changed, 20 insertions(+) > > create mode 100644 sysdeps/generic/math-use-builtins-roundeven.h > > > > diff --git a/sysdeps/generic/math-use-builtins-roundeven.h b/sysdeps/generic/math-use-builtins-roundeven.h > > new file mode 100644 > > index 0000000000..bd2e84c93f > > --- /dev/null > > +++ b/sysdeps/generic/math-use-builtins-roundeven.h > > @@ -0,0 +1,4 @@ > > +#define USE_ROUNDEVEN_BUILTIN 0 > > +#define USE_ROUNDEVENF_BUILTIN 0 > > +#define USE_ROUNDEVENL_BUILTIN 0 > > +#define USE_ROUNDEVENF128_BUILTIN 0 > > diff --git a/sysdeps/generic/math-use-builtins.h b/sysdeps/generic/math-use-builtins.h > > index cc3e9f2201..19d2d1cf3c 100644 > > --- a/sysdeps/generic/math-use-builtins.h > > +++ b/sysdeps/generic/math-use-builtins.h > > @@ -30,6 +30,7 @@ > > #include <math-use-builtins-ceil.h> > > #include <math-use-builtins-trunc.h> > > #include <math-use-builtins-round.h> > > +#include <math-use-builtins-roundeven.h> > > #include <math-use-builtins-copysign.h> > > #include <math-use-builtins-sqrt.h> > > #include <math-use-builtins-fma.h> > > diff --git a/sysdeps/ieee754/dbl-64/s_roundeven.c b/sysdeps/ieee754/dbl-64/s_roundeven.c > > index 5deff3bb8a..88c051e9fe 100644 > > --- a/sysdeps/ieee754/dbl-64/s_roundeven.c > > +++ b/sysdeps/ieee754/dbl-64/s_roundeven.c > > @@ -21,6 +21,7 @@ > > #include <math_private.h> > > #include <libm-alias-double.h> > > #include <stdint.h> > > +#include <math-use-builtins.h> > > > > #define BIAS 0x3ff > > #define MANT_DIG 53 > > @@ -29,6 +30,9 @@ > > double > > __roundeven (double x) > > { > > +#if USE_ROUNDEVEN_BUILTIN > > + return __builtin_roundeven (x); > > +#else > > uint64_t ix, ux; > > EXTRACT_WORDS64 (ix, x); > > ux = ix & 0x7fffffffffffffffULL; > > @@ -66,6 +70,7 @@ __roundeven (double x) > > ix &= 0x8000000000000000ULL; > > INSERT_WORDS64 (x, ix); > > return x; > > +#endif /* ! USE_ROUNDEVEN_BUILTIN */ > > } > > #ifndef __roundeven > > libm_alias_double (__roundeven, roundeven) > > diff --git a/sysdeps/ieee754/flt-32/s_roundevenf.c b/sysdeps/ieee754/flt-32/s_roundevenf.c > > index 2cc0d7b001..4f568579d8 100644 > > --- a/sysdeps/ieee754/flt-32/s_roundevenf.c > > +++ b/sysdeps/ieee754/flt-32/s_roundevenf.c > > @@ -21,6 +21,7 @@ > > #include <math.h> > > #include <math_private.h> > > #include <libm-alias-float.h> > > +#include <math-use-builtins.h> > > #include <stdint.h> > > > > #define BIAS 0x7f > > @@ -30,6 +31,9 @@ > > float > > __roundevenf (float x) > > { > > +#if USE_ROUNDEVENF_BUILTIN > > + return __builtin_roundevenf (x); > > +#else > > uint32_t ix, ux; > > GET_FLOAT_WORD (ix, x); > > ux = ix & 0x7fffffff; > > @@ -67,6 +71,7 @@ __roundevenf (float x) > > ix &= 0x80000000; > > SET_FLOAT_WORD (x, ix); > > return x; > > +#endif /* ! USE_ROUNDEVENF_BUILTIN */ > > } > > #ifndef __roundevenf > > libm_alias_float (__roundeven, roundeven) > > diff --git a/sysdeps/ieee754/ldbl-128/s_roundevenl.c b/sysdeps/ieee754/ldbl-128/s_roundevenl.c > > index 7c9c11fad2..afbf13d4f2 100644 > > --- a/sysdeps/ieee754/ldbl-128/s_roundevenl.c > > +++ b/sysdeps/ieee754/ldbl-128/s_roundevenl.c > > @@ -21,6 +21,7 @@ > > #include <math.h> > > #include <math_private.h> > > #include <libm-alias-ldouble.h> > > +#include <math-use-builtins.h> > > #include <stdint.h> > > > > #define BIAS 0x3fff > > @@ -30,6 +31,9 @@ > > _Float128 > > __roundevenl (_Float128 x) > > { > > +#if USE_ROUNDEVENL_BUILTIN > > + return __builtin_roundevenl (x); > > +#else > > uint64_t hx, lx, uhx; > > GET_LDOUBLE_WORDS64 (hx, lx, x); > > uhx = hx & 0x7fffffffffffffffULL; > > @@ -101,5 +105,6 @@ __roundevenl (_Float128 x) > > } > > SET_LDOUBLE_WORDS64 (x, hx, lx); > > return x; > > +#endif /* ! USE_ROUNDEVENL_BUILTIN */ > > } > > libm_alias_ldouble (__roundeven, roundeven) > > -- > > 2.31.1 > > > > Do you need to map USE_ROUNDEVENL_BUILTIN to > USE_ROUNDEVENF128_BUILTIN in float128_private.h? > > -- > H.J.
diff --git a/sysdeps/generic/math-use-builtins-roundeven.h b/sysdeps/generic/math-use-builtins-roundeven.h new file mode 100644 index 0000000000..bd2e84c93f --- /dev/null +++ b/sysdeps/generic/math-use-builtins-roundeven.h @@ -0,0 +1,4 @@ +#define USE_ROUNDEVEN_BUILTIN 0 +#define USE_ROUNDEVENF_BUILTIN 0 +#define USE_ROUNDEVENL_BUILTIN 0 +#define USE_ROUNDEVENF128_BUILTIN 0 diff --git a/sysdeps/generic/math-use-builtins.h b/sysdeps/generic/math-use-builtins.h index cc3e9f2201..19d2d1cf3c 100644 --- a/sysdeps/generic/math-use-builtins.h +++ b/sysdeps/generic/math-use-builtins.h @@ -30,6 +30,7 @@ #include <math-use-builtins-ceil.h> #include <math-use-builtins-trunc.h> #include <math-use-builtins-round.h> +#include <math-use-builtins-roundeven.h> #include <math-use-builtins-copysign.h> #include <math-use-builtins-sqrt.h> #include <math-use-builtins-fma.h> diff --git a/sysdeps/ieee754/dbl-64/s_roundeven.c b/sysdeps/ieee754/dbl-64/s_roundeven.c index 5deff3bb8a..88c051e9fe 100644 --- a/sysdeps/ieee754/dbl-64/s_roundeven.c +++ b/sysdeps/ieee754/dbl-64/s_roundeven.c @@ -21,6 +21,7 @@ #include <math_private.h> #include <libm-alias-double.h> #include <stdint.h> +#include <math-use-builtins.h> #define BIAS 0x3ff #define MANT_DIG 53 @@ -29,6 +30,9 @@ double __roundeven (double x) { +#if USE_ROUNDEVEN_BUILTIN + return __builtin_roundeven (x); +#else uint64_t ix, ux; EXTRACT_WORDS64 (ix, x); ux = ix & 0x7fffffffffffffffULL; @@ -66,6 +70,7 @@ __roundeven (double x) ix &= 0x8000000000000000ULL; INSERT_WORDS64 (x, ix); return x; +#endif /* ! USE_ROUNDEVEN_BUILTIN */ } #ifndef __roundeven libm_alias_double (__roundeven, roundeven) diff --git a/sysdeps/ieee754/flt-32/s_roundevenf.c b/sysdeps/ieee754/flt-32/s_roundevenf.c index 2cc0d7b001..4f568579d8 100644 --- a/sysdeps/ieee754/flt-32/s_roundevenf.c +++ b/sysdeps/ieee754/flt-32/s_roundevenf.c @@ -21,6 +21,7 @@ #include <math.h> #include <math_private.h> #include <libm-alias-float.h> +#include <math-use-builtins.h> #include <stdint.h> #define BIAS 0x7f @@ -30,6 +31,9 @@ float __roundevenf (float x) { +#if USE_ROUNDEVENF_BUILTIN + return __builtin_roundevenf (x); +#else uint32_t ix, ux; GET_FLOAT_WORD (ix, x); ux = ix & 0x7fffffff; @@ -67,6 +71,7 @@ __roundevenf (float x) ix &= 0x80000000; SET_FLOAT_WORD (x, ix); return x; +#endif /* ! USE_ROUNDEVENF_BUILTIN */ } #ifndef __roundevenf libm_alias_float (__roundeven, roundeven) diff --git a/sysdeps/ieee754/ldbl-128/s_roundevenl.c b/sysdeps/ieee754/ldbl-128/s_roundevenl.c index 7c9c11fad2..afbf13d4f2 100644 --- a/sysdeps/ieee754/ldbl-128/s_roundevenl.c +++ b/sysdeps/ieee754/ldbl-128/s_roundevenl.c @@ -21,6 +21,7 @@ #include <math.h> #include <math_private.h> #include <libm-alias-ldouble.h> +#include <math-use-builtins.h> #include <stdint.h> #define BIAS 0x3fff @@ -30,6 +31,9 @@ _Float128 __roundevenl (_Float128 x) { +#if USE_ROUNDEVENL_BUILTIN + return __builtin_roundevenl (x); +#else uint64_t hx, lx, uhx; GET_LDOUBLE_WORDS64 (hx, lx, x); uhx = hx & 0x7fffffffffffffffULL; @@ -101,5 +105,6 @@ __roundevenl (_Float128 x) } SET_LDOUBLE_WORDS64 (x, hx, lx); return x; +#endif /* ! USE_ROUNDEVENL_BUILTIN */ } libm_alias_ldouble (__roundeven, roundeven)
This patch is using the corresponding GCC builtin for roundevenf, roundeven and roundevenl if the USE_FUNCTION_BUILTIN macros are defined to one in math-use-builtins.h. These builtin functions is supported since GCC 10. The code of the generic implementation is not changed. Signed-off-by: Shen-Ta Hsieh <ibmibmibm.tw@gmail.com> --- sysdeps/generic/math-use-builtins-roundeven.h | 4 ++++ sysdeps/generic/math-use-builtins.h | 1 + sysdeps/ieee754/dbl-64/s_roundeven.c | 5 +++++ sysdeps/ieee754/flt-32/s_roundevenf.c | 5 +++++ sysdeps/ieee754/ldbl-128/s_roundevenl.c | 5 +++++ 5 files changed, 20 insertions(+) create mode 100644 sysdeps/generic/math-use-builtins-roundeven.h