diff options
Diffstat (limited to 'libm/csky')
| -rw-r--r-- | libm/csky/Makefile.arch | 16 | ||||
| -rw-r--r-- | libm/csky/fclrexcpt.c | 40 | ||||
| -rw-r--r-- | libm/csky/fedisblxcpt.c | 40 | ||||
| -rw-r--r-- | libm/csky/feenablxcpt.c | 39 | ||||
| -rw-r--r-- | libm/csky/fegetenv.c | 33 | ||||
| -rw-r--r-- | libm/csky/fegetexcept.c | 31 | ||||
| -rw-r--r-- | libm/csky/fegetmode.c | 27 | ||||
| -rw-r--r-- | libm/csky/fegetround.c | 30 | ||||
| -rw-r--r-- | libm/csky/feholdexcpt.c | 30 | ||||
| -rw-r--r-- | libm/csky/fenv_libc.h | 29 | ||||
| -rw-r--r-- | libm/csky/fenv_private.h | 277 | ||||
| -rw-r--r-- | libm/csky/fesetenv.c | 55 | ||||
| -rw-r--r-- | libm/csky/fesetexcept.c | 32 | ||||
| -rw-r--r-- | libm/csky/fesetmode.c | 32 | ||||
| -rw-r--r-- | libm/csky/fesetround.c | 28 | ||||
| -rw-r--r-- | libm/csky/feupdateenv.c | 42 | ||||
| -rw-r--r-- | libm/csky/fgetexcptflg.c | 31 | ||||
| -rw-r--r-- | libm/csky/fraiseexcpt.c | 122 | ||||
| -rw-r--r-- | libm/csky/fsetexcptflg.c | 42 | ||||
| -rw-r--r-- | libm/csky/ftestexcept.c | 28 | 
20 files changed, 1004 insertions, 0 deletions
| diff --git a/libm/csky/Makefile.arch b/libm/csky/Makefile.arch new file mode 100644 index 000000000..bd38690be --- /dev/null +++ b/libm/csky/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/csky/fclrexcpt.c b/libm/csky/fclrexcpt.c new file mode 100644 index 000000000..8f8acef16 --- /dev/null +++ b/libm/csky/fclrexcpt.c @@ -0,0 +1,40 @@ +/* Clear given exceptions in current floating-point environment. +   Copyright (C) 2018-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 fpsr; + +  /* Mask out unsupported bits/exceptions.  */ +  excepts &= FE_ALL_EXCEPT; + +  /* Read the complete control word.  */ +  _FPU_GETFPSR (fpsr); + +  /* Clear the relevant bits.  */ +  fpsr &= ~(excepts | (excepts << CAUSE_SHIFT)); + +  /* Put the new data in effect.  */ +  _FPU_SETFPSR (fpsr); + +  return 0; +} diff --git a/libm/csky/fedisblxcpt.c b/libm/csky/fedisblxcpt.c new file mode 100644 index 000000000..e518968ab --- /dev/null +++ b/libm/csky/fedisblxcpt.c @@ -0,0 +1,40 @@ +/* Disable floating-point exceptions. +   Copyright (C) 2018-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; + +  /* Get the except disable mask.  */ +  excepts &= FE_ALL_EXCEPT; +  new_exc &= ~(excepts << ENABLE_SHIFT); + +  /* Put the new data in effect.  */ +  _FPU_SETCW (new_exc); + +  return old_exc; +} diff --git a/libm/csky/feenablxcpt.c b/libm/csky/feenablxcpt.c new file mode 100644 index 000000000..90c495080 --- /dev/null +++ b/libm/csky/feenablxcpt.c @@ -0,0 +1,39 @@ +/* Enable floating-point exceptions. +   Copyright (C) 2018-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/csky/fegetenv.c b/libm/csky/fegetenv.c new file mode 100644 index 000000000..d98982fc1 --- /dev/null +++ b/libm/csky/fegetenv.c @@ -0,0 +1,33 @@ +/* Store current floating-point environment. +   Copyright (C) 2018-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) +{ +  unsigned int fpcr; +  unsigned int fpsr; + +  _FPU_GETCW (fpcr); +  _FPU_GETFPSR (fpsr); +  envp->__fpcr = fpcr; +  envp->__fpsr = fpsr; + +  return 0; +} diff --git a/libm/csky/fegetexcept.c b/libm/csky/fegetexcept.c new file mode 100644 index 000000000..339f35923 --- /dev/null +++ b/libm/csky/fegetexcept.c @@ -0,0 +1,31 @@ +/* Get enabled floating-point exceptions. +   Copyright (C) 2018-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/csky/fegetmode.c b/libm/csky/fegetmode.c new file mode 100644 index 000000000..09d8282dd --- /dev/null +++ b/libm/csky/fegetmode.c @@ -0,0 +1,27 @@ +/* Store current floating-point control modes. +   Copyright (C) 2018-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/csky/fegetround.c b/libm/csky/fegetround.c new file mode 100644 index 000000000..e68775af3 --- /dev/null +++ b/libm/csky/fegetround.c @@ -0,0 +1,30 @@ +/* Return current rounding direction. +   Copyright (C) 2018-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) +{ +  unsigned int cw; + +  /* Get control word.  */ +  _FPU_GETCW (cw); + +  return cw & __FE_ROUND_MASK; +} diff --git a/libm/csky/feholdexcpt.c b/libm/csky/feholdexcpt.c new file mode 100644 index 000000000..456af5eb1 --- /dev/null +++ b/libm/csky/feholdexcpt.c @@ -0,0 +1,30 @@ +/* Store current floating-point environment and clear exceptions. +   Copyright (C) 2018-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> +#include "fenv_libc.h" +#include "fenv_private.h" + +#include <stdio.h> + +int +feholdexcept (fenv_t *envp) +{ +  libc_feholdexcept_vfp (envp); +  return 0; +} diff --git a/libm/csky/fenv_libc.h b/libm/csky/fenv_libc.h new file mode 100644 index 000000000..44e89812d --- /dev/null +++ b/libm/csky/fenv_libc.h @@ -0,0 +1,29 @@ +/* fpu registers environment.  C-SKY version. +   Copyright (C) 2018-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	0x0003FU +#define CAUSE_MASK	0x3F000U + +/* Shift for FE_* flags to get up to the ENABLE bits and the CAUSE bits.  */ +#define ENABLE_SHIFT	0 +#define CAUSE_SHIFT	8 + +#endif /* fenv_libc.h */ diff --git a/libm/csky/fenv_private.h b/libm/csky/fenv_private.h new file mode 100644 index 000000000..f0f48a88a --- /dev/null +++ b/libm/csky/fenv_private.h @@ -0,0 +1,277 @@ +/* Private floating point rounding and exceptions handling.  C-SKY version. +   Copyright (C) 2018-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 CSKY_FENV_PRIVATE_H +#define CSKY_FENV_PRIVATE_H 1 + +#include <fenv.h> +#include <fpu_control.h> +#include "fenv_libc.h" + +static __always_inline void +libc_feholdexcept_vfp (fenv_t *envp) +{ +  fpu_control_t fpsr, fpcr; + +  _FPU_GETCW (fpcr); +  envp->__fpcr = fpcr; + +  _FPU_GETFPSR (fpsr); +  envp->__fpsr = fpsr; + +  /* Now set all exceptions to non-stop.  */ +  fpcr &= ~FE_ALL_EXCEPT; + +  /* And clear all exception flags.  */ +  fpsr &= ~(FE_ALL_EXCEPT << CAUSE_SHIFT); + +  _FPU_SETFPSR (fpsr); + +  _FPU_SETCW (fpcr); +} + +static __always_inline void +libc_fesetround_vfp (int round) +{ +  fpu_control_t fpcr; + +  _FPU_GETCW (fpcr); + +  /* Set new rounding mode if different.  */ +  if (unlikely ((fpcr & FE_DOWNWARD) != round)) +    _FPU_SETCW ((fpcr & ~FE_DOWNWARD) | round); +} + +static __always_inline void +libc_feholdexcept_setround_vfp (fenv_t *envp, int round) +{ +  fpu_control_t fpsr, fpcr; + +  _FPU_GETCW (fpcr); +  envp->__fpcr = fpcr; + +  _FPU_GETFPSR (fpsr); +  envp->__fpsr = fpsr; + +  /* Clear exception flags, set all exceptions to non-stop, +     and set new rounding mode.  */ +  fpsr &= ~(FE_ALL_EXCEPT << CAUSE_SHIFT); +  _FPU_SETFPSR (fpsr); + +  fpcr &= ~(FE_ALL_EXCEPT | FE_DOWNWARD); +  _FPU_SETCW (fpcr | round); +} + +static __always_inline void +libc_feholdsetround_vfp (fenv_t *envp, int round) +{ +  fpu_control_t fpcr; + +  _FPU_GETCW (fpcr); +  envp->__fpcr = fpcr; + +  /* Set new rounding mode if different.  */ +  if (unlikely ((fpcr & FE_DOWNWARD) != round)) +    _FPU_SETCW ((fpcr & ~FE_DOWNWARD) | round); +} + +static __always_inline void +libc_feresetround_vfp (fenv_t *envp) +{ +  fpu_control_t fpcr, round; + +  _FPU_GETCW (fpcr); + +  /* Check whether rounding modes are different.  */ +  round = (envp->__fpcr ^ fpcr) & FE_DOWNWARD; + +  /* Restore the rounding mode if it was changed.  */ +  if (unlikely (round != 0)) +    _FPU_SETCW (fpcr ^ round); +} + +static __always_inline int +libc_fetestexcept_vfp (int ex) +{ +  fpu_control_t fpsr; + +  _FPU_GETFPSR (fpsr); +  fpsr = fpsr >> CAUSE_SHIFT; +  return fpsr & ex & FE_ALL_EXCEPT; +} + +static __always_inline void +libc_fesetenv_vfp (const fenv_t *envp) +{ +  fpu_control_t fpcr, fpsr, new_fpcr, new_fpsr; + +  _FPU_GETCW (fpcr); +  _FPU_GETFPSR (fpsr); + +  new_fpcr = envp->__fpcr; +  new_fpsr = envp->__fpsr; + +  if (unlikely (fpsr ^ new_fpsr) != 0) +    _FPU_SETFPSR (new_fpsr); + +  if (unlikely (fpcr ^ new_fpcr) != 0) +    _FPU_SETCW (new_fpcr); +} + +static __always_inline int +libc_feupdateenv_test_vfp (const fenv_t *envp, int ex) +{ +  fpu_control_t fpcr, fpsr, new_fpcr, new_fpsr, excepts; + +  _FPU_GETCW (fpcr); +  _FPU_GETFPSR (fpsr); + +  /* Merge current exception flags with the saved fenv.  */ +  excepts = (fpsr >> CAUSE_SHIFT) & FE_ALL_EXCEPT; +  new_fpcr = envp->__fpcr; +  new_fpsr = envp->__fpsr | (excepts << CAUSE_SHIFT); + +  /* Write FCR and FESR if different.  */ +  if (unlikely (fpsr ^ new_fpsr) != 0) +    _FPU_SETFPSR (new_fpsr); + +  if (unlikely (fpcr ^ new_fpcr) != 0) +    _FPU_SETCW (new_fpcr); + +  /* Raise the exceptions if enabled in the new FP state.  */ +  if (unlikely (excepts & new_fpcr)) +    feraiseexcept (excepts); + +  return excepts & ex; +} + +static __always_inline void +libc_feupdateenv_vfp (const fenv_t *envp) +{ +  libc_feupdateenv_test_vfp (envp, 0); +} + +static __always_inline void +libc_feholdsetround_vfp_ctx (struct rm_ctx *ctx, int r) +{ +  fpu_control_t fpcr, fpsr, round; + +  _FPU_GETCW (fpcr); +  _FPU_GETFPSR (fpsr); +  ctx->updated_status = false; +  ctx->env.__fpcr = fpcr; +  ctx->env.__fpsr = fpsr; + +  /* Check whether rounding modes are different.  */ +  round = (fpcr ^ r) & FE_DOWNWARD; + +  /* Set the rounding mode if changed.  */ +  if (unlikely (round != 0)) +    { +      ctx->updated_status = true; +      _FPU_SETCW (fpcr ^ round); +    } +} + +static __always_inline void +libc_feresetround_vfp_ctx (struct rm_ctx *ctx) +{ +  /* Restore the rounding mode if updated.  */ +  if (unlikely (ctx->updated_status)) +    { +      fpu_control_t fpcr; + +      _FPU_GETCW (fpcr); +      fpcr = (fpcr & ~FE_DOWNWARD) | (ctx->env.__fpcr & FE_DOWNWARD); +      _FPU_SETCW (fpcr); +    } +} + +static __always_inline void +libc_fesetenv_vfp_ctx (struct rm_ctx *ctx) +{ +  fpu_control_t fpcr, fpsr, new_fpcr, new_fpsr; + +  _FPU_GETCW (fpcr); +  _FPU_GETFPSR (fpsr); + +  new_fpcr = ctx->env.__fpcr; +  new_fpsr = ctx->env.__fpsr; + +  if (unlikely (fpsr ^ new_fpsr) != 0) +    _FPU_SETFPSR (new_fpsr); + +  if (unlikely (fpcr ^ new_fpcr) != 0) +    _FPU_SETCW (new_fpcr); +} + +#define libc_feholdexcept  libc_feholdexcept_vfp +#define libc_feholdexceptf libc_feholdexcept_vfp +#define libc_feholdexceptl libc_feholdexcept_vfp + +#define libc_fesetround  libc_fesetround_vfp +#define libc_fesetroundf libc_fesetround_vfp +#define libc_fesetroundl libc_fesetround_vfp + +#define libc_feresetround  libc_feresetround_vfp +#define libc_feresetroundf libc_feresetround_vfp +#define libc_feresetroundl libc_feresetround_vfp + +#define libc_feresetround_noex  libc_fesetenv_vfp +#define libc_feresetround_noexf libc_fesetenv_vfp +#define libc_feresetround_noexl libc_fesetenv_vfp + +#define libc_feholdexcept_setround  libc_feholdexcept_setround_vfp +#define libc_feholdexcept_setroundf libc_feholdexcept_setround_vfp +#define libc_feholdexcept_setroundl libc_feholdexcept_setround_vfp + +#define libc_feholdsetround  libc_feholdsetround_vfp +#define libc_feholdsetroundf libc_feholdsetround_vfp +#define libc_feholdsetroundl libc_feholdsetround_vfp + +#define libc_fetestexcept  libc_fetestexcept_vfp +#define libc_fetestexceptf libc_fetestexcept_vfp +#define libc_fetestexceptl libc_fetestexcept_vfp + +#define libc_fesetenv  libc_fesetenv_vfp +#define libc_fesetenvf libc_fesetenv_vfp +#define libc_fesetenvl libc_fesetenv_vfp + +#define libc_feupdateenv  libc_feupdateenv_vfp +#define libc_feupdateenvf libc_feupdateenv_vfp +#define libc_feupdateenvl libc_feupdateenv_vfp + +#define libc_feupdateenv_test  libc_feupdateenv_test_vfp +#define libc_feupdateenv_testf libc_feupdateenv_test_vfp +#define libc_feupdateenv_testl libc_feupdateenv_test_vfp + +/* We have support for rounding mode context.  */ +#define HAVE_RM_CTX 1 + +#define libc_feholdsetround_ctx		libc_feholdsetround_vfp_ctx +#define libc_feresetround_ctx		libc_feresetround_vfp_ctx +#define libc_feresetround_noex_ctx	libc_fesetenv_vfp_ctx + +#define libc_feholdsetroundf_ctx	libc_feholdsetround_vfp_ctx +#define libc_feresetroundf_ctx		libc_feresetround_vfp_ctx +#define libc_feresetround_noexf_ctx	libc_fesetenv_vfp_ctx + +#define libc_feholdsetroundl_ctx	libc_feholdsetround_vfp_ctx +#define libc_feresetroundl_ctx		libc_feresetround_vfp_ctx +#define libc_feresetround_noexl_ctx	libc_fesetenv_vfp_ctx + +#endif /* CSKY_FENV_PRIVATE_H */ diff --git a/libm/csky/fesetenv.c b/libm/csky/fesetenv.c new file mode 100644 index 000000000..96b961598 --- /dev/null +++ b/libm/csky/fesetenv.c @@ -0,0 +1,55 @@ +/* Install given floating-point environment. +   Copyright (C) 2018-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) +{ +  unsigned int fpcr; +  unsigned int fpsr; + +  _FPU_GETCW (fpcr); +  _FPU_GETFPSR (fpsr); + +  fpcr &= _FPU_RESERVED; +  fpsr &= _FPU_FPSR_RESERVED; + +  if (envp == FE_DFL_ENV) +    { +      fpcr |= _FPU_DEFAULT; +      fpsr |= _FPU_FPSR_DEFAULT; +    } +  else if (envp == FE_NOMASK_ENV) +    { +      fpcr |= _FPU_FPCR_IEEE; +      fpsr |= _FPU_FPSR_IEEE; +    } +  else +    { +      fpcr |= envp->__fpcr & ~_FPU_RESERVED; +      fpsr |= envp->__fpsr & ~_FPU_FPSR_RESERVED; +    } + +  _FPU_SETFPSR (fpsr); + +  _FPU_SETCW (fpcr); + +  /* Success.  */ +  return 0; +} diff --git a/libm/csky/fesetexcept.c b/libm/csky/fesetexcept.c new file mode 100644 index 000000000..940322197 --- /dev/null +++ b/libm/csky/fesetexcept.c @@ -0,0 +1,32 @@ +/* Set given exception flags. +   Copyright (C) 2018-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> +#include "fenv_libc.h" + +int +fesetexcept (int excepts) +{ +  fpu_control_t fpsr, new_fpsr; +  _FPU_GETFPSR (fpsr); +  new_fpsr = fpsr | ((excepts & FE_ALL_EXCEPT) << CAUSE_SHIFT); +  if (new_fpsr != fpsr) +    _FPU_SETFPSR (new_fpsr); + +  return 0; +} diff --git a/libm/csky/fesetmode.c b/libm/csky/fesetmode.c new file mode 100644 index 000000000..eddd2d401 --- /dev/null +++ b/libm/csky/fesetmode.c @@ -0,0 +1,32 @@ +/* Install given floating-point control modes. +   Copyright (C) 2018-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 +fesetmode (const femode_t *modep) +{ +  femode_t mode; +  if (modep == FE_DFL_MODE) +    mode = _FPU_DEFAULT; +  else +    mode = *modep; +  _FPU_SETCW (mode); + +  return 0; +} diff --git a/libm/csky/fesetround.c b/libm/csky/fesetround.c new file mode 100644 index 000000000..15a4b7c7e --- /dev/null +++ b/libm/csky/fesetround.c @@ -0,0 +1,28 @@ +/* Set current rounding direction. +   Copyright (C) 2018-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> +#include "fenv_private.h" + +#include <stdio.h> +int +fesetround (int round) +{ +  libc_fesetround_vfp (round); +  return 0; +} diff --git a/libm/csky/feupdateenv.c b/libm/csky/feupdateenv.c new file mode 100644 index 000000000..91e627ad2 --- /dev/null +++ b/libm/csky/feupdateenv.c @@ -0,0 +1,42 @@ +/* Install given floating-point environment and raise exceptions. +   Copyright (C) 2018-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> +#include "fenv_libc.h" +#include "fenv_private.h" +#include <stdio.h> + +int +feupdateenv (const fenv_t *envp) +{ +  int temp; + +  /* Save current exceptions.  */ +  _FPU_GETFPSR (temp); +  temp = (temp >> CAUSE_SHIFT) & 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/csky/fgetexcptflg.c b/libm/csky/fgetexcptflg.c new file mode 100644 index 000000000..c400a2c1f --- /dev/null +++ b/libm/csky/fgetexcptflg.c @@ -0,0 +1,31 @@ +/* Store current representation for exceptions. +   Copyright (C) 2018-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> +#include "fenv_libc.h" +#include "fenv_private.h" +#include <stdio.h> + +int +fegetexceptflag (fexcept_t *flagp, int excepts) +{ +  *flagp = libc_fetestexcept_vfp (excepts); + +  /* Success.  */ +  return 0; +} diff --git a/libm/csky/fraiseexcpt.c b/libm/csky/fraiseexcpt.c new file mode 100644 index 000000000..31cd32f2c --- /dev/null +++ b/libm/csky/fraiseexcpt.c @@ -0,0 +1,122 @@ +/* Raise given exceptions. +   Copyright (C) 2018-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> +#include <float.h> +#include <math.h> + +int +feraiseexcept (int excepts) +{ +    /* Raise exceptions represented by EXCEPTS.  But we must raise only one +     signal at a time.  It is important that if the overflow/underflow +     exception and the divide by zero exception are given at the same +     time, the overflow/underflow exception follows the divide by zero +     exception.  */ + +# ifndef __csky_fpuv1__ +    /* First: invalid exception.  */ +    if (FE_INVALID & excepts) +    { +      /* One example of a invalid operation is 0 * Infinity.  */ +      float x = HUGE_VALF, y = 0.0f; +      __asm__ __volatile__ ("fmuls %0, %0, %1" : "+v" (x) : "v" (y)); +    } + +    /* Next: division by zero.  */ +    if (FE_DIVBYZERO & excepts) +    { +      float x = 1.0f, y = 0.0f; +      __asm__ __volatile__ ("fdivs %0, %0, %1" : "+v" (x) : "v" (y)); +    } + +    /* Next: overflow.  */ +    if (FE_OVERFLOW & excepts) +    { +      float x = FLT_MAX; +      __asm__ __volatile__ ("fmuls %0, %0, %0" : "+v" (x)); +    } +    /* Next: underflow.  */ +    if (FE_UNDERFLOW & excepts) +    { +      float x = -FLT_MIN; + +      __asm__ __volatile__ ("fmuls %0, %0, %0" : "+v" (x)); +    } + +    /* Last: inexact.  */ +    if (FE_INEXACT & excepts) +    { +      float x = 1.0f, y = 3.0f; +      __asm__ __volatile__ ("fdivs %0, %0, %1" : "+v" (x) : "v" (y)); +    } + +    if (__FE_DENORMAL & excepts) +    { +      double x = 4.9406564584124654e-324; +      __asm__ __volatile__ ("fstod %0, %0" : "+v" (x)); +    } +# else +     int tmp = 0; +    /* First: invalid exception.  */ +    if (FE_INVALID & excepts) +    { +      /* One example of a invalid operation is 0 * Infinity.  */ +      float x = HUGE_VALF, y = 0.0f; +      __asm__ __volatile__ ("fmuls %0, %0, %2, %1" +                    : "+f" (x), "+r"(tmp) : "f" (y)); +    } + +    /* Next: division by zero.  */ +    if (FE_DIVBYZERO & excepts) +    { +      float x = 1.0f, y = 0.0f; +      __asm__ __volatile__ ("fdivs %0, %0, %2, %1" +                    : "+f" (x), "+r"(tmp) : "f" (y)); +    } + +    /* Next: overflow.  */ +    if (FE_OVERFLOW & excepts) +    { +      float x = FLT_MAX, y = FLT_MAX; +      __asm__ __volatile__ ("fmuls %0, %0, %2, %1" +                    : "+f" (x), "+r"(tmp) : "f" (y)); +    } + +    /* Next: underflow.  */ +    if (FE_UNDERFLOW & excepts) +    { +      float x = -FLT_MIN, y = -FLT_MIN; + +      __asm__ __volatile__ ("fmuls %0, %0, %2, %1" +                    : "+f" (x), "+r"(tmp) : "f" (y)); +    } + +    /* Last: inexact.  */ +    if (FE_INEXACT & excepts) +    { +      float x = 1.0f, y = 3.0f; +      __asm__ __volatile__ ("fdivs %0, %0, %2, %1" +                    : "+f" (x), "+r"(tmp) : "f" (y)); +    } +# endif /* __csky_fpuv2__ */ + +    /* Success.  */ +    return 0; +} diff --git a/libm/csky/fsetexcptflg.c b/libm/csky/fsetexcptflg.c new file mode 100644 index 000000000..b6281d5c2 --- /dev/null +++ b/libm/csky/fsetexcptflg.c @@ -0,0 +1,42 @@ +/* Set floating-point environment exception handling. +   Copyright (C) 2018-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> +#include "fenv_libc.h" + +int +fesetexceptflag (const fexcept_t *flagp, int excepts) +{ +  fpu_control_t temp; + +  /* Get the current exceptions.  */ +   _FPU_GETFPSR (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 >> CAUSE_SHIFT) & ~excepts) | (*flagp & excepts); +  temp = temp << CAUSE_SHIFT; + +  _FPU_SETFPSR (temp); + +  /* Success.  */ +  return 0; +} diff --git a/libm/csky/ftestexcept.c b/libm/csky/ftestexcept.c new file mode 100644 index 000000000..6e3217eb1 --- /dev/null +++ b/libm/csky/ftestexcept.c @@ -0,0 +1,28 @@ +/* Test exception in current environment. +   Copyright (C) 2018-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> +#include "fenv_libc.h" +#include "fenv_private.h" +#include <stdio.h> + +int +fetestexcept (int excepts) +{ +  return libc_fetestexcept_vfp (excepts); +} | 
