[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