[PATCH 0/1] Add fenv support for ARM

classic Classic list List threaded Threaded
9 messages Options
Reply | Threaded
Open this post in threaded view
|

[PATCH 0/1] Add fenv support for ARM

Sourceware - newlib list mailing list
This Patch adds Fenv support for ARM.

The implementation files are taken from FreeBSD.

The files are added to libm/machine/arm
and libc/machine/arm

Eshan dhawan (1):
  fenv support arm

 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

--
2.17.1

Reply | Threaded
Open this post in threaded view
|

[PATCH 1/1] fenv support arm

Sourceware - newlib list mailing list
Signed-off-by: Eshan dhawan <[hidden email]>
---
 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 <[hidden email]>
+ * 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 <[hidden email]>
+ * 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 <[hidden email]>
+ * 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 <[hidden email]>
+ * 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 <[hidden email]>
+ */
+
+#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 <[hidden email]>
+ */
+
+#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 <[hidden email]>
+ */
+
+#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 <[hidden email]>
+ */
+
+#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 <[hidden email]>
+ */
+
+#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 <[hidden email]>
+ */
+
+#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 <[hidden email]>
+ * 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 <[hidden email]>
+ * 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 <[hidden email]>
+ * Copyright (c) 2013 Andrew Turner <[hidden email]>
+ * 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 <[hidden email]>
+ */
+
+#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 <[hidden email]>
+ */
+
+#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 <[hidden email]>
+ */
+
+#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 <[hidden email]>
+ */
+
+#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 <[hidden email]>
+ */
+
+#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 <[hidden email]>
+ */
+
+#include "../../fenv/fenv_stub.c"
--
2.17.1

Reply | Threaded
Open this post in threaded view
|

Re: [PATCH 0/1] Add fenv support for ARM

Sourceware - newlib list mailing list
In reply to this post by Sourceware - newlib list mailing list
Patch pushed to master.  I modified COPYING.NEWLIB with the new licenses
and regenerated Makefile.in.  I noticed that
there were powerpc generated files that weren't checked in so I did a
separate patch for them prior to this one.  If you find
any issues, let me know.

-- Jeff J.

On Wed, Jun 3, 2020 at 1:47 PM Eshan dhawan via Newlib <
[hidden email]> wrote:

> This Patch adds Fenv support for ARM.
>
> The implementation files are taken from FreeBSD.
>
> The files are added to libm/machine/arm
> and libc/machine/arm
>
> Eshan dhawan (1):
>   fenv support arm
>
>  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
>
> --
> 2.17.1
>
>
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH 0/1] Add fenv support for ARM

Sebastian Huber-4
On 10/06/2020 03:15, Jeff Johnston via Newlib wrote:

> Patch pushed to master.  I modified COPYING.NEWLIB with the new licenses
> and regenerated Makefile.in.  I noticed that
> there were powerpc generated files that weren't checked in so I did a
> separate patch for them prior to this one.  If you find
> any issues, let me know.
Thanks for sorting this out. My Newlib build works now again for
powerpc-rtems. The arm-rtems target is also fine.
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH 1/1] fenv support arm

Szabolcs Nagy-2
In reply to this post by Sourceware - newlib list mailing list
The 06/03/2020 23:15, Eshan dhawan via Newlib wrote:
> --- /dev/null
> +++ b/newlib/libc/machine/arm/sys/fenv.h
...

> +#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 */

why are these declarations conditional?

i get build failures e.g. in libgfortran
because configure detects the availability
of feenableexcept in libm.a so it starts
using it but then fenv.h does not have the
declaration so compilation fails.

it seems there is vfp code for all this
so why are the declarations removed?

Reply | Threaded
Open this post in threaded view
|

Re: [PATCH 1/1] fenv support arm

Joel Sherrill
On Thu, Jul 2, 2020 at 7:11 AM Szabolcs Nagy <[hidden email]> wrote:

> The 06/03/2020 23:15, Eshan dhawan via Newlib wrote:
> > --- /dev/null
> > +++ b/newlib/libc/machine/arm/sys/fenv.h
> ...
> > +#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 */
>
> why are these declarations conditional?
>

The prototypes for the POSIX methods are in the shared fenv.h.

Since the ARM has the BSD_VISIBLE extras, those should be left in the arm
specific sys/fenv.h.

But (I don't think) they need a ARM_PCS_VFP wrapper since there should be
an implementation for all multilibs.  We could discuss the BSD_VISIBLE
prototypes being moved to <fenv.h> and removed from all the architecture
<sys/fenv.h>
but that was also how the code I moved from Cygwin to newlib libm was done
so
maybe there is a reason that I don't know to leave it here.

>
> i get build failures e.g. in libgfortran
> because configure detects the availability
> of feenableexcept in libm.a so it starts
> using it but then fenv.h does not have the
> declaration so compilation fails.
>
> it seems there is vfp code for all this
> so why are the declarations removed?
>

The FreeBSD headers rely on the architecture sys/fenv.h prototypes
even for POSIX standard methods. Most of the block of code is removed
because the prototypes were in <fenv.h> which is where this file is included
from.

Eshan... re-add the BSD_VISIBLE block please and resubmit. It also
looks like the test code isn't exercising those methods so that should
be updated after this patch is updated. We don't want libfortran broken
for longer than neccessary.

--joel
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH 1/1] fenv support arm

Joel Sherrill
Szabolcs, is the code in question compiled with any feature flags set?

I see on Linux that the prototypes would be triggered by _GNU_SOURCE while
in newlib, it is _BSD_SOURCE. Is that possibly contributing?

Can you post a test case? The command line that is failing would also help.

I'd like to not guess at what's wrong.

--joel

On Thu, Jul 2, 2020 at 10:48 AM Joel Sherrill <[hidden email]> wrote:

>
>
> On Thu, Jul 2, 2020 at 7:11 AM Szabolcs Nagy <[hidden email]>
> wrote:
>
>> The 06/03/2020 23:15, Eshan dhawan via Newlib wrote:
>> > --- /dev/null
>> > +++ b/newlib/libc/machine/arm/sys/fenv.h
>> ...
>> > +#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 */
>>
>> why are these declarations conditional?
>>
>
> The prototypes for the POSIX methods are in the shared fenv.h.
>
> Since the ARM has the BSD_VISIBLE extras, those should be left in the arm
> specific sys/fenv.h.
>
> But (I don't think) they need a ARM_PCS_VFP wrapper since there should be
> an implementation for all multilibs.  We could discuss the BSD_VISIBLE
> prototypes being moved to <fenv.h> and removed from all the architecture
> <sys/fenv.h>
> but that was also how the code I moved from Cygwin to newlib libm was done
> so
> maybe there is a reason that I don't know to leave it here.
>
>>
>> i get build failures e.g. in libgfortran
>> because configure detects the availability
>> of feenableexcept in libm.a so it starts
>> using it but then fenv.h does not have the
>> declaration so compilation fails.
>>
>> it seems there is vfp code for all this
>> so why are the declarations removed?
>>
>
> The FreeBSD headers rely on the architecture sys/fenv.h prototypes
> even for POSIX standard methods. Most of the block of code is removed
> because the prototypes were in <fenv.h> which is where this file is
> included
> from.
>
> Eshan... re-add the BSD_VISIBLE block please and resubmit. It also
> looks like the test code isn't exercising those methods so that should
> be updated after this patch is updated. We don't want libfortran broken
> for longer than neccessary.
>
> --joel
>
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH 1/1] fenv support arm

Szabolcs Nagy-2
The 07/02/2020 17:33, Joel Sherrill wrote:
> Szabolcs, is the code in question compiled with any feature flags set?

feature flags are not relevant to my issue.

>
> I see on Linux that the prototypes would be triggered by _GNU_SOURCE while
> in newlib, it is _BSD_SOURCE. Is that possibly contributing?

(feenableexcept should be hidden when compiling
in standard conform mode, _BSD_VISIBLE is a bit
misleading as it is historically a gnu extension
not BSD, but it does not matter: _GNU_SOURCE
exposes _BSD_VISISBLE code.)

>
> Can you post a test case? The command line that is failing would also help.

the problem is simply that sys/fenv.h has no
function declarations at all with hard float
abi. (fenv.h still has declarations but only
the standard apis) e.g.

echo '#include <fenv.h>
void *p = (void*)feenableexcept;' | \
 arm-none-eabi-gcc -march=armv5te+fp -mfloat-abi=hard -include fenv.h -xc -c -

<stdin>:2:16: error: 'feenableexcept' undeclared here (not in a function); did you mean 'feraiseexcept'?

echo '#include <sys/fenv.h>
void *p = (void*)feraiseexcept;' | \
 arm-none-eabi-gcc -march=armv5te+fp -mfloat-abi=hard -include fenv.h -xc -c -

<stdin>:2:16: error: 'feraiseexcept' undeclared here (not in a function)


>
> I'd like to not guess at what's wrong.

i can submit a patch for removing the VFP ifndef
but i wanted to understand why is it there?

>
> --joel
>
> On Thu, Jul 2, 2020 at 10:48 AM Joel Sherrill <[hidden email]> wrote:
>
> >
> >
> > On Thu, Jul 2, 2020 at 7:11 AM Szabolcs Nagy <[hidden email]>
> > wrote:
> >
> >> The 06/03/2020 23:15, Eshan dhawan via Newlib wrote:
> >> > --- /dev/null
> >> > +++ b/newlib/libc/machine/arm/sys/fenv.h
> >> ...
> >> > +#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 */
> >>
> >> why are these declarations conditional?
> >>
> >
> > The prototypes for the POSIX methods are in the shared fenv.h.
> >
> > Since the ARM has the BSD_VISIBLE extras, those should be left in the arm
> > specific sys/fenv.h.
> >
> > But (I don't think) they need a ARM_PCS_VFP wrapper since there should be
> > an implementation for all multilibs.  We could discuss the BSD_VISIBLE
> > prototypes being moved to <fenv.h> and removed from all the architecture
> > <sys/fenv.h>
> > but that was also how the code I moved from Cygwin to newlib libm was done
> > so
> > maybe there is a reason that I don't know to leave it here.
> >
> >>
> >> i get build failures e.g. in libgfortran
> >> because configure detects the availability
> >> of feenableexcept in libm.a so it starts
> >> using it but then fenv.h does not have the
> >> declaration so compilation fails.
> >>
> >> it seems there is vfp code for all this
> >> so why are the declarations removed?
> >>
> >
> > The FreeBSD headers rely on the architecture sys/fenv.h prototypes
> > even for POSIX standard methods. Most of the block of code is removed
> > because the prototypes were in <fenv.h> which is where this file is
> > included
> > from.
> >
> > Eshan... re-add the BSD_VISIBLE block please and resubmit. It also
> > looks like the test code isn't exercising those methods so that should
> > be updated after this patch is updated. We don't want libfortran broken
> > for longer than neccessary.
> >
> > --joel
> >

--
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH 1/1] fenv support arm

Joel Sherrill
On Fri, Jul 3, 2020 at 4:14 AM Szabolcs Nagy <[hidden email]> wrote:

> The 07/02/2020 17:33, Joel Sherrill wrote:
> > Szabolcs, is the code in question compiled with any feature flags set?
>
> feature flags are not relevant to my issue.
>
> >
> > I see on Linux that the prototypes would be triggered by _GNU_SOURCE
> while
> > in newlib, it is _BSD_SOURCE. Is that possibly contributing?
>
> (feenableexcept should be hidden when compiling
> in standard conform mode, _BSD_VISIBLE is a bit
> misleading as it is historically a gnu extension
> not BSD, but it does not matter: _GNU_SOURCE
> exposes _BSD_VISISBLE code.)
>

In FreeBSD, it is under _BSD_SOURCE but the Cygwin source brought
over for x86_64 and i386 has _GNU_SOURCE.  Should a sweep be made
to make this consistent across the architectures?


> >
> > Can you post a test case? The command line that is failing would also
> help.
>
> the problem is simply that sys/fenv.h has no
> function declarations at all with hard float
> abi. (fenv.h still has declarations but only
> the standard apis) e.g.
>
> echo '#include <fenv.h>
> void *p = (void*)feenableexcept;' | \
>  arm-none-eabi-gcc -march=armv5te+fp -mfloat-abi=hard -include fenv.h -xc
> -c -
>
> <stdin>:2:16: error: 'feenableexcept' undeclared here (not in a function);
> did you mean 'feraiseexcept'?
>
> echo '#include <sys/fenv.h>
> void *p = (void*)feraiseexcept;' | \
>  arm-none-eabi-gcc -march=armv5te+fp -mfloat-abi=hard -include fenv.h -xc
> -c -
>
> <stdin>:2:16: error: 'feraiseexcept' undeclared here (not in a function)
>
>
> >
> > I'd like to not guess at what's wrong.
>
> i can submit a patch for removing the VFP ifndef
> but i wanted to understand why is it there?
>

The original FreeBSD code used some name remapping magic based on VFP or
soft-float or whatever to map the names of the methods appropriately. The
port to newlib simplified that since multilib results in only having one
version of the
methods in the library.

This is just a remnant of the FreeBSD approach and should be removed. Feel
free
to remove it.

--joel

>
> >
> > --joel
> >
> > On Thu, Jul 2, 2020 at 10:48 AM Joel Sherrill <[hidden email]> wrote:
> >
> > >
> > >
> > > On Thu, Jul 2, 2020 at 7:11 AM Szabolcs Nagy <[hidden email]>
> > > wrote:
> > >
> > >> The 06/03/2020 23:15, Eshan dhawan via Newlib wrote:
> > >> > --- /dev/null
> > >> > +++ b/newlib/libc/machine/arm/sys/fenv.h
> > >> ...
> > >> > +#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 */
> > >>
> > >> why are these declarations conditional?
> > >>
> > >
> > > The prototypes for the POSIX methods are in the shared fenv.h.
> > >
> > > Since the ARM has the BSD_VISIBLE extras, those should be left in the
> arm
> > > specific sys/fenv.h.
> > >
> > > But (I don't think) they need a ARM_PCS_VFP wrapper since there should
> be
> > > an implementation for all multilibs.  We could discuss the BSD_VISIBLE
> > > prototypes being moved to <fenv.h> and removed from all the
> architecture
> > > <sys/fenv.h>
> > > but that was also how the code I moved from Cygwin to newlib libm was
> done
> > > so
> > > maybe there is a reason that I don't know to leave it here.
> > >
> > >>
> > >> i get build failures e.g. in libgfortran
> > >> because configure detects the availability
> > >> of feenableexcept in libm.a so it starts
> > >> using it but then fenv.h does not have the
> > >> declaration so compilation fails.
> > >>
> > >> it seems there is vfp code for all this
> > >> so why are the declarations removed?
> > >>
> > >
> > > The FreeBSD headers rely on the architecture sys/fenv.h prototypes
> > > even for POSIX standard methods. Most of the block of code is removed
> > > because the prototypes were in <fenv.h> which is where this file is
> > > included
> > > from.
> > >
> > > Eshan... re-add the BSD_VISIBLE block please and resubmit. It also
> > > looks like the test code isn't exercising those methods so that should
> > > be updated after this patch is updated. We don't want libfortran broken
> > > for longer than neccessary.
> > >
> > > --joel
> > >
>
> --
>