]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/powerpc/fpu/fraiseexcpt.c
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / sysdeps / powerpc / fpu / fraiseexcpt.c
CommitLineData
1f205a47 1/* Raise given exceptions.
f7a9f785 2 Copyright (C) 1997-2016 Free Software Foundation, Inc.
1f205a47
UD
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
41bdb6e2
AJ
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
1f205a47
UD
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
41bdb6e2 13 Lesser General Public License for more details.
1f205a47 14
41bdb6e2 15 You should have received a copy of the GNU Lesser General Public
59ba27a6
PE
16 License along with the GNU C Library; if not, see
17 <http://www.gnu.org/licenses/>. */
1f205a47
UD
18
19#include <fenv_libc.h>
20
0413b54c 21#undef feraiseexcept
63ae7b63
UD
22int
23__feraiseexcept (int excepts)
1f205a47
UD
24{
25 fenv_union_t u;
26
27 /* Raise exceptions represented by EXCEPTS. It is the responsibility of
28 the OS to ensure that if multiple exceptions occur they are fed back
29 to this process in the proper way; this can happen in hardware,
30 anyway (in particular, inexact with overflow or underflow). */
31
32 /* Get the current state. */
33 u.fenv = fegetenv_register ();
34
35 /* Add the exceptions */
4a28b3ca
AB
36 u.l = (u.l
37 | (excepts & FPSCR_STICKY_BITS)
38 /* Turn FE_INVALID into FE_INVALID_SOFTWARE. */
39 | (excepts >> ((31 - FPSCR_VX) - (31 - FPSCR_VXSOFT))
40 & FE_INVALID_SOFTWARE));
1f205a47
UD
41
42 /* Store the new status word (along with the rest of the environment),
43 triggering any appropriate exceptions. */
44 fesetenv_register (u.fenv);
0413b54c 45
246ec411
UD
46 if ((excepts & FE_INVALID))
47 {
0413b54c
UD
48 /* For some reason, some PowerPC chips (the 601, in particular)
49 don't have FE_INVALID_SOFTWARE implemented. Detect this
50 case and raise FE_INVALID_SNAN instead. */
246ec411 51 u.fenv = fegetenv_register ();
4a28b3ca 52 if ((u.l & FE_INVALID) == 0)
246ec411
UD
53 set_fpscr_bit (FPSCR_VXSNAN);
54 }
63ae7b63
UD
55
56 /* Success. */
57 return 0;
1f205a47 58}
4eb8a862
RM
59
60#include <shlib-compat.h>
61#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
63ae7b63 62strong_alias (__feraiseexcept, __old_feraiseexcept)
e97ed6dd 63compat_symbol (libm, __old_feraiseexcept, feraiseexcept, GLIBC_2_1);
4eb8a862
RM
64#endif
65
0747f818 66libm_hidden_def (__feraiseexcept)
76f2646f 67libm_hidden_ver (__feraiseexcept, feraiseexcept)
e97ed6dd 68versioned_symbol (libm, __feraiseexcept, feraiseexcept, GLIBC_2_2);