/*  $OpenBSD: fenv.c,v 1.3 2012/12/05 23:20:02 deraadt Exp $  */
/*  $NetBSD: fenv.c,v 1.1 2010/07/31 21:47:53 joerg Exp $ */

/*-
 * Copyright (c) 2004-2005 David Schultz <das (at) FreeBSD.ORG>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#include <fenv.h>
#include <machine/fpu.h>

/*
 * The following constant represents the default floating-point environment
 * (that is, the one installed at program startup) and has type pointer to
 * const-qualified fenv_t.
 *
 * It can be used as an argument to the functions within the <fenv.h> header
 * that manage the floating-point environment, namely fesetenv() and
 * feupdateenv().
 *
 * x87 fpu registers are 16bit wide. The upper bits, 31-16, are marked as
 * RESERVED.
 */
const fenv_t __fe_dfl_env = {
  {
    0xffff0000 | __INITIAL_NPXCW__, /* Control word register */
    0xffff0000,                     /* Status word register */
    0xffffffff,                     /* Tag word register */
    {
      0x00000000,
      0x00000000,
      0x00000000,
      0xffff0000
    }
  },
  __INITIAL_MXCSR__                 /* MXCSR register */
};


/*
 * The feclearexcept() function clears the supported floating-point exceptions
 * represented by `excepts'.
 */
int
feclearexcept(int excepts)
{
  fenv_t fenv;
  unsigned int mxcsr;

  excepts &= FE_ALL_EXCEPT;

  /* Store the current x87 floating-point environment */
  __asm__ __volatile__ ("fnstenv %0" : "=m" (fenv));

  /* Clear the requested floating-point exceptions */
  fenv.__x87.__status &= ~excepts;

  /* Load the x87 floating-point environent */
  __asm__ __volatile__ ("fldenv %0" : : "m" (fenv));

  /* Same for SSE environment */
  __asm__ __volatile__ ("stmxcsr %0" : "=m" (mxcsr));
  mxcsr &= ~excepts;
  __asm__ __volatile__ ("ldmxcsr %0" : : "m" (mxcsr));

  return (0);
}

/*
 * The fegetexceptflag() function stores an implementation-defined
 * representation of the states of the floating-point status flags indicated by
 * the argument excepts in the object pointed to by the argument flagp.
 */
int
fegetexceptflag(fexcept_t *flagp, int excepts)
{
  unsigned short status;
  unsigned int mxcsr;

  excepts &= FE_ALL_EXCEPT;

  /* Store the current x87 status register */
  __asm__ __volatile__ ("fnstsw %0" : "=am" (status));

  /* Store the MXCSR register */
  __asm__ __volatile__ ("stmxcsr %0" : "=m" (mxcsr));

  /* Store the results in flagp */
  *flagp = (status | mxcsr) & excepts;

  return (0);
}

/*
 * The feraiseexcept() function raises the supported floating-point exceptions
 * represented by the argument `excepts'.
 *
 * The standard explicitly allows us to execute an instruction that has the
 * exception as a side effect, but we choose to manipulate the status register
 * directly.
 *
 * The validation of input is being deferred to fesetexceptflag().
 */
int
feraiseexcept(int excepts)
{
  excepts &= FE_ALL_EXCEPT;

  fesetexceptflag((fexcept_t *)&excepts, excepts);
  __asm__ __volatile__ ("fwait");

  return (0);
}

/*
 * This function sets the floating-point status flags indicated by the argument
 * `excepts' to the states stored in the object pointed to by `flagp'. It does
 * NOT raise any floating-point exceptions, but only sets the state of the flags.
 */
int
fesetexceptflag(const fexcept_t *flagp, int excepts)
{
  fenv_t fenv;
  unsigned int mxcsr;

  excepts &= FE_ALL_EXCEPT;

  /* Store the current x87 floating-point environment */
  __asm__ __volatile__ ("fnstenv %0" : "=m" (fenv));

  /* Set the requested status flags */
  fenv.__x87.__status &= ~excepts;
  fenv.__x87.__status |= *flagp & excepts;

  /* Load the x87 floating-point environent */
  __asm__ __volatile__ ("fldenv %0" : : "m" (fenv));

  /* Same for SSE environment */
  __asm__ __volatile__ ("stmxcsr %0" : "=m" (mxcsr));
  mxcsr &= ~excepts;
  mxcsr |= *flagp & excepts;
  __asm__ __volatile__ ("ldmxcsr %0" : : "m" (mxcsr));

  return (0);
}

/*
 * The fetestexcept() function determines which of a specified subset of the
 * floating-point exception flags are currently set. The `excepts' argument
 * specifies the floating-point status flags to be queried.
 */
int
fetestexcept(int excepts)
{
  unsigned short status;
  unsigned int mxcsr;

  excepts &= FE_ALL_EXCEPT;

  /* Store the current x87 status register */
  __asm__ __volatile__ ("fnstsw %0" : "=am" (status));

  /* Store the MXCSR register state */
  __asm__ __volatile__ ("stmxcsr %0" : "=m" (mxcsr));

  return ((status | mxcsr) & excepts);
}

/*
 * The fegetround() function gets the current rounding direction.
 */
int
fegetround(void)
{
  unsigned short control;

  /*
   * We assume that the x87 and the SSE unit agree on the
   * rounding mode.  Reading the control word on the x87 turns
   * out to be about 5 times faster than reading it on the SSE
   * unit on an Opteron 244.
   */
  __asm__ __volatile__ ("fnstcw %0" : "=m" (control));

  return (control & _X87_ROUND_MASK);
}

/*
 * The fesetround() function establishes the rounding direction represented by
 * its argument `round'. If the argument is not equal to the value of a rounding
 * direction macro, the rounding direction is not changed.
 */
int
fesetround(int round)
{
  unsigned short control;
  unsigned int mxcsr;

  /* Check whether requested rounding direction is supported */
  if (round & ~_X87_ROUND_MASK)
    return (-1);

  /* Store the current x87 control word register */
  __asm__ __volatile__ ("fnstcw %0" : "=m" (control));

  /* Set the rounding direction */
  control &= ~_X87_ROUND_MASK;
  control |= round;

  /* Load the x87 control word register */
  __asm__ __volatile__ ("fldcw %0" : : "m" (control));

  /* Same for the SSE environment */
  __asm__ __volatile__ ("stmxcsr %0" : "=m" (mxcsr));
  mxcsr &= ~(_X87_ROUND_MASK << _SSE_ROUND_SHIFT);
  mxcsr |= round << _SSE_ROUND_SHIFT;
  __asm__ __volatile__ ("ldmxcsr %0" : : "m" (mxcsr));

  return (0);
}

/*
 * The fegetenv() function attempts to store the current floating-point
 * environment in the object pointed to by envp.
 */
int
fegetenv(fenv_t *envp)
{
  /* Store the current x87 floating-point environment */
  __asm__ __volatile__ ("fnstenv %0" : "=m" (*envp));

  /* Store the MXCSR register state */
  __asm__ __volatile__ ("stmxcsr %0" : "=m" (envp->__mxcsr));

  /*
   * When an FNSTENV instruction is executed, all pending exceptions are
   * essentially lost (either the x87 FPU status register is cleared or
   * all exceptions are masked).
   *
   * 8.6 X87 FPU EXCEPTION SYNCHRONIZATION -
   * Intel(R) 64 and IA-32 Architectures Softare Developer's Manual - Vol1
   */
  __asm__ __volatile__ ("fldcw %0" : : "m" (envp->__x87.__control));

  return (0);
}

/*
 * The feholdexcept() function saves the current floating-point environment
 * in the object pointed to by envp, clears the floating-point status flags, and
 * then installs a non-stop (continue on floating-point exceptions) mode, if
 * available, for all floating-point exceptions.
 */
int
feholdexcept(fenv_t *envp)
{
  unsigned int mxcsr;

  /* Store the current x87 floating-point environment */
  __asm__ __volatile__ ("fnstenv %0" : "=m" (*envp));

  /* Clear all exception flags in FPU */
  __asm__ __volatile__ ("fnclex");

  /* Store the MXCSR register state */
  __asm__ __volatile__ ("stmxcsr %0" : "=m" (envp->__mxcsr));

  /* Clear exception flags in MXCSR */
  mxcsr = envp->__mxcsr;
  mxcsr &= ~FE_ALL_EXCEPT;

  /* Mask all exceptions */
  mxcsr |= FE_ALL_EXCEPT << _SSE_MASK_SHIFT;

  /* Store the MXCSR register */
  __asm__ __volatile__ ("ldmxcsr %0" : : "m" (mxcsr));

  return (0);
}

/*
 * The fesetenv() function attempts to establish the floating-point environment
 * represented by the object pointed to by envp. The argument `envp' points
 * to an object set by a call to fegetenv() or feholdexcept(), or equal a
 * floating-point environment macro. The fesetenv() function does not raise
 * floating-point exceptions, but only installs the state of the floating-point
 * status flags represented through its argument.
 */
int
fesetenv(const fenv_t *envp)
{
  /* Load the x87 floating-point environent */
  __asm__ __volatile__ ("fldenv %0" : : "m" (*envp));

  /* Store the MXCSR register */
  __asm__ __volatile__ ("ldmxcsr %0" : : "m" (envp->__mxcsr));

  return (0);
}

/*
 * The feupdateenv() function saves the currently raised floating-point
 * exceptions in its automatic storage, installs the floating-point environment
 * represented by the object pointed to by `envp', and then raises the saved
 * floating-point exceptions. The argument `envp' shall point to an object set
 * by a call to feholdexcept() or fegetenv(), or equal a floating-point
 * environment macro.
 */
int
feupdateenv(const fenv_t *envp)
{
  unsigned short status;
  unsigned int mxcsr;

  /* Store the x87 status register */
  __asm__ __volatile__ ("fnstsw %0" : "=am" (status));

  /* Store the MXCSR register */
  __asm__ __volatile__ ("stmxcsr %0" : "=m" (mxcsr));

  /* Install new floating-point environment */
  fesetenv(envp);

  /* Raise any previously accumulated exceptions */
  feraiseexcept(status | mxcsr);

  return (0);
}

/*
 * The following functions are extentions to the standard
 */
int
feenableexcept(int mask)
{
  unsigned int mxcsr, omask;
  unsigned short control;

  mask &= FE_ALL_EXCEPT;

  __asm__ __volatile__ ("fnstcw %0" : "=m" (control));
  __asm__ __volatile__ ("stmxcsr %0" : "=m" (mxcsr));

  omask = ~(control | (mxcsr >> _SSE_MASK_SHIFT)) & FE_ALL_EXCEPT;
  control &= ~mask;
  __asm__ __volatile__ ("fldcw %0" : : "m" (control));

  mxcsr &= ~(mask << _SSE_MASK_SHIFT);
  __asm__ __volatile__ ("ldmxcsr %0" : : "m" (mxcsr));

  return (omask);
}

int
fedisableexcept(int mask)
{
  unsigned int mxcsr, omask;
  unsigned short control;

  mask &= FE_ALL_EXCEPT;

  __asm__ __volatile__ ("fnstcw %0" : "=m" (control));
  __asm__ __volatile__ ("stmxcsr %0" : "=m" (mxcsr));

  omask = ~(control | (mxcsr >> _SSE_MASK_SHIFT)) & FE_ALL_EXCEPT;
  control |= mask;
  __asm__ __volatile__ ("fldcw %0" : : "m" (control));

  mxcsr |= mask << _SSE_MASK_SHIFT;
  __asm__ __volatile__ ("ldmxcsr %0" : : "m" (mxcsr));

  return (omask);
}

int
fegetexcept(void)
{
  unsigned short control;

  /*
   * We assume that the masks for the x87 and the SSE unit are
   * the same.
   */
  __asm__ __volatile__ ("fnstcw %0" : "=m" (control));

  return (~control & FE_ALL_EXCEPT);
}
