diff options
Diffstat (limited to 'libm/mips')
| -rw-r--r-- | libm/mips/Makefile.arch | 16 | ||||
| -rw-r--r-- | libm/mips/fclrexcpt.c | 44 | ||||
| -rw-r--r-- | libm/mips/fedisblxcpt.c | 38 | ||||
| -rw-r--r-- | libm/mips/feenablxcpt.c | 38 | ||||
| -rw-r--r-- | libm/mips/fegetenv.c | 28 | ||||
| -rw-r--r-- | libm/mips/fegetexcept.c | 31 | ||||
| -rw-r--r-- | libm/mips/fegetmode.c | 26 | ||||
| -rw-r--r-- | libm/mips/fegetround.c | 30 | ||||
| -rw-r--r-- | libm/mips/feholdexcpt.c | 35 | ||||
| -rw-r--r-- | libm/mips/fenv_libc.h | 29 | ||||
| -rw-r--r-- | libm/mips/fenv_private.h | 238 | ||||
| -rw-r--r-- | libm/mips/fesetenv.c | 38 | ||||
| -rw-r--r-- | libm/mips/fesetexcept.c | 31 | ||||
| -rw-r--r-- | libm/mips/fesetmode.c | 37 | ||||
| -rw-r--r-- | libm/mips/fesetround.c | 40 | ||||
| -rw-r--r-- | libm/mips/feupdateenv.c | 40 | ||||
| -rw-r--r-- | libm/mips/fgetexcptflg.c | 37 | ||||
| -rw-r--r-- | libm/mips/fraiseexcpt.c | 42 | ||||
| -rw-r--r-- | libm/mips/fsetexcptflg.c | 40 | ||||
| -rw-r--r-- | libm/mips/ftestexcept.c | 30 | 
20 files changed, 888 insertions, 0 deletions
| diff --git a/libm/mips/Makefile.arch b/libm/mips/Makefile.arch new file mode 100644 index 000000000..bd38690be --- /dev/null +++ b/libm/mips/Makefile.arch @@ -0,0 +1,16 @@ +# Makefile for uClibc-ng +# Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball. + +ifeq ($(UCLIBC_HAS_FENV),y) +libm_ARCH_SRC:=$(wildcard $(libm_ARCH_DIR)/*.c) +libm_ARCH_OBJ:=$(patsubst $(libm_ARCH_DIR)/%.c,$(libm_ARCH_OUT)/%.o,$(libm_ARCH_SRC)) +endif + +libm_ARCH_OBJS:=$(libm_ARCH_OBJ) + +ifeq ($(DOPIC),y) +libm-a-y+=$(libm_ARCH_OBJS:.o=.os) +else +libm-a-y+=$(libm_ARCH_OBJS) +endif +libm-so-y+=$(libm_ARCH_OBJS:.o=.os) diff --git a/libm/mips/fclrexcpt.c b/libm/mips/fclrexcpt.c new file mode 100644 index 000000000..04d48d712 --- /dev/null +++ b/libm/mips/fclrexcpt.c @@ -0,0 +1,44 @@ +/* Clear given exceptions in current floating-point environment. +   Copyright (C) 1998-2025 Free Software Foundation, Inc. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library.  If not, see +   <https://www.gnu.org/licenses/>.  */ + +#include <fenv.h> +#include "fenv_libc.h" +#include <fpu_control.h> + +int +feclearexcept (int excepts) +{ +  int cw; + +  /* Mask out unsupported bits/exceptions.  */ +  excepts &= FE_ALL_EXCEPT; + +  /* Read the complete control word.  */ +  _FPU_GETCW (cw); + +  /* Clear exception flag bits and cause bits. If the cause bit is not +     cleared, the next CTC instruction (just below) will re-generate the +     exception.  */ + +  cw &= ~(excepts | (excepts << CAUSE_SHIFT)); + +  /* Put the new data in effect.  */ +  _FPU_SETCW (cw); + +  /* Success.  */ +  return 0; +} diff --git a/libm/mips/fedisblxcpt.c b/libm/mips/fedisblxcpt.c new file mode 100644 index 000000000..85cd6c518 --- /dev/null +++ b/libm/mips/fedisblxcpt.c @@ -0,0 +1,38 @@ +/* Disable floating-point exceptions. +   Copyright (C) 2000-2025 Free Software Foundation, Inc. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library.  If not, see +   <https://www.gnu.org/licenses/>.  */ + +#include <fenv.h> +#include "fenv_libc.h" +#include <fpu_control.h> + +int +fedisableexcept (int excepts) +{ +  unsigned int new_exc, old_exc; + +  /* Get the current control word.  */ +  _FPU_GETCW (new_exc); + +  old_exc = (new_exc & ENABLE_MASK) >> ENABLE_SHIFT; + +  excepts &= FE_ALL_EXCEPT; + +  new_exc &= ~(excepts << ENABLE_SHIFT); +  _FPU_SETCW (new_exc); + +  return old_exc; +} diff --git a/libm/mips/feenablxcpt.c b/libm/mips/feenablxcpt.c new file mode 100644 index 000000000..9d919a8ba --- /dev/null +++ b/libm/mips/feenablxcpt.c @@ -0,0 +1,38 @@ +/* Enable floating-point exceptions. +   Copyright (C) 2000-2025 Free Software Foundation, Inc. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library.  If not, see +   <https://www.gnu.org/licenses/>.  */ + +#include <fenv.h> +#include "fenv_libc.h" +#include <fpu_control.h> + +int +feenableexcept (int excepts) +{ +  unsigned int new_exc, old_exc; + +  /* Get the current control word.  */ +  _FPU_GETCW (new_exc); + +  old_exc = (new_exc & ENABLE_MASK) >> ENABLE_SHIFT; + +  excepts &= FE_ALL_EXCEPT; + +  new_exc |= excepts << ENABLE_SHIFT; +  _FPU_SETCW (new_exc); + +  return old_exc; +} diff --git a/libm/mips/fegetenv.c b/libm/mips/fegetenv.c new file mode 100644 index 000000000..94f3444ac --- /dev/null +++ b/libm/mips/fegetenv.c @@ -0,0 +1,28 @@ +/* Store current floating-point environment. +   Copyright (C) 1998-2025 Free Software Foundation, Inc. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library.  If not, see +   <https://www.gnu.org/licenses/>.  */ + +#include <fenv.h> +#include <fpu_control.h> + +int +fegetenv (fenv_t *envp) +{ +  _FPU_GETCW (*envp); + +  /* Success.  */ +  return 0; +} diff --git a/libm/mips/fegetexcept.c b/libm/mips/fegetexcept.c new file mode 100644 index 000000000..4c7c89fa6 --- /dev/null +++ b/libm/mips/fegetexcept.c @@ -0,0 +1,31 @@ +/* Get enabled floating-point exceptions. +   Copyright (C) 2000-2025 Free Software Foundation, Inc. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library.  If not, see +   <https://www.gnu.org/licenses/>.  */ + +#include <fenv.h> +#include "fenv_libc.h" +#include <fpu_control.h> + +int +fegetexcept (void) +{ +  unsigned int exc; + +  /* Get the current control word.  */ +  _FPU_GETCW (exc); + +  return (exc & ENABLE_MASK) >> ENABLE_SHIFT; +} diff --git a/libm/mips/fegetmode.c b/libm/mips/fegetmode.c new file mode 100644 index 000000000..136b8d3fb --- /dev/null +++ b/libm/mips/fegetmode.c @@ -0,0 +1,26 @@ +/* Store current floating-point control modes.  MIPS version. +   Copyright (C) 2016-2025 Free Software Foundation, Inc. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library; if not, see +   <https://www.gnu.org/licenses/>.  */ + +#include <fenv.h> +#include <fpu_control.h> + +int +fegetmode (femode_t *modep) +{ +  _FPU_GETCW (*modep); +  return 0; +} diff --git a/libm/mips/fegetround.c b/libm/mips/fegetround.c new file mode 100644 index 000000000..4d8f3744d --- /dev/null +++ b/libm/mips/fegetround.c @@ -0,0 +1,30 @@ +/* Return current rounding direction. +   Copyright (C) 1998-2025 Free Software Foundation, Inc. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library.  If not, see +   <https://www.gnu.org/licenses/>.  */ + +#include <fenv.h> +#include <fpu_control.h> + +int +fegetround (void) +{ +  int cw; + +  /* Get control word.  */ +  _FPU_GETCW (cw); + +  return cw & _FPU_RC_MASK; +} diff --git a/libm/mips/feholdexcpt.c b/libm/mips/feholdexcpt.c new file mode 100644 index 000000000..b1e35ae5a --- /dev/null +++ b/libm/mips/feholdexcpt.c @@ -0,0 +1,35 @@ +/* Store current floating-point environment and clear exceptions. +   Copyright (C) 2000-2025 Free Software Foundation, Inc. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library.  If not, see +   <https://www.gnu.org/licenses/>.  */ + +#include <fenv.h> +#include <fpu_control.h> + +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/libm/mips/fenv_libc.h b/libm/mips/fenv_libc.h new file mode 100644 index 000000000..642a7b127 --- /dev/null +++ b/libm/mips/fenv_libc.h @@ -0,0 +1,29 @@ +/* Copyright (C) 2000-2025 Free Software Foundation, Inc. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library.  If not, see +   <https://www.gnu.org/licenses/>.  */ + +#ifndef _FENV_LIBC_H +#define _FENV_LIBC_H    1 + +/* Mask for enabling exceptions and for the CAUSE bits.  */ +#define ENABLE_MASK	0x00F80U +#define CAUSE_MASK	0x1F000U + +/* Shift for FE_* flags to get up to the ENABLE bits and the CAUSE bits.  */ +#define	ENABLE_SHIFT	5 +#define	CAUSE_SHIFT	10 + + +#endif /* _FENV_LIBC_H */ diff --git a/libm/mips/fenv_private.h b/libm/mips/fenv_private.h new file mode 100644 index 000000000..bc9be3b62 --- /dev/null +++ b/libm/mips/fenv_private.h @@ -0,0 +1,238 @@ +/* Internal math stuff.  MIPS version. +   Copyright (C) 2013-2025 Free Software Foundation, Inc. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library; if not, see +   <https://www.gnu.org/licenses/>.  */ + +#ifndef MIPS_FENV_PRIVATE_H +#define MIPS_FENV_PRIVATE_H 1 + +/* Inline functions to speed up the math library implementation.  The +   default versions of these routines are in generic/fenv_private.h +   and call fesetround, feholdexcept, etc.  These routines use inlined +   code instead.  */ + +#include <fenv.h> +#include "fenv_libc.h" +#include <fpu_control.h> + +#define _FPU_MASK_ALL (_FPU_MASK_V | _FPU_MASK_Z | _FPU_MASK_O \ +		       |_FPU_MASK_U | _FPU_MASK_I | FE_ALL_EXCEPT) + +static __always_inline void +libc_feholdexcept_mips (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_ALL); +  _FPU_SETCW (cw); +} +#define libc_feholdexcept libc_feholdexcept_mips +#define libc_feholdexceptf libc_feholdexcept_mips +#define libc_feholdexceptl libc_feholdexcept_mips + +static __always_inline void +libc_fesetround_mips (int round) +{ +  fpu_control_t cw; + +  /* Get current state.  */ +  _FPU_GETCW (cw); + +  /* Set rounding bits.  */ +  cw &= ~_FPU_RC_MASK; +  cw |= round; + +  /* Set new state.  */ +  _FPU_SETCW (cw); +} +#define libc_fesetround libc_fesetround_mips +#define libc_fesetroundf libc_fesetround_mips +#define libc_fesetroundl libc_fesetround_mips + +static __always_inline void +libc_feholdexcept_setround_mips (fenv_t *envp, int round) +{ +  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_ALL); + +  /* Set rounding bits.  */ +  cw &= ~_FPU_RC_MASK; +  cw |= round; + +  /* Set new state.  */ +  _FPU_SETCW (cw); +} +#define libc_feholdexcept_setround libc_feholdexcept_setround_mips +#define libc_feholdexcept_setroundf libc_feholdexcept_setround_mips +#define libc_feholdexcept_setroundl libc_feholdexcept_setround_mips + +#define libc_feholdsetround libc_feholdexcept_setround_mips +#define libc_feholdsetroundf libc_feholdexcept_setround_mips +#define libc_feholdsetroundl libc_feholdexcept_setround_mips + +static __always_inline void +libc_fesetenv_mips (fenv_t *envp) +{ +  fpu_control_t cw __attribute__ ((unused)); + +  /* Read current state to flush fpu pipeline.  */ +  _FPU_GETCW (cw); + +  _FPU_SETCW (envp->__fp_control_register); +} +#define libc_fesetenv libc_fesetenv_mips +#define libc_fesetenvf libc_fesetenv_mips +#define libc_fesetenvl libc_fesetenv_mips + +static __always_inline int +libc_feupdateenv_test_mips (fenv_t *envp, int excepts) +{ +  /* int ret = fetestexcept (excepts); feupdateenv (envp); return ret; */ +  int cw, temp; + +  /* Get current control word.  */ +  _FPU_GETCW (cw); + +  /* Set flag bits (which are accumulative), and *also* set the +     cause bits.  The setting of the cause bits is what actually causes +     the hardware to generate the exception, if the corresponding enable +     bit is set as well.  */ +  temp = cw & FE_ALL_EXCEPT; +  temp |= envp->__fp_control_register | (temp << CAUSE_SHIFT); + +  /* Set new state.  */ +  _FPU_SETCW (temp); + +  return cw & excepts & FE_ALL_EXCEPT; +} +#define libc_feupdateenv_test libc_feupdateenv_test_mips +#define libc_feupdateenv_testf libc_feupdateenv_test_mips +#define libc_feupdateenv_testl libc_feupdateenv_test_mips + +static __always_inline void +libc_feupdateenv_mips (fenv_t *envp) +{ +  libc_feupdateenv_test_mips (envp, 0); +} +#define libc_feupdateenv libc_feupdateenv_mips +#define libc_feupdateenvf libc_feupdateenv_mips +#define libc_feupdateenvl libc_feupdateenv_mips + +#define libc_feresetround libc_feupdateenv_mips +#define libc_feresetroundf libc_feupdateenv_mips +#define libc_feresetroundl libc_feupdateenv_mips + +static __always_inline int +libc_fetestexcept_mips (int excepts) +{ +  int cw; + +  /* Get current control word.  */ +  _FPU_GETCW (cw); + +  return cw & excepts & FE_ALL_EXCEPT; +} +#define libc_fetestexcept libc_fetestexcept_mips +#define libc_fetestexceptf libc_fetestexcept_mips +#define libc_fetestexceptl libc_fetestexcept_mips + +/*  Enable support for rounding mode context.  */ +#define HAVE_RM_CTX 1 + +static __always_inline void +libc_feholdexcept_setround_mips_ctx (struct rm_ctx *ctx, int round) +{ +  fpu_control_t old, new; + +  /* Save the current state.  */ +  _FPU_GETCW (old); +  ctx->env.__fp_control_register = old; + +  /* Clear all exception enable bits and flags.  */ +  new = old & ~(_FPU_MASK_ALL); + +  /* Set rounding bits.  */ +  new = (new & ~_FPU_RC_MASK) | round; + +  if (__glibc_unlikely (new != old)) +    { +      _FPU_SETCW (new); +      ctx->updated_status = true; +    } +  else +    ctx->updated_status = false; +} +#define libc_feholdexcept_setround_ctx   libc_feholdexcept_setround_mips_ctx +#define libc_feholdexcept_setroundf_ctx  libc_feholdexcept_setround_mips_ctx +#define libc_feholdexcept_setroundl_ctx  libc_feholdexcept_setround_mips_ctx + +static __always_inline void +libc_fesetenv_mips_ctx (struct rm_ctx *ctx) +{ +  libc_fesetenv_mips (&ctx->env); +} +#define libc_fesetenv_ctx                libc_fesetenv_mips_ctx +#define libc_fesetenvf_ctx               libc_fesetenv_mips_ctx +#define libc_fesetenvl_ctx               libc_fesetenv_mips_ctx + +static __always_inline void +libc_feupdateenv_mips_ctx (struct rm_ctx *ctx) +{ +  if (__glibc_unlikely (ctx->updated_status)) +    libc_feupdateenv_test_mips (&ctx->env, 0); +} +#define libc_feupdateenv_ctx             libc_feupdateenv_mips_ctx +#define libc_feupdateenvf_ctx            libc_feupdateenv_mips_ctx +#define libc_feupdateenvl_ctx            libc_feupdateenv_mips_ctx +#define libc_feresetround_ctx            libc_feupdateenv_mips_ctx +#define libc_feresetroundf_ctx           libc_feupdateenv_mips_ctx +#define libc_feresetroundl_ctx           libc_feupdateenv_mips_ctx + +static __always_inline void +libc_feholdsetround_mips_ctx (struct rm_ctx *ctx, int round) +{ +  fpu_control_t old, new; + +  /* Save the current state.  */ +  _FPU_GETCW (old); +  ctx->env.__fp_control_register = old; + +  /* Set rounding bits.  */ +  new = (old & ~_FPU_RC_MASK) | round; + +  if (__glibc_unlikely (new != old)) +    { +      _FPU_SETCW (new); +      ctx->updated_status = true; +    } +  else +    ctx->updated_status = false; +} +#define libc_feholdsetround_ctx          libc_feholdsetround_mips_ctx +#define libc_feholdsetroundf_ctx         libc_feholdsetround_mips_ctx +#define libc_feholdsetroundl_ctx         libc_feholdsetround_mips_ctx + +#endif diff --git a/libm/mips/fesetenv.c b/libm/mips/fesetenv.c new file mode 100644 index 000000000..03b5b91a6 --- /dev/null +++ b/libm/mips/fesetenv.c @@ -0,0 +1,38 @@ +/* Install given floating-point environment. +   Copyright (C) 1998-2025 Free Software Foundation, Inc. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library.  If not, see +   <https://www.gnu.org/licenses/>.  */ + +#include <fenv.h> +#include <fpu_control.h> + +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 if (envp == FE_NOMASK_ENV) +    _FPU_SETCW (_FPU_IEEE); +  else +    _FPU_SETCW (envp->__fp_control_register); + +  /* Success.  */ +  return 0; +} diff --git a/libm/mips/fesetexcept.c b/libm/mips/fesetexcept.c new file mode 100644 index 000000000..1c9a0de3b --- /dev/null +++ b/libm/mips/fesetexcept.c @@ -0,0 +1,31 @@ +/* Set given exception flags.  MIPS version. +   Copyright (C) 2016-2025 Free Software Foundation, Inc. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library; if not, see +   <https://www.gnu.org/licenses/>.  */ + +#include <fenv.h> +#include <fpu_control.h> + +int +fesetexcept (int excepts) +{ +  fpu_control_t temp; + +  _FPU_GETCW (temp); +  temp |= excepts & FE_ALL_EXCEPT; +  _FPU_SETCW (temp); + +  return 0; +} diff --git a/libm/mips/fesetmode.c b/libm/mips/fesetmode.c new file mode 100644 index 000000000..cb4ffdc06 --- /dev/null +++ b/libm/mips/fesetmode.c @@ -0,0 +1,37 @@ +/* Install given floating-point control modes.  MIPS version. +   Copyright (C) 2016-2025 Free Software Foundation, Inc. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library; if not, see +   <https://www.gnu.org/licenses/>.  */ + +#include <fenv.h> +#include <fpu_control.h> + +#define FCSR_STATUS 0xfe83f07c + +int +fesetmode (const femode_t *modep) +{ +  fpu_control_t cw; + +  _FPU_GETCW (cw); +  cw &= FCSR_STATUS; +  if (modep == FE_DFL_MODE) +    cw |= _FPU_DEFAULT; +  else +    cw |= *modep & ~FCSR_STATUS; +  _FPU_SETCW (cw); + +  return 0; +} diff --git a/libm/mips/fesetround.c b/libm/mips/fesetround.c new file mode 100644 index 000000000..532092710 --- /dev/null +++ b/libm/mips/fesetround.c @@ -0,0 +1,40 @@ +/* Set current rounding direction. +   Copyright (C) 1998-2025 Free Software Foundation, Inc. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library.  If not, see +   <https://www.gnu.org/licenses/>.  */ + +#include <fenv.h> +#include <fpu_control.h> + +int +fesetround (int round) +{ +  fpu_control_t cw; + +  if ((round & ~_FPU_RC_MASK) != 0) +    /* ROUND is no valid rounding mode.  */ +    return 1; + +  /* Get current state.  */ +  _FPU_GETCW (cw); + +  /* Set rounding bits.  */ +  cw &= ~_FPU_RC_MASK; +  cw |= round; +  /* Set new state.  */ +  _FPU_SETCW (cw); + +  return 0; +} diff --git a/libm/mips/feupdateenv.c b/libm/mips/feupdateenv.c new file mode 100644 index 000000000..d90604db3 --- /dev/null +++ b/libm/mips/feupdateenv.c @@ -0,0 +1,40 @@ +/* Install given floating-point environment and raise exceptions. +   Copyright (C) 1998-2025 Free Software Foundation, Inc. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library.  If not, see +   <https://www.gnu.org/licenses/>.  */ + +#include <fenv.h> +#include <fpu_control.h> + +int +feupdateenv (const fenv_t *envp) +{ +  int temp; + +  /* Save current exceptions.  */ +  _FPU_GETCW (temp); +  temp &= FE_ALL_EXCEPT; + +  /* Install new environment.  */ +  fesetenv (envp); + +  /* Raise the saved exception.  Incidentally for us the implementation +     defined format of the values in objects of type fexcept_t is the +     same as the ones specified using the FE_* constants.  */ +  feraiseexcept (temp); + +  /* Success.  */ +  return 0; +} diff --git a/libm/mips/fgetexcptflg.c b/libm/mips/fgetexcptflg.c new file mode 100644 index 000000000..b03eca55e --- /dev/null +++ b/libm/mips/fgetexcptflg.c @@ -0,0 +1,37 @@ +/* Store current representation for exceptions. +   Copyright (C) 1998-2025 Free Software Foundation, Inc. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library.  If not, see +   <https://www.gnu.org/licenses/>.  */ + +#include <fenv.h> +#include <fpu_control.h> + +int +fegetexceptflag (fexcept_t *flagp, int excepts) +{ +  fpu_control_t temp; + +  /* Get the current exceptions.  */ +  _FPU_GETCW (temp); + +  /* We only save the relevant bits here. In particular, care has to be +     taken with the CAUSE bits, as an inadvertent restore later on could +     generate unexpected exceptions.  */ + +  *flagp = temp & excepts & FE_ALL_EXCEPT; + +  /* Success.  */ +  return 0; +} diff --git a/libm/mips/fraiseexcpt.c b/libm/mips/fraiseexcpt.c new file mode 100644 index 000000000..6327b1104 --- /dev/null +++ b/libm/mips/fraiseexcpt.c @@ -0,0 +1,42 @@ +/* Raise given exceptions. +   Copyright (C) 2000-2025 Free Software Foundation, Inc. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library.  If not, see +   <https://www.gnu.org/licenses/>.  */ + +#include <fenv.h> +#include "fenv_libc.h" +#include <fpu_control.h> + +int +feraiseexcept (int excepts) +{ +  fpu_control_t cw; + +  /* Get current state.  */ +  _FPU_GETCW (cw); + +  /* Set flag bits (which are accumulative), and *also* set the +     cause bits. The setting of the cause bits is what actually causes +     the hardware to generate the exception, if the corresponding enable +     bit is set as well.  */ + +  excepts &= FE_ALL_EXCEPT; +  cw |= excepts | (excepts << CAUSE_SHIFT); + +  /* Set new state.  */ +  _FPU_SETCW (cw); + +  return 0; +} diff --git a/libm/mips/fsetexcptflg.c b/libm/mips/fsetexcptflg.c new file mode 100644 index 000000000..d98a300e2 --- /dev/null +++ b/libm/mips/fsetexcptflg.c @@ -0,0 +1,40 @@ +/* Set floating-point environment exception handling. +   Copyright (C) 1998-2025 Free Software Foundation, Inc. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library.  If not, see +   <https://www.gnu.org/licenses/>.  */ + +#include <fenv.h> +#include <fpu_control.h> + +int +fesetexceptflag (const fexcept_t *flagp, int excepts) +{ +  fpu_control_t temp; + +  /* Get the current exceptions.  */ +  _FPU_GETCW (temp); + +  /* Make sure the flags we want restored are legal.  */ +  excepts &= FE_ALL_EXCEPT; + +  /* Now clear the bits called for, and copy them in from flagp. Note that +     we ignore all non-flag bits from *flagp, so they don't matter.  */ +  temp = (temp & ~excepts) | (*flagp & excepts); + +  _FPU_SETCW (temp); + +  /* Success.  */ +  return 0; +} diff --git a/libm/mips/ftestexcept.c b/libm/mips/ftestexcept.c new file mode 100644 index 000000000..8fdca7560 --- /dev/null +++ b/libm/mips/ftestexcept.c @@ -0,0 +1,30 @@ +/* Test exception in current environment. +   Copyright (C) 1998-2025 Free Software Foundation, Inc. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library.  If not, see +   <https://www.gnu.org/licenses/>.  */ + +#include <fenv.h> +#include <fpu_control.h> + +int +fetestexcept (int excepts) +{ +  int cw; + +  /* Get current control word.  */ +  _FPU_GETCW (cw); + +  return cw & excepts & FE_ALL_EXCEPT; +} | 
