This is the mail archive of the
libc-help@sourceware.org
mailing list for the glibc project.
Re: [RFC PATCH 04/10] C-SKY: Hard Float Support
On 03/16/2018 03:58 AM, Mao Han wrote:
> This patch contains hardware floating-point support for C-SKY.
>
> *sysdeps/csky/fpu/fclrexcpt.c: New file
> *sysdeps/csky/fpu/fedisblxcpt.c: New file
> *sysdeps/csky/fpu/feenablxcpt.c: New file
> *sysdeps/csky/fpu/fegetenv.c: New file
> *sysdeps/csky/fpu/fegetexcept.c: New file
> *sysdeps/csky/fpu/fegetmode.c: New file
> *sysdeps/csky/fpu/fegetround.c: New file
> *sysdeps/csky/fpu/feholdexcpt.c: New file
> *sysdeps/csky/fpu/fenv_libc.h: New file
> *sysdeps/csky/fpu/fesetenv.c: New file
> *sysdeps/csky/fpu/fesetexcept.c: New file
> *sysdeps/csky/fpu/fesetmode.c: New file
> *sysdeps/csky/fpu/fesetround.c: New file
> *sysdeps/csky/fpu/feupdateenv.c: New file
> *sysdeps/csky/fpu/fgetexcptflg.c: New file
> *sysdeps/csky/fpu/fraiseexcpt.c: New file
> *sysdeps/csky/fpu/fsetexcptflg.c: New file
> *sysdeps/csky/fpu/ftestexcept.c: New file
> *sysdeps/csky/fpu_control.h: New file
>
Fairly straight forward looks OK to me.
Should go to libc-alpha now.
> Signed-off-by: Mao Han <han_mao@c-sky.com>
> ---
> sysdeps/csky/fpu/fclrexcpt.c | 47 +++++++++++++
> sysdeps/csky/fpu/fedisblxcpt.c | 46 ++++++++++++
> sysdeps/csky/fpu/feenablxcpt.c | 45 ++++++++++++
> sysdeps/csky/fpu/fegetenv.c | 43 ++++++++++++
> sysdeps/csky/fpu/fegetexcept.c | 37 ++++++++++
> sysdeps/csky/fpu/fegetmode.c | 29 ++++++++
> sysdeps/csky/fpu/fegetround.c | 39 +++++++++++
> sysdeps/csky/fpu/feholdexcpt.c | 39 +++++++++++
> sysdeps/csky/fpu/fenv_libc.h | 29 ++++++++
> sysdeps/csky/fpu/fesetenv.c | 65 +++++++++++++++++
> sysdeps/csky/fpu/fesetexcept.c | 37 ++++++++++
> sysdeps/csky/fpu/fesetmode.c | 37 ++++++++++
> sysdeps/csky/fpu/fesetround.c | 42 +++++++++++
> sysdeps/csky/fpu/feupdateenv.c | 52 ++++++++++++++
> sysdeps/csky/fpu/fgetexcptflg.c | 37 ++++++++++
> sysdeps/csky/fpu/fraiseexcpt.c | 131 +++++++++++++++++++++++++++++++++++
> sysdeps/csky/fpu/fsetexcptflg.c | 48 +++++++++++++
> sysdeps/csky/fpu/ftestexcept.c | 35 ++++++++++
> sysdeps/csky/fpu_control.h | 150 ++++++++++++++++++++++++++++++++++++++++
> 19 files changed, 988 insertions(+)
> create mode 100644 sysdeps/csky/fpu/fclrexcpt.c
> create mode 100644 sysdeps/csky/fpu/fedisblxcpt.c
> create mode 100644 sysdeps/csky/fpu/feenablxcpt.c
> create mode 100644 sysdeps/csky/fpu/fegetenv.c
> create mode 100644 sysdeps/csky/fpu/fegetexcept.c
> create mode 100644 sysdeps/csky/fpu/fegetmode.c
> create mode 100644 sysdeps/csky/fpu/fegetround.c
> create mode 100644 sysdeps/csky/fpu/feholdexcpt.c
> create mode 100644 sysdeps/csky/fpu/fenv_libc.h
> create mode 100644 sysdeps/csky/fpu/fesetenv.c
> create mode 100644 sysdeps/csky/fpu/fesetexcept.c
> create mode 100644 sysdeps/csky/fpu/fesetmode.c
> create mode 100644 sysdeps/csky/fpu/fesetround.c
> create mode 100644 sysdeps/csky/fpu/feupdateenv.c
> create mode 100644 sysdeps/csky/fpu/fgetexcptflg.c
> create mode 100644 sysdeps/csky/fpu/fraiseexcpt.c
> create mode 100644 sysdeps/csky/fpu/fsetexcptflg.c
> create mode 100644 sysdeps/csky/fpu/ftestexcept.c
> create mode 100644 sysdeps/csky/fpu_control.h
>
> diff --git a/sysdeps/csky/fpu/fclrexcpt.c b/sysdeps/csky/fpu/fclrexcpt.c
> new file mode 100644
> index 0000000..d3bbaf0
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fclrexcpt.c
> @@ -0,0 +1,47 @@
> +/* Clear given exceptions in current floating-point environment.
> + Copyright (C) 2018 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + 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
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <fenv.h>
> +#include <fenv_libc.h>
> +#include <fpu_control.h>
> +
> +int
> +feclearexcept (int excepts)
> +{
> +#ifdef __csky_hard_float__
> + 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;
> +#else
> + /* Unsupported, so fail unless nothing needs to be done. */
> + return (excepts != 0);
> +#endif /* __csky_hard_float__ */
> +}
> +libm_hidden_def (feclearexcept)
> diff --git a/sysdeps/csky/fpu/fedisblxcpt.c b/sysdeps/csky/fpu/fedisblxcpt.c
> new file mode 100644
> index 0000000..6a70c0e
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fedisblxcpt.c
> @@ -0,0 +1,46 @@
> +/* Disable floating-point exceptions.
> + Copyright (C) 2018 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + 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
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <fenv.h>
> +#include <fenv_libc.h>
> +#include <fpu_control.h>
> +
> +int
> +fedisableexcept (int excepts)
> +{
> +#ifdef __csky_hard_float__
> + 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;
> +#else
> + /* Unsupported, so return -1 for failure. */
> + return -1;
> +#endif /* __csky_hard_float__ */
> +}
> diff --git a/sysdeps/csky/fpu/feenablxcpt.c b/sysdeps/csky/fpu/feenablxcpt.c
> new file mode 100644
> index 0000000..21c1e77
> --- /dev/null
> +++ b/sysdeps/csky/fpu/feenablxcpt.c
> @@ -0,0 +1,45 @@
> +/* Enable floating-point exceptions.
> + Copyright (C) 2018 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + 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
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <fenv.h>
> +#include <fenv_libc.h>
> +#include <fpu_control.h>
> +
> +int
> +feenableexcept (int excepts)
> +{
> +#ifdef __csky_hard_float__
> + 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;
> +#else
> + /* Unsupported, so return -1 for failure. */
> + return -1;
> +#endif /* __csky_hard_float__ */
> +}
> diff --git a/sysdeps/csky/fpu/fegetenv.c b/sysdeps/csky/fpu/fegetenv.c
> new file mode 100644
> index 0000000..5828c99
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fegetenv.c
> @@ -0,0 +1,43 @@
> +/* Store current floating-point environment.
> + Copyright (C) 2018 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + 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
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <fenv.h>
> +#include <fpu_control.h>
> +
> +int
> +__fegetenv (fenv_t *envp)
> +{
> +#ifdef __csky_hard_float__
> + unsigned int fpcr;
> + unsigned int fpsr;
> +
> + _FPU_GETCW (fpcr);
> + _FPU_GETFPSR (fpsr);
> + envp->__fpcr = fpcr;
> + envp->__fpsr = fpsr;
> +
> + return 0;
> +#else
> + /* Unsupported, so return 1 for failure. */
> + return 1;
> +#endif /* __csky_hard_float__ */
> +}
> +libm_hidden_def (__fegetenv)
> +weak_alias (__fegetenv, fegetenv)
> +libm_hidden_weak (fegetenv)
> +
> diff --git a/sysdeps/csky/fpu/fegetexcept.c b/sysdeps/csky/fpu/fegetexcept.c
> new file mode 100644
> index 0000000..784f4f7
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fegetexcept.c
> @@ -0,0 +1,37 @@
> +/* Get enabled floating-point exceptions.
> + Copyright (C) 2018 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + 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
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <fenv.h>
> +#include <fenv_libc.h>
> +#include <fpu_control.h>
> +
> +int
> +fegetexcept (void)
> +{
> +#ifdef __csky_hard_float__
> + unsigned int exc;
> +
> + /* Get the current control word. */
> + _FPU_GETCW (exc);
> +
> + return (exc & ENABLE_MASK) >> ENABLE_SHIFT;
> +#else
> + /* Unsupported. Return all exceptions disabled. */
> + return 0;
> +#endif /* __csky_hard_float__ */
> +}
> diff --git a/sysdeps/csky/fpu/fegetmode.c b/sysdeps/csky/fpu/fegetmode.c
> new file mode 100644
> index 0000000..f3115b1
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fegetmode.c
> @@ -0,0 +1,29 @@
> +/* Store current floating-point control modes.
> + Copyright (C) 2018 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + 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
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <fenv.h>
> +#include <fpu_control.h>
> +
> +int
> +fegetmode (femode_t *modep)
> +{
> +#ifdef __csky_hard_float__
> + _FPU_GETCW (*modep);
> +#endif /* __csky_hard_float__ */
> + return 0;
> +}
> diff --git a/sysdeps/csky/fpu/fegetround.c b/sysdeps/csky/fpu/fegetround.c
> new file mode 100644
> index 0000000..6e0fcec
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fegetround.c
> @@ -0,0 +1,39 @@
> +/* Return current rounding direction.
> + Copyright (C) 2018 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + 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
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <fenv.h>
> +#include <fpu_control.h>
> +
> +int
> +__fegetround (void)
> +{
> +#ifdef __csky_hard_float__
> + unsigned int cw;
> +
> + /* Get control word. */
> + _FPU_GETCW (cw);
> +
> + return cw & FE_ROUND_MASK;
> +#else
> + /* The current soft-float implementation only handles TONEAREST. */
> + return FE_TONEAREST;
> +#endif /* __csky_hard_float__ */
> +}
> +libm_hidden_def (__fegetround)
> +weak_alias (__fegetround, fegetround)
> +libm_hidden_weak (fegetround)
> diff --git a/sysdeps/csky/fpu/feholdexcpt.c b/sysdeps/csky/fpu/feholdexcpt.c
> new file mode 100644
> index 0000000..6c466d0
> --- /dev/null
> +++ b/sysdeps/csky/fpu/feholdexcpt.c
> @@ -0,0 +1,39 @@
> +/* Store current floating-point environment and clear exceptions.
> + Copyright (C) 2018 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + 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
> + <http://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)
> +{
> +#ifdef __csky_hard_float__
> + libc_feholdexcept_vfp (envp);
> + return 0;
> +#else
> + /* Unsupported, so fail. */
> + return 1;
> +#endif /* __csky_hard_float__ */
> +}
> +libm_hidden_def (__feholdexcept)
> +weak_alias (__feholdexcept, feholdexcept)
> +libm_hidden_weak (feholdexcept)
> diff --git a/sysdeps/csky/fpu/fenv_libc.h b/sysdeps/csky/fpu/fenv_libc.h
> new file mode 100644
> index 0000000..2dacb2c
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fenv_libc.h
> @@ -0,0 +1,29 @@
> +/* Copyright (C) 2018 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + 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
> + <http://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/sysdeps/csky/fpu/fesetenv.c b/sysdeps/csky/fpu/fesetenv.c
> new file mode 100644
> index 0000000..9a651a6
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fesetenv.c
> @@ -0,0 +1,65 @@
> +/* Install given floating-point environment.
> + Copyright (C) 2018 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + 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
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <fenv.h>
> +#include <fpu_control.h>
> +
> +int
> +__fesetenv (const fenv_t *envp)
> +{
> +#ifdef __csky_hard_float__
> + 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;
> +#else
> + /* Unsupported, so fail. */
> + return 1;
> +#endif /* __csky_hard_float__ */
> +}
> +libm_hidden_def (__fesetenv)
> +weak_alias (__fesetenv, fesetenv)
> +libm_hidden_weak (fesetenv)
> +
> diff --git a/sysdeps/csky/fpu/fesetexcept.c b/sysdeps/csky/fpu/fesetexcept.c
> new file mode 100644
> index 0000000..e0a90f6
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fesetexcept.c
> @@ -0,0 +1,37 @@
> +/* Set given exception flags.
> + Copyright (C) 2018 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + 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
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <fenv.h>
> +#include <fpu_control.h>
> +#include <fenv_libc.h>
> +
> +int
> +fesetexcept (int excepts)
> +{
> +#ifdef __csky_hard_float__
> + 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);
> +#else
> + return (excepts != 0);
> +#endif /* __csky_hard_float__ */
> +
> + return 0;
> +}
> diff --git a/sysdeps/csky/fpu/fesetmode.c b/sysdeps/csky/fpu/fesetmode.c
> new file mode 100644
> index 0000000..9e259d0
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fesetmode.c
> @@ -0,0 +1,37 @@
> +/* Install given floating-point control modes.
> + Copyright (C) 2018 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + 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
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <fenv.h>
> +#include <fpu_control.h>
> +
> +int
> +fesetmode (const femode_t *modep)
> +{
> +#ifdef __csky_hard_float__
> + if (modep == FE_DFL_MODE)
> + mode = _FPU_DEFAULT;
> + else
> + mode = *modep;
> + _FPU_SETCW (mode);
> +
> + return 0;
> +#else
> + /* Nothing to do. */
> + return 0;
> +#endif /* __csky_hard_float__ */
> +}
> diff --git a/sysdeps/csky/fpu/fesetround.c b/sysdeps/csky/fpu/fesetround.c
> new file mode 100644
> index 0000000..8e3128c
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fesetround.c
> @@ -0,0 +1,42 @@
> +/* Set current rounding direction.
> + Copyright (C) 2018 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + 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
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <fenv.h>
> +#include <fpu_control.h>
> +#include <fenv_private.h>
> +
> +#include <stdio.h>
> +int
> +__fesetround (int round)
> +{
> +#ifdef __csky_hard_float__
> + libc_fesetround_vfp (round);
> + return 0;
> +#else
> + if (round == FE_TONEAREST)
> + /* This is the only supported rounding mode for soft-fp. */
> + return 0;
> +
> + /* Unsupported, so fail. */
> + return 1;
> +#endif /* __csky_hard_float__ */
> +}
> +libm_hidden_def (__fesetround)
> +weak_alias (__fesetround, fesetround)
> +libm_hidden_weak (fesetround)
> +
> diff --git a/sysdeps/csky/fpu/feupdateenv.c b/sysdeps/csky/fpu/feupdateenv.c
> new file mode 100644
> index 0000000..992717e
> --- /dev/null
> +++ b/sysdeps/csky/fpu/feupdateenv.c
> @@ -0,0 +1,52 @@
> +/* Install given floating-point environment and raise exceptions.
> + Copyright (C) 2018 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + 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
> + <http://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)
> +{
> +#ifdef __csky_hard_float__
> + int temp;
> +
> + /* Save current exceptions. */
> + _FPU_GETFPSR(temp);
> + temp = (temp >> CAUSE_SHIFT) & FE_ALL_EXCEPT;
> + /* Install new environment. */
> + libc_fesetenv_vfp (envp);
> +
> + /* Raise the safed exception. Incidently 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;
> +#else
> + /* Unsupported, so fail. */
> + return 1;
> +#endif /* __csky_hard_float__ */
> +}
> +libm_hidden_def (__feupdateenv)
> +weak_alias (__feupdateenv, feupdateenv)
> +libm_hidden_weak (feupdateenv)
> +
> diff --git a/sysdeps/csky/fpu/fgetexcptflg.c b/sysdeps/csky/fpu/fgetexcptflg.c
> new file mode 100644
> index 0000000..73d0ce8
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fgetexcptflg.c
> @@ -0,0 +1,37 @@
> +/* Store current representation for exceptions.
> + Copyright (C) 2018 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + 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
> + <http://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)
> +{
> +#ifdef __csky_hard_float__
> + *flagp = libc_fetestexcept_vfp (excepts);
> +
> + /* Success. */
> + return 0;
> +#else
> + /* Unsupported, so fail. */
> + return 1;
> +#endif /* __csky_hard_float__ */
> +}
> diff --git a/sysdeps/csky/fpu/fraiseexcpt.c b/sysdeps/csky/fpu/fraiseexcpt.c
> new file mode 100644
> index 0000000..221533e
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fraiseexcpt.c
> @@ -0,0 +1,131 @@
> +/* Raise given exceptions.
> + Copyright (C) 2018 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + 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
> + <http://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)
> +{
> +#ifdef __csky_hard_float__
> + /* 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. */
> +
> +# ifdef __csky_fpuv2__
> + /* 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 /* __csky_fpuv2__ */
> + 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;
> +#else /* __csky_hard_float__ */
> + /* Unsupported, so fail unless nothing needs to be done. */
> + return (excepts != 0);
> +#endif
> +}
> +libm_hidden_def (__feraiseexcept)
> +weak_alias (__feraiseexcept, feraiseexcept)
> +libm_hidden_weak (feraiseexcept)
> diff --git a/sysdeps/csky/fpu/fsetexcptflg.c b/sysdeps/csky/fpu/fsetexcptflg.c
> new file mode 100644
> index 0000000..79ddc50
> --- /dev/null
> +++ b/sysdeps/csky/fpu/fsetexcptflg.c
> @@ -0,0 +1,48 @@
> +/* Set floating-point environment exception handling.
> + Copyright (C) 2018 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + 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
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <fenv.h>
> +#include <fpu_control.h>
> +#include <fenv_libc.h>
> +
> +int
> +fesetexceptflag (const fexcept_t *flagp, int excepts)
> +{
> +#ifdef __csky_hard_float__
> + 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;
> +#else
> + /* Unsupported, so fail unless nothing needs to be done. */
> + return (excepts != 0);
> +#endif
> +}
> diff --git a/sysdeps/csky/fpu/ftestexcept.c b/sysdeps/csky/fpu/ftestexcept.c
> new file mode 100644
> index 0000000..23f7f0b
> --- /dev/null
> +++ b/sysdeps/csky/fpu/ftestexcept.c
> @@ -0,0 +1,35 @@
> +/* Test exception in current environment.
> + Copyright (C) 2018 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + 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
> + <http://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)
> +{
> +#ifdef __csky_hard_float__
> + return libc_fetestexcept_vfp (excepts);
> +#else
> + /* Unsupported, return 0. */
> + return 0;
> +#endif
> +}
> +libm_hidden_def (fetestexcept)
> diff --git a/sysdeps/csky/fpu_control.h b/sysdeps/csky/fpu_control.h
> new file mode 100644
> index 0000000..c2757f5
> --- /dev/null
> +++ b/sysdeps/csky/fpu_control.h
> @@ -0,0 +1,150 @@
> +/* FPU control word bits. C-SKY version.
> + Copyright (C) 2018 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + 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
> + <http://www.gnu.org/licenses/>. */
> +
> +#ifndef _FPU_CONTROL_H
> +#define _FPU_CONTROL_H
> +
> +/*
> + * CSKY FPU floating point control register bits.
> + *
> + * 31-28 -> reserved (read as 0, write with 0)
> + * 27 -> 0: flush denormalized results to zero
> + * 1: flush denormalized results to signed minimal normal number.
> + * 26 -> reserved (read as 0, write with 0)
> + * 25-24 -> rounding control
> + * 23-6 -> reserved (read as 0, write with 0)
> + * 5 -> enable exception for input denormalized exception
> + * 4 -> enable exception for inexact exception
> + * 3 -> enable exception for underflow exception
> + * 2 -> enable exception for overflow exception
> + * 1 -> enable exception for division by zero exception
> + * 0 -> enable exception for invalid operation exception
> + *
> + * Rounding Control:
> + * 00 - rounding to nearest (RN)
> + * 01 - rounding toward zero (RZ)
> + * 10 - rounding (up) toward plus infinity (RP)
> + * 11 - rounding (down)toward minus infinity (RM)
> + *
> + * CSKY FPU floating point exception status register bits.
> + *
> + * 15 -> accumulate bit for any exception
> + * 14 -> reserved (read as 0, write with 0)
> + * 13 -> cause bit for input denormalized exception
> + * 12 -> cause bit for inexact exception
> + * 11 -> cause bit for underflow exception
> + * 10 -> cause bit for overflow exception
> + * 9 -> cause bit for division by zero exception
> + * 8 -> cause bit for invalid operation exception
> + * 7 -> flag bit for any exception
> + * 6 -> reserved (read as 0, write with 0)
> + * 5 -> flag exception for input denormalized exception
> + * 4 -> flag exception for inexact exception
> + * 3 -> flag exception for underflow exception
> + * 2 -> flag exception for overflow exception
> + * 1 -> flag exception for division by zero exception
> + * 0 -> flag exception for invalid operation exception
> + */
> +
> +#include <features.h>
> +
> +#ifdef __csky_soft_float__
> +
> +# define _FPU_RESERVED 0xffffffff
> +# define _FPU_DEFAULT 0x00000000
> +typedef unsigned int fpu_control_t;
> +# define _FPU_GETCW(cw) (cw) = 0
> +# define _FPU_SETCW(cw) (void) (cw)
> +# define _FPU_GETFPSR(cw) (cw) = 0
> +# define _FPU_SETFPSR(cw) (void) (cw)
> +extern fpu_control_t __fpu_control;
> +
> +#else /* !__csky_soft_float__ */
> +
> +/* masking of interrupts */
> +# define _FPU_MASK_IDE (1 << 5) /* input denormalized exception */
> +# define _FPU_MASK_IXE (1 << 4) /* inexact exception */
> +# define _FPU_MASK_UFE (1 << 3) /* underflow exception */
> +# define _FPU_MASK_OFE (1 << 2) /* overflow exception */
> +# define _FPU_MASK_DZE (1 << 1) /* division by zero exception */
> +# define _FPU_MASK_IOE (1 << 0) /* invalid operation exception */
> +
> +# define _FPU_MASK_FEA (1 << 15) /* case for any exception */
> +# define _FPU_MASK_FEC (1 << 7) /* flag for any exception */
> +
> +/* flush denormalized numbers to zero */
> +# define _FPU_FLUSH_TZ 0x8000000
> +
> +/* rounding control */
> +# define _FPU_RC_NEAREST (0x0 << 24) /* RECOMMENDED */
> +# define _FPU_RC_ZERO (0x1 << 24)
> +# define _FPU_RC_UP (0x2 << 24)
> +# define _FPU_RC_DOWN (0x3 << 24)
> +
> +# define _FPU_RESERVED 0xf4ffffc0 /* Reserved bits in cw */
> +# define _FPU_FPSR_RESERVED 0x3fff0000
> +
> +/* The fdlibm code requires strict IEEE double precision arithmetic,
> + and no interrupts for exceptions, rounding to nearest. */
> +
> +# define _FPU_DEFAULT 0x00000000
> +# define _FPU_FPSR_DEFAULT 0x00000000
> +
> +/* IEEE: same as above, but exceptions */
> +# define _FPU_FPCR_IEEE 0x0000001F
> +# define _FPU_FPSR_IEEE 0x00000000
> +
> +/* Type of the control word. */
> +typedef unsigned int fpu_control_t;
> +
> +/* Macros for accessing the hardware control word. */
> +# if (__CSKY__ == 2)
> +# define _FPU_GETCW(cw) __asm__ volatile ("mfcr %0, cr<1, 2>" : "=r" (cw))
> +# define _FPU_SETCW(cw) __asm__ volatile ("mtcr %0, cr<1, 2>" : : "r" (cw))
> +# define _FPU_GETFPSR(cw) __asm__ volatile ("mfcr %0, cr<2, 2>" : "=r" (cw))
> +# define _FPU_SETFPSR(cw) __asm__ volatile ("mtcr %0, cr<2, 2>" : : "r" (cw))
> +# else /* __CSKY__ != 2 */
> +# define _FPU_GETCW(cw) __asm__ volatile ("1: cprcr %0, cpcr2 \n" \
> + " btsti %0, 31 \n" \
> + " bt 1b \n" \
> + " cprcr %0, cpcr1\n" : "=b" (cw))
> +
> +# define _FPU_SETCW(cw) __asm__ volatile ("1: cprcr r7, cpcr2 \n" \
> + " btsti r7, 31 \n" \
> + " bt 1b \n" \
> + " cpwcr %0, cpcr1 \n" \
> + : : "b" (cw) : "r7")
> +
> +# define _FPU_GETFPSR(cw) __asm__ volatile ("1: cprcr %0, cpcr2 \n" \
> + " btsti %0, 31 \n" \
> + " bt 1b \n" \
> + " cprcr %0, cpcr4\n" : "=b" (cw))
> +
> +# define _FPU_SETFPSR(cw) __asm__ volatile ("1: cprcr r7, cpcr2 \n" \
> + " btsti r7, 31 \n" \
> + " bt 1b \n" \
> + " cpwcr %0, cpcr4 \n" \
> + : : "b" (cw) : "r7")
> +# endif /* __CSKY__ != 2 */
> +
> +/* Default control word set at startup. */
> +extern fpu_control_t __fpu_control;
> +
> +#endif /* !__csky_soft_float__ */
> +
> +#endif /* fpu_control.h */
>