]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/m68k/m680x0/fpu/fraiseexcpt.c
Update copyright dates with scripts/update-copyrights
[thirdparty/glibc.git] / sysdeps / m68k / m680x0 / fpu / fraiseexcpt.c
CommitLineData
c72aa4a2 1/* Raise given exceptions.
6d7e8eda 2 Copyright (C) 1997-2023 Free Software Foundation, Inc.
c72aa4a2 3 This file is part of the GNU C Library.
c72aa4a2
UD
4
5 The GNU C Library is free software; you can redistribute it and/or
3214b89b
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.
c72aa4a2
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
3214b89b 13 Lesser General Public License for more details.
c72aa4a2 14
3214b89b 15 You should have received a copy of the GNU Lesser General Public
ab84e3ff 16 License along with the GNU C Library. If not, see
5a82c748 17 <https://www.gnu.org/licenses/>. */
c72aa4a2
UD
18
19#include <fenv.h>
e8fcfc26 20#include <float.h>
c72aa4a2
UD
21#include <math.h>
22
146bade7
UD
23int
24__feraiseexcept (int excepts)
c72aa4a2
UD
25{
26 /* Raise exceptions represented by EXCEPTS. But we must raise only one
27 signal at a time. It is important that if the overflow/underflow
28 exception and the divide by zero exception are given at the same
29 time, the overflow/underflow exception follows the divide by zero
30 exception. */
31
32 /* First: invalid exception. */
33 if (excepts & FE_INVALID)
34 {
c0c3f78a 35 /* One example of an invalid operation is 0 * Infinity. */
d9814880
UD
36 double d = HUGE_VAL;
37 __asm__ __volatile__ ("fmul%.s %#0r0,%0; fnop" : "=f" (d) : "0" (d));
c72aa4a2
UD
38 }
39
40 /* Next: division by zero. */
41 if (excepts & FE_DIVBYZERO)
42 {
43 double d = 1.0;
44 __asm__ __volatile__ ("fdiv%.s %#0r0,%0; fnop" : "=f" (d) : "0" (d));
45 }
46
47 /* Next: overflow. */
48 if (excepts & FE_OVERFLOW)
49 {
d9814880 50 long double d = LDBL_MAX;
c49416b5 51
75dc7e89 52 __asm__ __volatile__ ("fmul%.x %0,%0; fnop" : "=f" (d) : "0" (d));
c72aa4a2
UD
53 }
54
55 /* Next: underflow. */
56 if (excepts & FE_UNDERFLOW)
57 {
c49416b5 58 long double d = -LDBL_MAX;
c49416b5 59
75dc7e89 60 __asm__ __volatile__ ("fetox%.x %0; fnop" : "=f" (d) : "0" (d));
c72aa4a2
UD
61 }
62
63 /* Last: inexact. */
64 if (excepts & FE_INEXACT)
65 {
d9814880
UD
66 long double d = 1.0;
67 __asm__ __volatile__ ("fdiv%.s %#0r3,%0; fnop" : "=f" (d) : "0" (d));
c72aa4a2 68 }
146bade7
UD
69
70 /* Success. */
71 return 0;
c72aa4a2 72}
60446d7a
RM
73
74#include <shlib-compat.h>
75#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
146bade7 76strong_alias (__feraiseexcept, __old_feraiseexcept)
60446d7a
RM
77compat_symbol (libm, __old_feraiseexcept, feraiseexcept, GLIBC_2_1);
78#endif
79
403cc231 80libm_hidden_def (__feraiseexcept)
280ad607 81libm_hidden_ver (__feraiseexcept, feraiseexcept)
60446d7a 82versioned_symbol (libm, __feraiseexcept, feraiseexcept, GLIBC_2_2);