[PATCH] SPARC fenv support

Joel Sherrill joel at rtems.org
Wed Jun 3 22:57:02 UTC 2020


This looks great. By chat, you confirmed, you did the
multilib compile and link spot check plus it the psxfenv
test runs on erc32. Go ahead and submit this to newlib at .

The code has ifdefs for 64-bits. RTEMS has sparc64 support so
it would be straight forward to follow the x86_64 and i386 pattern
to add support for sparc64 right after it is merged.

NOTE: We do not have anyway to execute sparc64 code AFAIK so
this would be just the multilib compile and link test portion.

Great job!

--joel

On Wed, Jun 3, 2020 at 5:22 PM Eshan dhawan <eshandhawan51 at gmail.com> wrote:

> Signed-off-by: Eshan dhawan <eshandhawan51 at gmail.com>
> ---
>  newlib/configure.host                       |   1 +
>  newlib/libc/machine/sparc/sys/fenv.h        |  85 +++++
>  newlib/libm/machine/configure.in            |   1 +
>  newlib/libm/machine/sparc/Makefile.am       |  21 ++
>  newlib/libm/machine/sparc/configure.in      |  11 +
>  newlib/libm/machine/sparc/feclearexcept.c   |   7 +
>  newlib/libm/machine/sparc/fegetenv.c        |   7 +
>  newlib/libm/machine/sparc/fegetexceptflag.c |   7 +
>  newlib/libm/machine/sparc/fegetround.c      |   7 +
>  newlib/libm/machine/sparc/feholdexcept.c    |   7 +
>  newlib/libm/machine/sparc/fenv.c            | 350 ++++++++++++++++++++
>  newlib/libm/machine/sparc/feraiseexcept.c   |   7 +
>  newlib/libm/machine/sparc/fesetenv.c        |   7 +
>  newlib/libm/machine/sparc/fesetexceptflag.c |   7 +
>  newlib/libm/machine/sparc/fesetround.c      |   7 +
>  newlib/libm/machine/sparc/fetestexcept.c    |   7 +
>  newlib/libm/machine/sparc/feupdateenv.c     |   7 +
>  17 files changed, 546 insertions(+)
>  create mode 100644 newlib/libc/machine/sparc/sys/fenv.h
>  create mode 100644 newlib/libm/machine/sparc/Makefile.am
>  create mode 100644 newlib/libm/machine/sparc/configure.in
>  create mode 100644 newlib/libm/machine/sparc/feclearexcept.c
>  create mode 100644 newlib/libm/machine/sparc/fegetenv.c
>  create mode 100644 newlib/libm/machine/sparc/fegetexceptflag.c
>  create mode 100644 newlib/libm/machine/sparc/fegetround.c
>  create mode 100644 newlib/libm/machine/sparc/feholdexcept.c
>  create mode 100644 newlib/libm/machine/sparc/fenv.c
>  create mode 100644 newlib/libm/machine/sparc/feraiseexcept.c
>  create mode 100644 newlib/libm/machine/sparc/fesetenv.c
>  create mode 100644 newlib/libm/machine/sparc/fesetexceptflag.c
>  create mode 100644 newlib/libm/machine/sparc/fesetround.c
>  create mode 100644 newlib/libm/machine/sparc/fetestexcept.c
>  create mode 100644 newlib/libm/machine/sparc/feupdateenv.c
>
> diff --git a/newlib/configure.host b/newlib/configure.host
> index a84c0c80a..f31f8bd1a 100644
> --- a/newlib/configure.host
> +++ b/newlib/configure.host
> @@ -321,6 +321,7 @@ case "${host_cpu}" in
>         machine_dir=sh
>         ;;
>    sparc*)
> +       libm_machine_dir=sparc
>         machine_dir=sparc
>         # FIXME: Might wish to make MALLOC_ALIGNMENT more generic.
>         newlib_cflags="${newlib_cflags} -DMALLOC_ALIGNMENT=8"
> diff --git a/newlib/libc/machine/sparc/sys/fenv.h
> b/newlib/libc/machine/sparc/sys/fenv.h
> new file mode 100644
> index 000000000..0d8fb13ea
> --- /dev/null
> +++ b/newlib/libc/machine/sparc/sys/fenv.h
> @@ -0,0 +1,85 @@
> +/*     $NetBSD: fenv.h,v 1.2 2017/01/14 12:00:13 martin Exp $  */
> +
> +/*-
> + * 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$
> + */
> +
> +#ifndef        _SYS_FENV_H_
> +#define        _SYS_FENV_H_
> +
> +#include <stdint.h>
> +
> +#ifdef __arch64__
> +typedef        uint64_t        fenv_t;
> +typedef        uint64_t        fexcept_t;
> +#else
> +typedef        uint32_t        fenv_t;
> +typedef        uint32_t        fexcept_t;
> +#endif
> +
> +/*
> + * Exception flags
> + *
> + * Symbols are defined in such a way, to correspond to the accrued
> + * exception bits (aexc) fields of FSR.
> + */
> +#define        FE_INEXACT      0x00000020      /* 0000100000 */
> +#define        FE_DIVBYZERO    0x00000040      /* 0001000000 */
> +#define        FE_UNDERFLOW    0x00000080      /* 0010000000 */
> +#define        FE_OVERFLOW     0x00000100      /* 0100000000 */
> +#define        FE_INVALID      0x00000200      /* 1000000000 */
> +
> +#define        FE_ALL_EXCEPT   (FE_DIVBYZERO | FE_INEXACT | \
> +    FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW)
> +
> +/*
> + * Rounding modes
> + *
> + * We can't just use the hardware bit values here, because that would
> + * make FE_UPWARD and FE_DOWNWARD negative, which is not allowed.
> + */
> +#define        FE_TONEAREST    0       /* round to nearest representable
> number */
> +#define        FE_TOWARDZERO   1       /* round to zero (truncate) */
> +#define        FE_UPWARD       2       /* round toward positive infinity
> */
> +#define        FE_DOWNWARD     3       /* round toward negative infinity
> */
> +#define        _ROUND_MASK     (FE_TONEAREST | FE_DOWNWARD | \
> +    FE_UPWARD | FE_TOWARDZERO)
> +#define        _ROUND_SHIFT    30
> +
> +
> +
> +/* Default floating-point environment */
> +extern const fenv_t *_fe_dfl_env;
> +#define FE_DFL_ENV _fe_dfl_env
> +
> +/* We need to be able to map status flag positions to mask flag positions
> */
> +#define        _FPUSW_SHIFT    18
> +#define        _ENABLE_MASK    (FE_ALL_EXCEPT << _FPUSW_SHIFT)
> +
> +
> +
> +#endif /* !_SYS_FENV_H_ */
> diff --git a/newlib/libm/machine/configure.in b/newlib/libm/machine/
> configure.in
> index d4635214a..b8cf52bef 100644
> --- a/newlib/libm/machine/configure.in
> +++ b/newlib/libm/machine/configure.in
> @@ -33,6 +33,7 @@ if test -n "${libm_machine_dir}"; then
>         spu) AC_CONFIG_SUBDIRS(spu) ;;
>         riscv) AC_CONFIG_SUBDIRS(riscv) ;;
>         x86_64) AC_CONFIG_SUBDIRS(x86_64) ;;
> +       sparc) AC_CONFIG_SUBDIRS(sparc) ;;
>    esac;
>    if test "${use_libtool}" = "yes"; then
>      machlib=${libm_machine_dir}/lib${libm_machine_dir}.${aext}
> diff --git a/newlib/libm/machine/sparc/Makefile.am
> b/newlib/libm/machine/sparc/Makefile.am
> new file mode 100644
> index 000000000..34157760b
> --- /dev/null
> +++ b/newlib/libm/machine/sparc/Makefile.am
> @@ -0,0 +1,21 @@
> +## Process this file with automake to generate Makefile.in
> +
> +INCLUDES = -I $(newlib_basedir)/../newlib/libm/common $(NEWLIB_CFLAGS) \
> +       $(CROSS_CFLAGS) $(TARGET_CFLAGS)
> +
> +LIB_SOURCES = \
> +       feclearexcept.c  fegetenv.c fegetexceptflag.c \
> +       fegetround.c feholdexcept.c feraiseexcept.c fesetenv.c \
> +       fesetexceptflag.c fesetround.c fetestexcept.c feupdateenv.c \
> +       fenv.c
> +
> +noinst_LIBRARIES = lib.a
> +lib_a_SOURCES = $(LIB_SOURCES)
> +lib_a_CFLAGS = $(AM_CFLAGS)
> +lib_a_CCASFLAGS = $(AM_CCASFLAGS)
> +noinst_DATA =
> +
> +include $(srcdir)/../../../Makefile.shared
> +
> +ACLOCAL_AMFLAGS = -I ../../.. -I ../../../..
> +CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
> diff --git a/newlib/libm/machine/sparc/configure.in
> b/newlib/libm/machine/sparc/configure.in
> new file mode 100644
> index 000000000..7a22fa31c
> --- /dev/null
> +++ b/newlib/libm/machine/sparc/configure.in
> @@ -0,0 +1,11 @@
> +
> +AC_PREREQ(2.59)
> +AC_INIT([newlib],[NEWLIB_VERSION])
> +AC_CONFIG_SRCDIR([Makefile.am])
> +
> +AC_CONFIG_AUX_DIR(../../../..)
> +
> +NEWLIB_CONFIGURE(../../..)
> +
> +AC_CONFIG_FILES([Makefile])
> +AC_OUTPUT
> diff --git a/newlib/libm/machine/sparc/feclearexcept.c
> b/newlib/libm/machine/sparc/feclearexcept.c
> new file mode 100644
> index 000000000..8cbee7771
> --- /dev/null
> +++ b/newlib/libm/machine/sparc/feclearexcept.c
> @@ -0,0 +1,7 @@
> +/*
> + * SPDX-License-Identifier: BSD-2-Clause
> + *
> + * (c) Copyright 2019 Joel Sherrill <joel at rtems.org>
> + */
> +
> +#include "../../fenv/fenv_stub.c"
> diff --git a/newlib/libm/machine/sparc/fegetenv.c
> b/newlib/libm/machine/sparc/fegetenv.c
> new file mode 100644
> index 000000000..8cbee7771
> --- /dev/null
> +++ b/newlib/libm/machine/sparc/fegetenv.c
> @@ -0,0 +1,7 @@
> +/*
> + * SPDX-License-Identifier: BSD-2-Clause
> + *
> + * (c) Copyright 2019 Joel Sherrill <joel at rtems.org>
> + */
> +
> +#include "../../fenv/fenv_stub.c"
> diff --git a/newlib/libm/machine/sparc/fegetexceptflag.c
> b/newlib/libm/machine/sparc/fegetexceptflag.c
> new file mode 100644
> index 000000000..8cbee7771
> --- /dev/null
> +++ b/newlib/libm/machine/sparc/fegetexceptflag.c
> @@ -0,0 +1,7 @@
> +/*
> + * SPDX-License-Identifier: BSD-2-Clause
> + *
> + * (c) Copyright 2019 Joel Sherrill <joel at rtems.org>
> + */
> +
> +#include "../../fenv/fenv_stub.c"
> diff --git a/newlib/libm/machine/sparc/fegetround.c
> b/newlib/libm/machine/sparc/fegetround.c
> new file mode 100644
> index 000000000..8cbee7771
> --- /dev/null
> +++ b/newlib/libm/machine/sparc/fegetround.c
> @@ -0,0 +1,7 @@
> +/*
> + * SPDX-License-Identifier: BSD-2-Clause
> + *
> + * (c) Copyright 2019 Joel Sherrill <joel at rtems.org>
> + */
> +
> +#include "../../fenv/fenv_stub.c"
> diff --git a/newlib/libm/machine/sparc/feholdexcept.c
> b/newlib/libm/machine/sparc/feholdexcept.c
> new file mode 100644
> index 000000000..8cbee7771
> --- /dev/null
> +++ b/newlib/libm/machine/sparc/feholdexcept.c
> @@ -0,0 +1,7 @@
> +/*
> + * SPDX-License-Identifier: BSD-2-Clause
> + *
> + * (c) Copyright 2019 Joel Sherrill <joel at rtems.org>
> + */
> +
> +#include "../../fenv/fenv_stub.c"
> diff --git a/newlib/libm/machine/sparc/fenv.c
> b/newlib/libm/machine/sparc/fenv.c
> new file mode 100644
> index 000000000..127898021
> --- /dev/null
> +++ b/newlib/libm/machine/sparc/fenv.c
> @@ -0,0 +1,350 @@
> +/*     $NetBSD: fenv.c,v 1.2 2017/03/22 23:11:09 chs Exp $     */
> +
> +/*-
> + * 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
> + */
> +#include <sys/cdefs.h>
> +__RCSID("$NetBSD: fenv.c,v 1.2 2017/03/22 23:11:09 chs Exp $");
> +
> +
> +
> +#include <assert.h>
> +#include <fenv.h>
> +
> +#define _DIAGASSERT(x) assert(x)
> +
> +#ifdef __weak_alias
> +__weak_alias(feclearexcept,_feclearexcept)
> +__weak_alias(fedisableexcept,_fedisableexcept)
> +__weak_alias(feenableexcept,_feenableexcept)
> +__weak_alias(fegetenv,_fegetenv)
> +__weak_alias(fegetexcept,_fegetexcept)
> +__weak_alias(fegetexceptflag,_fegetexceptflag)
> +__weak_alias(fegetround,_fegetround)
> +__weak_alias(feholdexcept,_feholdexcept)
> +__weak_alias(feraiseexcept,_feraiseexcept)
> +__weak_alias(fesetenv,_fesetenv)
> +__weak_alias(fesetexceptflag,_fesetexceptflag)
> +__weak_alias(fesetround,_fesetround)
> +__weak_alias(fetestexcept,_fetestexcept)
> +__weak_alias(feupdateenv,_feupdateenv)
> +#endif
> +
> +/* Load floating-point state register (32bits) */
> +#define        __ldfsr(__r)    __asm__ __volatile__            \
> +       ("ld %0, %%fsr" : : "m" (__r))
> +
> +/* Save floating-point state register (32bits) */
> +#define        __stfsr(__r)    __asm__ __volatile__            \
> +       ("st %%fsr, %0" : "=m" (*(__r)))
> +
> +/*
> + * The feclearexcept() function clears the supported floating-point
> exceptions
> + * represented by `excepts'.
> + */
> +int
> +feclearexcept(int excepts)
> +{
> +       fexcept_t r;
> +       int ex;
> +
> +       _DIAGASSERT((excepts & ~FE_ALL_EXCEPT) == 0);
> +
> +       ex = excepts & FE_ALL_EXCEPT;
> +
> +       __stfsr(&r);
> +       r &= ~ex;
> +       __ldfsr(r);
> +
> +       /* Success */
> +       return 0;
> +}
> +
> +/*
> + * The fegetexceptflag() function stores an implementation-defined
> + * representation of the states of the floating-point status flags
> indicated
> + * by the argument excepts in the object pointed to by the argument flagp.
> + */
> +int
> +fegetexceptflag(fexcept_t *flagp, int excepts)
> +{
> +       fexcept_t r;
> +       int ex;
> +
> +       _DIAGASSERT(flagp != NULL);
> +       _DIAGASSERT((excepts & ~FE_ALL_EXCEPT) == 0);
> +
> +       ex = excepts & FE_ALL_EXCEPT;
> +
> +       __stfsr(&r);
> +       *flagp = r & ex;
> +
> +       /* Success */
> +       return 0;
> +}
> +
> +
> +/*
> + * This function sets the floating-point status flags indicated by the
> argument
> + * `excepts' to the states stored in the object pointed to by `flagp'. It
> does
> + * NOT raise any floating-point exceptions, but only sets the state of
> the flags.
> + */
> +int
> +fesetexceptflag(const fexcept_t *flagp, int excepts)
> +{
> +       fexcept_t r;
> +       int ex;
> +
> +       _DIAGASSERT(flagp != NULL);
> +       _DIAGASSERT((excepts & ~FE_ALL_EXCEPT) == 0);
> +
> +       ex = excepts & FE_ALL_EXCEPT;
> +
> +       __stfsr(&r);
> +       r &= ~ex;
> +       r |= *flagp & ex;
> +       __ldfsr(r);
> +
> +       /* Success */
> +       return 0;
> +}
> +
> +/*
> + * The feraiseexcept() function raises the supported floating-point
> exceptions
> + * represented by the argument `excepts'.
> + *
> + * The order in which these floating-point exceptions are raised is
> unspecified
> + * (by the standard).
> + */
> +int
> +feraiseexcept(int excepts)
> +{
> +       volatile double d;
> +       int ex;
> +
> +       _DIAGASSERT((excepts & ~FE_ALL_EXCEPT) == 0);
> +
> +       ex = excepts & FE_ALL_EXCEPT;
> +
> +       /*
> +        * With a compiler that supports the FENV_ACCESS pragma properly,
> simple
> +        * expressions like '0.0 / 0.0' should be sufficient to generate
> traps.
> +        * Unfortunately, we need to bring a volatile variable into the
> equation
> +        * to prevent incorrect optimizations.
> +        */
> +       if (ex & FE_INVALID) {
> +               d = 0.0;
> +               d = 0.0 / d;
> +       }
> +       if (ex & FE_DIVBYZERO) {
> +               d = 0.0;
> +               d = 1.0 / d;
> +       }
> +       if (ex & FE_OVERFLOW) {
> +               d = 0x1.ffp1023;
> +               d *= 2.0;
> +       }
> +       if (ex & FE_UNDERFLOW) {
> +               d = 0x1p-1022;
> +               d /= 0x1p1023;
> +       }
> +       if (ex & FE_INEXACT) {
> +               d = 0x1p-1022;
> +               d += 1.0;
> +       }
> +
> +       /* Success */
> +       return 0;
> +}
> +
> +/*
> + * The fetestexcept() function determines which of a specified subset of
> the
> + * floating-point exception flags are currently set. The `excepts'
> argument
> + * specifies the floating-point status flags to be queried.
> + */
> +int
> +fetestexcept(int excepts)
> +{
> +       fexcept_t r;
> +
> +       _DIAGASSERT((excepts & ~FE_ALL_EXCEPT) == 0);
> +
> +       __stfsr(&r);
> +
> +       return r & (excepts & FE_ALL_EXCEPT);
> +}
> +
> +/*
> + * The fegetround() function gets the current rounding direction.
> + */
> +int
> +fegetround(void)
> +{
> +       fenv_t r;
> +
> +       __stfsr(&r);
> +
> +       return (r >> _ROUND_SHIFT) & _ROUND_MASK;
> +}
> +
> +/*
> + * The fesetround() function establishes the rounding direction
> represented by
> + * its argument `round'. If the argument is not equal to the value of a
> rounding
> + * direction macro, the rounding direction is not changed.
> + */
> +int
> +fesetround(int round)
> +{
> +       fenv_t r;
> +
> +       _DIAGASSERT((round & ~_ROUND_MASK) == 0);
> +       if (round & ~_ROUND_MASK)
> +               return -1;
> +
> +       __stfsr(&r);
> +       r &= ~(_ROUND_MASK << _ROUND_SHIFT);
> +       r |= round << _ROUND_SHIFT;
> +       __ldfsr(r);
> +
> +       /* Success */
> +       return 0;
> +}
> +
> +/*
> + * The fegetenv() function attempts to store the current floating-point
> + * environment in the object pointed to by envp.
> + */
> +int
> +fegetenv(fenv_t *envp)
> +{
> +       _DIAGASSERT(envp != NULL);
> +
> +       __stfsr(envp);
> +
> +       /* Success */
> +       return 0;
> +}
> +
> +
> +/*
> + * The feholdexcept() function saves the current floating-point
> environment
> + * in the object pointed to by envp, clears the floating-point status
> flags, and
> + * then installs a non-stop (continue on floating-point exceptions) mode,
> if
> + * available, for all floating-point exceptions.
> + */
> +int
> +feholdexcept(fenv_t *envp)
> +{
> +       fenv_t r;
> +
> +       _DIAGASSERT(envp != NULL);
> +
> +       __stfsr(&r);
> +       *envp = r;
> +       r &= ~(FE_ALL_EXCEPT | _ENABLE_MASK);
> +       __ldfsr(r);
> +
> +       /* Success */
> +       return 0;
> +}
> +
> +/*
> + * The fesetenv() function attempts to establish the floating-point
> environment
> + * represented by the object pointed to by envp. The argument `envp'
> points
> + * to an object set by a call to fegetenv() or feholdexcept(), or equal a
> + * floating-point environment macro. The fesetenv() function does not
> raise
> + * floating-point exceptions, but only installs the state of the
> floating-point
> + * status flags represented through its argument.
> + */
> +int
> +fesetenv(const fenv_t *envp)
> +{
> +       _DIAGASSERT(envp != NULL);
> +
> +       __ldfsr(*envp);
> +
> +       /* Success */
> +       return 0;
> +}
> +
> +
> +/*
> + * The feupdateenv() function saves the currently raised floating-point
> + * exceptions in its automatic storage, installs the floating-point
> environment
> + * represented by the object pointed to by `envp', and then raises the
> saved
> + * floating-point exceptions. The argument `envp' shall point to an
> object set
> + * by a call to feholdexcept() or fegetenv(), or equal a floating-point
> + * environment macro.
> + */
> +int
> +feupdateenv(const fenv_t *envp)
> +{
> +       fexcept_t r;
> +
> +       _DIAGASSERT(envp != NULL);
> +
> +       __stfsr(&r);
> +       __ldfsr(*envp);
> +
> +       _DIAGASSERT((r & ~FE_ALL_EXCEPT) == 0);
> +       feraiseexcept(r & FE_ALL_EXCEPT);
> +
> +       /* Success */
> +       return 0;
> +}
> +
> +/*
> + * The following functions are extentions to the standard
> + */
> +int
> +feenableexcept(int mask)
> +{
> +       fenv_t old_r, new_r;
> +
> +       __stfsr(&old_r);
> +       new_r = old_r | ((mask & FE_ALL_EXCEPT) << _FPUSW_SHIFT);
> +       __ldfsr(new_r);
> +
> +       return (old_r >> _FPUSW_SHIFT) & FE_ALL_EXCEPT;
> +}
> +
> +int
> +fedisableexcept(int mask)
> +{
> +       fenv_t old_r, new_r;
> +
> +       __stfsr(&old_r);
> +       new_r = old_r & ~((mask & FE_ALL_EXCEPT) << _FPUSW_SHIFT);
> +       __ldfsr(new_r);
> +
> +       return (old_r >> _FPUSW_SHIFT) & FE_ALL_EXCEPT;
> +}
> +
> +int
> +fegetexcept(void)
> +{
> +       fenv_t r;
> +
> +       __stfsr(&r);
> +       return (r & _ENABLE_MASK) >> _FPUSW_SHIFT;
> +}
> diff --git a/newlib/libm/machine/sparc/feraiseexcept.c
> b/newlib/libm/machine/sparc/feraiseexcept.c
> new file mode 100644
> index 000000000..8cbee7771
> --- /dev/null
> +++ b/newlib/libm/machine/sparc/feraiseexcept.c
> @@ -0,0 +1,7 @@
> +/*
> + * SPDX-License-Identifier: BSD-2-Clause
> + *
> + * (c) Copyright 2019 Joel Sherrill <joel at rtems.org>
> + */
> +
> +#include "../../fenv/fenv_stub.c"
> diff --git a/newlib/libm/machine/sparc/fesetenv.c
> b/newlib/libm/machine/sparc/fesetenv.c
> new file mode 100644
> index 000000000..8cbee7771
> --- /dev/null
> +++ b/newlib/libm/machine/sparc/fesetenv.c
> @@ -0,0 +1,7 @@
> +/*
> + * SPDX-License-Identifier: BSD-2-Clause
> + *
> + * (c) Copyright 2019 Joel Sherrill <joel at rtems.org>
> + */
> +
> +#include "../../fenv/fenv_stub.c"
> diff --git a/newlib/libm/machine/sparc/fesetexceptflag.c
> b/newlib/libm/machine/sparc/fesetexceptflag.c
> new file mode 100644
> index 000000000..8cbee7771
> --- /dev/null
> +++ b/newlib/libm/machine/sparc/fesetexceptflag.c
> @@ -0,0 +1,7 @@
> +/*
> + * SPDX-License-Identifier: BSD-2-Clause
> + *
> + * (c) Copyright 2019 Joel Sherrill <joel at rtems.org>
> + */
> +
> +#include "../../fenv/fenv_stub.c"
> diff --git a/newlib/libm/machine/sparc/fesetround.c
> b/newlib/libm/machine/sparc/fesetround.c
> new file mode 100644
> index 000000000..8cbee7771
> --- /dev/null
> +++ b/newlib/libm/machine/sparc/fesetround.c
> @@ -0,0 +1,7 @@
> +/*
> + * SPDX-License-Identifier: BSD-2-Clause
> + *
> + * (c) Copyright 2019 Joel Sherrill <joel at rtems.org>
> + */
> +
> +#include "../../fenv/fenv_stub.c"
> diff --git a/newlib/libm/machine/sparc/fetestexcept.c
> b/newlib/libm/machine/sparc/fetestexcept.c
> new file mode 100644
> index 000000000..8cbee7771
> --- /dev/null
> +++ b/newlib/libm/machine/sparc/fetestexcept.c
> @@ -0,0 +1,7 @@
> +/*
> + * SPDX-License-Identifier: BSD-2-Clause
> + *
> + * (c) Copyright 2019 Joel Sherrill <joel at rtems.org>
> + */
> +
> +#include "../../fenv/fenv_stub.c"
> diff --git a/newlib/libm/machine/sparc/feupdateenv.c
> b/newlib/libm/machine/sparc/feupdateenv.c
> new file mode 100644
> index 000000000..8cbee7771
> --- /dev/null
> +++ b/newlib/libm/machine/sparc/feupdateenv.c
> @@ -0,0 +1,7 @@
> +/*
> + * SPDX-License-Identifier: BSD-2-Clause
> + *
> + * (c) Copyright 2019 Joel Sherrill <joel at rtems.org>
> + */
> +
> +#include "../../fenv/fenv_stub.c"
> --
> 2.17.1
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20200603/074e7098/attachment-0001.html>


More information about the devel mailing list