Back to index

glibc  2.9
fesetenv.c
Go to the documentation of this file.
00001 /* Install given floating-point environment.
00002    Copyright (C) 1997,99,2000,01,02 Free Software Foundation, Inc.
00003    This file is part of the GNU C Library.
00004    Contributed by Richard Henderson <rth@tamu.edu>, 1997
00005 
00006    The GNU C Library is free software; you can redistribute it and/or
00007    modify it under the terms of the GNU Lesser General Public
00008    License as published by the Free Software Foundation; either
00009    version 2.1 of the License, or (at your option) any later version.
00010 
00011    The GNU C Library is distributed in the hope that it will be useful,
00012    but WITHOUT ANY WARRANTY; without even the implied warranty of
00013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014    Lesser General Public License for more details.
00015 
00016    You should have received a copy of the GNU Lesser General Public
00017    License along with the GNU C Library; if not, write to the Free
00018    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
00019    02111-1307 USA.  */
00020 
00021 #include <fenv_libc.h>
00022 
00023 int
00024 __fesetenv (const fenv_t *envp)
00025 {
00026   unsigned long int fpcr;
00027   fenv_t env;
00028 
00029   /* Magic encoding of default values: high bit set (never possible for a
00030      user-space address) is not indirect.  And we don't even have to get
00031      rid of it since we mask things around just below.  */
00032   if ((long int) envp >= 0)
00033     env = *envp;
00034   else
00035     env = (unsigned long int) envp;
00036 
00037   /* Reset the rounding mode with the hardware fpcr.  Note that the following
00038      system call is an implied trap barrier for our modification.  */
00039   __asm__ __volatile__ ("excb; mf_fpcr %0" : "=f" (fpcr));
00040   fpcr = (fpcr & ~FPCR_ROUND_MASK) | (env & FPCR_ROUND_MASK);
00041   __asm__ __volatile__ ("mt_fpcr %0" : : "f" (fpcr));
00042 
00043   /* Reset the exception status and mask with the kernel's FP code.  */
00044   __ieee_set_fp_control (env & SWCR_ALL_MASK);
00045 
00046   /* Success.  */
00047   return 0;
00048 }
00049 
00050 #include <shlib-compat.h>
00051 #if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
00052 strong_alias (__fesetenv, __old_fesetenv)
00053 compat_symbol (libm, __old_fesetenv, fesetenv, GLIBC_2_1);
00054 #endif
00055 
00056 libm_hidden_ver (__fesetenv, fesetenv)
00057 versioned_symbol (libm, __fesetenv, fesetenv, GLIBC_2_2);