| From af123aa95091d3d2d1b4ff027cf806ca1721d29d Mon Sep 17 00:00:00 2001 |
| From: Stefan Liebler <stli@linux.ibm.com> |
| Date: Wed, 11 Dec 2019 15:09:14 +0100 |
| Subject: [PATCH 01/28] Always use wordsize-64 version of s_nearbyint.c. |
| |
| This patch replaces s_nearbyint.c in sysdeps/dbl-64 with the one in |
| sysdeps/dbl-64/wordsize-64 and removes the latter one. |
| The code is not changed except changes in code style. |
| |
| Also adjusted the include path in x86_64 file. |
| |
| Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> |
| |
| sysdeps/ieee754/dbl-64/s_nearbyint.c | 38 ++++++-------- |
| sysdeps/ieee754/dbl-64/wordsize-64/s_nearbyint.c | 65 ------------------------ |
| sysdeps/x86_64/fpu/multiarch/s_nearbyint-c.c | 2 +- |
| 3 files changed, 17 insertions(+), 88 deletions(-) |
| delete mode 100644 sysdeps/ieee754/dbl-64/wordsize-64/s_nearbyint.c |
| |
| Note: tweaked by DJ for backport; some portions handled by glibc-rh1780204-07.patch |
| |
| diff -rupN a/sysdeps/ieee754/dbl-64/s_nearbyint.c b/sysdeps/ieee754/dbl-64/s_nearbyint.c |
| |
| |
| @@ -10,10 +10,6 @@ |
| * |
| */ |
| |
| -#if defined(LIBM_SCCS) && !defined(lint) |
| -static char rcsid[] = "$NetBSD: s_rint.c,v 1.8 1995/05/10 20:48:04 jtc Exp $"; |
| -#endif |
| - |
| /* |
| * rint(x) |
| * Return x rounded to integral value according to the prevailing |
| @@ -44,35 +40,33 @@ __nearbyint (double x) |
| -4.50359962737049600000e+15, /* 0xC3300000, 0x00000000 */ |
| }; |
| fenv_t env; |
| - int32_t i0, j0, sx; |
| - double w, t; |
| - GET_HIGH_WORD (i0, x); |
| - sx = (i0 >> 31) & 1; |
| - j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; |
| - if (j0 < 52) |
| + int64_t i0, sx; |
| + int32_t j0; |
| + EXTRACT_WORDS64 (i0, x); |
| + sx = (i0 >> 63) & 1; |
| + j0 = ((i0 >> 52) & 0x7ff) - 0x3ff; |
| + if (__glibc_likely (j0 < 52)) |
| { |
| if (j0 < 0) |
| { |
| libc_feholdexcept (&env); |
| - w = TWO52[sx] + math_opt_barrier (x); |
| - t = w - TWO52[sx]; |
| + double w = TWO52[sx] + math_opt_barrier (x); |
| + double t = w - TWO52[sx]; |
| math_force_eval (t); |
| libc_fesetenv (&env); |
| - GET_HIGH_WORD (i0, t); |
| - SET_HIGH_WORD (t, (i0 & 0x7fffffff) | (sx << 31)); |
| - return t; |
| + return copysign (t, x); |
| } |
| } |
| else |
| { |
| if (j0 == 0x400) |
| - return x + x; /* inf or NaN */ |
| + return x + x; /* inf or NaN */ |
| else |
| - return x; /* x is integral */ |
| + return x; /* x is integral */ |
| } |
| libc_feholdexcept (&env); |
| - w = TWO52[sx] + math_opt_barrier (x); |
| - t = w - TWO52[sx]; |
| + double w = TWO52[sx] + math_opt_barrier (x); |
| + double t = w - TWO52[sx]; |
| math_force_eval (t); |
| libc_fesetenv (&env); |
| return t; |
| diff -rupN a/sysdeps/ieee754/dbl-64/wordsize-64/s_nearbyint.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_nearbyint.c |
| |
| |
| @@ -1,64 +0,0 @@ |
| -/* Adapted for use as nearbyint by Ulrich Drepper <drepper@cygnus.com>. */ |
| -/* |
| - * ==================================================== |
| - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. |
| - * |
| - * Developed at SunPro, a Sun Microsystems, Inc. business. |
| - * Permission to use, copy, modify, and distribute this |
| - * software is freely granted, provided that this notice |
| - * is preserved. |
| - * ==================================================== |
| - */ |
| - |
| -/* |
| - * rint(x) |
| - * Return x rounded to integral value according to the prevailing |
| - * rounding mode. |
| - * Method: |
| - * Using floating addition. |
| - * Exception: |
| - * Inexact flag raised if x not equal to rint(x). |
| - */ |
| - |
| -#include <fenv.h> |
| -#include <math.h> |
| -#include <math-barriers.h> |
| -#include <math_private.h> |
| -#include <libm-alias-double.h> |
| - |
| -static const double |
| -TWO52[2]={ |
| - 4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */ |
| - -4.50359962737049600000e+15, /* 0xC3300000, 0x00000000 */ |
| -}; |
| - |
| -double |
| -__nearbyint(double x) |
| -{ |
| - fenv_t env; |
| - int64_t i0,sx; |
| - int32_t j0; |
| - EXTRACT_WORDS64(i0,x); |
| - sx = (i0>>63)&1; |
| - j0 = ((i0>>52)&0x7ff)-0x3ff; |
| - if(__builtin_expect(j0<52, 1)) { |
| - if(j0<0) { |
| - libc_feholdexcept (&env); |
| - double w = TWO52[sx] + math_opt_barrier (x); |
| - double t = w-TWO52[sx]; |
| - math_force_eval (t); |
| - libc_fesetenv (&env); |
| - return __copysign (t, x); |
| - } |
| - } else { |
| - if(j0==0x400) return x+x; /* inf or NaN */ |
| - else return x; /* x is integral */ |
| - } |
| - libc_feholdexcept (&env); |
| - double w = TWO52[sx] + math_opt_barrier (x); |
| - double t = w-TWO52[sx]; |
| - math_force_eval (t); |
| - libc_fesetenv (&env); |
| - return t; |
| -} |
| -libm_alias_double (__nearbyint, nearbyint) |
| diff -rupN a/sysdeps/x86_64/fpu/multiarch/s_nearbyint-c.c b/sysdeps/x86_64/fpu/multiarch/s_nearbyint-c.c |
| |
| |
| @@ -1,3 +1,3 @@ |
| #undef __nearbyint |
| #define __nearbyint __nearbyint_c |
| -#include <sysdeps/ieee754/dbl-64/wordsize-64/s_nearbyint.c> |
| +#include <sysdeps/ieee754/dbl-64/s_nearbyint.c> |