[RFC PATCH 03/10] C-SKY: Generic math Routines
Carlos O'Donell
carlos@redhat.com
Fri Mar 16 14:13:00 GMT 2018
On 03/16/2018 03:58 AM, Mao Han wrote:
> This patch contains the miscellaneous math routines and headers we have
> implemented for C-SKY.
>
> *sysdeps/csky/bits/fenv.h: New file
> *sysdeps/csky/libm-test-ulps: New file
> *sysdeps/csky/libm-test-ulps-name: New file
> *sysdeps/csky/math-tests.h: New file
> *sysdeps/csky/sfp-machine.h: New file
> *sysdeps/csky/math_private.h: New file
> *sysdeps/csky/fenv_private.h: New file
>
Looks OK, you have an odd comment in fenv_private.h about someone needing
to check _FP_CHOOSENAN implementation for softfp, that should be cleaned up.
Overall looks ready to go to libc-alpha for review.
> Signed-off-by: Mao Han <han_mao@c-sky.com>
> ---
> sysdeps/csky/bits/fenv.h | 97 +++
> sysdeps/csky/fenv_private.h | 288 +++++++
> sysdeps/csky/libm-test-ulps | 1682 ++++++++++++++++++++++++++++++++++++++
> sysdeps/csky/libm-test-ulps-name | 1 +
> sysdeps/csky/math-tests.h | 35 +
> sysdeps/csky/math_private.h | 7 +
> sysdeps/csky/sfp-machine.h | 51 ++
> 7 files changed, 2161 insertions(+)
> create mode 100644 sysdeps/csky/bits/fenv.h
> create mode 100644 sysdeps/csky/fenv_private.h
> create mode 100644 sysdeps/csky/libm-test-ulps
> create mode 100644 sysdeps/csky/libm-test-ulps-name
> create mode 100644 sysdeps/csky/math-tests.h
> create mode 100644 sysdeps/csky/math_private.h
> create mode 100644 sysdeps/csky/sfp-machine.h
>
> diff --git a/sysdeps/csky/bits/fenv.h b/sysdeps/csky/bits/fenv.h
> new file mode 100644
> index 0000000..fdd188a
> --- /dev/null
> +++ b/sysdeps/csky/bits/fenv.h
> @@ -0,0 +1,97 @@
> +/* 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_H
> +# error "Never use <bits/fenv.h> directly; include <fenv.h> instead."
> +#endif
> +
> +/* Define bits representing the exception. We use the bit positions
> + of the appropriate bits in the FPU control word. */
> +enum
> + {
> + FE_INVALID =
> +#define FE_INVALID 0x01
> + FE_INVALID,
> + FE_DIVBYZERO =
> +#define FE_DIVBYZERO 0x02
> + FE_DIVBYZERO,
> + FE_OVERFLOW =
> +#define FE_OVERFLOW 0x04
> + FE_OVERFLOW,
> + FE_UNDERFLOW =
> +#define FE_UNDERFLOW 0x08
> + FE_UNDERFLOW,
> + FE_INEXACT =
> +#define FE_INEXACT 0x10
> + FE_INEXACT,
> + FE_DENORMAL =
> +#define FE_DENORMAL 0x20
> + FE_DENORMAL,
> + };
> +
> +#define FE_ALL_EXCEPT \
> + (FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW |\
> + FE_INVALID | FE_DENORMAL)
> +
> +/* The C-SKY FPU supports all of the four defined rounding modes. We
> + use again the bit positions in the FPU control word as the values
> + for the appropriate macros. */
> +enum
> + {
> + FE_TONEAREST =
> +#define FE_TONEAREST (0x0 << 24)
> + FE_TONEAREST,
> + FE_TOWARDZERO =
> +#define FE_TOWARDZERO (0x1 << 24)
> + FE_TOWARDZERO,
> + FE_UPWARD =
> +#define FE_UPWARD (0x2 << 24)
> + FE_UPWARD,
> + FE_DOWNWARD =
> +#define FE_DOWNWARD (0x3 << 24)
> + FE_DOWNWARD,
> + FE_ROUND_MASK =
> +#define FE_ROUND_MASK (0x3 << 24)
> + FE_ROUND_MASK
> + };
> +
> +/* Type representing exception flags. */
> +typedef unsigned int fexcept_t;
> +
> +/* Type representing floating-point environment. */
> +typedef struct
> + {
> + unsigned int __fpcr;
> + unsigned int __fpsr;
> + }
> +fenv_t;
> +
> +/* If the default argument is used we use this value. */
> +#define FE_DFL_ENV ((const fenv_t *) -1)
> +
> +#ifdef __USE_GNU
> +/* Floating-point environment where none of the exceptions are masked. */
> +# define FE_NOMASK_ENV ((const fenv_t *) -2)
> +#endif
> +
> +#if __GLIBC_USE (IEC_60559_BFP_EXT)
> +/* Type representing floating-point control modes. */
> +typedef unsigned int femode_t;
> +
> +/* Default floating-point control modes. */
> +# define FE_DFL_MODE ((const femode_t *) -1L)
> +#endif
> diff --git a/sysdeps/csky/fenv_private.h b/sysdeps/csky/fenv_private.h
> new file mode 100644
> index 0000000..dc15032
> --- /dev/null
> +++ b/sysdeps/csky/fenv_private.h
> @@ -0,0 +1,288 @@
> +/* Private floating point rounding and exceptions handling. 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 FENV_PRIVATE_H
> +#define FENV_PRIVATE_H 1
> +
> +#include <fenv.h>
> +#include <fpu_control.h>
> +
> +#ifdef __csky_hard_float__
> +# include <fenv_libc.h>
> +
> +static __always_inline void
> +libc_feholdexcept_vfp (fenv_t *envp)
> +{
> + unsigned int fpsr;
> + unsigned int 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 (__glibc_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;
> + fpu_control_t 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. */
> + fpcr &= ~(FE_ALL_EXCEPT | FE_DOWNWARD);
> + _FPU_SETCW (fpcr | round);
> +
> + fpsr &= ~(FE_ALL_EXCEPT << CAUSE_SHIFT);
> + _FPU_SETFPSR (fpsr);
> +}
> +
> +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 (__glibc_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 (__glibc_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)
> +{
> + 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);
> +}
> +
> +static __always_inline int
> +libc_feupdateenv_test_vfp (const fenv_t *envp, int ex)
> +{
> + fpu_control_t fpsr, new_fpsr;
> + int excepts;
> +
> + _FPU_GETFPSR (fpsr);
> +
> + /* Merge current exception flags with the saved fenv. */
> + excepts = (fpsr >> CAUSE_SHIFT) & FE_ALL_EXCEPT;
> + new_fpsr = envp->__fpsr | (excepts << CAUSE_SHIFT);
> +
> + /* Write new FPSCR if different (ignoring NZCV flags). */
> + if (__glibc_unlikely (((fpsr ^ new_fpsr)) != 0))
> + _FPU_SETFPSR (new_fpsr);
> +
> + /* Raise the exceptions if enabled in the new FP state. */
> + if (__glibc_unlikely (excepts & (new_fpsr >> CAUSE_SHIFT)))
> + __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, round;
> +
> + _FPU_GETCW (fpcr);
> + ctx->updated_status = false;
> + ctx->env.__fpcr = fpcr;
> +
> + /* Check whether rounding modes are different. */
> + round = (fpcr ^ r) & FE_DOWNWARD;
> +
> + /* Set the rounding mode if changed. */
> + if (__glibc_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 (__glibc_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, new_fpcr;
> +
> + _FPU_GETCW (fpcr);
> + new_fpcr = ctx->env.__fpcr;
> +
> + /* Write new FPSCR if different (ignoring NZCV flags). */
> + if (__glibc_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_hard_float__ */
> +
> +#endif /* FENV_PRIVATE_H */
> diff --git a/sysdeps/csky/libm-test-ulps b/sysdeps/csky/libm-test-ulps
> new file mode 100644
> index 0000000..aa3d696
> --- /dev/null
> +++ b/sysdeps/csky/libm-test-ulps
> @@ -0,0 +1,1682 @@
> +# Begin of automatic generation
> +
> +# Maximal error of functions:
> +Function: "acos":
> +float: 1
> +ifloat: 1
> +
> +Function: "acos_downward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "acos_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "acos_upward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "acosh":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "acosh_downward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "acosh_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "acosh_upward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "asin":
> +float: 1
> +ifloat: 1
> +
> +Function: "asin_downward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "asin_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "asin_upward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "asinh":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "asinh_downward":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: "asinh_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "asinh_upward":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: "atan":
> +float: 1
> +ifloat: 1
> +
> +Function: "atan2":
> +float: 1
> +ifloat: 1
> +
> +Function: "atan2_downward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "atan2_towardzero":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "atan2_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "atan_downward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "atan_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "atan_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "atanh":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "atanh_downward":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: "atanh_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "atanh_upward":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: "cabs":
> +double: 1
> +idouble: 1
> +
> +Function: "cabs_downward":
> +double: 1
> +idouble: 1
> +
> +Function: "cabs_towardzero":
> +double: 1
> +idouble: 1
> +
> +Function: "cabs_upward":
> +double: 1
> +idouble: 1
> +
> +Function: Real part of "cacos":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Imaginary part of "cacos":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Real part of "cacos_downward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Imaginary part of "cacos_downward":
> +double: 5
> +float: 3
> +idouble: 5
> +ifloat: 3
> +
> +Function: Real part of "cacos_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Imaginary part of "cacos_towardzero":
> +double: 5
> +float: 3
> +idouble: 5
> +ifloat: 3
> +
> +Function: Real part of "cacos_upward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Imaginary part of "cacos_upward":
> +double: 4
> +float: 4
> +idouble: 4
> +ifloat: 4
> +
> +Function: Real part of "cacosh":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Imaginary part of "cacosh":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Real part of "cacosh_downward":
> +double: 5
> +float: 3
> +idouble: 5
> +ifloat: 3
> +
> +Function: Imaginary part of "cacosh_downward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Real part of "cacosh_towardzero":
> +double: 5
> +float: 3
> +idouble: 5
> +ifloat: 3
> +
> +Function: Imaginary part of "cacosh_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Real part of "cacosh_upward":
> +double: 4
> +float: 4
> +idouble: 4
> +ifloat: 4
> +
> +Function: Imaginary part of "cacosh_upward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "carg":
> +float: 1
> +ifloat: 1
> +
> +Function: "carg_downward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "carg_towardzero":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "carg_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Real part of "casin":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Imaginary part of "casin":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Real part of "casin_downward":
> +double: 3
> +float: 1
> +idouble: 3
> +ifloat: 1
> +
> +Function: Imaginary part of "casin_downward":
> +double: 5
> +float: 3
> +idouble: 5
> +ifloat: 3
> +
> +Function: Real part of "casin_towardzero":
> +double: 3
> +float: 1
> +idouble: 3
> +ifloat: 1
> +
> +Function: Imaginary part of "casin_towardzero":
> +double: 5
> +float: 3
> +idouble: 5
> +ifloat: 3
> +
> +Function: Real part of "casin_upward":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: Imaginary part of "casin_upward":
> +double: 4
> +float: 4
> +idouble: 4
> +ifloat: 4
> +
> +Function: Real part of "casinh":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Imaginary part of "casinh":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Real part of "casinh_downward":
> +double: 5
> +float: 3
> +idouble: 5
> +ifloat: 3
> +
> +Function: Imaginary part of "casinh_downward":
> +double: 3
> +float: 1
> +idouble: 3
> +ifloat: 1
> +
> +Function: Real part of "casinh_towardzero":
> +double: 5
> +float: 3
> +idouble: 5
> +ifloat: 3
> +
> +Function: Imaginary part of "casinh_towardzero":
> +double: 3
> +float: 1
> +idouble: 3
> +ifloat: 1
> +
> +Function: Real part of "casinh_upward":
> +double: 4
> +float: 4
> +idouble: 4
> +ifloat: 4
> +
> +Function: Imaginary part of "casinh_upward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Real part of "catan":
> +float: 1
> +ifloat: 1
> +
> +Function: Imaginary part of "catan":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Real part of "catan_downward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Imaginary part of "catan_downward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Real part of "catan_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Imaginary part of "catan_towardzero":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: Real part of "catan_upward":
> +float: 1
> +ifloat: 1
> +
> +Function: Imaginary part of "catan_upward":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: Real part of "catanh":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Imaginary part of "catanh":
> +float: 1
> +ifloat: 1
> +
> +Function: Real part of "catanh_downward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Imaginary part of "catanh_downward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Real part of "catanh_towardzero":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: Imaginary part of "catanh_towardzero":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Real part of "catanh_upward":
> +double: 4
> +float: 3
> +idouble: 4
> +ifloat: 3
> +
> +Function: Imaginary part of "catanh_upward":
> +float: 1
> +ifloat: 1
> +
> +Function: "cbrt":
> +double: 3
> +float: 1
> +idouble: 3
> +ifloat: 1
> +
> +Function: "cbrt_downward":
> +double: 4
> +float: 1
> +idouble: 4
> +ifloat: 1
> +
> +Function: "cbrt_towardzero":
> +double: 3
> +float: 1
> +idouble: 3
> +ifloat: 1
> +
> +Function: "cbrt_upward":
> +double: 5
> +float: 1
> +idouble: 5
> +ifloat: 1
> +
> +Function: Real part of "ccos":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Imaginary part of "ccos":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Real part of "ccos_downward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Imaginary part of "ccos_downward":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: Real part of "ccos_towardzero":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Imaginary part of "ccos_towardzero":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: Real part of "ccos_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Imaginary part of "ccos_upward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Real part of "ccosh":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Imaginary part of "ccosh":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Real part of "ccosh_downward":
> +double: 1
> +float: 3
> +idouble: 1
> +ifloat: 3
> +
> +Function: Imaginary part of "ccosh_downward":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: Real part of "ccosh_towardzero":
> +double: 1
> +float: 3
> +idouble: 1
> +ifloat: 3
> +
> +Function: Imaginary part of "ccosh_towardzero":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: Real part of "ccosh_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Imaginary part of "ccosh_upward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Real part of "cexp":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: Imaginary part of "cexp":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Real part of "cexp_downward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Imaginary part of "cexp_downward":
> +double: 1
> +float: 3
> +idouble: 1
> +ifloat: 3
> +
> +Function: Real part of "cexp_towardzero":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Imaginary part of "cexp_towardzero":
> +double: 1
> +float: 3
> +idouble: 1
> +ifloat: 3
> +
> +Function: Real part of "cexp_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Imaginary part of "cexp_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Real part of "clog":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: Imaginary part of "clog":
> +float: 1
> +ifloat: 1
> +
> +Function: Real part of "clog10":
> +double: 3
> +float: 4
> +idouble: 3
> +ifloat: 4
> +
> +Function: Imaginary part of "clog10":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Real part of "clog10_downward":
> +double: 5
> +float: 4
> +idouble: 5
> +ifloat: 4
> +
> +Function: Imaginary part of "clog10_downward":
> +double: 2
> +float: 4
> +idouble: 2
> +ifloat: 4
> +
> +Function: Real part of "clog10_towardzero":
> +double: 5
> +float: 5
> +idouble: 5
> +ifloat: 5
> +
> +Function: Imaginary part of "clog10_towardzero":
> +double: 2
> +float: 4
> +idouble: 2
> +ifloat: 4
> +
> +Function: Real part of "clog10_upward":
> +double: 6
> +float: 5
> +idouble: 6
> +ifloat: 5
> +
> +Function: Imaginary part of "clog10_upward":
> +double: 2
> +float: 4
> +idouble: 2
> +ifloat: 4
> +
> +Function: Real part of "clog_downward":
> +double: 4
> +float: 3
> +idouble: 4
> +ifloat: 3
> +
> +Function: Imaginary part of "clog_downward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Real part of "clog_towardzero":
> +double: 4
> +float: 4
> +idouble: 4
> +ifloat: 4
> +
> +Function: Imaginary part of "clog_towardzero":
> +double: 1
> +float: 3
> +idouble: 1
> +ifloat: 3
> +
> +Function: Real part of "clog_upward":
> +double: 4
> +float: 3
> +idouble: 4
> +ifloat: 3
> +
> +Function: Imaginary part of "clog_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "cos":
> +float: 1
> +ifloat: 1
> +
> +Function: "cos_downward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "cos_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "cos_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "cosh":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "cosh_downward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "cosh_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "cosh_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Real part of "cpow":
> +double: 2
> +float: 4
> +idouble: 2
> +ifloat: 4
> +
> +Function: Imaginary part of "cpow":
> +float: 2
> +ifloat: 2
> +
> +Function: Real part of "cpow_downward":
> +double: 4
> +float: 8
> +idouble: 4
> +ifloat: 8
> +
> +Function: Imaginary part of "cpow_downward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Real part of "cpow_towardzero":
> +double: 4
> +float: 8
> +idouble: 4
> +ifloat: 8
> +
> +Function: Imaginary part of "cpow_towardzero":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Real part of "cpow_upward":
> +double: 4
> +float: 1
> +idouble: 4
> +ifloat: 1
> +
> +Function: Imaginary part of "cpow_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Real part of "csin":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Real part of "csin_downward":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: Imaginary part of "csin_downward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Real part of "csin_towardzero":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: Imaginary part of "csin_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Real part of "csin_upward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Imaginary part of "csin_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Real part of "csinh":
> +float: 1
> +ifloat: 1
> +
> +Function: Imaginary part of "csinh":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Real part of "csinh_downward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Imaginary part of "csinh_downward":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: Real part of "csinh_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Imaginary part of "csinh_towardzero":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: Real part of "csinh_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: Imaginary part of "csinh_upward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Real part of "csqrt":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Imaginary part of "csqrt":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Real part of "csqrt_downward":
> +double: 5
> +float: 4
> +idouble: 5
> +ifloat: 4
> +
> +Function: Imaginary part of "csqrt_downward":
> +double: 4
> +float: 3
> +idouble: 4
> +ifloat: 3
> +
> +Function: Real part of "csqrt_towardzero":
> +double: 4
> +float: 3
> +idouble: 4
> +ifloat: 3
> +
> +Function: Imaginary part of "csqrt_towardzero":
> +double: 4
> +float: 3
> +idouble: 4
> +ifloat: 3
> +
> +Function: Real part of "csqrt_upward":
> +double: 5
> +float: 4
> +idouble: 5
> +ifloat: 4
> +
> +Function: Imaginary part of "csqrt_upward":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: Real part of "ctan":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: Imaginary part of "ctan":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: Real part of "ctan_downward":
> +double: 6
> +float: 5
> +idouble: 6
> +ifloat: 5
> +
> +Function: Imaginary part of "ctan_downward":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: Real part of "ctan_towardzero":
> +double: 5
> +float: 3
> +idouble: 5
> +ifloat: 3
> +
> +Function: Imaginary part of "ctan_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Real part of "ctan_upward":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: Imaginary part of "ctan_upward":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: Real part of "ctanh":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: Imaginary part of "ctanh":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Real part of "ctanh_downward":
> +double: 4
> +float: 1
> +idouble: 4
> +ifloat: 1
> +
> +Function: Imaginary part of "ctanh_downward":
> +double: 6
> +float: 5
> +idouble: 6
> +ifloat: 5
> +
> +Function: Real part of "ctanh_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: Imaginary part of "ctanh_towardzero":
> +double: 5
> +float: 3
> +idouble: 5
> +ifloat: 3
> +
> +Function: Real part of "ctanh_upward":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: Imaginary part of "ctanh_upward":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: "erf":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "erf_downward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "erf_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "erf_upward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "erfc":
> +double: 3
> +float: 2
> +idouble: 3
> +ifloat: 2
> +
> +Function: "erfc_downward":
> +double: 5
> +float: 6
> +idouble: 5
> +ifloat: 6
> +
> +Function: "erfc_towardzero":
> +double: 3
> +float: 4
> +idouble: 3
> +ifloat: 4
> +
> +Function: "erfc_upward":
> +double: 5
> +float: 6
> +idouble: 5
> +ifloat: 6
> +
> +Function: "exp":
> +float: 1
> +ifloat: 1
> +
> +Function: "exp10":
> +double: 2
> +idouble: 2
> +
> +Function: "exp10_downward":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: "exp10_towardzero":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: "exp10_upward":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: "exp2":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "exp2_downward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "exp2_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "exp2_upward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "exp_downward":
> +double: 1
> +idouble: 1
> +
> +Function: "exp_towardzero":
> +double: 1
> +idouble: 1
> +
> +Function: "exp_upward":
> +double: 1
> +idouble: 1
> +
> +Function: "expm1":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "expm1_downward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "expm1_towardzero":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "expm1_upward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "gamma":
> +double: 4
> +float: 4
> +idouble: 4
> +ifloat: 4
> +
> +Function: "gamma_downward":
> +double: 5
> +float: 4
> +idouble: 5
> +ifloat: 4
> +
> +Function: "gamma_towardzero":
> +double: 5
> +float: 4
> +idouble: 5
> +ifloat: 4
> +
> +Function: "gamma_upward":
> +double: 5
> +float: 5
> +idouble: 5
> +ifloat: 5
> +
> +Function: "hypot":
> +double: 1
> +idouble: 1
> +
> +Function: "hypot_downward":
> +double: 1
> +idouble: 1
> +
> +Function: "hypot_towardzero":
> +double: 1
> +idouble: 1
> +
> +Function: "hypot_upward":
> +double: 1
> +idouble: 1
> +
> +Function: "j0":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "j0_downward":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: "j0_towardzero":
> +double: 3
> +float: 2
> +idouble: 3
> +ifloat: 2
> +
> +Function: "j0_upward":
> +double: 3
> +float: 2
> +idouble: 3
> +ifloat: 2
> +
> +Function: "j1":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "j1_downward":
> +double: 3
> +float: 2
> +idouble: 3
> +ifloat: 2
> +
> +Function: "j1_towardzero":
> +double: 3
> +float: 2
> +idouble: 3
> +ifloat: 2
> +
> +Function: "j1_upward":
> +double: 3
> +float: 5
> +idouble: 3
> +ifloat: 5
> +
> +Function: "jn":
> +double: 4
> +float: 4
> +idouble: 4
> +ifloat: 4
> +
> +Function: "jn_downward":
> +double: 5
> +float: 5
> +idouble: 5
> +ifloat: 5
> +
> +Function: "jn_towardzero":
> +double: 5
> +float: 5
> +idouble: 5
> +ifloat: 5
> +
> +Function: "jn_upward":
> +double: 5
> +float: 5
> +idouble: 5
> +ifloat: 5
> +
> +Function: "lgamma":
> +double: 4
> +float: 4
> +idouble: 4
> +ifloat: 4
> +
> +Function: "lgamma_downward":
> +double: 5
> +float: 4
> +idouble: 5
> +ifloat: 4
> +
> +Function: "lgamma_towardzero":
> +double: 5
> +float: 4
> +idouble: 5
> +ifloat: 4
> +
> +Function: "lgamma_upward":
> +double: 5
> +float: 5
> +idouble: 5
> +ifloat: 5
> +
> +Function: "log":
> +float: 1
> +ifloat: 1
> +
> +Function: "log10":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "log10_downward":
> +double: 2
> +float: 3
> +idouble: 2
> +ifloat: 3
> +
> +Function: "log10_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "log10_upward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "log1p":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "log1p_downward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "log1p_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "log1p_upward":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "log2":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: "log2_downward":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: "log2_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "log2_upward":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: "log_downward":
> +float: 2
> +ifloat: 2
> +
> +Function: "log_towardzero":
> +float: 2
> +ifloat: 2
> +
> +Function: "log_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "pow":
> +float: 1
> +ifloat: 1
> +
> +Function: "pow10":
> +double: 2
> +idouble: 2
> +
> +Function: "pow10_downward":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: "pow10_towardzero":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: "pow10_upward":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: "pow_downward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "pow_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "pow_upward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "sin":
> +float: 1
> +ifloat: 1
> +
> +Function: "sin_downward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "sin_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "sin_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "sincos":
> +float: 1
> +ifloat: 1
> +
> +Function: "sincos_downward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "sincos_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "sincos_upward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "sinh":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "sinh_downward":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: "sinh_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "sinh_upward":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: "tan":
> +float: 1
> +ifloat: 1
> +
> +Function: "tan_downward":
> +double: 1
> +float: 2
> +idouble: 1
> +ifloat: 2
> +
> +Function: "tan_towardzero":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "tan_upward":
> +double: 1
> +float: 1
> +idouble: 1
> +ifloat: 1
> +
> +Function: "tanh":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "tanh_downward":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: "tanh_towardzero":
> +double: 2
> +float: 2
> +idouble: 2
> +ifloat: 2
> +
> +Function: "tanh_upward":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: "tgamma":
> +double: 5
> +float: 4
> +idouble: 5
> +ifloat: 4
> +
> +Function: "tgamma_downward":
> +double: 5
> +float: 5
> +idouble: 5
> +ifloat: 5
> +
> +Function: "tgamma_towardzero":
> +double: 5
> +float: 4
> +idouble: 5
> +ifloat: 4
> +
> +Function: "tgamma_upward":
> +double: 4
> +float: 4
> +idouble: 4
> +ifloat: 4
> +
> +Function: "y0":
> +double: 2
> +float: 1
> +idouble: 2
> +ifloat: 1
> +
> +Function: "y0_downward":
> +double: 3
> +float: 2
> +idouble: 3
> +ifloat: 2
> +
> +Function: "y0_towardzero":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: "y0_upward":
> +double: 3
> +float: 4
> +idouble: 3
> +ifloat: 4
> +
> +Function: "y1":
> +double: 3
> +float: 2
> +idouble: 3
> +ifloat: 2
> +
> +Function: "y1_downward":
> +double: 3
> +float: 2
> +idouble: 3
> +ifloat: 2
> +
> +Function: "y1_towardzero":
> +double: 3
> +float: 2
> +idouble: 3
> +ifloat: 2
> +
> +Function: "y1_upward":
> +double: 7
> +float: 2
> +idouble: 7
> +ifloat: 2
> +
> +Function: "yn":
> +double: 3
> +float: 2
> +idouble: 3
> +ifloat: 2
> +
> +Function: "yn_downward":
> +double: 3
> +float: 2
> +idouble: 3
> +ifloat: 2
> +
> +Function: "yn_towardzero":
> +double: 3
> +float: 3
> +idouble: 3
> +ifloat: 3
> +
> +Function: "yn_upward":
> +double: 4
> +float: 4
> +idouble: 4
> +ifloat: 4
> +
> +# end of automatic generation
> diff --git a/sysdeps/csky/libm-test-ulps-name b/sysdeps/csky/libm-test-ulps-name
> new file mode 100644
> index 0000000..236b0fb
> --- /dev/null
> +++ b/sysdeps/csky/libm-test-ulps-name
> @@ -0,0 +1 @@
> +CSKY
> diff --git a/sysdeps/csky/math-tests.h b/sysdeps/csky/math-tests.h
> new file mode 100644
> index 0000000..30d9b73
> --- /dev/null
> +++ b/sysdeps/csky/math-tests.h
> @@ -0,0 +1,35 @@
> +/* Configuration for math tests. 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/>. */
> +
> +/* On systems with VFP support, but where glibc is built for
> + soft-float, the libgcc functions used in libc and libm do not
> + support rounding modes, although fesetround succeeds, and do not
> + support exceptions. */
> +#ifdef __CSKY_SOFT_FLOAT__
> +# define ROUNDING_TESTS_float(MODE) ((MODE) == FE_TONEAREST)
> +# define ROUNDING_TESTS_double(MODE) ((MODE) == FE_TONEAREST)
> +# define ROUNDING_TESTS_long_double(MODE) ((MODE) == FE_TONEAREST)
> +# define EXCEPTION_TESTS_float 0
> +# define EXCEPTION_TESTS_double 0
> +# define EXCEPTION_TESTS_long_double 0
> +#endif
> +
> +/* Not all VFP implementations support trapping exceptions. */
> +#define EXCEPTION_ENABLE_SUPPORTED(EXCEPT) ((EXCEPT) == 0)
> +
> +#include_next <math-tests.h>
> diff --git a/sysdeps/csky/math_private.h b/sysdeps/csky/math_private.h
> new file mode 100644
> index 0000000..db303da
> --- /dev/null
> +++ b/sysdeps/csky/math_private.h
> @@ -0,0 +1,7 @@
> +#ifndef CSKY_MATH_PRIVATE_H
> +#define CSKY_MATH_PRIVATE_H 1
> +
> +#include "fenv_private.h"
> +#include_next <math_private.h>
> +
> +#endif
> diff --git a/sysdeps/csky/sfp-machine.h b/sysdeps/csky/sfp-machine.h
> new file mode 100644
> index 0000000..2e7c156
> --- /dev/null
> +++ b/sysdeps/csky/sfp-machine.h
> @@ -0,0 +1,51 @@
> +#define _FP_W_TYPE_SIZE 32
> +#define _FP_W_TYPE unsigned long
> +#define _FP_WS_TYPE signed long
> +#define _FP_I_TYPE long
> +
> +#define _FP_MUL_MEAT_S(R,X,Y) \
> + _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
> +#define _FP_MUL_MEAT_D(R,X,Y) \
> + _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
> +#define _FP_MUL_MEAT_Q(R,X,Y) \
> + _FP_MUL_MEAT_4_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm)
> +
> +#define _FP_MUL_MEAT_DW_S(R,X,Y) \
> + _FP_MUL_MEAT_DW_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
> +#define _FP_MUL_MEAT_DW_D(R,X,Y) \
> + _FP_MUL_MEAT_DW_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
> +#define _FP_MUL_MEAT_DW_Q(R,X,Y) \
> + _FP_MUL_MEAT_DW_4_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm)
> +
> +#define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_loop(S,R,X,Y)
> +#define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_2_udiv(D,R,X,Y)
> +#define _FP_DIV_MEAT_Q(R,X,Y) _FP_DIV_MEAT_4_udiv(Q,R,X,Y)
> +
> +#define _FP_NANFRAC_S _FP_QNANBIT_S
> +#define _FP_NANFRAC_D _FP_QNANBIT_D, 0
> +#define _FP_NANFRAC_Q _FP_QNANBIT_Q, 0, 0, 0
> +#define _FP_NANSIGN_S 0
> +#define _FP_NANSIGN_D 0
> +#define _FP_NANSIGN_Q 0
> +
> +#define _FP_KEEPNANFRACP 1
> +#define _FP_QNANNEGATEDP 0
> +
> +/* Someone please check this. */
What needs to be checked?
> +#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP) \
> + do { \
> + if ((_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs) \
> + && !(_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs)) \
> + { \
> + R##_s = Y##_s; \
> + _FP_FRAC_COPY_##wc(R,Y); \
> + } \
> + else \
> + { \
> + R##_s = X##_s; \
> + _FP_FRAC_COPY_##wc(R,X); \
> + } \
> + R##_c = FP_CLS_NAN; \
> + } while (0)
> +
> +#define _FP_TININESS_AFTER_ROUNDING 0
>
More information about the Libc-help
mailing list