Blame sysdeps/sparc/fpu/fenv_private.h

Packit 6c4009
#ifndef FENV_PRIVATE_H
Packit 6c4009
#define FENV_PRIVATE_H 1
Packit 6c4009
Packit 6c4009
#include <fenv.h>
Packit 6c4009
Packit 6c4009
static __always_inline void
Packit 6c4009
libc_feholdexcept (fenv_t *e)
Packit 6c4009
{
Packit 6c4009
  fenv_t etmp;
Packit 6c4009
  __fenv_stfsr(etmp);
Packit 6c4009
  *(e) = etmp;
Packit 6c4009
  etmp = etmp & ~((0x1f << 23) | FE_ALL_EXCEPT);
Packit 6c4009
  __fenv_ldfsr(etmp);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static __always_inline void
Packit 6c4009
libc_fesetround (int r)
Packit 6c4009
{
Packit 6c4009
  fenv_t etmp;
Packit 6c4009
  __fenv_stfsr(etmp);
Packit 6c4009
  etmp = (etmp & ~__FE_ROUND_MASK) | (r);
Packit 6c4009
  __fenv_ldfsr(etmp);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static __always_inline void
Packit 6c4009
libc_feholdexcept_setround (fenv_t *e, int r)
Packit 6c4009
{
Packit 6c4009
  fenv_t etmp;
Packit 6c4009
  __fenv_stfsr(etmp);
Packit 6c4009
  *(e) = etmp;
Packit 6c4009
  etmp = etmp & ~((0x1f << 23) | FE_ALL_EXCEPT);
Packit 6c4009
  etmp = (etmp & ~__FE_ROUND_MASK) | (r);
Packit 6c4009
  __fenv_ldfsr(etmp);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static __always_inline int
Packit 6c4009
libc_fetestexcept (int e)
Packit 6c4009
{
Packit 6c4009
  fenv_t etmp;
Packit 6c4009
  __fenv_stfsr(etmp);
Packit 6c4009
  return etmp & (e) & FE_ALL_EXCEPT;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static __always_inline void
Packit 6c4009
libc_fesetenv (fenv_t *e)
Packit 6c4009
{
Packit 6c4009
  __fenv_ldfsr(*e);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static __always_inline int
Packit 6c4009
libc_feupdateenv_test (fenv_t *e, int ex)
Packit 6c4009
{
Packit 6c4009
  fenv_t etmp;
Packit 6c4009
Packit 6c4009
  __fenv_stfsr(etmp);
Packit 6c4009
  etmp &= FE_ALL_EXCEPT;
Packit 6c4009
Packit 6c4009
  __fenv_ldfsr(*e);
Packit 6c4009
Packit 6c4009
  __feraiseexcept (etmp);
Packit 6c4009
Packit 6c4009
  return etmp & ex;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static __always_inline void
Packit 6c4009
libc_feupdateenv (fenv_t *e)
Packit 6c4009
{
Packit 6c4009
  libc_feupdateenv_test (e, 0);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static __always_inline void
Packit 6c4009
libc_feholdsetround (fenv_t *e, int r)
Packit 6c4009
{
Packit 6c4009
  fenv_t etmp;
Packit 6c4009
  __fenv_stfsr(etmp);
Packit 6c4009
  *(e) = etmp;
Packit 6c4009
  etmp = (etmp & ~__FE_ROUND_MASK) | (r);
Packit 6c4009
  __fenv_ldfsr(etmp);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static __always_inline void
Packit 6c4009
libc_feresetround (fenv_t *e)
Packit 6c4009
{
Packit 6c4009
  fenv_t etmp;
Packit 6c4009
  __fenv_stfsr(etmp);
Packit 6c4009
  etmp = (etmp & ~__FE_ROUND_MASK) | (*e & __FE_ROUND_MASK);
Packit 6c4009
  __fenv_ldfsr(etmp);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
#define libc_feholdexceptf		libc_feholdexcept
Packit 6c4009
#define libc_fesetroundf		libc_fesetround
Packit 6c4009
#define libc_feholdexcept_setroundf	libc_feholdexcept_setround
Packit 6c4009
#define libc_fetestexceptf		libc_fetestexcept
Packit 6c4009
#define libc_fesetenvf			libc_fesetenv
Packit 6c4009
#define libc_feupdateenv_testf		libc_feupdateenv_test
Packit 6c4009
#define libc_feupdateenvf		libc_feupdateenv
Packit 6c4009
#define libc_feholdsetroundf		libc_feholdsetround
Packit 6c4009
#define libc_feresetroundf		libc_feresetround
Packit 6c4009
#define libc_feholdexcept		libc_feholdexcept
Packit 6c4009
#define libc_fesetround			libc_fesetround
Packit 6c4009
#define libc_feholdexcept_setround	libc_feholdexcept_setround
Packit 6c4009
#define libc_fetestexcept		libc_fetestexcept
Packit 6c4009
#define libc_fesetenv			libc_fesetenv
Packit 6c4009
#define libc_feupdateenv_test		libc_feupdateenv_test
Packit 6c4009
#define libc_feupdateenv		libc_feupdateenv
Packit 6c4009
#define libc_feholdsetround		libc_feholdsetround
Packit 6c4009
#define libc_feresetround		libc_feresetround
Packit 6c4009
#define libc_feholdexceptl		libc_feholdexcept
Packit 6c4009
#define libc_fesetroundl		libc_fesetround
Packit 6c4009
#define libc_feholdexcept_setroundl	libc_feholdexcept_setround
Packit 6c4009
#define libc_fetestexceptl		libc_fetestexcept
Packit 6c4009
#define libc_fesetenvl			libc_fesetenv
Packit 6c4009
#define libc_feupdateenv_testl		libc_feupdateenv_test
Packit 6c4009
#define libc_feupdateenvl		libc_feupdateenv
Packit 6c4009
#define libc_feholdsetroundl		libc_feholdsetround
Packit 6c4009
#define libc_feresetroundl		libc_feresetround
Packit 6c4009
Packit 6c4009
/* We have support for rounding mode context.  */
Packit 6c4009
#define HAVE_RM_CTX 1
Packit 6c4009
Packit 6c4009
static __always_inline void
Packit 6c4009
libc_feholdexcept_setround_sparc_ctx (struct rm_ctx *ctx, int round)
Packit 6c4009
{
Packit 6c4009
  fenv_t new;
Packit 6c4009
Packit 6c4009
  __fenv_stfsr(ctx->env);
Packit 6c4009
  new = ctx->env & ~((0x1f << 23) | FE_ALL_EXCEPT);
Packit 6c4009
  new = (new & ~__FE_ROUND_MASK) | round;
Packit 6c4009
  if (__glibc_unlikely (new != ctx->env))
Packit 6c4009
    {
Packit 6c4009
      __fenv_ldfsr(new);
Packit 6c4009
      ctx->updated_status = true;
Packit 6c4009
    }
Packit 6c4009
  else
Packit 6c4009
    ctx->updated_status = false;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static __always_inline void
Packit 6c4009
libc_fesetenv_sparc_ctx (struct rm_ctx *ctx)
Packit 6c4009
{
Packit 6c4009
  libc_fesetenv(&ctx->env);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static __always_inline void
Packit 6c4009
libc_feupdateenv_sparc_ctx (struct rm_ctx *ctx)
Packit 6c4009
{
Packit 6c4009
  if (__glibc_unlikely (ctx->updated_status))
Packit 6c4009
    libc_feupdateenv_test (&ctx->env, 0);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static __always_inline void
Packit 6c4009
libc_feholdsetround_sparc_ctx (struct rm_ctx *ctx, int round)
Packit 6c4009
{
Packit 6c4009
  fenv_t new;
Packit 6c4009
Packit 6c4009
  __fenv_stfsr(ctx->env);
Packit 6c4009
  new = (ctx->env & ~__FE_ROUND_MASK) | round;
Packit 6c4009
  if (__glibc_unlikely (new != ctx->env))
Packit 6c4009
    {
Packit 6c4009
      __fenv_ldfsr(new);
Packit 6c4009
      ctx->updated_status = true;
Packit 6c4009
    }
Packit 6c4009
  else
Packit 6c4009
    ctx->updated_status = false;
Packit 6c4009
}
Packit 6c4009
#define libc_feholdexcept_setround_ctx   libc_feholdexcept_setround_sparc_ctx
Packit 6c4009
#define libc_feholdexcept_setroundf_ctx  libc_feholdexcept_setround_sparc_ctx
Packit 6c4009
#define libc_feholdexcept_setroundl_ctx  libc_feholdexcept_setround_sparc_ctx
Packit 6c4009
#define libc_fesetenv_ctx                libc_fesetenv_sparc_ctx
Packit 6c4009
#define libc_fesetenvf_ctx               libc_fesetenv_sparc_ctx
Packit 6c4009
#define libc_fesetenvl_ctx               libc_fesetenv_sparc_ctx
Packit 6c4009
#define libc_feupdateenv_ctx             libc_feupdateenv_sparc_ctx
Packit 6c4009
#define libc_feupdateenvf_ctx            libc_feupdateenv_sparc_ctx
Packit 6c4009
#define libc_feupdateenvl_ctx            libc_feupdateenv_sparc_ctx
Packit 6c4009
#define libc_feresetround_ctx            libc_feupdateenv_sparc_ctx
Packit 6c4009
#define libc_feresetroundf_ctx           libc_feupdateenv_sparc_ctx
Packit 6c4009
#define libc_feresetroundl_ctx           libc_feupdateenv_sparc_ctx
Packit 6c4009
#define libc_feholdsetround_ctx          libc_feholdsetround_sparc_ctx
Packit 6c4009
#define libc_feholdsetroundf_ctx         libc_feholdsetround_sparc_ctx
Packit 6c4009
#define libc_feholdsetroundl_ctx         libc_feholdsetround_sparc_ctx
Packit 6c4009
Packit 6c4009
#endif /* FENV_PRIVATE_H */