Back to index

glibc  2.9
Functions
feupdateenv.c File Reference
#include <fenv_libc.h>
#include <bp-sym.h>
#include <shlib-compat.h>

Go to the source code of this file.

Functions

int __feupdateenv (const fenv_t *envp)
 versioned_symbol (libm, BP_SYM(__feupdateenv), BP_SYM(feupdateenv), GLIBC_2_2)

Function Documentation

Definition at line 25 of file feupdateenv.c.

{
  fenv_union_t old, new;

  /* Save the currently set exceptions.  */
  new.fenv = *envp;
  old.fenv = fegetenv_register ();

  /* Restore rounding mode and exception enable from *envp and merge
     exceptions.  Leave fraction rounded/inexact and FP result/CC bits
     unchanged.  */
  new.l[1] = (old.l[1] & 0x1FFFFF00) | (new.l[1] & 0x1FF80FFF);
  
  /* If the old env has no eabled exceptions and the new env has any enabled
     exceptions, then unmask SIGFPE in the MSR FE0/FE1 bits.  This will put
     the hardware into "precise mode" and may cause the FPU to run slower on
     some hardware.  */
  if ((old.l[1] & 0x000000F8) == 0 && (new.l[1] & 0x000000F8) != 0)
    (void)__fe_nomask_env ();
  
  /* If the old env had any eabled exceptions and the new env has no enabled
     exceptions, then mask SIGFPE in the MSR FE0/FE1 bits.  This may allow the
     FPU to run faster because it always takes the default action and can not 
     generate SIGFPE. */
  if ((old.l[1] & 0x000000F8) != 0 && (new.l[1] & 0x000000F8) == 0)
    (void)__fe_mask_env ();

  /* Atomically enable and raise (if appropriate) exceptions set in `new'. */
  fesetenv_register (new.fenv);

  /* Success.  */
  return 0;
}

Here is the call graph for this function:

versioned_symbol ( libm  ,
BP_SYM(__feupdateenv ,
BP_SYM(feupdateenv ,
GLIBC_2_2   
)