Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEshan dhawan via Newlib <newlib@sourceware.org>2020-07-03 00:13:06 +0300
committerCorinna Vinschen <corinna@vinschen.de>2020-07-03 11:41:45 +0300
commit65918715a071fd753f9bca1ec778fb137ca2d0fa (patch)
tree7860991c341ee1f2a49e4df8745e1f6ed7d7f7ef /newlib/libc/machine
parent03bf9f431c1a2b6244dfa6f5ac4ec59ef1913709 (diff)
mips fenv support
Signed-off-by: Eshan dhawan <eshandhawan51@gmail.com>
Diffstat (limited to 'newlib/libc/machine')
-rw-r--r--newlib/libc/machine/mips/machine/fenv-fp.h207
-rw-r--r--newlib/libc/machine/mips/machine/fenv-softfloat.h182
-rw-r--r--newlib/libc/machine/mips/sys/fenv.h88
3 files changed, 477 insertions, 0 deletions
diff --git a/newlib/libc/machine/mips/machine/fenv-fp.h b/newlib/libc/machine/mips/machine/fenv-fp.h
new file mode 100644
index 000000000..5f446e395
--- /dev/null
+++ b/newlib/libc/machine/mips/machine/fenv-fp.h
@@ -0,0 +1,207 @@
+/*-
+ * 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$
+ */
+
+__fenv_static inline int
+feclearexcept(int excepts)
+{
+ fexcept_t fcsr;
+
+ excepts &= FE_ALL_EXCEPT;
+ __cfc1(fcsr);
+ fcsr &= ~(excepts | (excepts << _FCSR_CAUSE_SHIFT));
+ __ctc1(fcsr);
+
+ return (0);
+}
+
+__fenv_static inline int
+fegetexceptflag(fexcept_t *flagp, int excepts)
+{
+ fexcept_t fcsr;
+
+ excepts &= FE_ALL_EXCEPT;
+ __cfc1(fcsr);
+ *flagp = fcsr & excepts;
+
+ return (0);
+}
+
+__fenv_static inline int
+fesetexceptflag(const fexcept_t *flagp, int excepts)
+{
+ fexcept_t fcsr;
+
+ excepts &= FE_ALL_EXCEPT;
+ __cfc1(fcsr);
+ fcsr &= ~excepts;
+ fcsr |= *flagp & excepts;
+ __ctc1(fcsr);
+
+ return (0);
+}
+
+__fenv_static inline int
+feraiseexcept(int excepts)
+{
+ fexcept_t fcsr;
+
+ excepts &= FE_ALL_EXCEPT;
+ __cfc1(fcsr);
+ fcsr |= excepts | (excepts << _FCSR_CAUSE_SHIFT);
+ __ctc1(fcsr);
+
+ return (0);
+}
+
+__fenv_static inline int
+fetestexcept(int excepts)
+{
+ fexcept_t fcsr;
+
+ excepts &= FE_ALL_EXCEPT;
+ __cfc1(fcsr);
+
+ return (fcsr & excepts);
+}
+
+__fenv_static inline int
+fegetround(void)
+{
+ fexcept_t fcsr;
+
+ __cfc1(fcsr);
+
+ return (fcsr & _ROUND_MASK);
+}
+
+__fenv_static inline int
+fesetround(int rounding_mode)
+{
+ fexcept_t fcsr;
+
+ if (rounding_mode & ~_ROUND_MASK)
+ return (-1);
+
+ __cfc1(fcsr);
+ fcsr &= ~_ROUND_MASK;
+ fcsr |= rounding_mode;
+ __ctc1(fcsr);
+
+ return (0);
+}
+
+__fenv_static inline int
+fegetenv(fenv_t *envp)
+{
+
+ __cfc1(*envp);
+
+ return (0);
+}
+
+__fenv_static inline int
+feholdexcept(fenv_t *envp)
+{
+ fexcept_t fcsr;
+
+ __cfc1(fcsr);
+ *envp = fcsr;
+ fcsr &= ~(FE_ALL_EXCEPT | _ENABLE_MASK);
+ __ctc1(fcsr);
+
+ return (0);
+}
+
+__fenv_static inline int
+fesetenv(const fenv_t *envp)
+{
+
+ __ctc1(*envp);
+
+ return (0);
+}
+
+__fenv_static inline int
+feupdateenv(const fenv_t *envp)
+{
+ fexcept_t fcsr;
+
+ __cfc1(fcsr);
+ fesetenv(envp);
+ feraiseexcept(fcsr);
+
+ return (0);
+}
+#if __BSD_VISIBLE
+
+/* We currently provide no external definitions of the functions below. */
+
+#ifdef __mips_soft_float
+int feenableexcept(int __mask);
+int fedisableexcept(int __mask);
+int fegetexcept(void);
+#else
+static inline int
+feenableexcept(int __mask)
+{
+ fenv_t __old_fcsr, __new_fcsr;
+
+ __cfc1(__old_fcsr);
+ __new_fcsr = __old_fcsr | (__mask & FE_ALL_EXCEPT) << _ENABLE_SHIFT;
+ __ctc1(__new_fcsr);
+
+ return ((__old_fcsr >> _ENABLE_SHIFT) & FE_ALL_EXCEPT);
+}
+
+static inline int
+fedisableexcept(int __mask)
+{
+ fenv_t __old_fcsr, __new_fcsr;
+
+ __cfc1(__old_fcsr);
+ __new_fcsr = __old_fcsr & ~((__mask & FE_ALL_EXCEPT) << _ENABLE_SHIFT);
+ __ctc1(__new_fcsr);
+
+ return ((__old_fcsr >> _ENABLE_SHIFT) & FE_ALL_EXCEPT);
+}
+
+static inline int
+fegetexcept(void)
+{
+ fexcept_t fcsr;
+
+ __cfc1(fcsr);
+
+ return ((fcsr & _ENABLE_MASK) >> _ENABLE_SHIFT);
+}
+
+#endif /* !__mips_soft_float */
+
+#endif /* __BSD_VISIBLE */ \ No newline at end of file
diff --git a/newlib/libc/machine/mips/machine/fenv-softfloat.h b/newlib/libc/machine/mips/machine/fenv-softfloat.h
new file mode 100644
index 000000000..cf13e73fc
--- /dev/null
+++ b/newlib/libc/machine/mips/machine/fenv-softfloat.h
@@ -0,0 +1,182 @@
+/*-
+ * 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$
+ */
+
+/*
+ * 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 rounding_mode)
+{
+
+ __softfloat_float_rounding_mode = rounding_mode;
+ 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/mips/sys/fenv.h b/newlib/libc/machine/mips/sys/fenv.h
new file mode 100644
index 000000000..282d68c49
--- /dev/null
+++ b/newlib/libc/machine/mips/sys/fenv.h
@@ -0,0 +1,88 @@
+/*-
+ * 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_
+
+#include <sys/_types.h>
+
+#ifndef __fenv_static
+#define __fenv_static static
+#endif
+
+typedef int fenv_t;
+typedef int fexcept_t;
+
+/* Exception flags */
+#ifdef __mips_soft_float
+#define _FPUSW_SHIFT 16
+#define FE_INVALID 0x0001
+#define FE_DIVBYZERO 0x0002
+#define FE_OVERFLOW 0x0004
+#define FE_UNDERFLOW 0x0008
+#define FE_INEXACT 0x0010
+#else
+#define _FCSR_CAUSE_SHIFT 10
+#define FE_INVALID 0x0040
+#define FE_DIVBYZERO 0x0020
+#define FE_OVERFLOW 0x0010
+#define FE_UNDERFLOW 0x0008
+#define FE_INEXACT 0x0004
+#endif
+#define FE_ALL_EXCEPT (FE_DIVBYZERO | FE_INEXACT | \
+ FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW)
+
+/* Rounding modes */
+#define FE_TONEAREST 0x0000
+#define FE_TOWARDZERO 0x0001
+#define FE_UPWARD 0x0002
+#define FE_DOWNWARD 0x0003
+#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 */
+#define _ENABLE_SHIFT 5
+#define _ENABLE_MASK (FE_ALL_EXCEPT << _ENABLE_SHIFT)
+
+#if !defined(__mips_soft_float) && !defined(__mips_hard_float)
+#error compiler didnt set soft/hard float macros
+#endif
+
+#ifndef __mips_soft_float
+#define __cfc1(__fcsr) __asm __volatile("cfc1 %0, $31" : "=r" (__fcsr))
+#define __ctc1(__fcsr) __asm __volatile("ctc1 %0, $31" :: "r" (__fcsr))
+#endif
+
+#endif /* !_FENV_H_ */