Unless someone comments in the next 24 hours, I think this is ready to post to newlib's mailing list and get merged.
It looks like a faithful adaptation of the FreeBSD code to newlib's libm architecture. --joel On Mon, Jun 1, 2020 at 7:10 PM Eshan dhawan <eshandhawa...@gmail.com> wrote: > This patch adds support for ARM fenv to newlib > > the files are taken from FreeBSD > > Signed-off-by: Eshan dhawan <eshandhawa...@gmail.com> > --- > newlib/libc/machine/arm/machine/acle-compat.h | 182 ++++++++++ > 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 | 122 +++++++ > newlib/libm/machine/arm/Makefile.am | 18 +- > newlib/libm/machine/arm/fe_dfl_env.c | 7 + > newlib/libm/machine/arm/feclearexcept.c | 7 + > newlib/libm/machine/arm/fegetenv.c | 7 + > newlib/libm/machine/arm/fegetexceptflag.c | 7 + > newlib/libm/machine/arm/fegetround.c | 7 + > newlib/libm/machine/arm/feholdexcept.c | 7 + > newlib/libm/machine/arm/fenv-softfp.c | 32 ++ > newlib/libm/machine/arm/fenv-vfp.c | 32 ++ > newlib/libm/machine/arm/fenv.c | 328 ++++++++++++++++++ > newlib/libm/machine/arm/feraiseexcept.c | 7 + > newlib/libm/machine/arm/fesetenv.c | 7 + > newlib/libm/machine/arm/fesetexceptflag.c | 7 + > newlib/libm/machine/arm/fesetround.c | 7 + > newlib/libm/machine/arm/fetestexcept.c | 7 + > newlib/libm/machine/arm/feupdateenv.c | 7 + > 21 files changed, 1224 insertions(+), 1 deletion(-) > create mode 100644 newlib/libc/machine/arm/machine/acle-compat.h > create mode 100644 newlib/libc/machine/arm/machine/fenv-mangle.h > create mode 100644 newlib/libc/machine/arm/machine/fenv-softfloat.h > create mode 100644 newlib/libc/machine/arm/machine/fenv-vfp.h > create mode 100644 newlib/libc/machine/arm/sys/fenv.h > create mode 100644 newlib/libm/machine/arm/fe_dfl_env.c > create mode 100644 newlib/libm/machine/arm/feclearexcept.c > create mode 100644 newlib/libm/machine/arm/fegetenv.c > create mode 100644 newlib/libm/machine/arm/fegetexceptflag.c > create mode 100644 newlib/libm/machine/arm/fegetround.c > create mode 100644 newlib/libm/machine/arm/feholdexcept.c > create mode 100644 newlib/libm/machine/arm/fenv-softfp.c > create mode 100644 newlib/libm/machine/arm/fenv-vfp.c > create mode 100644 newlib/libm/machine/arm/fenv.c > create mode 100644 newlib/libm/machine/arm/feraiseexcept.c > create mode 100644 newlib/libm/machine/arm/fesetenv.c > create mode 100644 newlib/libm/machine/arm/fesetexceptflag.c > create mode 100644 newlib/libm/machine/arm/fesetround.c > create mode 100644 newlib/libm/machine/arm/fetestexcept.c > create mode 100644 newlib/libm/machine/arm/feupdateenv.c > > diff --git a/newlib/libc/machine/arm/machine/acle-compat.h > b/newlib/libc/machine/arm/machine/acle-compat.h > new file mode 100644 > index 000000000..888ae2ea8 > --- /dev/null > +++ b/newlib/libc/machine/arm/machine/acle-compat.h > @@ -0,0 +1,182 @@ > +/* > + * Copyright (c) 2014 ARM Ltd > + * 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. > + * 3. The name of the company may not be used to endorse or promote > + * products derived from this software without specific prior written > + * permission. > + * > + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``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 ARM LTD 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. > + */ > + > +#ifndef __ARM_ARCH > + > +/* ACLE standardises a set of pre-defines that describe the ARM > architecture. > + These were mostly implemented in GCC around GCC-4.8; older versions > + have no, or only partial support. To provide a level of backwards > + compatibility we try to work out what the definitions should be, given > + the older pre-defines that GCC did produce. This isn't complete, but > + it should be enough for use by routines that depend on this header. */ > + > +/* No need to handle ARMv8, GCC had ACLE support before that. */ > + > +# ifdef __ARM_ARCH_7__ > +/* The common subset of ARMv7 in all profiles. */ > +# define __ARM_ARCH 7 > +# define __ARM_ARCH_ISA_THUMB 2 > +# define __ARM_FEATURE_CLZ > +# define __ARM_FEATURE_LDREX 7 > +# define __ARM_FEATURE_UNALIGNED > +# endif > + > +# if defined (__ARM_ARCH_7A__) || defined (__ARM_ARCH_7R__) > +# define __ARM_ARCH 7 > +# define __ARM_ARCH_ISA_THUMB 2 > +# define __ARM_ARCH_ISA_ARM > +# define __ARM_FEATURE_CLZ > +# define __ARM_FEATURE_SIMD32 > +# define __ARM_FEATURE_DSP > +# define __ARM_FEATURE_QBIT > +# define __ARM_FEATURE_SAT > +# define __ARM_FEATURE_LDREX 15 > +# define __ARM_FEATURE_UNALIGNED > +# ifdef __ARM_ARCH_7A__ > +# define __ARM_ARCH_PROFILE 'A' > +# else > +# define __ARM_ARCH_PROFILE 'R' > +# endif > +# endif > + > +# ifdef __ARM_ARCH_7EM__ > +# define __ARM_ARCH 7 > +# define __ARM_ARCH_ISA_THUMB 2 > +# define __ARM_FEATURE_CLZ > +# define __ARM_FEATURE_SIMD32 > +# define __ARM_FEATURE_DSP > +# define __ARM_FEATURE_QBIT > +# define __ARM_FEATURE_SAT > +# define __ARM_FEATURE_LDREX 7 > +# define __ARM_FEATURE_UNALIGNED > +# define __ARM_ARCH_PROFILE 'M' > +# endif > + > +# ifdef __ARM_ARCH_7M__ > +# define __ARM_ARCH 7 > +# define __ARM_ARCH_ISA_THUMB 2 > +# define __ARM_FEATURE_CLZ > +# define __ARM_FEATURE_QBIT > +# define __ARM_FEATURE_SAT > +# define __ARM_FEATURE_LDREX 7 > +# define __ARM_FEATURE_UNALIGNED > +# define __ARM_ARCH_PROFILE 'M' > +# endif > + > +# ifdef __ARM_ARCH_6T2__ > +# define __ARM_ARCH 6 > +# define __ARM_ARCH_ISA_THUMB 2 > +# define __ARM_ARCH_ISA_ARM > +# define __ARM_FEATURE_CLZ > +# define __ARM_FEATURE_SIMD32 > +# define __ARM_FEATURE_DSP > +# define __ARM_FEATURE_QBIT > +# define __ARM_FEATURE_SAT > +# define __ARM_FEATURE_LDREX 4 > +# define __ARM_FEATURE_UNALIGNED > +# endif > + > +# ifdef __ARM_ARCH_6M__ > +# define __ARM_ARCH 6 > +# define __ARM_ARCH_ISA_THUMB 1 > +# define __ARM_ARCH_PROFILE 'M' > +# endif > + > +# if defined (__ARM_ARCH_6__) || defined (__ARM_ARCH_6J__) \ > + || defined (__ARM_ARCH_6K__) || defined (__ARM_ARCH_6Z__) \ > + || defined (__ARM_ARCH_6ZK__) > +# define __ARM_ARCH 6 > +# define __ARM_ARCH_ISA_THUMB 1 > +# define __ARM_ARCH_ISA_ARM > +# define __ARM_FEATURE_CLZ > +# define __ARM_FEATURE_SIMD32 > +# define __ARM_FEATURE_DSP > +# define __ARM_FEATURE_QBIT > +# define __ARM_FEATURE_SAT > +# define __ARM_FEATURE_UNALIGNED > +# ifndef __thumb__ > +# if defined (__ARM_ARCH_6K__) || defined (__ARM_ARCH_6ZK__) > +# define __ARM_FEATURE_LDREX 15 > +# else > +# define __ARM_FEATURE_LDREX 4 > +# endif > +# endif > +# endif > + > +# if defined (__ARM_ARCH_5TE__) || defined (__ARM_ARCH_5E__) > +# define __ARM_ARCH 5 > +# define __ARM_ARCH_ISA_ARM > +# ifdef __ARM_ARCH_5TE__ > +# define __ARM_ARCH_ISA_THUMB 1 > +# endif > +# define __ARM_FEATURE_CLZ > +# define __ARM_FEATURE_DSP > +# endif > + > +# if defined (__ARM_ARCH_5T__) || defined (__ARM_ARCH_5__) > +# define __ARM_ARCH 5 > +# define __ARM_ARCH_ISA_ARM > +# ifdef __ARM_ARCH_5TE__ > +# define __ARM_ARCH_ISA_THUMB 1 > +# endif > +# define __ARM_FEATURE_CLZ > +# endif > + > +# ifdef __ARM_ARCH_4T__ > +# define __ARM_ARCH 4 > +# define __ARM_ARCH_ISA_ARM > +# define __ARM_ARCH_ISA_THUMB 1 > +# endif > + > +# ifdef __ARM_ARCH_4__ > +# define __ARM_ARCH 4 > +# define __ARM_ARCH_ISA_ARM > +# endif > + > +# if defined (__ARM_ARCH_3__) || defined (__ARM_ARCH_3M__) > +# define __ARM_ARCH 3 > +# define __ARM_ARCH_ISA_ARM > +# endif > + > +# ifdef __ARM_ARCH_2__ > +# define __ARM_ARCH 2 > +# define __ARM_ARCH_ISA_ARM > +# endif > + > +# ifdef __ARMEB__ > +# define __ARM_BIG_ENDIAN > +# endif > + > +/* If we still don't know what the target architecture is, then we're > + probably not using GCC. */ > +# ifndef __ARM_ARCH > +# error Unable to determine architecture version. > +# endif > + > +#endif /* __ARM_ARCH */ > + > diff --git a/newlib/libc/machine/arm/machine/fenv-mangle.h > b/newlib/libc/machine/arm/machine/fenv-mangle.h > new file mode 100644 > index 000000000..476f7b20c > --- /dev/null > +++ b/newlib/libc/machine/arm/machine/fenv-mangle.h > @@ -0,0 +1,53 @@ > +/*- > + * 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 > new file mode 100644 > index 000000000..b650437cc > --- /dev/null > +++ b/newlib/libc/machine/arm/machine/fenv-softfloat.h > @@ -0,0 +1,187 @@ > + /*- > + * 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 > new file mode 100644 > index 000000000..25d71f3ab > --- /dev/null > +++ b/newlib/libc/machine/arm/machine/fenv-vfp.h > @@ -0,0 +1,187 @@ > +/*- > + * 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 > new file mode 100644 > index 000000000..af74c5f47 > --- /dev/null > +++ b/newlib/libc/machine/arm/sys/fenv.h > @@ -0,0 +1,122 @@ > +/*- > + * 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$ > + */ > + > +#ifndef _SYS_FENV_H_ > +#define _SYS_FENV_H_ 1 > + > +#include <sys/_types.h> > +#include <sys/cdefs.h> > + > +#ifdef __cplusplus > +extern "C" { > +#endif > + > +#ifndef __fenv_static > +#define __fenv_static static > +#endif > + > +typedef int fenv_t; > +typedef int fexcept_t; > + > +/* Exception flags */ > +#define FE_INVALID 0x0001 > +#define FE_DIVBYZERO 0x0002 > +#define FE_OVERFLOW 0x0004 > +#define FE_UNDERFLOW 0x0008 > +#define FE_INEXACT 0x0010 > +#ifdef __ARM_PCS_VFP > +#define FE_DENORMAL 0x0080 > +#define FE_ALL_EXCEPT (FE_DIVBYZERO | FE_INEXACT | \ > + FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW | > FE_DENORMAL) > +#else > +#define FE_ALL_EXCEPT (FE_DIVBYZERO | FE_INEXACT | \ > + FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW) > +#endif > + > + > + > +/* Rounding modes */ > +#define VFP_FE_TONEAREST 0x00000000 > +#define VFP_FE_UPWARD 0x00400000 > +#define VFP_FE_DOWNWARD 0x00800000 > +#define VFP_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) > + > + > +/* 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 > */ > +#ifndef __ARM_PCS_VFP > +#define _FPUSW_SHIFT 16 > +#define _ENABLE_MASK (FE_ALL_EXCEPT << _FPUSW_SHIFT) > +#endif > + > +#ifndef __ARM_PCS_VFP > + > +int feclearexcept(int excepts); > +int fegetexceptflag(fexcept_t *flagp, int excepts); > +int fesetexceptflag(const fexcept_t *flagp, int excepts); > +int feraiseexcept(int excepts); > +int fetestexcept(int excepts); > +int fegetround(void); > +int fesetround(int round); > +int fegetenv(fenv_t *envp); > +int feholdexcept(fenv_t *envp); > +int fesetenv(const fenv_t *envp); > +int feupdateenv(const fenv_t *envp); > +#if __BSD_VISIBLE > +int feenableexcept(int __mask); > +int fedisableexcept(int __mask); > +int fegetexcept(void); > +#endif /* __BSD_VISIBLE */ > + > +#endif /* __ARM_PCS_VFP */ > + > +#ifdef __cplusplus > +} > +#endif > + > +#endif /* _SYS_FENV_H_ */ > diff --git a/newlib/libm/machine/arm/Makefile.am > b/newlib/libm/machine/arm/Makefile.am > index 1f10a7a40..a64ee59d5 100644 > --- a/newlib/libm/machine/arm/Makefile.am > +++ b/newlib/libm/machine/arm/Makefile.am > @@ -19,7 +19,23 @@ LIB_SOURCES = \ > sf_nearbyint.c \ > sf_rint.c \ > sf_round.c \ > - sf_trunc.c > + sf_trunc.c \ > + feclearexcept.c \ > + fe_dfl_env.c\ > + fegetenv.c \ > + fegetexceptflag.c \ > + fegetround.c \ > + feholdexcept.c \ > + fenv.c \ > + feraiseexcept.c \ > + fesetenv.c \ > + fesetexceptflag.c \ > + fesetround.c \ > + fetestexcept.c \ > + feupdateenv.c \ > + fenv-vfp.c \ > + fenv-softfp.c > + > > noinst_LIBRARIES = lib.a > lib_a_SOURCES = $(LIB_SOURCES) > diff --git a/newlib/libm/machine/arm/fe_dfl_env.c > b/newlib/libm/machine/arm/fe_dfl_env.c > new file mode 100644 > index 000000000..8cbee7771 > --- /dev/null > +++ b/newlib/libm/machine/arm/fe_dfl_env.c > @@ -0,0 +1,7 @@ > +/* > + * SPDX-License-Identifier: BSD-2-Clause > + * > + * (c) Copyright 2019 Joel Sherrill <j...@rtems.org> > + */ > + > +#include "../../fenv/fenv_stub.c" > diff --git a/newlib/libm/machine/arm/feclearexcept.c > b/newlib/libm/machine/arm/feclearexcept.c > new file mode 100644 > index 000000000..8cbee7771 > --- /dev/null > +++ b/newlib/libm/machine/arm/feclearexcept.c > @@ -0,0 +1,7 @@ > +/* > + * SPDX-License-Identifier: BSD-2-Clause > + * > + * (c) Copyright 2019 Joel Sherrill <j...@rtems.org> > + */ > + > +#include "../../fenv/fenv_stub.c" > diff --git a/newlib/libm/machine/arm/fegetenv.c > b/newlib/libm/machine/arm/fegetenv.c > new file mode 100644 > index 000000000..8cbee7771 > --- /dev/null > +++ b/newlib/libm/machine/arm/fegetenv.c > @@ -0,0 +1,7 @@ > +/* > + * SPDX-License-Identifier: BSD-2-Clause > + * > + * (c) Copyright 2019 Joel Sherrill <j...@rtems.org> > + */ > + > +#include "../../fenv/fenv_stub.c" > diff --git a/newlib/libm/machine/arm/fegetexceptflag.c > b/newlib/libm/machine/arm/fegetexceptflag.c > new file mode 100644 > index 000000000..8cbee7771 > --- /dev/null > +++ b/newlib/libm/machine/arm/fegetexceptflag.c > @@ -0,0 +1,7 @@ > +/* > + * SPDX-License-Identifier: BSD-2-Clause > + * > + * (c) Copyright 2019 Joel Sherrill <j...@rtems.org> > + */ > + > +#include "../../fenv/fenv_stub.c" > diff --git a/newlib/libm/machine/arm/fegetround.c > b/newlib/libm/machine/arm/fegetround.c > new file mode 100644 > index 000000000..8cbee7771 > --- /dev/null > +++ b/newlib/libm/machine/arm/fegetround.c > @@ -0,0 +1,7 @@ > +/* > + * SPDX-License-Identifier: BSD-2-Clause > + * > + * (c) Copyright 2019 Joel Sherrill <j...@rtems.org> > + */ > + > +#include "../../fenv/fenv_stub.c" > diff --git a/newlib/libm/machine/arm/feholdexcept.c > b/newlib/libm/machine/arm/feholdexcept.c > new file mode 100644 > index 000000000..8cbee7771 > --- /dev/null > +++ b/newlib/libm/machine/arm/feholdexcept.c > @@ -0,0 +1,7 @@ > +/* > + * SPDX-License-Identifier: BSD-2-Clause > + * > + * (c) Copyright 2019 Joel Sherrill <j...@rtems.org> > + */ > + > +#include "../../fenv/fenv_stub.c" > diff --git a/newlib/libm/machine/arm/fenv-softfp.c > b/newlib/libm/machine/arm/fenv-softfp.c > new file mode 100644 > index 000000000..a576cc1b2 > --- /dev/null > +++ b/newlib/libm/machine/arm/fenv-softfp.c > @@ -0,0 +1,32 @@ > +/*- > + * 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 > new file mode 100644 > index 000000000..297e81296 > --- /dev/null > +++ b/newlib/libm/machine/arm/fenv-vfp.c > @@ -0,0 +1,32 @@ > +/*- > + * 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 > new file mode 100644 > index 000000000..5b61ab81f > --- /dev/null > +++ b/newlib/libm/machine/arm/fenv.c > @@ -0,0 +1,328 @@ > +/*- > + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD > + * > + * Copyright (c) 2004 David Schultz <d...@freebsd.org> > + * 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_static > +#include <fenv.h> > + > +#include <machine/acle-compat.h> > + > +#if __ARM_ARCH >= 6 > +#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" > +#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; > + } > +} > + > +int feclearexcept(int excepts) > +{ > + > + if (_libc_arm_fpu_present) > + __vfp_feclearexcept(excepts); > + __softfp_feclearexcept(excepts); > + > + 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; > + > + return (0); > +} > + > +int fesetexceptflag(const fexcept_t *flagp, int excepts) > +{ > + > + if (_libc_arm_fpu_present) > + __vfp_fesetexceptflag(flagp, excepts); > + __softfp_fesetexceptflag(flagp, excepts); > + > + return (0); > +} > + > +int feraiseexcept(int excepts) > +{ > + > + if (_libc_arm_fpu_present) > + __vfp_feraiseexcept(excepts); > + __softfp_feraiseexcept(excepts); > + > + 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); > + > + return (__got_excepts); > +} > + > +int fegetround(void) > +{ > + > + if (_libc_arm_fpu_present) > + return __softfp_round_from_vfp(__vfp_fegetround()); > + return __softfp_fegetround(); > +} > + > +int fesetround(int round) > +{ > + > + if (_libc_arm_fpu_present) > + __vfp_fesetround(__softfp_round_to_vfp(round)); > + __softfp_fesetround(round); > + > + return (0); > +} > + > +int fegetenv(fenv_t *envp) > +{ > + fenv_t __vfp_envp; > + > + __vfp_envp = 0; > + if (_libc_arm_fpu_present) > + __vfp_fegetenv(&__vfp_envp); > + __softfp_fegetenv(envp); > + *envp |= __vfp_envp; > + > + 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; > + > + return (0); > +} > + > +int fesetenv(const fenv_t *envp) > +{ > + > + if (_libc_arm_fpu_present) > + __vfp_fesetenv(envp); > + __softfp_fesetenv(envp); > + > + return (0); > +} > + > +int feupdateenv(const fenv_t *envp) > +{ > + > + if (_libc_arm_fpu_present) > + __vfp_feupdateenv(envp); > + __softfp_feupdateenv(envp); > + > + return (0); > +} > + > +int feenableexcept(int __mask) > +{ > + int __unmasked; > + > + __unmasked = 0; > + if (_libc_arm_fpu_present) > + __unmasked = __vfp_feenableexcept(__mask); > + __unmasked |= __softfp_feenableexcept(__mask); > + > + return (__unmasked); > +} > + > +int fedisableexcept(int __mask) > +{ > + int __unmasked; > + > + __unmasked = 0; > + if (_libc_arm_fpu_present) > + __unmasked = __vfp_fedisableexcept(__mask); > + __unmasked |= __softfp_fedisableexcept(__mask); > + > + return (__unmasked); > +} > + > +int fegetexcept(void) > +{ > + int __unmasked; > + > + __unmasked = 0; > + if (_libc_arm_fpu_present) > + __unmasked = __vfp_fegetexcept(); > + __unmasked |= __softfp_fegetexcept(); > + > + return (__unmasked); > +} > + > +#endif > + > diff --git a/newlib/libm/machine/arm/feraiseexcept.c > b/newlib/libm/machine/arm/feraiseexcept.c > new file mode 100644 > index 000000000..8cbee7771 > --- /dev/null > +++ b/newlib/libm/machine/arm/feraiseexcept.c > @@ -0,0 +1,7 @@ > +/* > + * SPDX-License-Identifier: BSD-2-Clause > + * > + * (c) Copyright 2019 Joel Sherrill <j...@rtems.org> > + */ > + > +#include "../../fenv/fenv_stub.c" > diff --git a/newlib/libm/machine/arm/fesetenv.c > b/newlib/libm/machine/arm/fesetenv.c > new file mode 100644 > index 000000000..8cbee7771 > --- /dev/null > +++ b/newlib/libm/machine/arm/fesetenv.c > @@ -0,0 +1,7 @@ > +/* > + * SPDX-License-Identifier: BSD-2-Clause > + * > + * (c) Copyright 2019 Joel Sherrill <j...@rtems.org> > + */ > + > +#include "../../fenv/fenv_stub.c" > diff --git a/newlib/libm/machine/arm/fesetexceptflag.c > b/newlib/libm/machine/arm/fesetexceptflag.c > new file mode 100644 > index 000000000..8cbee7771 > --- /dev/null > +++ b/newlib/libm/machine/arm/fesetexceptflag.c > @@ -0,0 +1,7 @@ > +/* > + * SPDX-License-Identifier: BSD-2-Clause > + * > + * (c) Copyright 2019 Joel Sherrill <j...@rtems.org> > + */ > + > +#include "../../fenv/fenv_stub.c" > diff --git a/newlib/libm/machine/arm/fesetround.c > b/newlib/libm/machine/arm/fesetround.c > new file mode 100644 > index 000000000..8cbee7771 > --- /dev/null > +++ b/newlib/libm/machine/arm/fesetround.c > @@ -0,0 +1,7 @@ > +/* > + * SPDX-License-Identifier: BSD-2-Clause > + * > + * (c) Copyright 2019 Joel Sherrill <j...@rtems.org> > + */ > + > +#include "../../fenv/fenv_stub.c" > diff --git a/newlib/libm/machine/arm/fetestexcept.c > b/newlib/libm/machine/arm/fetestexcept.c > new file mode 100644 > index 000000000..8cbee7771 > --- /dev/null > +++ b/newlib/libm/machine/arm/fetestexcept.c > @@ -0,0 +1,7 @@ > +/* > + * SPDX-License-Identifier: BSD-2-Clause > + * > + * (c) Copyright 2019 Joel Sherrill <j...@rtems.org> > + */ > + > +#include "../../fenv/fenv_stub.c" > diff --git a/newlib/libm/machine/arm/feupdateenv.c > b/newlib/libm/machine/arm/feupdateenv.c > new file mode 100644 > index 000000000..8cbee7771 > --- /dev/null > +++ b/newlib/libm/machine/arm/feupdateenv.c > @@ -0,0 +1,7 @@ > +/* > + * SPDX-License-Identifier: BSD-2-Clause > + * > + * (c) Copyright 2019 Joel Sherrill <j...@rtems.org> > + */ > + > +#include "../../fenv/fenv_stub.c" > -- > 2.17.1 > >
_______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel