public inbox for newlib@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 0/1] Add fenv support for ARM
@ 2020-06-03 17:45 Eshan dhawan
  2020-06-03 17:45 ` [PATCH 1/1] fenv support arm Eshan dhawan
  2020-06-10  1:15 ` [PATCH 0/1] Add fenv support for ARM Jeff Johnston
  0 siblings, 2 replies; 9+ messages in thread
From: Eshan dhawan @ 2020-06-03 17:45 UTC (permalink / raw)
  To: newlib; +Cc: jeol, gedare, Eshan dhawan

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


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/1] fenv support arm
  2020-06-03 17:45 [PATCH 0/1] Add fenv support for ARM Eshan dhawan
@ 2020-06-03 17:45 ` Eshan dhawan
  2020-07-02 12:11   ` Szabolcs Nagy
  2020-06-10  1:15 ` [PATCH 0/1] Add fenv support for ARM Jeff Johnston
  1 sibling, 1 reply; 9+ messages in thread
From: Eshan dhawan @ 2020-06-03 17:45 UTC (permalink / raw)
  To: newlib; +Cc: jeol, gedare, Eshan dhawan

Signed-off-by: Eshan dhawan <eshandhawan51@gmail.com>
---
 newlib/libc/machine/arm/machine/acle-compat.h | 182 ++++++++++
 newlib/libc/machine/arm/machine/fenv-mangle.h |  53 +++
 .../libc/machine/arm/machine/fenv-softfloat.h | 187 ++++++++++
 newlib/libc/machine/arm/machine/fenv-vfp.h    | 187 ++++++++++
 newlib/libc/machine/arm/sys/fenv.h            | 122 +++++++
 newlib/libm/machine/arm/Makefile.am           |  18 +-
 newlib/libm/machine/arm/fe_dfl_env.c          |   7 +
 newlib/libm/machine/arm/feclearexcept.c       |   7 +
 newlib/libm/machine/arm/fegetenv.c            |   7 +
 newlib/libm/machine/arm/fegetexceptflag.c     |   7 +
 newlib/libm/machine/arm/fegetround.c          |   7 +
 newlib/libm/machine/arm/feholdexcept.c        |   7 +
 newlib/libm/machine/arm/fenv-softfp.c         |  32 ++
 newlib/libm/machine/arm/fenv-vfp.c            |  32 ++
 newlib/libm/machine/arm/fenv.c                | 328 ++++++++++++++++++
 newlib/libm/machine/arm/feraiseexcept.c       |   7 +
 newlib/libm/machine/arm/fesetenv.c            |   7 +
 newlib/libm/machine/arm/fesetexceptflag.c     |   7 +
 newlib/libm/machine/arm/fesetround.c          |   7 +
 newlib/libm/machine/arm/fetestexcept.c        |   7 +
 newlib/libm/machine/arm/feupdateenv.c         |   7 +
 21 files changed, 1224 insertions(+), 1 deletion(-)
 create mode 100644 newlib/libc/machine/arm/machine/acle-compat.h
 create mode 100644 newlib/libc/machine/arm/machine/fenv-mangle.h
 create mode 100644 newlib/libc/machine/arm/machine/fenv-softfloat.h
 create mode 100644 newlib/libc/machine/arm/machine/fenv-vfp.h
 create mode 100644 newlib/libc/machine/arm/sys/fenv.h
 create mode 100644 newlib/libm/machine/arm/fe_dfl_env.c
 create mode 100644 newlib/libm/machine/arm/feclearexcept.c
 create mode 100644 newlib/libm/machine/arm/fegetenv.c
 create mode 100644 newlib/libm/machine/arm/fegetexceptflag.c
 create mode 100644 newlib/libm/machine/arm/fegetround.c
 create mode 100644 newlib/libm/machine/arm/feholdexcept.c
 create mode 100644 newlib/libm/machine/arm/fenv-softfp.c
 create mode 100644 newlib/libm/machine/arm/fenv-vfp.c
 create mode 100644 newlib/libm/machine/arm/fenv.c
 create mode 100644 newlib/libm/machine/arm/feraiseexcept.c
 create mode 100644 newlib/libm/machine/arm/fesetenv.c
 create mode 100644 newlib/libm/machine/arm/fesetexceptflag.c
 create mode 100644 newlib/libm/machine/arm/fesetround.c
 create mode 100644 newlib/libm/machine/arm/fetestexcept.c
 create mode 100644 newlib/libm/machine/arm/feupdateenv.c

diff --git a/newlib/libc/machine/arm/machine/acle-compat.h b/newlib/libc/machine/arm/machine/acle-compat.h
new file mode 100644
index 000000000..888ae2ea8
--- /dev/null
+++ b/newlib/libc/machine/arm/machine/acle-compat.h
@@ -0,0 +1,182 @@
+/*
+ * Copyright (c) 2014 ARM Ltd
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the company may not be used to endorse or promote
+ *    products derived from this software without specific prior written
+ *    permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __ARM_ARCH
+
+/* ACLE standardises a set of pre-defines that describe the ARM architecture.
+   These were mostly implemented in GCC around GCC-4.8; older versions
+   have no, or only partial support.  To provide a level of backwards
+   compatibility we try to work out what the definitions should be, given
+   the older pre-defines that GCC did produce.  This isn't complete, but
+   it should be enough for use by routines that depend on this header.  */
+
+/* No need to handle ARMv8, GCC had ACLE support before that.  */
+
+# ifdef __ARM_ARCH_7__
+/* The common subset of ARMv7 in all profiles.  */
+#  define __ARM_ARCH 7
+#  define __ARM_ARCH_ISA_THUMB 2
+#  define __ARM_FEATURE_CLZ
+#  define __ARM_FEATURE_LDREX 7
+#  define __ARM_FEATURE_UNALIGNED
+# endif
+
+# if defined (__ARM_ARCH_7A__) || defined (__ARM_ARCH_7R__)
+#  define __ARM_ARCH 7
+#  define __ARM_ARCH_ISA_THUMB 2
+#  define __ARM_ARCH_ISA_ARM
+#  define __ARM_FEATURE_CLZ
+#  define __ARM_FEATURE_SIMD32
+#  define __ARM_FEATURE_DSP
+#  define __ARM_FEATURE_QBIT
+#  define __ARM_FEATURE_SAT
+#  define __ARM_FEATURE_LDREX 15
+#  define __ARM_FEATURE_UNALIGNED
+#  ifdef __ARM_ARCH_7A__
+#   define __ARM_ARCH_PROFILE 'A'
+#  else
+#   define __ARM_ARCH_PROFILE 'R'
+#  endif
+# endif
+
+# ifdef __ARM_ARCH_7EM__
+#  define __ARM_ARCH 7
+#  define __ARM_ARCH_ISA_THUMB 2
+#  define __ARM_FEATURE_CLZ
+#  define __ARM_FEATURE_SIMD32
+#  define __ARM_FEATURE_DSP
+#  define __ARM_FEATURE_QBIT
+#  define __ARM_FEATURE_SAT
+#  define __ARM_FEATURE_LDREX 7
+#  define __ARM_FEATURE_UNALIGNED
+#  define __ARM_ARCH_PROFILE 'M'
+# endif
+
+# ifdef __ARM_ARCH_7M__
+#  define __ARM_ARCH 7
+#  define __ARM_ARCH_ISA_THUMB 2
+#  define __ARM_FEATURE_CLZ
+#  define __ARM_FEATURE_QBIT
+#  define __ARM_FEATURE_SAT
+#  define __ARM_FEATURE_LDREX 7
+#  define __ARM_FEATURE_UNALIGNED
+#  define __ARM_ARCH_PROFILE 'M'
+# endif
+
+# ifdef __ARM_ARCH_6T2__
+#  define __ARM_ARCH 6
+#  define __ARM_ARCH_ISA_THUMB 2
+#  define __ARM_ARCH_ISA_ARM
+#  define __ARM_FEATURE_CLZ
+#  define __ARM_FEATURE_SIMD32
+#  define __ARM_FEATURE_DSP
+#  define __ARM_FEATURE_QBIT
+#  define __ARM_FEATURE_SAT
+#  define __ARM_FEATURE_LDREX 4
+#  define __ARM_FEATURE_UNALIGNED
+# endif
+
+# ifdef __ARM_ARCH_6M__
+#  define __ARM_ARCH 6
+#  define __ARM_ARCH_ISA_THUMB 1
+#  define __ARM_ARCH_PROFILE 'M'
+# endif
+
+# if defined (__ARM_ARCH_6__) || defined (__ARM_ARCH_6J__) \
+  || defined (__ARM_ARCH_6K__) || defined (__ARM_ARCH_6Z__) \
+  || defined (__ARM_ARCH_6ZK__)
+#  define __ARM_ARCH 6
+#  define __ARM_ARCH_ISA_THUMB 1
+#  define __ARM_ARCH_ISA_ARM
+#  define __ARM_FEATURE_CLZ
+#  define __ARM_FEATURE_SIMD32
+#  define __ARM_FEATURE_DSP
+#  define __ARM_FEATURE_QBIT
+#  define __ARM_FEATURE_SAT
+#  define __ARM_FEATURE_UNALIGNED
+#  ifndef __thumb__
+#   if defined (__ARM_ARCH_6K__) || defined (__ARM_ARCH_6ZK__)
+#    define __ARM_FEATURE_LDREX 15
+#   else
+#    define __ARM_FEATURE_LDREX 4
+#   endif
+#  endif
+# endif
+
+# if defined (__ARM_ARCH_5TE__) || defined (__ARM_ARCH_5E__)
+#  define __ARM_ARCH 5
+#  define __ARM_ARCH_ISA_ARM
+#  ifdef __ARM_ARCH_5TE__
+#   define __ARM_ARCH_ISA_THUMB 1
+#  endif
+#  define __ARM_FEATURE_CLZ
+#  define __ARM_FEATURE_DSP
+# endif
+
+# if defined (__ARM_ARCH_5T__) || defined (__ARM_ARCH_5__)
+#  define __ARM_ARCH 5
+#  define __ARM_ARCH_ISA_ARM
+#  ifdef __ARM_ARCH_5TE__
+#   define __ARM_ARCH_ISA_THUMB 1
+#  endif
+#  define __ARM_FEATURE_CLZ
+# endif
+
+# ifdef __ARM_ARCH_4T__
+#  define __ARM_ARCH 4
+#  define __ARM_ARCH_ISA_ARM
+#  define __ARM_ARCH_ISA_THUMB 1
+# endif
+
+# ifdef __ARM_ARCH_4__
+#  define __ARM_ARCH 4
+#  define __ARM_ARCH_ISA_ARM
+# endif
+
+# if defined (__ARM_ARCH_3__) || defined (__ARM_ARCH_3M__)
+#  define __ARM_ARCH 3
+#  define __ARM_ARCH_ISA_ARM
+# endif
+
+# ifdef __ARM_ARCH_2__
+#  define __ARM_ARCH 2
+#  define __ARM_ARCH_ISA_ARM
+# endif
+
+# ifdef __ARMEB__
+#  define __ARM_BIG_ENDIAN
+# endif
+
+/* If we still don't know what the target architecture is, then we're
+   probably not using GCC.  */
+# ifndef __ARM_ARCH
+#  error Unable to determine architecture version.
+# endif
+
+#endif /* __ARM_ARCH  */
+
diff --git a/newlib/libc/machine/arm/machine/fenv-mangle.h b/newlib/libc/machine/arm/machine/fenv-mangle.h
new file mode 100644
index 000000000..476f7b20c
--- /dev/null
+++ b/newlib/libc/machine/arm/machine/fenv-mangle.h
@@ -0,0 +1,53 @@
+/*-
+ * Copyright (c) 2013 Andrew Turner <andrew@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifdef _FENV_MANGLE_H_
+#error Only include fenv-mangle.h once
+#endif
+
+#define	_FENV_MANGLE_H_
+
+#ifndef FENV_MANGLE
+#error FENV_MANGLE is undefined
+#endif
+
+#define	feclearexcept	FENV_MANGLE(feclearexcept)
+#define	fegetexceptflag	FENV_MANGLE(fegetexceptflag)
+#define	fesetexceptflag	FENV_MANGLE(fesetexceptflag)
+#define	feraiseexcept	FENV_MANGLE(feraiseexcept)
+#define	fetestexcept	FENV_MANGLE(fetestexcept)
+#define	fegetround	FENV_MANGLE(fegetround)
+#define	fesetround	FENV_MANGLE(fesetround)
+#define	fegetenv	FENV_MANGLE(fegetenv)
+#define	feholdexcept	FENV_MANGLE(feholdexcept)
+#define	fesetenv	FENV_MANGLE(fesetenv)
+#define	feupdateenv	FENV_MANGLE(feupdateenv)
+#define	feenableexcept	FENV_MANGLE(feenableexcept)
+#define	fedisableexcept	FENV_MANGLE(fedisableexcept)
+#define	fegetexcept	FENV_MANGLE(fegetexcept)
+
diff --git a/newlib/libc/machine/arm/machine/fenv-softfloat.h b/newlib/libc/machine/arm/machine/fenv-softfloat.h
new file mode 100644
index 000000000..b650437cc
--- /dev/null
+++ b/newlib/libc/machine/arm/machine/fenv-softfloat.h
@@ -0,0 +1,187 @@
+ /*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2004-2011 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef	_SYS_FENV_H_
+#error "This file is meant to be included only by <sys/fenv.h>."
+#endif
+/* the file can be added from architecture specific fenv.h file found in
+ *libc/sys/arch/sys *
+ *
+ * This file implements the functionality of <fenv.h> on platforms that
+ * lack an FPU and use softfloat in libc for floating point.  To use it,
+ * you must write an <fenv.h> that provides the following:
+ *
+ *   - a typedef for fenv_t, which may be an integer or struct type
+ *   - a typedef for fexcept_t (XXX This file assumes fexcept_t is a
+ *     simple integer type containing the exception mask.)
+ *   - definitions of FE_* constants for the five exceptions and four
+ *     rounding modes in IEEE 754, as described in fenv(3)
+ *   - a definition, and the corresponding external symbol, for FE_DFL_ENV
+ *   - a macro __set_env(env, flags, mask, rnd), which sets the given fenv_t
+ *     from the exception flags, mask, and rounding mode
+ *   - macros __env_flags(env), __env_mask(env), and __env_round(env), which
+ *     extract fields from an fenv_t
+ *   - a definition of __fenv_static
+ *
+ * If the architecture supports an optional FPU, it's recommended that you
+ * define fenv_t and fexcept_t to match the hardware ABI.  Otherwise, it
+ * doesn't matter how you define them.
+ */
+#include <errno.h>
+
+int __softfloat_float_exception_flags;
+int __softfloat_float_exception_mask;
+int __softfloat_float_rounding_mode;
+
+
+__fenv_static inline int
+feclearexcept(int excepts)
+{
+
+	__softfloat_float_exception_flags &= ~excepts;
+	return (0);
+}
+
+__fenv_static inline int
+fegetexceptflag(fexcept_t *flagp, int excepts)
+{
+
+	*flagp = __softfloat_float_exception_flags & excepts;
+	return (0);
+}
+
+__fenv_static inline int
+fesetexceptflag(const fexcept_t *flagp, int excepts)
+{
+
+	__softfloat_float_exception_flags &= ~excepts;
+	__softfloat_float_exception_flags |= *flagp & excepts;
+	return (0);
+}
+
+__fenv_static inline int
+feraiseexcept(int excepts)
+{
+
+	return (excepts  ?  -ENOTSUP : 0);
+}
+
+__fenv_static inline int
+fetestexcept(int excepts)
+{
+
+	return (__softfloat_float_exception_flags & excepts);
+}
+
+__fenv_static inline int
+fegetround(void)
+{
+
+	return (__softfloat_float_rounding_mode);
+}
+
+__fenv_static inline int
+fesetround(int round)
+{
+
+	__softfloat_float_rounding_mode = round;
+	return (0);
+}
+
+__fenv_static inline int
+fegetenv(fenv_t *envp)
+{
+
+	__set_env(*envp, __softfloat_float_exception_flags,
+	    __softfloat_float_exception_mask, __softfloat_float_rounding_mode);
+	return (0);
+}
+
+__fenv_static inline int
+feholdexcept(fenv_t *envp)
+{
+	fenv_t __env;
+
+	fegetenv(envp);
+	__softfloat_float_exception_flags = 0;
+	__softfloat_float_exception_mask = 0;
+	return (0);
+}
+
+__fenv_static inline int
+fesetenv(const fenv_t *envp)
+{
+
+	__softfloat_float_exception_flags = __env_flags(*envp);
+	__softfloat_float_exception_mask = __env_mask(*envp);
+	__softfloat_float_rounding_mode = __env_round(*envp);
+	return (0);
+}
+
+__fenv_static inline int
+feupdateenv(const fenv_t *envp)
+{
+	int __oflags = __softfloat_float_exception_flags;
+
+	fesetenv(envp);
+	feraiseexcept(__oflags);
+	return (0);
+}
+
+#if __BSD_VISIBLE
+
+/* We currently provide no external definitions of the functions below. */
+
+__fenv_static inline int
+feenableexcept(int __mask)
+{
+	int __omask = __softfloat_float_exception_mask;
+
+	__softfloat_float_exception_mask |= __mask;
+	return (__omask);
+}
+
+__fenv_static inline int
+fedisableexcept(int __mask)
+{
+	int __omask = __softfloat_float_exception_mask;
+
+	__softfloat_float_exception_mask &= ~__mask;
+	return (__omask);
+}
+
+__fenv_static inline int
+fegetexcept(void)
+{
+
+	return (__softfloat_float_exception_mask);
+}
+
+#endif /* __BSD_VISIBLE */
diff --git a/newlib/libc/machine/arm/machine/fenv-vfp.h b/newlib/libc/machine/arm/machine/fenv-vfp.h
new file mode 100644
index 000000000..25d71f3ab
--- /dev/null
+++ b/newlib/libc/machine/arm/machine/fenv-vfp.h
@@ -0,0 +1,187 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2004-2005 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+
+
+#define	vmrs_fpscr(__r)	__asm __volatile("vmrs %0, fpscr" : "=&r"(__r))
+#define	vmsr_fpscr(__r)	__asm __volatile("vmsr fpscr, %0" : : "r"(__r))
+
+
+#define _FPU_MASK_SHIFT	8
+
+__fenv_static inline int feclearexcept(int excepts)
+{
+	fexcept_t __fpsr;
+
+	vmrs_fpscr(__fpsr);
+	__fpsr &= ~excepts;
+	vmsr_fpscr(__fpsr);
+	return (0);
+}
+
+__fenv_static inline int
+fegetexceptflag(fexcept_t *flagp, int excepts)
+{
+	fexcept_t __fpsr;
+
+	vmrs_fpscr(__fpsr);
+	*flagp = __fpsr & excepts;
+	return (0);
+}
+
+__fenv_static inline int
+fesetexceptflag(const fexcept_t *flagp, int excepts)
+{
+	fexcept_t __fpsr;
+
+	vmrs_fpscr(__fpsr);
+	__fpsr &= ~excepts;
+	__fpsr |= *flagp & excepts;
+	vmsr_fpscr(__fpsr);
+	return (0);
+}
+
+__fenv_static inline int
+feraiseexcept(int excepts)
+{
+	fexcept_t __ex = excepts;
+
+	fesetexceptflag(&__ex, excepts);	/* XXX */
+	return (0);
+}
+
+__fenv_static inline int
+fetestexcept(int excepts)
+{
+	fexcept_t __fpsr;
+
+	vmrs_fpscr(__fpsr);
+	return (__fpsr & excepts);
+}
+
+__fenv_static inline int
+fegetround(void)
+{
+	fenv_t __fpsr;
+
+	vmrs_fpscr(__fpsr);
+	return (__fpsr & _ROUND_MASK);
+}
+
+__fenv_static inline int
+fesetround(int round)
+{
+	fenv_t __fpsr;
+
+	vmrs_fpscr(__fpsr);
+	__fpsr &= ~(_ROUND_MASK);
+	__fpsr |= round;
+	vmsr_fpscr(__fpsr);
+	return (0);
+}
+
+__fenv_static inline int
+fegetenv(fenv_t *envp)
+{
+
+	vmrs_fpscr(*envp);
+	return (0);
+}
+
+__fenv_static inline int
+feholdexcept(fenv_t *envp)
+{
+	fenv_t __env;
+
+	vmrs_fpscr(__env);
+	*envp = __env;
+	__env &= ~(FE_ALL_EXCEPT);
+	vmsr_fpscr(__env);
+	return (0);
+}
+
+__fenv_static inline int
+fesetenv(const fenv_t *envp)
+{
+
+	vmsr_fpscr(*envp);
+	return (0);
+}
+
+__fenv_static inline int
+feupdateenv(const fenv_t *envp)
+{
+	fexcept_t __fpsr;
+
+	vmrs_fpscr(__fpsr);
+	vmsr_fpscr(*envp);
+	feraiseexcept(__fpsr & FE_ALL_EXCEPT);
+	return (0);
+}
+
+#if __BSD_VISIBLE
+
+/* We currently provide no external definitions of the functions below. */
+
+__fenv_static inline int
+feenableexcept(int __mask)
+{
+	fenv_t __old_fpsr, __new_fpsr;
+
+	vmrs_fpscr(__old_fpsr);
+	__new_fpsr = __old_fpsr |
+	    ((__mask & FE_ALL_EXCEPT) << _FPU_MASK_SHIFT);
+	vmsr_fpscr(__new_fpsr);
+	return ((__old_fpsr >> _FPU_MASK_SHIFT) & FE_ALL_EXCEPT);
+}
+
+__fenv_static inline int
+fedisableexcept(int __mask)
+{
+	fenv_t __old_fpsr, __new_fpsr;
+
+	vmrs_fpscr(__old_fpsr);
+	__new_fpsr = __old_fpsr &
+	    ~((__mask & FE_ALL_EXCEPT) << _FPU_MASK_SHIFT);
+	vmsr_fpscr(__new_fpsr);
+	return ((__old_fpsr >> _FPU_MASK_SHIFT) & FE_ALL_EXCEPT);
+}
+
+__fenv_static inline int
+fegetexcept(void)
+{
+	fenv_t __fpsr;
+
+	vmrs_fpscr(__fpsr);
+	return (__fpsr & FE_ALL_EXCEPT);
+}
+
+#endif /* __BSD_VISIBLE */
+
diff --git a/newlib/libc/machine/arm/sys/fenv.h b/newlib/libc/machine/arm/sys/fenv.h
new file mode 100644
index 000000000..af74c5f47
--- /dev/null
+++ b/newlib/libc/machine/arm/sys/fenv.h
@@ -0,0 +1,122 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2004-2005 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _SYS_FENV_H_
+#define _SYS_FENV_H_ 1
+
+#include <sys/_types.h>
+#include <sys/cdefs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef	__fenv_static
+#define	__fenv_static static
+#endif
+
+typedef int fenv_t;
+typedef int fexcept_t;
+
+/* Exception flags */
+#define	FE_INVALID	0x0001
+#define	FE_DIVBYZERO	0x0002
+#define	FE_OVERFLOW	0x0004
+#define	FE_UNDERFLOW	0x0008
+#define	FE_INEXACT	0x0010
+#ifdef __ARM_PCS_VFP
+#define	FE_DENORMAL	0x0080
+#define	FE_ALL_EXCEPT	(FE_DIVBYZERO | FE_INEXACT | \
+			 FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW | FE_DENORMAL)
+#else
+#define	FE_ALL_EXCEPT	(FE_DIVBYZERO | FE_INEXACT | \
+			 FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW)
+#endif
+
+
+
+/* Rounding modes */
+#define	VFP_FE_TONEAREST	0x00000000
+#define	VFP_FE_UPWARD		0x00400000
+#define	VFP_FE_DOWNWARD		0x00800000
+#define	VFP_FE_TOWARDZERO	0x00c00000
+
+#ifdef __ARM_PCS_VFP
+#define	FE_TONEAREST	VFP_FE_TONEAREST
+#define	FE_UPWARD	VFP_FE_UPWARD
+#define	FE_DOWNWARD	VFP_FE_DOWNWARD
+#define	FE_TOWARDZERO	VFP_FE_TOWARDZERO
+#else
+#define	FE_TONEAREST	0x0000
+#define	FE_TOWARDZERO	0x0001
+#define	FE_UPWARD	0x0002
+#define	FE_DOWNWARD	0x0003
+#endif
+#define	_ROUND_MASK	(FE_TONEAREST | FE_DOWNWARD | \
+			 FE_UPWARD | FE_TOWARDZERO)
+
+
+/* Default floating-point environment */
+
+extern const fenv_t	*_fe_dfl_env;
+#define	FE_DFL_ENV	(_fe_dfl_env)
+
+/* We need to be able to map status flag positions to mask flag positions */
+#ifndef __ARM_PCS_VFP
+#define	_FPUSW_SHIFT	16
+#define	_ENABLE_MASK	(FE_ALL_EXCEPT << _FPUSW_SHIFT)
+#endif
+
+#ifndef __ARM_PCS_VFP
+
+int feclearexcept(int excepts);
+int fegetexceptflag(fexcept_t *flagp, int excepts);
+int fesetexceptflag(const fexcept_t *flagp, int excepts);
+int feraiseexcept(int excepts);
+int fetestexcept(int excepts);
+int fegetround(void);
+int fesetround(int round);
+int fegetenv(fenv_t *envp);
+int feholdexcept(fenv_t *envp);
+int fesetenv(const fenv_t *envp);
+int feupdateenv(const fenv_t *envp);
+#if __BSD_VISIBLE
+int feenableexcept(int __mask);
+int fedisableexcept(int __mask);
+int fegetexcept(void);
+#endif /* __BSD_VISIBLE */
+
+#endif	/* __ARM_PCS_VFP */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SYS_FENV_H_ */ 
diff --git a/newlib/libm/machine/arm/Makefile.am b/newlib/libm/machine/arm/Makefile.am
index 1f10a7a40..a64ee59d5 100644
--- a/newlib/libm/machine/arm/Makefile.am
+++ b/newlib/libm/machine/arm/Makefile.am
@@ -19,7 +19,23 @@ LIB_SOURCES = \
 	sf_nearbyint.c \
 	sf_rint.c \
 	sf_round.c \
-	sf_trunc.c
+	sf_trunc.c \
+	feclearexcept.c \
+	fe_dfl_env.c\
+	fegetenv.c \
+	fegetexceptflag.c \
+	fegetround.c \
+	feholdexcept.c \
+	fenv.c \
+	feraiseexcept.c \
+	fesetenv.c \
+	fesetexceptflag.c \
+	fesetround.c \
+	fetestexcept.c \
+	feupdateenv.c \
+	fenv-vfp.c \
+	fenv-softfp.c 
+
 
 noinst_LIBRARIES = lib.a
 lib_a_SOURCES = $(LIB_SOURCES)
diff --git a/newlib/libm/machine/arm/fe_dfl_env.c b/newlib/libm/machine/arm/fe_dfl_env.c
new file mode 100644
index 000000000..8cbee7771
--- /dev/null
+++ b/newlib/libm/machine/arm/fe_dfl_env.c
@@ -0,0 +1,7 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * (c) Copyright 2019 Joel Sherrill <joel@rtems.org>
+ */
+
+#include "../../fenv/fenv_stub.c"
diff --git a/newlib/libm/machine/arm/feclearexcept.c b/newlib/libm/machine/arm/feclearexcept.c
new file mode 100644
index 000000000..8cbee7771
--- /dev/null
+++ b/newlib/libm/machine/arm/feclearexcept.c
@@ -0,0 +1,7 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * (c) Copyright 2019 Joel Sherrill <joel@rtems.org>
+ */
+
+#include "../../fenv/fenv_stub.c"
diff --git a/newlib/libm/machine/arm/fegetenv.c b/newlib/libm/machine/arm/fegetenv.c
new file mode 100644
index 000000000..8cbee7771
--- /dev/null
+++ b/newlib/libm/machine/arm/fegetenv.c
@@ -0,0 +1,7 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * (c) Copyright 2019 Joel Sherrill <joel@rtems.org>
+ */
+
+#include "../../fenv/fenv_stub.c"
diff --git a/newlib/libm/machine/arm/fegetexceptflag.c b/newlib/libm/machine/arm/fegetexceptflag.c
new file mode 100644
index 000000000..8cbee7771
--- /dev/null
+++ b/newlib/libm/machine/arm/fegetexceptflag.c
@@ -0,0 +1,7 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * (c) Copyright 2019 Joel Sherrill <joel@rtems.org>
+ */
+
+#include "../../fenv/fenv_stub.c"
diff --git a/newlib/libm/machine/arm/fegetround.c b/newlib/libm/machine/arm/fegetround.c
new file mode 100644
index 000000000..8cbee7771
--- /dev/null
+++ b/newlib/libm/machine/arm/fegetround.c
@@ -0,0 +1,7 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * (c) Copyright 2019 Joel Sherrill <joel@rtems.org>
+ */
+
+#include "../../fenv/fenv_stub.c"
diff --git a/newlib/libm/machine/arm/feholdexcept.c b/newlib/libm/machine/arm/feholdexcept.c
new file mode 100644
index 000000000..8cbee7771
--- /dev/null
+++ b/newlib/libm/machine/arm/feholdexcept.c
@@ -0,0 +1,7 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * (c) Copyright 2019 Joel Sherrill <joel@rtems.org>
+ */
+
+#include "../../fenv/fenv_stub.c"
diff --git a/newlib/libm/machine/arm/fenv-softfp.c b/newlib/libm/machine/arm/fenv-softfp.c
new file mode 100644
index 000000000..a576cc1b2
--- /dev/null
+++ b/newlib/libm/machine/arm/fenv-softfp.c
@@ -0,0 +1,32 @@
+/*-
+ * Copyright (c) 2013 Andrew Turner <andrew@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#define	FENV_MANGLE(x)	__softfp_ ##x
+#include <machine/fenv-mangle.h>
+#include "fenv.c"
+
diff --git a/newlib/libm/machine/arm/fenv-vfp.c b/newlib/libm/machine/arm/fenv-vfp.c
new file mode 100644
index 000000000..297e81296
--- /dev/null
+++ b/newlib/libm/machine/arm/fenv-vfp.c
@@ -0,0 +1,32 @@
+/*-
+ * Copyright (c) 2013 Andrew Turner <andrew@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#define	FENV_MANGLE(x)	__vfp_ ##x
+#include <machine/fenv-mangle.h>
+#include "fenv.c"
+
diff --git a/newlib/libm/machine/arm/fenv.c b/newlib/libm/machine/arm/fenv.c
new file mode 100644
index 000000000..5b61ab81f
--- /dev/null
+++ b/newlib/libm/machine/arm/fenv.c
@@ -0,0 +1,328 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * Copyright (c) 2013 Andrew Turner <andrew@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#define	__fenv_static
+#include <fenv.h>
+
+#include <machine/acle-compat.h>
+
+#if __ARM_ARCH >= 6
+#define FENV_ARMv6
+#endif
+
+/* When SOFTFP_ABI is defined we are using the softfp ABI. */
+#if defined(__VFP_FP__) && !defined(__ARM_PCS_VFP)
+#define SOFTFP_ABI
+#endif
+
+
+#ifndef FENV_MANGLE
+/*
+ * Hopefully the system ID byte is immutable, so it's valid to use
+ * this as a default environment.
+ */
+fenv_t __fe_dfl_env = { 0 };
+
+const fenv_t *_fe_dfl_env = &__fe_dfl_env;
+#endif
+
+
+/* If this is a non-mangled softfp version special processing is required */
+#if defined(FENV_MANGLE) || !defined(SOFTFP_ABI) || !defined(FENV_ARMv6)
+
+/*
+ * The following macros map between the softfloat emulator's flags and
+ * the hardware's FPSR.  The hardware this file was written for doesn't
+ * have rounding control bits, so we stick those in the system ID byte.
+ */
+#ifndef __ARM_PCS_VFP
+#define	__set_env(env, flags, mask, rnd) env = ((flags)			\
+						| (mask)<<_FPUSW_SHIFT	\
+						| (rnd) << 24)
+#define	__env_flags(env)		((env) & FE_ALL_EXCEPT)
+#define	__env_mask(env)			(((env) >> _FPUSW_SHIFT)	\
+						& FE_ALL_EXCEPT)
+#define	__env_round(env)		(((env) >> 24) & _ROUND_MASK)
+
+#include <machine/fenv-softfloat.h>
+
+#else /* __ARM_PCS_VFP PRESENT */
+
+#include <machine/fenv-vfp.h>
+
+#endif /* __ARM_PCS_VFP */
+
+#ifdef __GNUC_GNU_INLINE__
+#error "This file must be compiled with C99 'inline' semantics"
+#endif
+
+extern inline int feclearexcept(int excepts);
+extern inline int fegetexceptflag(fexcept_t *flagp, int excepts);
+extern inline int fesetexceptflag(const fexcept_t *flagp, int excepts);
+extern inline int feraiseexcept(int excepts);
+extern inline int fetestexcept(int excepts);
+extern inline int fegetround(void);
+extern inline int fesetround(int round);
+extern inline int fegetenv(fenv_t *envp);
+extern inline int feholdexcept(fenv_t *envp);
+extern inline int fesetenv(const fenv_t *envp);
+extern inline int feupdateenv(const fenv_t *envp);
+extern inline int feenableexcept(int __mask);
+extern inline int fedisableexcept(int __mask);
+extern inline int fegetexcept(void);
+
+#else /* !FENV_MANGLE && SOFTFP_ABI */
+/* Set by libc when the VFP unit is enabled */
+
+int _libc_arm_fpu_present;
+
+int __softfp_feclearexcept(int excepts);
+int __softfp_fegetexceptflag(fexcept_t *flagp, int excepts);
+int __softfp_fesetexceptflag(const fexcept_t *flagp, int excepts);
+int __softfp_feraiseexcept(int excepts);
+int __softfp_fetestexcept(int excepts);
+int __softfp_fegetround(void);
+int __softfp_fesetround(int round);
+int __softfp_fegetenv(fenv_t *envp);
+int __softfp_feholdexcept(fenv_t *envp);
+int __softfp_fesetenv(const fenv_t *envp);
+int __softfp_feupdateenv(const fenv_t *envp);
+int __softfp_feenableexcept(int __mask);
+int __softfp_fedisableexcept(int __mask);
+int __softfp_fegetexcept(void);
+
+int __vfp_feclearexcept(int excepts);
+int __vfp_fegetexceptflag(fexcept_t *flagp, int excepts);
+int __vfp_fesetexceptflag(const fexcept_t *flagp, int excepts);
+int __vfp_feraiseexcept(int excepts);
+int __vfp_fetestexcept(int excepts);
+int __vfp_fegetround(void);
+int __vfp_fesetround(int round);
+int __vfp_fegetenv(fenv_t *envp);
+int __vfp_feholdexcept(fenv_t *envp);
+int __vfp_fesetenv(const fenv_t *envp);
+int __vfp_feupdateenv(const fenv_t *envp);
+int __vfp_feenableexcept(int __mask);
+int __vfp_fedisableexcept(int __mask);
+int __vfp_fegetexcept(void);
+
+static int
+__softfp_round_to_vfp(int round)
+{
+
+	switch (round) {
+	case FE_TONEAREST:
+	default:
+		return VFP_FE_TONEAREST;
+	case FE_TOWARDZERO:
+		return VFP_FE_TOWARDZERO;
+	case FE_UPWARD:
+		return VFP_FE_UPWARD;
+	case FE_DOWNWARD:
+		return VFP_FE_DOWNWARD;
+	}
+}
+
+static int
+__softfp_round_from_vfp(int round)
+{
+
+	switch (round) {
+	case VFP_FE_TONEAREST:
+	default:
+		return FE_TONEAREST;
+	case VFP_FE_TOWARDZERO:
+		return FE_TOWARDZERO;
+	case VFP_FE_UPWARD:
+		return FE_UPWARD;
+	case VFP_FE_DOWNWARD:
+		return FE_DOWNWARD;
+	}
+}
+
+int feclearexcept(int excepts)
+{
+
+	if (_libc_arm_fpu_present)
+		__vfp_feclearexcept(excepts);
+	__softfp_feclearexcept(excepts);
+
+	return (0);
+}
+
+int fegetexceptflag(fexcept_t *flagp, int excepts)
+{
+	fexcept_t __vfp_flagp;
+
+	__vfp_flagp = 0;
+	if (_libc_arm_fpu_present)
+		__vfp_fegetexceptflag(&__vfp_flagp, excepts);
+	__softfp_fegetexceptflag(flagp, excepts);
+
+	*flagp |= __vfp_flagp;
+
+	return (0);
+}
+
+int fesetexceptflag(const fexcept_t *flagp, int excepts)
+{
+
+	if (_libc_arm_fpu_present)
+		__vfp_fesetexceptflag(flagp, excepts);
+	__softfp_fesetexceptflag(flagp, excepts);
+
+	return (0);
+}
+
+int feraiseexcept(int excepts)
+{
+
+	if (_libc_arm_fpu_present)
+		__vfp_feraiseexcept(excepts);
+	__softfp_feraiseexcept(excepts);
+
+	return (0);
+}
+
+int fetestexcept(int excepts)
+{
+	int __got_excepts;
+
+	__got_excepts = 0;
+	if (_libc_arm_fpu_present)
+		__got_excepts = __vfp_fetestexcept(excepts);
+	__got_excepts |= __softfp_fetestexcept(excepts);
+
+	return (__got_excepts);
+}
+
+int fegetround(void)
+{
+
+	if (_libc_arm_fpu_present)
+		return __softfp_round_from_vfp(__vfp_fegetround());
+	return __softfp_fegetround();
+}
+
+int fesetround(int round)
+{
+
+	if (_libc_arm_fpu_present)
+		__vfp_fesetround(__softfp_round_to_vfp(round));
+	__softfp_fesetround(round);
+
+	return (0);
+}
+
+int fegetenv(fenv_t *envp)
+{
+	fenv_t __vfp_envp;
+
+	__vfp_envp = 0;
+	if (_libc_arm_fpu_present)
+		__vfp_fegetenv(&__vfp_envp);
+	__softfp_fegetenv(envp);
+	*envp |= __vfp_envp;
+
+	return (0);
+}
+
+int feholdexcept(fenv_t *envp)
+{
+	fenv_t __vfp_envp;
+
+	__vfp_envp = 0;
+	if (_libc_arm_fpu_present)
+		__vfp_feholdexcept(&__vfp_envp);
+	__softfp_feholdexcept(envp);
+	*envp |= __vfp_envp;
+
+	return (0);
+}
+
+int fesetenv(const fenv_t *envp)
+{
+
+	if (_libc_arm_fpu_present)
+		__vfp_fesetenv(envp);
+	__softfp_fesetenv(envp);
+
+	return (0);
+}
+
+int feupdateenv(const fenv_t *envp)
+{
+
+	if (_libc_arm_fpu_present)
+		__vfp_feupdateenv(envp);
+	__softfp_feupdateenv(envp);
+
+	return (0);
+}
+
+int feenableexcept(int __mask)
+{
+	int __unmasked;
+
+	__unmasked = 0;
+	if (_libc_arm_fpu_present)
+		__unmasked = __vfp_feenableexcept(__mask);
+	__unmasked |= __softfp_feenableexcept(__mask);
+
+	return (__unmasked);
+}
+
+int fedisableexcept(int __mask)
+{
+	int __unmasked;
+
+	__unmasked = 0;
+	if (_libc_arm_fpu_present)
+		__unmasked = __vfp_fedisableexcept(__mask);
+	__unmasked |= __softfp_fedisableexcept(__mask);
+
+	return (__unmasked);
+}
+
+int fegetexcept(void)
+{
+	int __unmasked;
+
+	__unmasked = 0;
+	if (_libc_arm_fpu_present)
+		__unmasked = __vfp_fegetexcept();
+	__unmasked |= __softfp_fegetexcept();
+
+	return (__unmasked);
+}
+
+#endif
+
diff --git a/newlib/libm/machine/arm/feraiseexcept.c b/newlib/libm/machine/arm/feraiseexcept.c
new file mode 100644
index 000000000..8cbee7771
--- /dev/null
+++ b/newlib/libm/machine/arm/feraiseexcept.c
@@ -0,0 +1,7 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * (c) Copyright 2019 Joel Sherrill <joel@rtems.org>
+ */
+
+#include "../../fenv/fenv_stub.c"
diff --git a/newlib/libm/machine/arm/fesetenv.c b/newlib/libm/machine/arm/fesetenv.c
new file mode 100644
index 000000000..8cbee7771
--- /dev/null
+++ b/newlib/libm/machine/arm/fesetenv.c
@@ -0,0 +1,7 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * (c) Copyright 2019 Joel Sherrill <joel@rtems.org>
+ */
+
+#include "../../fenv/fenv_stub.c"
diff --git a/newlib/libm/machine/arm/fesetexceptflag.c b/newlib/libm/machine/arm/fesetexceptflag.c
new file mode 100644
index 000000000..8cbee7771
--- /dev/null
+++ b/newlib/libm/machine/arm/fesetexceptflag.c
@@ -0,0 +1,7 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * (c) Copyright 2019 Joel Sherrill <joel@rtems.org>
+ */
+
+#include "../../fenv/fenv_stub.c"
diff --git a/newlib/libm/machine/arm/fesetround.c b/newlib/libm/machine/arm/fesetround.c
new file mode 100644
index 000000000..8cbee7771
--- /dev/null
+++ b/newlib/libm/machine/arm/fesetround.c
@@ -0,0 +1,7 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * (c) Copyright 2019 Joel Sherrill <joel@rtems.org>
+ */
+
+#include "../../fenv/fenv_stub.c"
diff --git a/newlib/libm/machine/arm/fetestexcept.c b/newlib/libm/machine/arm/fetestexcept.c
new file mode 100644
index 000000000..8cbee7771
--- /dev/null
+++ b/newlib/libm/machine/arm/fetestexcept.c
@@ -0,0 +1,7 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * (c) Copyright 2019 Joel Sherrill <joel@rtems.org>
+ */
+
+#include "../../fenv/fenv_stub.c"
diff --git a/newlib/libm/machine/arm/feupdateenv.c b/newlib/libm/machine/arm/feupdateenv.c
new file mode 100644
index 000000000..8cbee7771
--- /dev/null
+++ b/newlib/libm/machine/arm/feupdateenv.c
@@ -0,0 +1,7 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * (c) Copyright 2019 Joel Sherrill <joel@rtems.org>
+ */
+
+#include "../../fenv/fenv_stub.c"
-- 
2.17.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 0/1] Add fenv support for ARM
  2020-06-03 17:45 [PATCH 0/1] Add fenv support for ARM Eshan dhawan
  2020-06-03 17:45 ` [PATCH 1/1] fenv support arm Eshan dhawan
@ 2020-06-10  1:15 ` Jeff Johnston
  2020-06-10 17:31   ` Sebastian Huber
  1 sibling, 1 reply; 9+ messages in thread
From: Jeff Johnston @ 2020-06-10  1:15 UTC (permalink / raw)
  To: Eshan dhawan; +Cc: Newlib, jeol

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 <
newlib@sourceware.org> 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
>
>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 0/1] Add fenv support for ARM
  2020-06-10  1:15 ` [PATCH 0/1] Add fenv support for ARM Jeff Johnston
@ 2020-06-10 17:31   ` Sebastian Huber
  0 siblings, 0 replies; 9+ messages in thread
From: Sebastian Huber @ 2020-06-10 17:31 UTC (permalink / raw)
  To: Jeff Johnston, Eshan dhawan; +Cc: Newlib, jeol

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.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/1] fenv support arm
  2020-06-03 17:45 ` [PATCH 1/1] fenv support arm Eshan dhawan
@ 2020-07-02 12:11   ` Szabolcs Nagy
  2020-07-02 15:48     ` Joel Sherrill
  0 siblings, 1 reply; 9+ messages in thread
From: Szabolcs Nagy @ 2020-07-02 12:11 UTC (permalink / raw)
  To: Eshan dhawan; +Cc: newlib, jeol

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?


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/1] fenv support arm
  2020-07-02 12:11   ` Szabolcs Nagy
@ 2020-07-02 15:48     ` Joel Sherrill
  2020-07-02 22:33       ` Joel Sherrill
  0 siblings, 1 reply; 9+ messages in thread
From: Joel Sherrill @ 2020-07-02 15:48 UTC (permalink / raw)
  To: Szabolcs Nagy; +Cc: Eshan dhawan, Newlib, jeol

On Thu, Jul 2, 2020 at 7:11 AM Szabolcs Nagy <szabolcs.nagy@arm.com> 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

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/1] fenv support arm
  2020-07-02 15:48     ` Joel Sherrill
@ 2020-07-02 22:33       ` Joel Sherrill
  2020-07-03  9:14         ` Szabolcs Nagy
  0 siblings, 1 reply; 9+ messages in thread
From: Joel Sherrill @ 2020-07-02 22:33 UTC (permalink / raw)
  To: Szabolcs Nagy; +Cc: Eshan dhawan, Newlib, jeol

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 <joel@rtems.org> wrote:

>
>
> On Thu, Jul 2, 2020 at 7:11 AM Szabolcs Nagy <szabolcs.nagy@arm.com>
> 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
>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/1] fenv support arm
  2020-07-02 22:33       ` Joel Sherrill
@ 2020-07-03  9:14         ` Szabolcs Nagy
  2020-07-03 13:12           ` Joel Sherrill
  0 siblings, 1 reply; 9+ messages in thread
From: Szabolcs Nagy @ 2020-07-03  9:14 UTC (permalink / raw)
  To: Joel Sherrill; +Cc: Eshan dhawan, Newlib, jeol

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 <joel@rtems.org> wrote:
> 
> >
> >
> > On Thu, Jul 2, 2020 at 7:11 AM Szabolcs Nagy <szabolcs.nagy@arm.com>
> > 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
> >

-- 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/1] fenv support arm
  2020-07-03  9:14         ` Szabolcs Nagy
@ 2020-07-03 13:12           ` Joel Sherrill
  0 siblings, 0 replies; 9+ messages in thread
From: Joel Sherrill @ 2020-07-03 13:12 UTC (permalink / raw)
  To: Szabolcs Nagy; +Cc: Eshan dhawan, Newlib, jeol

On Fri, Jul 3, 2020 at 4:14 AM Szabolcs Nagy <szabolcs.nagy@arm.com> 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 <joel@rtems.org> wrote:
> >
> > >
> > >
> > > On Thu, Jul 2, 2020 at 7:11 AM Szabolcs Nagy <szabolcs.nagy@arm.com>
> > > 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
> > >
>
> --
>

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2020-07-03 13:12 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-03 17:45 [PATCH 0/1] Add fenv support for ARM Eshan dhawan
2020-06-03 17:45 ` [PATCH 1/1] fenv support arm Eshan dhawan
2020-07-02 12:11   ` Szabolcs Nagy
2020-07-02 15:48     ` Joel Sherrill
2020-07-02 22:33       ` Joel Sherrill
2020-07-03  9:14         ` Szabolcs Nagy
2020-07-03 13:12           ` Joel Sherrill
2020-06-10  1:15 ` [PATCH 0/1] Add fenv support for ARM Jeff Johnston
2020-06-10 17:31   ` Sebastian Huber

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).