[PATCH 1/1] fenv aarch64 support

Eshan dhawan via Newlib <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>
Signed-off-by: Eshan dhawan <[email protected]>
---
 newlib/libc/machine/aarch64/machine/fenv-fp.h | 156 ++++++++++++++++++
 newlib/libc/machine/aarch64/sys/fenv.h        | 120 ++++++++++++++
 newlib/libm/machine/aarch64/Makefile.am       |  14 +-
 newlib/libm/machine/aarch64/feclearexcept.c   |   7 +
 newlib/libm/machine/aarch64/fegetenv.c        |   7 +
 newlib/libm/machine/aarch64/fegetexceptflag.c |   7 +
 newlib/libm/machine/aarch64/fegetround.c      |   7 +
 newlib/libm/machine/aarch64/feholdexcept.c    |   7 +
 newlib/libm/machine/aarch64/fenv.c            |  57 +++++++
 newlib/libm/machine/aarch64/feraiseexcept.c   |   7 +
 newlib/libm/machine/aarch64/fesetenv.c        |   7 +
 newlib/libm/machine/aarch64/fesetexceptflag.c |   7 +
 newlib/libm/machine/aarch64/fesetround.c      |   7 +
 newlib/libm/machine/aarch64/fetestexcept.c    |   7 +
 newlib/libm/machine/aarch64/feupdateenv.c     |   7 +
 15 files changed, 423 insertions(+), 1 deletion(-)
 create mode 100644 newlib/libc/machine/aarch64/machine/fenv-fp.h
 create mode 100644 newlib/libc/machine/aarch64/sys/fenv.h
 create mode 100644 newlib/libm/machine/aarch64/feclearexcept.c
 create mode 100644 newlib/libm/machine/aarch64/fegetenv.c
 create mode 100644 newlib/libm/machine/aarch64/fegetexceptflag.c
 create mode 100644 newlib/libm/machine/aarch64/fegetround.c
 create mode 100644 newlib/libm/machine/aarch64/feholdexcept.c
 create mode 100644 newlib/libm/machine/aarch64/fenv.c
 create mode 100644 newlib/libm/machine/aarch64/feraiseexcept.c
 create mode 100644 newlib/libm/machine/aarch64/fesetenv.c
 create mode 100644 newlib/libm/machine/aarch64/fesetexceptflag.c
 create mode 100644 newlib/libm/machine/aarch64/fesetround.c
 create mode 100644 newlib/libm/machine/aarch64/fetestexcept.c
 create mode 100644 newlib/libm/machine/aarch64/feupdateenv.c

diff --git a/newlib/libc/machine/aarch64/machine/fenv-fp.h b/newlib/libc/machine/aarch64/machine/fenv-fp.h
new file mode 100644
index 000000000..d8ec3fc76
--- /dev/null
+++ b/newlib/libc/machine/aarch64/machine/fenv-fp.h
@@ -0,0 +1,156 @@
+/*-
+ * Copyright (c) 2004-2005 David Schultz <[email protected]>
+ * 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$
+ */
+
+
+__fenv_static __inline int
+feclearexcept(int __excepts)
+{
+	fexcept_t __r;
+
+	__mrs_fpsr(__r);
+	__r &= ~__excepts;
+	__msr_fpsr(__r);
+	return (0);
+}
+
+__fenv_static inline int
+fegetexceptflag(fexcept_t *__flagp, int __excepts)
+{
+	fexcept_t __r;
+
+	__mrs_fpsr(__r);
+	*__flagp = __r & __excepts;
+	return (0);
+}
+
+__fenv_static inline int
+fesetexceptflag(const fexcept_t *__flagp, int __excepts)
+{
+	fexcept_t __r;
+
+	__mrs_fpsr(__r);
+	__r &= ~__excepts;
+	__r |= *__flagp & __excepts;
+	__msr_fpsr(__r);
+	return (0);
+}
+
+__fenv_static inline int
+feraiseexcept(int __excepts)
+{
+	fexcept_t __r;
+
+	__mrs_fpsr(__r);
+	__r |= __excepts;
+	__msr_fpsr(__r);
+	return (0);
+}
+
+__fenv_static inline int
+fetestexcept(int __excepts)
+{
+	fexcept_t __r;
+
+	__mrs_fpsr(__r);
+	return (__r & __excepts);
+}
+
+__fenv_static inline int
+fegetround(void)
+{
+	fenv_t __r;
+
+	__mrs_fpcr(__r);
+	return ((__r >> _ROUND_SHIFT) & _ROUND_MASK);
+}
+
+__fenv_static inline int
+fesetround(int __round)
+{
+	fenv_t __r;
+
+	if (__round & ~_ROUND_MASK)
+		return (-1);
+	__mrs_fpcr(__r);
+	__r &= ~(_ROUND_MASK << _ROUND_SHIFT);
+	__r |= __round << _ROUND_SHIFT;
+	__msr_fpcr(__r);
+	return (0);
+}
+
+__fenv_static inline int
+fegetenv(fenv_t *__envp)
+{
+	fenv_t __r;
+
+	__mrs_fpcr(__r);
+	*__envp = __r & _ENABLE_MASK;
+
+	__mrs_fpsr(__r);
+	*__envp |= __r & (FE_ALL_EXCEPT | (_ROUND_MASK << _ROUND_SHIFT));
+
+	return (0);
+}
+
+__fenv_static inline int
+feholdexcept(fenv_t *__envp)
+{
+	fenv_t __r;
+
+	__mrs_fpcr(__r);
+	*__envp = __r & _ENABLE_MASK;
+	__r &= ~(_ENABLE_MASK);
+	__msr_fpcr(__r);
+
+	__mrs_fpsr(__r);
+	*__envp |= __r & (FE_ALL_EXCEPT | (_ROUND_MASK << _ROUND_SHIFT));
+	__r &= ~(_ENABLE_MASK);
+	__msr_fpsr(__r);
+	return (0);
+}
+
+__fenv_static inline int
+fesetenv(const fenv_t *__envp)
+{
+
+	__msr_fpcr((*__envp) & _ENABLE_MASK);
+	__msr_fpsr((*__envp) & (FE_ALL_EXCEPT | (_ROUND_MASK << _ROUND_SHIFT)));
+	return (0);
+}
+
+__fenv_static inline int
+feupdateenv(const fenv_t *__envp)
+{
+	fexcept_t __r;
+
+	__mrs_fpsr(__r);
+	fesetenv(__envp);
+	feraiseexcept(__r & FE_ALL_EXCEPT);
+	return (0);
+}
+
diff --git a/newlib/libc/machine/aarch64/sys/fenv.h b/newlib/libc/machine/aarch64/sys/fenv.h
new file mode 100644
index 000000000..6b0879269
--- /dev/null
+++ b/newlib/libc/machine/aarch64/sys/fenv.h
@@ -0,0 +1,120 @@
+/*-
+ * Copyright (c) 2004-2005 David Schultz <[email protected]>
+ * 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	_FENV_H_
+#define	_FENV_H_
+
+#include <sys/_types.h>
+
+#ifndef	__fenv_static
+#define	__fenv_static	static
+#endif
+
+typedef	__uint64_t	fenv_t;
+typedef	__uint64_t	fexcept_t;
+
+/* Exception flags */
+#define	FE_INVALID	0x00000001
+#define	FE_DIVBYZERO	0x00000002
+#define	FE_OVERFLOW	0x00000004
+#define	FE_UNDERFLOW	0x00000008
+#define	FE_INEXACT	0x00000010
+#define	FE_ALL_EXCEPT	(FE_DIVBYZERO | FE_INEXACT | \
+			 FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW)
+
+/*
+ * Rounding modes
+ *
+ * We can't just use the hardware bit values here, because that would
+ * make FE_UPWARD and FE_DOWNWARD negative, which is not allowed.
+ */
+#define	FE_TONEAREST	0x0
+#define	FE_UPWARD	0x1
+#define	FE_DOWNWARD	0x2
+#define	FE_TOWARDZERO	0x3
+#define	_ROUND_MASK	(FE_TONEAREST | FE_DOWNWARD | \
+			 FE_UPWARD | FE_TOWARDZERO)
+#define	_ROUND_SHIFT	22
+
+
+
+/* Default floating-point environment */
+extern const fenv_t	*_fe_dfl_env;
+#define	FE_DFL_ENV	_fe_dfl_env
+
+/* We need to be able to map status flag positions to mask flag positions */
+#define _FPUSW_SHIFT	8
+#define	_ENABLE_MASK	(FE_ALL_EXCEPT << _FPUSW_SHIFT)
+
+#define	__mrs_fpcr(__r)	__asm __volatile("mrs %0, fpcr" : "=r" (__r))
+#define	__msr_fpcr(__r)	__asm __volatile("msr fpcr, %0" : : "r" (__r))
+
+#define	__mrs_fpsr(__r)	__asm __volatile("mrs %0, fpsr" : "=r" (__r))
+#define	__msr_fpsr(__r)	__asm __volatile("msr fpsr, %0" : : "r" (__r))
+
+
+#if __BSD_VISIBLE
+
+/* We currently provide no external definitions of the functions below. */
+
+static inline int
+feenableexcept(int __mask)
+{
+	fenv_t __old_r, __new_r;
+
+	__mrs_fpcr(__old_r);
+	__new_r = __old_r | ((__mask & FE_ALL_EXCEPT) << _FPUSW_SHIFT);
+	__msr_fpcr(__new_r);
+	return ((__old_r >> _FPUSW_SHIFT) & FE_ALL_EXCEPT);
+}
+
+static inline int
+fedisableexcept(int __mask)
+{
+	fenv_t __old_r, __new_r;
+
+	__mrs_fpcr(__old_r);
+	__new_r = __old_r & ~((__mask & FE_ALL_EXCEPT) << _FPUSW_SHIFT);
+	__msr_fpcr(__new_r);
+	return ((__old_r >> _FPUSW_SHIFT) & FE_ALL_EXCEPT);
+}
+
+static inline int
+fegetexcept(void)
+{
+	fenv_t __r;
+
+	__mrs_fpcr(__r);
+	return ((__r & _ENABLE_MASK) >> _FPUSW_SHIFT);
+}
+
+#endif /* __BSD_VISIBLE */
+
+
+
+#endif	/* !_FENV_H_ */
diff --git a/newlib/libm/machine/aarch64/Makefile.am b/newlib/libm/machine/aarch64/Makefile.am
index 752f65dd1..1025bc420 100644
--- a/newlib/libm/machine/aarch64/Makefile.am
+++ b/newlib/libm/machine/aarch64/Makefile.am
@@ -35,7 +35,19 @@ LIB_SOURCES = \
 	sf_nearbyint.c \
 	sf_rint.c \
 	sf_round.c \
-	sf_trunc.c
+	sf_trunc.c \
+	fenv.c \
+	feclearexcept.c \
+	fegetenv.c \
+	fegetexceptflag.c \
+	fegetround.c \
+	feholdexcept.c \
+	feraiseexcept.c \
+	fesetenv.c \
+	fesetexceptflag.c \
+	fesetround.c \
+	fetestexcept.c \
+	feupdateenv.c
 
 noinst_LIBRARIES = lib.a
 lib_a_SOURCES = $(LIB_SOURCES)
diff --git a/newlib/libm/machine/aarch64/feclearexcept.c b/newlib/libm/machine/aarch64/feclearexcept.c
new file mode 100644
index 000000000..8cbee7771
--- /dev/null
+++ b/newlib/libm/machine/aarch64/feclearexcept.c
@@ -0,0 +1,7 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * (c) Copyright 2019 Joel Sherrill <[email protected]>
+ */
+
+#include "../../fenv/fenv_stub.c"
diff --git a/newlib/libm/machine/aarch64/fegetenv.c b/newlib/libm/machine/aarch64/fegetenv.c
new file mode 100644
index 000000000..8cbee7771
--- /dev/null
+++ b/newlib/libm/machine/aarch64/fegetenv.c
@@ -0,0 +1,7 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * (c) Copyright 2019 Joel Sherrill <[email protected]>
+ */
+
+#include "../../fenv/fenv_stub.c"
diff --git a/newlib/libm/machine/aarch64/fegetexceptflag.c b/newlib/libm/machine/aarch64/fegetexceptflag.c
new file mode 100644
index 000000000..8cbee7771
--- /dev/null
+++ b/newlib/libm/machine/aarch64/fegetexceptflag.c
@@ -0,0 +1,7 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * (c) Copyright 2019 Joel Sherrill <[email protected]>
+ */
+
+#include "../../fenv/fenv_stub.c"
diff --git a/newlib/libm/machine/aarch64/fegetround.c b/newlib/libm/machine/aarch64/fegetround.c
new file mode 100644
index 000000000..8cbee7771
--- /dev/null
+++ b/newlib/libm/machine/aarch64/fegetround.c
@@ -0,0 +1,7 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * (c) Copyright 2019 Joel Sherrill <[email protected]>
+ */
+
+#include "../../fenv/fenv_stub.c"
diff --git a/newlib/libm/machine/aarch64/feholdexcept.c b/newlib/libm/machine/aarch64/feholdexcept.c
new file mode 100644
index 000000000..8cbee7771
--- /dev/null
+++ b/newlib/libm/machine/aarch64/feholdexcept.c
@@ -0,0 +1,7 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * (c) Copyright 2019 Joel Sherrill <[email protected]>
+ */
+
+#include "../../fenv/fenv_stub.c"
diff --git a/newlib/libm/machine/aarch64/fenv.c b/newlib/libm/machine/aarch64/fenv.c
new file mode 100644
index 000000000..3ffe23441
--- /dev/null
+++ b/newlib/libm/machine/aarch64/fenv.c
@@ -0,0 +1,57 @@
+/*-
+ * Copyright (c) 2004 David Schultz <[email protected]>
+ * Copyright (c) 2013 Andrew Turner <[email protected]>
+ * 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/fenv-fp.h>
+
+/*
+ * Hopefully the system ID byte is immutable, so it's valid to use
+ * this as a default environment.
+ */
+
+
+#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);
diff --git a/newlib/libm/machine/aarch64/feraiseexcept.c b/newlib/libm/machine/aarch64/feraiseexcept.c
new file mode 100644
index 000000000..8cbee7771
--- /dev/null
+++ b/newlib/libm/machine/aarch64/feraiseexcept.c
@@ -0,0 +1,7 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * (c) Copyright 2019 Joel Sherrill <[email protected]>
+ */
+
+#include "../../fenv/fenv_stub.c"
diff --git a/newlib/libm/machine/aarch64/fesetenv.c b/newlib/libm/machine/aarch64/fesetenv.c
new file mode 100644
index 000000000..8cbee7771
--- /dev/null
+++ b/newlib/libm/machine/aarch64/fesetenv.c
@@ -0,0 +1,7 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * (c) Copyright 2019 Joel Sherrill <[email protected]>
+ */
+
+#include "../../fenv/fenv_stub.c"
diff --git a/newlib/libm/machine/aarch64/fesetexceptflag.c b/newlib/libm/machine/aarch64/fesetexceptflag.c
new file mode 100644
index 000000000..8cbee7771
--- /dev/null
+++ b/newlib/libm/machine/aarch64/fesetexceptflag.c
@@ -0,0 +1,7 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * (c) Copyright 2019 Joel Sherrill <[email protected]>
+ */
+
+#include "../../fenv/fenv_stub.c"
diff --git a/newlib/libm/machine/aarch64/fesetround.c b/newlib/libm/machine/aarch64/fesetround.c
new file mode 100644
index 000000000..8cbee7771
--- /dev/null
+++ b/newlib/libm/machine/aarch64/fesetround.c
@@ -0,0 +1,7 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * (c) Copyright 2019 Joel Sherrill <[email protected]>
+ */
+
+#include "../../fenv/fenv_stub.c"
diff --git a/newlib/libm/machine/aarch64/fetestexcept.c b/newlib/libm/machine/aarch64/fetestexcept.c
new file mode 100644
index 000000000..8cbee7771
--- /dev/null
+++ b/newlib/libm/machine/aarch64/fetestexcept.c
@@ -0,0 +1,7 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * (c) Copyright 2019 Joel Sherrill <[email protected]>
+ */
+
+#include "../../fenv/fenv_stub.c"
diff --git a/newlib/libm/machine/aarch64/feupdateenv.c b/newlib/libm/machine/aarch64/feupdateenv.c
new file mode 100644
index 000000000..8cbee7771
--- /dev/null
+++ b/newlib/libm/machine/aarch64/feupdateenv.c
@@ -0,0 +1,7 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * (c) Copyright 2019 Joel Sherrill <[email protected]>
+ */
+
+#include "../../fenv/fenv_stub.c"
-- 
2.17.1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.