Back to index

glibc  2.9
fesetenv.c File Reference
#include <fenv.h>

Go to the source code of this file.


int fesetenv (const fenv_t *envp)

Function Documentation

int fesetenv ( const fenv_t envp)

Definition at line 26 of file fesetenv.c.

  union { unsigned long long buf[4]; fenv_t env; } temp;
  unsigned long long *bufptr;

  /* Install the environment specified by ENVP.  But there are a few
     values which we do not want to come from the saved environment.
     Therefore, we get the current environment and replace the values
     we want to use from the environment specified by the parameter.  */
  bufptr = temp.buf;
  __asm__ (
          "fstd,ma %%fr0,8(%1)\n"
          : "=m" (temp) : "r" (bufptr) : "%r0");

  temp.env.__status_word &= ~(FE_ALL_EXCEPT
                         | (FE_ALL_EXCEPT << 27)
                         | FE_DOWNWARD);
  if (envp == FE_DFL_ENV)
  else if (envp == FE_NOMASK_ENV)
    temp.env.__status_word |= FE_ALL_EXCEPT;
    temp.env.__status_word |= (envp->__status_word
                            & (FE_ALL_EXCEPT
                              | FE_DOWNWARD
                              | (FE_ALL_EXCEPT << 27)));

  /* Load the new environment. We use bufptr again since the 
     initial asm has modified the value of the register and here
     we take advantage of that to load in reverse order so fr0
     is loaded last and T-Bit is enabled. */
  __asm__ (
          "fldd,mb -8(%1),%%fr0\n"
          : : "m" (temp), "r" (bufptr) : "%r0" );

  /* Success.  */
  return 0;

Here is the call graph for this function: