Hello everyone, This is the version 2 of the previous arm fenv patch apologies, I forgot to add the -v2 in the git send mail
-Eshan On Sat, Jul 18, 2020 at 2:26 AM Eshan dhawan <eshandhawa...@gmail.com> wrote: > All the extra files have been removed > > Signed-off-by: Eshan dhawan <eshandhawa...@gmail.com> > --- > newlib/libc/machine/arm/machine/fenv-mangle.h | 53 --- > .../libc/machine/arm/machine/fenv-softfloat.h | 187 ----------- > newlib/libc/machine/arm/machine/fenv-vfp.h | 187 ----------- > newlib/libc/machine/arm/sys/fenv.h | 19 +- > newlib/libm/machine/arm/Makefile.am | 4 +- > newlib/libm/machine/arm/fenv-softfp.c | 32 -- > newlib/libm/machine/arm/fenv-vfp.c | 32 -- > newlib/libm/machine/arm/fenv.c | 315 +++++++----------- > 8 files changed, 127 insertions(+), 702 deletions(-) > delete mode 100644 newlib/libc/machine/arm/machine/fenv-mangle.h > delete mode 100644 newlib/libc/machine/arm/machine/fenv-softfloat.h > delete mode 100644 newlib/libc/machine/arm/machine/fenv-vfp.h > delete mode 100644 newlib/libm/machine/arm/fenv-softfp.c > delete mode 100644 newlib/libm/machine/arm/fenv-vfp.c > > diff --git a/newlib/libc/machine/arm/machine/fenv-mangle.h > b/newlib/libc/machine/arm/machine/fenv-mangle.h > deleted file mode 100644 > index 476f7b20c..000000000 > --- a/newlib/libc/machine/arm/machine/fenv-mangle.h > +++ /dev/null > @@ -1,53 +0,0 @@ > -/*- > - * Copyright (c) 2013 Andrew Turner <and...@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$ > - */ > - > -#ifdef _FENV_MANGLE_H_ > -#error Only include fenv-mangle.h once > -#endif > - > -#define _FENV_MANGLE_H_ > - > -#ifndef FENV_MANGLE > -#error FENV_MANGLE is undefined > -#endif > - > -#define feclearexcept FENV_MANGLE(feclearexcept) > -#define fegetexceptflag FENV_MANGLE(fegetexceptflag) > -#define fesetexceptflag FENV_MANGLE(fesetexceptflag) > -#define feraiseexcept FENV_MANGLE(feraiseexcept) > -#define fetestexcept FENV_MANGLE(fetestexcept) > -#define fegetround FENV_MANGLE(fegetround) > -#define fesetround FENV_MANGLE(fesetround) > -#define fegetenv FENV_MANGLE(fegetenv) > -#define feholdexcept FENV_MANGLE(feholdexcept) > -#define fesetenv FENV_MANGLE(fesetenv) > -#define feupdateenv FENV_MANGLE(feupdateenv) > -#define feenableexcept FENV_MANGLE(feenableexcept) > -#define fedisableexcept FENV_MANGLE(fedisableexcept) > -#define fegetexcept FENV_MANGLE(fegetexcept) > - > diff --git a/newlib/libc/machine/arm/machine/fenv-softfloat.h > b/newlib/libc/machine/arm/machine/fenv-softfloat.h > deleted file mode 100644 > index 5d33e18d0..000000000 > --- a/newlib/libc/machine/arm/machine/fenv-softfloat.h > +++ /dev/null > @@ -1,187 +0,0 @@ > - /*- > - * SPDX-License-Identifier: BSD-2-Clause-FreeBSD > - * > - * Copyright (c) 2004-2011 David Schultz <d...@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 _SYS_FENV_H_ > -#error "This file is meant to be included only by <sys/fenv.h>." > -#endif > -/* the file can be added from architecture specific fenv.h file found in > - *libc/sys/arch/sys * > - * > - * This file implements the functionality of <fenv.h> on platforms that > - * lack an FPU and use softfloat in libc for floating point. To use it, > - * you must write an <fenv.h> that provides the following: > - * > - * - a typedef for fenv_t, which may be an integer or struct type > - * - a typedef for fexcept_t (XXX This file assumes fexcept_t is a > - * simple integer type containing the exception mask.) > - * - definitions of FE_* constants for the five exceptions and four > - * rounding modes in IEEE 754, as described in fenv(3) > - * - a definition, and the corresponding external symbol, for FE_DFL_ENV > - * - a macro __set_env(env, flags, mask, rnd), which sets the given > fenv_t > - * from the exception flags, mask, and rounding mode > - * - macros __env_flags(env), __env_mask(env), and __env_round(env), > which > - * extract fields from an fenv_t > - * - a definition of __fenv_static > - * > - * If the architecture supports an optional FPU, it's recommended that you > - * define fenv_t and fexcept_t to match the hardware ABI. Otherwise, it > - * doesn't matter how you define them. > - */ > -#include <errno.h> > - > -int __softfloat_float_exception_flags; > -int __softfloat_float_exception_mask; > -int __softfloat_float_rounding_mode; > - > - > -__fenv_static inline int > -feclearexcept(int excepts) > -{ > - > - __softfloat_float_exception_flags &= ~excepts; > - return (0); > -} > - > -__fenv_static inline int > -fegetexceptflag(fexcept_t *flagp, int excepts) > -{ > - > - *flagp = __softfloat_float_exception_flags & excepts; > - return (0); > -} > - > -__fenv_static inline int > -fesetexceptflag(const fexcept_t *flagp, int excepts) > -{ > - > - __softfloat_float_exception_flags &= ~excepts; > - __softfloat_float_exception_flags |= *flagp & excepts; > - return (0); > -} > - > -__fenv_static inline int > -feraiseexcept(int excepts) > -{ > - > - return (excepts ? -ENOTSUP : 0); > -} > - > -__fenv_static inline int > -fetestexcept(int excepts) > -{ > - > - return (__softfloat_float_exception_flags & excepts); > -} > - > -__fenv_static inline int > -fegetround(void) > -{ > - > - return (__softfloat_float_rounding_mode); > -} > - > -__fenv_static inline int > -fesetround(int round) > -{ > - > - __softfloat_float_rounding_mode = round; > - return (0); > -} > - > -__fenv_static inline int > -fegetenv(fenv_t *envp) > -{ > - > - __set_env(*envp, __softfloat_float_exception_flags, > - __softfloat_float_exception_mask, > __softfloat_float_rounding_mode); > - return (0); > -} > - > -__fenv_static inline int > -feholdexcept(fenv_t *envp) > -{ > - fenv_t __env; > - > - fegetenv(envp); > - __softfloat_float_exception_flags = 0; > - __softfloat_float_exception_mask = 0; > - return (0); > -} > - > -__fenv_static inline int > -fesetenv(const fenv_t *envp) > -{ > - > - __softfloat_float_exception_flags = __env_flags(*envp); > - __softfloat_float_exception_mask = __env_mask(*envp); > - __softfloat_float_rounding_mode = __env_round(*envp); > - return (0); > -} > - > -__fenv_static inline int > -feupdateenv(const fenv_t *envp) > -{ > - int __oflags = __softfloat_float_exception_flags; > - > - fesetenv(envp); > - feraiseexcept(__oflags); > - return (0); > -} > - > -#if __BSD_VISIBLE > - > -/* We currently provide no external definitions of the functions below. */ > - > -__fenv_static inline int > -feenableexcept(int __mask) > -{ > - int __omask = __softfloat_float_exception_mask; > - > - __softfloat_float_exception_mask |= __mask; > - return (__omask); > -} > - > -__fenv_static inline int > -fedisableexcept(int __mask) > -{ > - int __omask = __softfloat_float_exception_mask; > - > - __softfloat_float_exception_mask &= ~__mask; > - return (__omask); > -} > - > -__fenv_static inline int > -fegetexcept(void) > -{ > - > - return (__softfloat_float_exception_mask); > -} > - > -#endif /* __BSD_VISIBLE */ > diff --git a/newlib/libc/machine/arm/machine/fenv-vfp.h > b/newlib/libc/machine/arm/machine/fenv-vfp.h > deleted file mode 100644 > index 25d71f3ab..000000000 > --- a/newlib/libc/machine/arm/machine/fenv-vfp.h > +++ /dev/null > @@ -1,187 +0,0 @@ > -/*- > - * SPDX-License-Identifier: BSD-2-Clause-FreeBSD > - * > - * Copyright (c) 2004-2005 David Schultz <d...@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 vmrs_fpscr(__r) __asm __volatile("vmrs %0, fpscr" : > "=&r"(__r)) > -#define vmsr_fpscr(__r) __asm __volatile("vmsr fpscr, %0" : : > "r"(__r)) > - > - > -#define _FPU_MASK_SHIFT 8 > - > -__fenv_static inline int feclearexcept(int excepts) > -{ > - fexcept_t __fpsr; > - > - vmrs_fpscr(__fpsr); > - __fpsr &= ~excepts; > - vmsr_fpscr(__fpsr); > - return (0); > -} > - > -__fenv_static inline int > -fegetexceptflag(fexcept_t *flagp, int excepts) > -{ > - fexcept_t __fpsr; > - > - vmrs_fpscr(__fpsr); > - *flagp = __fpsr & excepts; > - return (0); > -} > - > -__fenv_static inline int > -fesetexceptflag(const fexcept_t *flagp, int excepts) > -{ > - fexcept_t __fpsr; > - > - vmrs_fpscr(__fpsr); > - __fpsr &= ~excepts; > - __fpsr |= *flagp & excepts; > - vmsr_fpscr(__fpsr); > - return (0); > -} > - > -__fenv_static inline int > -feraiseexcept(int excepts) > -{ > - fexcept_t __ex = excepts; > - > - fesetexceptflag(&__ex, excepts); /* XXX */ > - return (0); > -} > - > -__fenv_static inline int > -fetestexcept(int excepts) > -{ > - fexcept_t __fpsr; > - > - vmrs_fpscr(__fpsr); > - return (__fpsr & excepts); > -} > - > -__fenv_static inline int > -fegetround(void) > -{ > - fenv_t __fpsr; > - > - vmrs_fpscr(__fpsr); > - return (__fpsr & _ROUND_MASK); > -} > - > -__fenv_static inline int > -fesetround(int round) > -{ > - fenv_t __fpsr; > - > - vmrs_fpscr(__fpsr); > - __fpsr &= ~(_ROUND_MASK); > - __fpsr |= round; > - vmsr_fpscr(__fpsr); > - return (0); > -} > - > -__fenv_static inline int > -fegetenv(fenv_t *envp) > -{ > - > - vmrs_fpscr(*envp); > - return (0); > -} > - > -__fenv_static inline int > -feholdexcept(fenv_t *envp) > -{ > - fenv_t __env; > - > - vmrs_fpscr(__env); > - *envp = __env; > - __env &= ~(FE_ALL_EXCEPT); > - vmsr_fpscr(__env); > - return (0); > -} > - > -__fenv_static inline int > -fesetenv(const fenv_t *envp) > -{ > - > - vmsr_fpscr(*envp); > - return (0); > -} > - > -__fenv_static inline int > -feupdateenv(const fenv_t *envp) > -{ > - fexcept_t __fpsr; > - > - vmrs_fpscr(__fpsr); > - vmsr_fpscr(*envp); > - feraiseexcept(__fpsr & FE_ALL_EXCEPT); > - return (0); > -} > - > -#if __BSD_VISIBLE > - > -/* We currently provide no external definitions of the functions below. */ > - > -__fenv_static inline int > -feenableexcept(int __mask) > -{ > - fenv_t __old_fpsr, __new_fpsr; > - > - vmrs_fpscr(__old_fpsr); > - __new_fpsr = __old_fpsr | > - ((__mask & FE_ALL_EXCEPT) << _FPU_MASK_SHIFT); > - vmsr_fpscr(__new_fpsr); > - return ((__old_fpsr >> _FPU_MASK_SHIFT) & FE_ALL_EXCEPT); > -} > - > -__fenv_static inline int > -fedisableexcept(int __mask) > -{ > - fenv_t __old_fpsr, __new_fpsr; > - > - vmrs_fpscr(__old_fpsr); > - __new_fpsr = __old_fpsr & > - ~((__mask & FE_ALL_EXCEPT) << _FPU_MASK_SHIFT); > - vmsr_fpscr(__new_fpsr); > - return ((__old_fpsr >> _FPU_MASK_SHIFT) & FE_ALL_EXCEPT); > -} > - > -__fenv_static inline int > -fegetexcept(void) > -{ > - fenv_t __fpsr; > - > - vmrs_fpscr(__fpsr); > - return (__fpsr & FE_ALL_EXCEPT); > -} > - > -#endif /* __BSD_VISIBLE */ > - > diff --git a/newlib/libc/machine/arm/sys/fenv.h > b/newlib/libc/machine/arm/sys/fenv.h > index 740995a1a..0224da38b 100644 > --- a/newlib/libc/machine/arm/sys/fenv.h > +++ b/newlib/libc/machine/arm/sys/fenv.h > @@ -63,22 +63,11 @@ typedef int fexcept_t; > > > /* Rounding modes */ > -#define VFP_FE_TONEAREST 0x00000000 > -#define VFP_FE_UPWARD 0x00400000 > -#define VFP_FE_DOWNWARD 0x00800000 > -#define VFP_FE_TOWARDZERO 0x00c00000 > +#define FE_TONEAREST 0x00000000 > +#define FE_UPWARD 0x00400000 > +#define FE_DOWNWARD 0x00800000 > +#define FE_TOWARDZERO 0x00c00000 > > -#ifdef __ARM_PCS_VFP > -#define FE_TONEAREST VFP_FE_TONEAREST > -#define FE_UPWARD VFP_FE_UPWARD > -#define FE_DOWNWARD VFP_FE_DOWNWARD > -#define FE_TOWARDZERO VFP_FE_TOWARDZERO > -#else > -#define FE_TONEAREST 0x0000 > -#define FE_TOWARDZERO 0x0001 > -#define FE_UPWARD 0x0002 > -#define FE_DOWNWARD 0x0003 > -#endif > #define _ROUND_MASK (FE_TONEAREST | FE_DOWNWARD | \ > FE_UPWARD | FE_TOWARDZERO) > > diff --git a/newlib/libm/machine/arm/Makefile.am > b/newlib/libm/machine/arm/Makefile.am > index a64ee59d5..180a37f44 100644 > --- a/newlib/libm/machine/arm/Makefile.am > +++ b/newlib/libm/machine/arm/Makefile.am > @@ -32,9 +32,7 @@ LIB_SOURCES = \ > fesetexceptflag.c \ > fesetround.c \ > fetestexcept.c \ > - feupdateenv.c \ > - fenv-vfp.c \ > - fenv-softfp.c > + feupdateenv.c > > > noinst_LIBRARIES = lib.a > diff --git a/newlib/libm/machine/arm/fenv-softfp.c > b/newlib/libm/machine/arm/fenv-softfp.c > deleted file mode 100644 > index a576cc1b2..000000000 > --- a/newlib/libm/machine/arm/fenv-softfp.c > +++ /dev/null > @@ -1,32 +0,0 @@ > -/*- > - * Copyright (c) 2013 Andrew Turner <and...@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_MANGLE(x) __softfp_ ##x > -#include <machine/fenv-mangle.h> > -#include "fenv.c" > - > diff --git a/newlib/libm/machine/arm/fenv-vfp.c > b/newlib/libm/machine/arm/fenv-vfp.c > deleted file mode 100644 > index 297e81296..000000000 > --- a/newlib/libm/machine/arm/fenv-vfp.c > +++ /dev/null > @@ -1,32 +0,0 @@ > -/*- > - * Copyright (c) 2013 Andrew Turner <and...@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_MANGLE(x) __vfp_ ##x > -#include <machine/fenv-mangle.h> > -#include "fenv.c" > - > diff --git a/newlib/libm/machine/arm/fenv.c > b/newlib/libm/machine/arm/fenv.c > index 5b61ab81f..d5d488d10 100644 > --- a/newlib/libm/machine/arm/fenv.c > +++ b/newlib/libm/machine/arm/fenv.c > @@ -29,7 +29,6 @@ > * $FreeBSD$ > */ > > -#define __fenv_static > #include <fenv.h> > > #include <machine/acle-compat.h> > @@ -38,156 +37,40 @@ > #define FENV_ARMv6 > #endif > > -/* When SOFTFP_ABI is defined we are using the softfp ABI. */ > -#if defined(__VFP_FP__) && !defined(__ARM_PCS_VFP) > -#define SOFTFP_ABI > -#endif > - > - > -#ifndef FENV_MANGLE > -/* > - * Hopefully the system ID byte is immutable, so it's valid to use > - * this as a default environment. > - */ > fenv_t __fe_dfl_env = { 0 }; > > const fenv_t *_fe_dfl_env = &__fe_dfl_env; > -#endif > - > - > -/* If this is a non-mangled softfp version special processing is required > */ > -#if defined(FENV_MANGLE) || !defined(SOFTFP_ABI) || !defined(FENV_ARMv6) > - > -/* > - * The following macros map between the softfloat emulator's flags and > - * the hardware's FPSR. The hardware this file was written for doesn't > - * have rounding control bits, so we stick those in the system ID byte. > - */ > -#ifndef __ARM_PCS_VFP > -#define __set_env(env, flags, mask, rnd) env = ((flags) > \ > - | (mask)<<_FPUSW_SHIFT \ > - | (rnd) << 24) > -#define __env_flags(env) ((env) & FE_ALL_EXCEPT) > -#define __env_mask(env) (((env) >> _FPUSW_SHIFT) > \ > - & FE_ALL_EXCEPT) > -#define __env_round(env) (((env) >> 24) & > _ROUND_MASK) > - > -#include <machine/fenv-softfloat.h> > - > -#else /* __ARM_PCS_VFP PRESENT */ > - > -#include <machine/fenv-vfp.h> > > -#endif /* __ARM_PCS_VFP */ > - > -#ifdef __GNUC_GNU_INLINE__ > -#error "This file must be compiled with C99 'inline' semantics" > +#ifdef __ARM_PCS_VFP > +#define vmrs_fpscr(__r) __asm __volatile("vmrs %0, fpscr" : > "=&r"(__r)) > +#define vmsr_fpscr(__r) __asm __volatile("vmsr fpscr, %0" : : > "r"(__r)) > #endif > > -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); > -extern inline int feenableexcept(int __mask); > -extern inline int fedisableexcept(int __mask); > -extern inline int fegetexcept(void); > - > -#else /* !FENV_MANGLE && SOFTFP_ABI */ > -/* Set by libc when the VFP unit is enabled */ > - > -int _libc_arm_fpu_present; > - > -int __softfp_feclearexcept(int excepts); > -int __softfp_fegetexceptflag(fexcept_t *flagp, int excepts); > -int __softfp_fesetexceptflag(const fexcept_t *flagp, int excepts); > -int __softfp_feraiseexcept(int excepts); > -int __softfp_fetestexcept(int excepts); > -int __softfp_fegetround(void); > -int __softfp_fesetround(int round); > -int __softfp_fegetenv(fenv_t *envp); > -int __softfp_feholdexcept(fenv_t *envp); > -int __softfp_fesetenv(const fenv_t *envp); > -int __softfp_feupdateenv(const fenv_t *envp); > -int __softfp_feenableexcept(int __mask); > -int __softfp_fedisableexcept(int __mask); > -int __softfp_fegetexcept(void); > - > -int __vfp_feclearexcept(int excepts); > -int __vfp_fegetexceptflag(fexcept_t *flagp, int excepts); > -int __vfp_fesetexceptflag(const fexcept_t *flagp, int excepts); > -int __vfp_feraiseexcept(int excepts); > -int __vfp_fetestexcept(int excepts); > -int __vfp_fegetround(void); > -int __vfp_fesetround(int round); > -int __vfp_fegetenv(fenv_t *envp); > -int __vfp_feholdexcept(fenv_t *envp); > -int __vfp_fesetenv(const fenv_t *envp); > -int __vfp_feupdateenv(const fenv_t *envp); > -int __vfp_feenableexcept(int __mask); > -int __vfp_fedisableexcept(int __mask); > -int __vfp_fegetexcept(void); > - > -static int > -__softfp_round_to_vfp(int round) > -{ > - > - switch (round) { > - case FE_TONEAREST: > - default: > - return VFP_FE_TONEAREST; > - case FE_TOWARDZERO: > - return VFP_FE_TOWARDZERO; > - case FE_UPWARD: > - return VFP_FE_UPWARD; > - case FE_DOWNWARD: > - return VFP_FE_DOWNWARD; > - } > -} > - > -static int > -__softfp_round_from_vfp(int round) > -{ > - > - switch (round) { > - case VFP_FE_TONEAREST: > - default: > - return FE_TONEAREST; > - case VFP_FE_TOWARDZERO: > - return FE_TOWARDZERO; > - case VFP_FE_UPWARD: > - return FE_UPWARD; > - case VFP_FE_DOWNWARD: > - return FE_DOWNWARD; > - } > -} > +#define _FPU_MASK_SHIFT 8 > > int feclearexcept(int excepts) > { > > - if (_libc_arm_fpu_present) > - __vfp_feclearexcept(excepts); > - __softfp_feclearexcept(excepts); > +#ifdef __ARM_PCS_VFP > + fexcept_t __fpsr; > + vmrs_fpscr(__fpsr); > + __fpsr &= ~excepts; > + vmsr_fpscr(__fpsr); > +#endif > > return (0); > } > > int fegetexceptflag(fexcept_t *flagp, int excepts) > { > - fexcept_t __vfp_flagp; > > - __vfp_flagp = 0; > - if (_libc_arm_fpu_present) > - __vfp_fegetexceptflag(&__vfp_flagp, excepts); > - __softfp_fegetexceptflag(flagp, excepts); > - > - *flagp |= __vfp_flagp; > +#ifdef __ARM_PCS_VFP > + fexcept_t __fpsr; > + vmrs_fpscr(__fpsr); > + __fpsr &= ~excepts; > + __fpsr |= *flagp & excepts; > + vmsr_fpscr(__fpsr); > +#endif > > return (0); > } > @@ -195,9 +78,13 @@ int fegetexceptflag(fexcept_t *flagp, int excepts) > int fesetexceptflag(const fexcept_t *flagp, int excepts) > { > > - if (_libc_arm_fpu_present) > - __vfp_fesetexceptflag(flagp, excepts); > - __softfp_fesetexceptflag(flagp, excepts); > +#ifdef __ARM_PCS_VFP > + fexcept_t __fpsr; > + vmrs_fpscr(__fpsr); > + __fpsr &= ~excepts; > + __fpsr |= *flagp & excepts; > + vmsr_fpscr(__fpsr); > +#endif > > return (0); > } > @@ -205,65 +92,86 @@ int fesetexceptflag(const fexcept_t *flagp, int > excepts) > int feraiseexcept(int excepts) > { > > - if (_libc_arm_fpu_present) > - __vfp_feraiseexcept(excepts); > - __softfp_feraiseexcept(excepts); > +#ifdef __ARM_PCS_VFP > + fexcept_t __ex = excepts; > + fesetexceptflag(&__ex, excepts); > +#endif > > return (0); > } > > int fetestexcept(int excepts) > { > - int __got_excepts; > - > - __got_excepts = 0; > - if (_libc_arm_fpu_present) > - __got_excepts = __vfp_fetestexcept(excepts); > - __got_excepts |= __softfp_fetestexcept(excepts); > +#ifdef __ARM_PCS_VFP > + fexcept_t __fpsr; > + vmrs_fpscr(__fpsr); > + return (__fpsr & excepts); > +#endif > > - return (__got_excepts); > + return (0); > } > > int fegetround(void) > { > > - if (_libc_arm_fpu_present) > - return __softfp_round_from_vfp(__vfp_fegetround()); > - return __softfp_fegetround(); > +#ifdef __ARM_PCS_VFP > + fenv_t __fpsr; > + vmrs_fpscr(__fpsr); > + return (__fpsr & _ROUND_MASK); > + > +#else > +/* For soft float */ > + > +#ifdef FE_TONEAREST > + return FE_TONEAREST; > +#else > + return 0; > +#endif > + > +#endif > } > > int fesetround(int round) > { > > - if (_libc_arm_fpu_present) > - __vfp_fesetround(__softfp_round_to_vfp(round)); > - __softfp_fesetround(round); > +#ifdef __ARM_PCS_VFP > + fenv_t __fpsr; > + vmrs_fpscr(__fpsr); > + __fpsr &= ~(_ROUND_MASK); > + __fpsr |= round; > + vmsr_fpscr(__fpsr); > + return (0); > +#endif > > return (0); > } > > int fegetenv(fenv_t *envp) > { > - fenv_t __vfp_envp; > + > +#ifdef __ARM_PCS_VFP > + vmrs_fpscr(*envp); > + return 0; > +#endif > > - __vfp_envp = 0; > - if (_libc_arm_fpu_present) > - __vfp_fegetenv(&__vfp_envp); > - __softfp_fegetenv(envp); > - *envp |= __vfp_envp; > + *envp |= 0; > > return (0); > } > > int feholdexcept(fenv_t *envp) > { > - fenv_t __vfp_envp; > > - __vfp_envp = 0; > - if (_libc_arm_fpu_present) > - __vfp_feholdexcept(&__vfp_envp); > - __softfp_feholdexcept(envp); > - *envp |= __vfp_envp; > +#ifdef __ARM_PCS_VFP > + fenv_t __env; > + vmrs_fpscr(__env); > + *envp = __env; > + __env &= ~(FE_ALL_EXCEPT); > + vmsr_fpscr(__env); > + return (0); > + > +#endif > + *envp |= 0; > > return (0); > } > @@ -271,58 +179,79 @@ int feholdexcept(fenv_t *envp) > int fesetenv(const fenv_t *envp) > { > > - if (_libc_arm_fpu_present) > - __vfp_fesetenv(envp); > - __softfp_fesetenv(envp); > - > +#ifdef __ARM_PCS_VFP > + vmsr_fpscr(*envp); > +#endif > return (0); > } > > int feupdateenv(const fenv_t *envp) > { > > - if (_libc_arm_fpu_present) > - __vfp_feupdateenv(envp); > - __softfp_feupdateenv(envp); > +#ifdef __ARM_PCS_VFP > + fexcept_t __fpsr; > + vmrs_fpscr(__fpsr); > + vmsr_fpscr(*envp); > + feraiseexcept(__fpsr & FE_ALL_EXCEPT); > + > + return 0; > +#else > + > +#if defined FE_NOMASK_ENV && FE_ALL_EXCEPT != 0 > + > + if (envp == FE_NOMASK_ENV) > + return 1; > + > +#endif > + > + return 0; > + > +#endif > > - return (0); > } > > int feenableexcept(int __mask) > { > - int __unmasked; > - > - __unmasked = 0; > - if (_libc_arm_fpu_present) > - __unmasked = __vfp_feenableexcept(__mask); > - __unmasked |= __softfp_feenableexcept(__mask); > + > +#ifdef __ARM_PCS_VFP > + fenv_t __old_fpsr, __new_fpsr; > + vmrs_fpscr(__old_fpsr); > + __new_fpsr = __old_fpsr | > + ((__mask & FE_ALL_EXCEPT) << _FPU_MASK_SHIFT); > + vmsr_fpscr(__new_fpsr); > + return ((__old_fpsr >> _FPU_MASK_SHIFT) & FE_ALL_EXCEPT); > +#endif > > - return (__unmasked); > + return (0); > } > > int fedisableexcept(int __mask) > { > - int __unmasked; > > - __unmasked = 0; > - if (_libc_arm_fpu_present) > - __unmasked = __vfp_fedisableexcept(__mask); > - __unmasked |= __softfp_fedisableexcept(__mask); > +#ifdef __ARM_PCS_VFP > + fenv_t __old_fpsr, __new_fpsr; > > - return (__unmasked); > + vmrs_fpscr(__old_fpsr); > + __new_fpsr = __old_fpsr & > + ~((__mask & FE_ALL_EXCEPT) << _FPU_MASK_SHIFT); > + vmsr_fpscr(__new_fpsr); > + return ((__old_fpsr >> _FPU_MASK_SHIFT) & FE_ALL_EXCEPT); > +#endif > + > + return (0); > } > > int fegetexcept(void) > { > - int __unmasked; > > - __unmasked = 0; > - if (_libc_arm_fpu_present) > - __unmasked = __vfp_fegetexcept(); > - __unmasked |= __softfp_fegetexcept(); > +#ifdef __ARM_PCS_VFP > + fenv_t __fpsr; > > - return (__unmasked); > + vmrs_fpscr(__fpsr); > + return (__fpsr & FE_ALL_EXCEPT); > +#endif > + > + return (0); > } > > -#endif > > -- > 2.17.1 > >
_______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel