]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/m68k/fpu/fesetenv.c
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / sysdeps / m68k / fpu / fesetenv.c
CommitLineData
c72aa4a2 1/* Install given floating-point environment.
688903eb 2 Copyright (C) 1997-2018 Free Software Foundation, Inc.
c72aa4a2
UD
3 This file is part of the GNU C Library.
4 Contributed by Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
5
6 The GNU C Library is free software; you can redistribute it and/or
3214b89b
AJ
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
c72aa4a2
UD
10
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3214b89b 14 Lesser General Public License for more details.
c72aa4a2 15
3214b89b 16 You should have received a copy of the GNU Lesser General Public
ab84e3ff
PE
17 License along with the GNU C Library. If not, see
18 <http://www.gnu.org/licenses/>. */
c72aa4a2
UD
19
20#include <fenv.h>
21
146bade7
UD
22int
23__fesetenv (const fenv_t *envp)
c72aa4a2
UD
24{
25 fenv_t temp;
26
27 /* Install the environment specified by ENVP. But there are a few
28 values which we do not want to come from the saved environment.
29 Therefore, we get the current environment and replace the values
30 we want to use from the environment specified by the parameter. */
9c986f87
AS
31#ifdef __mcoldfire__
32 __asm__ ("fmove%.l %/fpcr,%0" : "=dm" (temp.__control_register));
33 __asm__ ("fmove%.l %/fpsr,%0" : "=dm" (temp.__status_register));
34 __asm__ ("fmove%.l %/fpiar,%0" : "=dm" (temp.__instruction_address));
35#else
053ed290 36 __asm__ ("fmovem%.l %/fpcr/%/fpsr/%/fpiar,%0" : "=m" (*&temp));
9c986f87 37#endif
c72aa4a2 38
303e5382
AS
39 temp.__status_register &= ~FE_ALL_EXCEPT;
40 temp.__control_register &= ~((FE_ALL_EXCEPT << 6) | FE_UPWARD);
c72aa4a2
UD
41 if (envp == FE_DFL_ENV)
42 ;
43 else if (envp == FE_NOMASK_ENV)
303e5382 44 temp.__control_register |= FE_ALL_EXCEPT << 6;
c72aa4a2
UD
45 else
46 {
303e5382
AS
47 temp.__control_register |= (envp->__control_register
48 & ((FE_ALL_EXCEPT << 6) | FE_UPWARD));
49 temp.__status_register |= envp->__status_register & FE_ALL_EXCEPT;
c72aa4a2
UD
50 }
51
9c986f87
AS
52#ifdef __mcoldfire__
53 __asm__ __volatile__ ("fmove%.l %0,%/fpiar"
54 :: "dm" (temp.__instruction_address));
55 __asm__ __volatile__ ("fmove%.l %0,%/fpcr"
56 :: "dm" (temp.__control_register));
57 __asm__ __volatile__ ("fmove%.l %0,%/fpsr"
58 :: "dm" (temp.__status_register));
59#else
053ed290 60 __asm__ __volatile__ ("fmovem%.l %0,%/fpcr/%/fpsr/%/fpiar" : : "m" (*&temp));
9c986f87 61#endif
146bade7
UD
62
63 /* Success. */
64 return 0;
c72aa4a2 65}
60446d7a
RM
66
67#include <shlib-compat.h>
68#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
146bade7 69strong_alias (__fesetenv, __old_fesetenv)
60446d7a
RM
70compat_symbol (libm, __old_fesetenv, fesetenv, GLIBC_2_1);
71#endif
72
cd42798a 73libm_hidden_def (__fesetenv)
280ad607 74libm_hidden_ver (__fesetenv, fesetenv)
60446d7a 75versioned_symbol (libm, __fesetenv, fesetenv, GLIBC_2_2);