[PATCH] Change ARM fenv support similar to x86_64

Eshan Dhawan eshandhawan51 at gmail.com
Fri Jul 17 20:58:57 UTC 2020


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 <eshandhawan51 at gmail.com>
wrote:

> All the extra files have been removed
>
> Signed-off-by: Eshan dhawan <eshandhawan51 at 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 <andrew at 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 <das at 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 <das at 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 <andrew at 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 <andrew at 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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20200718/60865ae6/attachment-0001.html>


More information about the devel mailing list