Message ID | 1575895568-26473-18-git-send-email-stli@linux.ibm.com |
---|---|
State | New |
Headers | show |
Series | Use GCC builtins for some math functions if desired. | expand |
On 09/12/2019 09:46, Stefan Liebler wrote: > This patch just adjusts the generic implementation regarding code style. > No functional change. LGTM, thanks. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> > --- > sysdeps/ieee754/flt-32/s_ceilf.c | 54 +++++++++++------- > sysdeps/ieee754/ldbl-128/s_ceill.c | 91 +++++++++++++++++++----------- > 2 files changed, 92 insertions(+), 53 deletions(-) > > diff --git a/sysdeps/ieee754/flt-32/s_ceilf.c b/sysdeps/ieee754/flt-32/s_ceilf.c > index 7d4990f3ff..5c4abfe145 100644 > --- a/sysdeps/ieee754/flt-32/s_ceilf.c > +++ b/sysdeps/ieee754/flt-32/s_ceilf.c > @@ -20,34 +20,46 @@ > #include <math-use-builtins.h> > > float > -__ceilf(float x) > +__ceilf (float x) > { > #if USE_CEILF_BUILTIN > return __builtin_ceilf (x); > #else > /* Use generic implementation. */ > - int32_t i0,j0; > - uint32_t i; > + int32_t i0, j0; > + uint32_t i; > > - GET_FLOAT_WORD(i0,x); > - j0 = ((i0>>23)&0xff)-0x7f; > - if(j0<23) { > - if(j0<0) { > - /* return 0*sign(x) if |x|<1 */ > - if(i0<0) {i0=0x80000000;} > - else if(i0!=0) { i0=0x3f800000;} > - } else { > - i = (0x007fffff)>>j0; > - if((i0&i)==0) return x; /* x is integral */ > - if(i0>0) i0 += (0x00800000)>>j0; > - i0 &= (~i); > - } > - } else { > - if(__builtin_expect(j0==0x80, 0)) return x+x; /* inf or NaN */ > - else return x; /* x is integral */ > + GET_FLOAT_WORD (i0, x); > + j0 = ((i0 >> 23) & 0xff) - 0x7f; > + if (j0 < 23) > + { > + if (j0 < 0) > + { > + /* return 0 * sign (x) if |x| < 1 */ > + if (i0 < 0) > + i0 = 0x80000000; > + else if (i0 != 0) > + i0 = 0x3f800000; > } > - SET_FLOAT_WORD(x,i0); > - return x; > + else > + { > + i = (0x007fffff) >> j0; > + if ((i0 & i) == 0) > + return x; /* x is integral */ > + if (i0 > 0) > + i0 += (0x00800000) >> j0; > + i0 &= (~i); > + } > + } > + else > + { > + if (__glibc_unlikely (j0 == 0x80)) > + return x + x; /* inf or NaN */ > + else > + return x; /* x is integral */ > + } > + SET_FLOAT_WORD (x, i0); > + return x; > #endif /* ! USE_CEILF_BUILTIN */ > } > #ifndef __ceilf Ok. > diff --git a/sysdeps/ieee754/ldbl-128/s_ceill.c b/sysdeps/ieee754/ldbl-128/s_ceill.c > index 02ffa7af2b..c5d98e1e37 100644 > --- a/sysdeps/ieee754/ldbl-128/s_ceill.c > +++ b/sysdeps/ieee754/ldbl-128/s_ceill.c > @@ -13,7 +13,7 @@ > * ==================================================== > */ > > -#if defined(LIBM_SCCS) && !defined(lint) > +#if defined (LIBM_SCCS) && ! defined (lint) > static char rcsid[] = "$NetBSD: $"; > #endif > > @@ -30,45 +30,72 @@ static char rcsid[] = "$NetBSD: $"; > #include <libm-alias-ldouble.h> > #include <math-use-builtins.h> > > -_Float128 __ceill(_Float128 x) > +_Float128 > +__ceill (_Float128 x) > { > #if USE_CEILL_BUILTIN > return __builtin_ceill (x); > #else > /* Use generic implementation. */ > - int64_t i0,i1,j0; > - uint64_t i,j; > - GET_LDOUBLE_WORDS64(i0,i1,x); > - j0 = ((i0>>48)&0x7fff)-0x3fff; > - if(j0<48) { > - if(j0<0) { > - /* return 0*sign(x) if |x|<1 */ > - if(i0<0) {i0=0x8000000000000000ULL;i1=0;} > - else if((i0|i1)!=0) { i0=0x3fff000000000000ULL;i1=0;} > - } else { > - i = (0x0000ffffffffffffULL)>>j0; > - if(((i0&i)|i1)==0) return x; /* x is integral */ > - if(i0>0) i0 += (0x0001000000000000LL)>>j0; > - i0 &= (~i); i1=0; > + int64_t i0, i1, j0; > + uint64_t i, j; > + GET_LDOUBLE_WORDS64 (i0, i1, x); > + j0 = ((i0 >> 48) & 0x7fff) - 0x3fff; > + if (j0 < 48) > + { > + if (j0 < 0) > + { > + /* return 0 * sign (x) if |x| < 1 */ > + if (i0 < 0) > + { > + i0 = 0x8000000000000000ULL; > + i1 = 0; > } > - } else if (j0>111) { > - if(j0==0x4000) return x+x; /* inf or NaN */ > - else return x; /* x is integral */ > - } else { > - i = -1ULL>>(j0-48); > - if((i1&i)==0) return x; /* x is integral */ > - if(i0>0) { > - if(j0==48) i0+=1; > - else { > - j = i1+(1LL<<(112-j0)); > - if(j<i1) i0 +=1 ; /* got a carry */ > - i1=j; > - } > + else if ((i0 | i1) != 0) > + { > + i0 = 0x3fff000000000000ULL; > + i1 = 0; > } > - i1 &= (~i); > } > - SET_LDOUBLE_WORDS64(x,i0,i1); > - return x; > + else > + { > + i = (0x0000ffffffffffffULL) >> j0; > + if (((i0 & i) | i1) == 0) > + return x; /* x is integral */ > + if (i0 > 0) > + i0 += (0x0001000000000000LL) >> j0; > + i0 &= (~i); > + i1 = 0; > + } > + } > + else if (j0 > 111) > + { > + if (j0 == 0x4000) > + return x + x; /* inf or NaN */ > + else > + return x; /* x is integral */ > + } > + else > + { > + i = -1ULL >> (j0 - 48); > + if ((i1 & i) == 0) > + return x; /* x is integral */ > + if (i0 > 0) > + { > + if (j0 == 48) > + i0 += 1; > + else > + { > + j = i1 + (1LL << (112 - j0)); > + if (j < i1) > + i0 += 1; /* got a carry */ > + i1 = j; > + } > + } > + i1 &= (~i); > + } > + SET_LDOUBLE_WORDS64 (x, i0, i1); > + return x; > #endif /* ! USE_CEILL_BUILTIN */ > } > libm_alias_ldouble (__ceil, ceil) > Ok.
diff --git a/sysdeps/ieee754/flt-32/s_ceilf.c b/sysdeps/ieee754/flt-32/s_ceilf.c index 7d4990f3ff..5c4abfe145 100644 --- a/sysdeps/ieee754/flt-32/s_ceilf.c +++ b/sysdeps/ieee754/flt-32/s_ceilf.c @@ -20,34 +20,46 @@ #include <math-use-builtins.h> float -__ceilf(float x) +__ceilf (float x) { #if USE_CEILF_BUILTIN return __builtin_ceilf (x); #else /* Use generic implementation. */ - int32_t i0,j0; - uint32_t i; + int32_t i0, j0; + uint32_t i; - GET_FLOAT_WORD(i0,x); - j0 = ((i0>>23)&0xff)-0x7f; - if(j0<23) { - if(j0<0) { - /* return 0*sign(x) if |x|<1 */ - if(i0<0) {i0=0x80000000;} - else if(i0!=0) { i0=0x3f800000;} - } else { - i = (0x007fffff)>>j0; - if((i0&i)==0) return x; /* x is integral */ - if(i0>0) i0 += (0x00800000)>>j0; - i0 &= (~i); - } - } else { - if(__builtin_expect(j0==0x80, 0)) return x+x; /* inf or NaN */ - else return x; /* x is integral */ + GET_FLOAT_WORD (i0, x); + j0 = ((i0 >> 23) & 0xff) - 0x7f; + if (j0 < 23) + { + if (j0 < 0) + { + /* return 0 * sign (x) if |x| < 1 */ + if (i0 < 0) + i0 = 0x80000000; + else if (i0 != 0) + i0 = 0x3f800000; } - SET_FLOAT_WORD(x,i0); - return x; + else + { + i = (0x007fffff) >> j0; + if ((i0 & i) == 0) + return x; /* x is integral */ + if (i0 > 0) + i0 += (0x00800000) >> j0; + i0 &= (~i); + } + } + else + { + if (__glibc_unlikely (j0 == 0x80)) + return x + x; /* inf or NaN */ + else + return x; /* x is integral */ + } + SET_FLOAT_WORD (x, i0); + return x; #endif /* ! USE_CEILF_BUILTIN */ } #ifndef __ceilf diff --git a/sysdeps/ieee754/ldbl-128/s_ceill.c b/sysdeps/ieee754/ldbl-128/s_ceill.c index 02ffa7af2b..c5d98e1e37 100644 --- a/sysdeps/ieee754/ldbl-128/s_ceill.c +++ b/sysdeps/ieee754/ldbl-128/s_ceill.c @@ -13,7 +13,7 @@ * ==================================================== */ -#if defined(LIBM_SCCS) && !defined(lint) +#if defined (LIBM_SCCS) && ! defined (lint) static char rcsid[] = "$NetBSD: $"; #endif @@ -30,45 +30,72 @@ static char rcsid[] = "$NetBSD: $"; #include <libm-alias-ldouble.h> #include <math-use-builtins.h> -_Float128 __ceill(_Float128 x) +_Float128 +__ceill (_Float128 x) { #if USE_CEILL_BUILTIN return __builtin_ceill (x); #else /* Use generic implementation. */ - int64_t i0,i1,j0; - uint64_t i,j; - GET_LDOUBLE_WORDS64(i0,i1,x); - j0 = ((i0>>48)&0x7fff)-0x3fff; - if(j0<48) { - if(j0<0) { - /* return 0*sign(x) if |x|<1 */ - if(i0<0) {i0=0x8000000000000000ULL;i1=0;} - else if((i0|i1)!=0) { i0=0x3fff000000000000ULL;i1=0;} - } else { - i = (0x0000ffffffffffffULL)>>j0; - if(((i0&i)|i1)==0) return x; /* x is integral */ - if(i0>0) i0 += (0x0001000000000000LL)>>j0; - i0 &= (~i); i1=0; + int64_t i0, i1, j0; + uint64_t i, j; + GET_LDOUBLE_WORDS64 (i0, i1, x); + j0 = ((i0 >> 48) & 0x7fff) - 0x3fff; + if (j0 < 48) + { + if (j0 < 0) + { + /* return 0 * sign (x) if |x| < 1 */ + if (i0 < 0) + { + i0 = 0x8000000000000000ULL; + i1 = 0; } - } else if (j0>111) { - if(j0==0x4000) return x+x; /* inf or NaN */ - else return x; /* x is integral */ - } else { - i = -1ULL>>(j0-48); - if((i1&i)==0) return x; /* x is integral */ - if(i0>0) { - if(j0==48) i0+=1; - else { - j = i1+(1LL<<(112-j0)); - if(j<i1) i0 +=1 ; /* got a carry */ - i1=j; - } + else if ((i0 | i1) != 0) + { + i0 = 0x3fff000000000000ULL; + i1 = 0; } - i1 &= (~i); } - SET_LDOUBLE_WORDS64(x,i0,i1); - return x; + else + { + i = (0x0000ffffffffffffULL) >> j0; + if (((i0 & i) | i1) == 0) + return x; /* x is integral */ + if (i0 > 0) + i0 += (0x0001000000000000LL) >> j0; + i0 &= (~i); + i1 = 0; + } + } + else if (j0 > 111) + { + if (j0 == 0x4000) + return x + x; /* inf or NaN */ + else + return x; /* x is integral */ + } + else + { + i = -1ULL >> (j0 - 48); + if ((i1 & i) == 0) + return x; /* x is integral */ + if (i0 > 0) + { + if (j0 == 48) + i0 += 1; + else + { + j = i1 + (1LL << (112 - j0)); + if (j < i1) + i0 += 1; /* got a carry */ + i1 = j; + } + } + i1 &= (~i); + } + SET_LDOUBLE_WORDS64 (x, i0, i1); + return x; #endif /* ! USE_CEILL_BUILTIN */ } libm_alias_ldouble (__ceil, ceil)