diff options
author | Warner Losh <imp@FreeBSD.org> | 2020-02-26 18:55:03 +0000 |
---|---|---|
committer | Warner Losh <imp@FreeBSD.org> | 2020-02-26 18:55:03 +0000 |
commit | a8197ad3aa952a03fc2aeebc2eafe9bb9de54550 (patch) | |
tree | 02a40f4c6bd2d1167d096b049d9ab170c9d651f1 /lib/msun | |
parent | 8e0ff10d4bc57e4b5cc259613d32bf6b7b990c02 (diff) | |
download | src-a8197ad3aa952a03fc2aeebc2eafe9bb9de54550.tar.gz src-a8197ad3aa952a03fc2aeebc2eafe9bb9de54550.zip |
Notes
Diffstat (limited to 'lib/msun')
-rw-r--r-- | lib/msun/ld128/k_expl.h | 3 | ||||
-rw-r--r-- | lib/msun/ld128/s_expl.c | 5 | ||||
-rw-r--r-- | lib/msun/ld128/s_logl.c | 21 | ||||
-rw-r--r-- | lib/msun/sparc64/Makefile.inc | 5 | ||||
-rw-r--r-- | lib/msun/sparc64/Symbol.map | 13 | ||||
-rw-r--r-- | lib/msun/sparc64/e_sqrt.S | 33 | ||||
-rw-r--r-- | lib/msun/sparc64/e_sqrtf.S | 33 | ||||
-rw-r--r-- | lib/msun/sparc64/fenv.c | 55 | ||||
-rw-r--r-- | lib/msun/sparc64/fenv.h | 262 |
9 files changed, 17 insertions, 413 deletions
diff --git a/lib/msun/ld128/k_expl.h b/lib/msun/ld128/k_expl.h index 913107652272..0c4e7015dbbe 100644 --- a/lib/msun/ld128/k_expl.h +++ b/lib/msun/ld128/k_expl.h @@ -265,7 +265,8 @@ __k_expl(long double x, long double *hip, long double *lop, int *kp) /* * XXX: the rest of the functions are identical for ld80 and ld128. * However, we should use scalbnl() for ld128, since long double - * multiplication is very slow on the only supported ld128 arch (sparc64). + * multiplication was very slow on sparc64 and no new evaluation has + * been made for aarch64 and/or riscv. */ static inline void diff --git a/lib/msun/ld128/s_expl.c b/lib/msun/ld128/s_expl.c index b47402b0fb4e..5b786af4948e 100644 --- a/lib/msun/ld128/s_expl.c +++ b/lib/msun/ld128/s_expl.c @@ -92,7 +92,10 @@ expl(long double x) t = SUM2P(hi, lo); /* Scale by 2**k. */ - /* XXX sparc64 multiplication is so slow that scalbnl() is faster. */ + /* + * XXX sparc64 multiplication was so slow that scalbnl() is faster, + * but performance on aarch64 and riscv hasn't yet been quantified. + */ if (k >= LDBL_MIN_EXP) { if (k == LDBL_MAX_EXP) RETURNI(t * 2 * 0x1p16383L); diff --git a/lib/msun/ld128/s_logl.c b/lib/msun/ld128/s_logl.c index 01ad3d8d8669..93a2a7c35ff5 100644 --- a/lib/msun/ld128/s_logl.c +++ b/lib/msun/ld128/s_logl.c @@ -535,16 +535,17 @@ logl(long double x) * efficiency than is gained. */ /* - * Use double precision operations wherever possible, since long - * double operations are emulated and are very slow on the only - * known machines that support ld128 (sparc64). Also, don't try - * to improve parallelism by increasing the number of operations, - * since any parallelism on such machines is needed for the - * emulation. Horner's method is good for this, and is also good - * for accuracy. Horner's method doesn't handle the `lo' term - * well, either for efficiency or accuracy. However, for accuracy - * we evaluate d * d * P2 separately to take advantage of - * by P2 being exact, and this gives a good place to sum the 'lo' + * Use double precision operations wherever possible, since + * long double operations are emulated and were very slow on + * the old sparc64 and unknown on the newer aarch64 and riscv + * machines. Also, don't try to improve parallelism by + * increasing the number of operations, since any parallelism + * on such machines is needed for the emulation. Horner's + * method is good for this, and is also good for accuracy. + * Horner's method doesn't handle the `lo' term well, either + * for efficiency or accuracy. However, for accuracy we + * evaluate d * d * P2 separately to take advantage of by P2 + * being exact, and this gives a good place to sum the 'lo' * term too. */ dd = (double)d; diff --git a/lib/msun/sparc64/Makefile.inc b/lib/msun/sparc64/Makefile.inc deleted file mode 100644 index 052dc4dd2b26..000000000000 --- a/lib/msun/sparc64/Makefile.inc +++ /dev/null @@ -1,5 +0,0 @@ -# $FreeBSD$ - -ARCH_SRCS= e_sqrt.S e_sqrtf.S -LDBL_PREC= 113 -SYM_MAPS+= ${.CURDIR}/sparc64/Symbol.map diff --git a/lib/msun/sparc64/Symbol.map b/lib/msun/sparc64/Symbol.map deleted file mode 100644 index 971112e30c8a..000000000000 --- a/lib/msun/sparc64/Symbol.map +++ /dev/null @@ -1,13 +0,0 @@ -/* - * $FreeBSD$ - */ -FBSD_1.0 { -}; - -FBSD_1.3 { - fesetexceptflag; - feraiseexcept; - fegetenv; - feholdexcept; - feupdateenv; -}; diff --git a/lib/msun/sparc64/e_sqrt.S b/lib/msun/sparc64/e_sqrt.S deleted file mode 100644 index 8c90c164b042..000000000000 --- a/lib/msun/sparc64/e_sqrt.S +++ /dev/null @@ -1,33 +0,0 @@ -/*- - * Copyright (c) 2005 David Schultz <das@FreeBSD.ORG> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <machine/asm.h> -__FBSDID("$FreeBSD$") - -ENTRY(sqrt) - retl - fsqrtd %f0, %f0 -END(sqrt) diff --git a/lib/msun/sparc64/e_sqrtf.S b/lib/msun/sparc64/e_sqrtf.S deleted file mode 100644 index bf63f33d1d00..000000000000 --- a/lib/msun/sparc64/e_sqrtf.S +++ /dev/null @@ -1,33 +0,0 @@ -/*- - * Copyright (c) 2005 David Schultz <das@FreeBSD.ORG> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <machine/asm.h> -__FBSDID("$FreeBSD$") - -ENTRY(sqrtf) - retl - fsqrts %f1, %f0 -END(sqrtf) diff --git a/lib/msun/sparc64/fenv.c b/lib/msun/sparc64/fenv.c deleted file mode 100644 index 802587582fd4..000000000000 --- a/lib/msun/sparc64/fenv.c +++ /dev/null @@ -1,55 +0,0 @@ -/*- - * SPDX-License-Identifier: BSD-2-Clause-FreeBSD - * - * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#define __fenv_static -#include "fenv.h" - -#ifdef __GNUC_GNU_INLINE__ -#error "This file must be compiled with C99 'inline' semantics" -#endif - -/* - * The FSR_version field may be different on different - * implementations, but it is immutable and opaque to the - * application. Thus, 0 is valid as the default environment. - */ -const fenv_t __fe_dfl_env = 0; - -extern inline int feclearexcept(int __excepts); -extern inline int fegetexceptflag(fexcept_t *__flagp, int __excepts); -extern inline int fesetexceptflag(const fexcept_t *__flagp, int __excepts); -extern inline int feraiseexcept(int __excepts); -extern inline int fetestexcept(int __excepts); -extern inline int fegetround(void); -extern inline int fesetround(int __round); -extern inline int fegetenv(fenv_t *__envp); -extern inline int feholdexcept(fenv_t *__envp); -extern inline int fesetenv(const fenv_t *__envp); -extern inline int feupdateenv(const fenv_t *__envp); diff --git a/lib/msun/sparc64/fenv.h b/lib/msun/sparc64/fenv.h deleted file mode 100644 index d42702323580..000000000000 --- a/lib/msun/sparc64/fenv.h +++ /dev/null @@ -1,262 +0,0 @@ -/*- - * SPDX-License-Identifier: BSD-2-Clause-FreeBSD - * - * Copyright (c) 2004-2005 David Schultz <das@FreeBSD.ORG> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#ifndef _FENV_H_ -#define _FENV_H_ - -#include <sys/_types.h> - -#ifndef __fenv_static -#define __fenv_static static -#endif - -typedef __uint64_t fenv_t; -typedef __uint64_t fexcept_t; - -/* Exception flags */ -#define FE_INVALID 0x00000200 -#define FE_DIVBYZERO 0x00000040 -#define FE_OVERFLOW 0x00000100 -#define FE_UNDERFLOW 0x00000080 -#define FE_INEXACT 0x00000020 -#define FE_ALL_EXCEPT (FE_DIVBYZERO | FE_INEXACT | \ - FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW) - -/* - * Rounding modes - * - * We can't just use the hardware bit values here, because that would - * make FE_UPWARD and FE_DOWNWARD negative, which is not allowed. - */ -#define FE_TONEAREST 0x0 -#define FE_TOWARDZERO 0x1 -#define FE_UPWARD 0x2 -#define FE_DOWNWARD 0x3 -#define _ROUND_MASK (FE_TONEAREST | FE_DOWNWARD | \ - FE_UPWARD | FE_TOWARDZERO) -#define _ROUND_SHIFT 30 - -__BEGIN_DECLS - -/* Default floating-point environment */ -extern const fenv_t __fe_dfl_env; -#define FE_DFL_ENV (&__fe_dfl_env) - -/* We need to be able to map status flag positions to mask flag positions */ -#define _FPUSW_SHIFT 18 -#define _ENABLE_MASK (FE_ALL_EXCEPT << _FPUSW_SHIFT) - -#define __ldxfsr(__r) __asm __volatile("ldx %0, %%fsr" : : "m" (__r)) -#define __stxfsr(__r) __asm __volatile("stx %%fsr, %0" : "=m" (*(__r))) - -__fenv_static __inline int -feclearexcept(int __excepts) -{ - fexcept_t __r; - - __stxfsr(&__r); - __r &= ~__excepts; - __ldxfsr(__r); - return (0); -} - -__fenv_static inline int -fegetexceptflag(fexcept_t *__flagp, int __excepts) -{ - fexcept_t __r; - - __stxfsr(&__r); - *__flagp = __r & __excepts; - return (0); -} - -__fenv_static inline int -fesetexceptflag(const fexcept_t *__flagp, int __excepts) -{ - fexcept_t __r; - - __stxfsr(&__r); - __r &= ~__excepts; - __r |= *__flagp & __excepts; - __ldxfsr(__r); - return (0); -} - -/* - * It seems to be worthwhile to inline this function even when the - * arguments are not compile-time constants. Perhaps this depends - * on the register window. - */ -__fenv_static inline int -feraiseexcept(int __excepts) -{ - volatile double d; - - /* - * With a compiler that supports the FENV_ACCESS pragma - * properly, simple expressions like '0.0 / 0.0' should - * be sufficient to generate traps. Unfortunately, we - * need to bring a volatile variable into the equation - * to prevent incorrect optimizations. - */ - if (__excepts & FE_INVALID) { - d = 0.0; - d = 0.0 / d; - } - if (__excepts & FE_DIVBYZERO) { - d = 0.0; - d = 1.0 / d; - } - if (__excepts & FE_OVERFLOW) { - d = 0x1.ffp1023; - d *= 2.0; - } - if (__excepts & FE_UNDERFLOW) { - d = 0x1p-1022; - d /= 0x1p1023; - } - if (__excepts & FE_INEXACT) { - d = 0x1p-1022; - d += 1.0; - } - return (0); -} - -__fenv_static inline int -fetestexcept(int __excepts) -{ - fexcept_t __r; - - __stxfsr(&__r); - return (__r & __excepts); -} - -__fenv_static inline int -fegetround(void) -{ - fenv_t __r; - - __stxfsr(&__r); - return ((__r >> _ROUND_SHIFT) & _ROUND_MASK); -} - -__fenv_static inline int -fesetround(int __round) -{ - fenv_t __r; - - if (__round & ~_ROUND_MASK) - return (-1); - __stxfsr(&__r); - __r &= ~(_ROUND_MASK << _ROUND_SHIFT); - __r |= __round << _ROUND_SHIFT; - __ldxfsr(__r); - return (0); -} - -__fenv_static inline int -fegetenv(fenv_t *__envp) -{ - - __stxfsr(__envp); - return (0); -} - -__fenv_static inline int -feholdexcept(fenv_t *__envp) -{ - fenv_t __r; - - __stxfsr(&__r); - *__envp = __r; - __r &= ~(FE_ALL_EXCEPT | _ENABLE_MASK); - __ldxfsr(__r); - return (0); -} - -__fenv_static inline int -fesetenv(const fenv_t *__envp) -{ - - __ldxfsr(*__envp); - return (0); -} - -__fenv_static inline int -feupdateenv(const fenv_t *__envp) -{ - fexcept_t __r; - - __stxfsr(&__r); - __ldxfsr(*__envp); - feraiseexcept(__r & FE_ALL_EXCEPT); - return (0); -} - -#if __BSD_VISIBLE - -/* We currently provide no external definitions of the functions below. */ - -static inline int -feenableexcept(int __mask) -{ - fenv_t __old_r, __new_r; - - __stxfsr(&__old_r); - __new_r = __old_r | ((__mask & FE_ALL_EXCEPT) << _FPUSW_SHIFT); - __ldxfsr(__new_r); - return ((__old_r >> _FPUSW_SHIFT) & FE_ALL_EXCEPT); -} - -static inline int -fedisableexcept(int __mask) -{ - fenv_t __old_r, __new_r; - - __stxfsr(&__old_r); - __new_r = __old_r & ~((__mask & FE_ALL_EXCEPT) << _FPUSW_SHIFT); - __ldxfsr(__new_r); - return ((__old_r >> _FPUSW_SHIFT) & FE_ALL_EXCEPT); -} - -static inline int -fegetexcept(void) -{ - fenv_t __r; - - __stxfsr(&__r); - return ((__r & _ENABLE_MASK) >> _FPUSW_SHIFT); -} - -#endif /* __BSD_VISIBLE */ - -__END_DECLS - -#endif /* !_FENV_H_ */ |