From 763f7e8ba7c381aee73e0536bb1f7732bb644ff1 Mon Sep 17 00:00:00 2001 From: Andreas Jaeger Date: Tue, 20 Jun 2000 13:05:21 +0000 Subject: [PATCH] * sysdeps/mips/fpu/fesetenv.c (__fesetenv): Flush fpu pipeline first. * sysdeps/mips/fpu/feholdexcpt.c: New file. * sysdeps/mips/fpu/fraiseexcpt.c: New file. --- sysdeps/mips/fpu/feholdexcpt.c | 38 ++++++++++++++++++++++++++++ sysdeps/mips/fpu/fesetenv.c | 6 +++++ sysdeps/mips/fpu/fraiseexcpt.c | 46 ++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 sysdeps/mips/fpu/feholdexcpt.c create mode 100644 sysdeps/mips/fpu/fraiseexcpt.c diff --git a/sysdeps/mips/fpu/feholdexcpt.c b/sysdeps/mips/fpu/feholdexcpt.c new file mode 100644 index 0000000000..ab92a71e0d --- /dev/null +++ b/sysdeps/mips/fpu/feholdexcpt.c @@ -0,0 +1,38 @@ +/* Store current floating-point environment and clear exceptions. + Copyright (C) 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Jaeger , 2000. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +int +feholdexcept (fenv_t *envp) +{ + fpu_control_t cw; + + /* Save the current state. */ + _FPU_GETCW (cw); + envp->__fp_control_register = cw; + + /* Clear all exception enable bits and flags. */ + cw &= ~(_FPU_MASK_V|_FPU_MASK_Z|_FPU_MASK_O|_FPU_MASK_U|_FPU_MASK_I|FE_ALL_EXCEPT); + _FPU_SETCW (cw); + + return 0; +} diff --git a/sysdeps/mips/fpu/fesetenv.c b/sysdeps/mips/fpu/fesetenv.c index 7ae688a6b1..ab90e4d022 100644 --- a/sysdeps/mips/fpu/fesetenv.c +++ b/sysdeps/mips/fpu/fesetenv.c @@ -25,6 +25,11 @@ int __fesetenv (const fenv_t *envp) { + fpu_control_t cw; + + /* Read first current state to flush fpu pipeline. */ + _FPU_GETCW (cw); + if (envp == FE_DFL_ENV) _FPU_SETCW (_FPU_DEFAULT); else @@ -33,6 +38,7 @@ __fesetenv (const fenv_t *envp) /* Success. */ return 0; } + #if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2) strong_alias (__fesetenv, __old_fesetenv) compat_symbol (libm, __old_fesetenv, fesetenv, GLIBC_2_1); diff --git a/sysdeps/mips/fpu/fraiseexcpt.c b/sysdeps/mips/fpu/fraiseexcpt.c new file mode 100644 index 0000000000..25c09e3912 --- /dev/null +++ b/sysdeps/mips/fpu/fraiseexcpt.c @@ -0,0 +1,46 @@ +/* Raise given exceptions. + Copyright (C) 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Jaeger , 2000. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +int +__feraiseexcept (int excepts) +{ + fpu_control_t cw; + + /* Get current state. */ + _FPU_GETCW (cw); + + /* Set exceptions bits. */ + cw |= (excepts & FE_ALL_EXCEPT); + + /* Set new state. */ + _FPU_SETCW (cw); + + return 0; +} + +#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2) +strong_alias (__feraiseexcept, __old_feraiseexcept) +compat_symbol (libm, __old_feraiseexcept, feraiseexcept, GLIBC_2_1); +#endif +versioned_symbol (libm, __feraiseexcept, feraiseexcept, GLIBC_2_2);