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 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
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.h>
00022 
00023 int
00024 __fesetenv (const fenv_t *envp)
00025 {
00026   fenv_t temp;
00027 
00028   /* Install the environment specified by ENVP.  But there are a few
00029      values which we do not want to come from the saved environment.
00030      Therefore, we get the current environment and replace the values
00031      we want to use from the environment specified by the parameter.  */
00032 #ifdef __mcoldfire__
00033   __asm__ ("fmove%.l %/fpcr,%0" : "=dm" (temp.__control_register));
00034   __asm__ ("fmove%.l %/fpsr,%0" : "=dm" (temp.__status_register));
00035   __asm__ ("fmove%.l %/fpiar,%0" : "=dm" (temp.__instruction_address));
00036 #else
00037   __asm__ ("fmovem%.l %/fpcr/%/fpsr/%/fpiar,%0" : "=m" (*&temp));
00038 #endif
00039 
00040   temp.__status_register &= ~FE_ALL_EXCEPT;
00041   temp.__control_register &= ~((FE_ALL_EXCEPT << 6) | FE_UPWARD);
00042   if (envp == FE_DFL_ENV)
00043     ;
00044   else if (envp == FE_NOMASK_ENV)
00045     temp.__control_register |= FE_ALL_EXCEPT << 6;
00046   else
00047     {
00048       temp.__control_register |= (envp->__control_register
00049                               & ((FE_ALL_EXCEPT << 6) | FE_UPWARD));
00050       temp.__status_register |= envp->__status_register & FE_ALL_EXCEPT;
00051     }
00052 
00053 #ifdef __mcoldfire__
00054   __asm__ __volatile__ ("fmove%.l %0,%/fpiar"
00055                      :: "dm" (temp.__instruction_address));
00056   __asm__ __volatile__ ("fmove%.l %0,%/fpcr"
00057                      :: "dm" (temp.__control_register));
00058   __asm__ __volatile__ ("fmove%.l %0,%/fpsr"
00059                      :: "dm" (temp.__status_register));
00060 #else
00061   __asm__ __volatile__ ("fmovem%.l %0,%/fpcr/%/fpsr/%/fpiar" : : "m" (*&temp));
00062 #endif
00063 
00064   /* Success.  */
00065   return 0;
00066 }
00067 
00068 #include <shlib-compat.h>
00069 #if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
00070 strong_alias (__fesetenv, __old_fesetenv)
00071 compat_symbol (libm, __old_fesetenv, fesetenv, GLIBC_2_1);
00072 #endif
00073 
00074 libm_hidden_ver (__fesetenv, fesetenv)
00075 versioned_symbol (libm, __fesetenv, fesetenv, GLIBC_2_2);