1/* Copyright (C) 2004-2025 Free Software Foundation, Inc.
 2   This file is part of the GNU C Library.
 3
 4   The GNU C Library is free software; you can redistribute it and/or
 5   modify it under the terms of the GNU Lesser General Public
 6   License as published by the Free Software Foundation; either
 7   version 2.1 of the License, or (at your option) any later version.
 8
 9   The GNU C Library is distributed in the hope that it will be useful,
10   but WITHOUT ANY WARRANTY; without even the implied warranty of
11   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12   Lesser General Public License for more details.
13
14   You should have received a copy of the GNU Lesser General Public
15   License along with the GNU C Library.  If not, see
16   <https://www.gnu.org/licenses/>.  */
17
18#ifndef _FENV_H
19# error "Never use <bits/fenv.h> directly; include <fenv.h> instead."
20#endif
21
22/* Define bits representing exceptions in the FPU status word.  */
23enum
24  {
25    FE_INVALID =
26#define FE_INVALID	1
27      FE_INVALID,
28    FE_DIVBYZERO =
29#define FE_DIVBYZERO	2
30      FE_DIVBYZERO,
31    FE_OVERFLOW =
32#define FE_OVERFLOW	4
33      FE_OVERFLOW,
34    FE_UNDERFLOW =
35#define FE_UNDERFLOW	8
36      FE_UNDERFLOW,
37    FE_INEXACT =
38#define FE_INEXACT	16
39      FE_INEXACT,
40  };
41
42/* Amount to shift by to convert an exception to a mask bit.  */
43#define FE_EXCEPT_SHIFT	8
44
45/* All supported exceptions.  */
46#define FE_ALL_EXCEPT	\
47	(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT)
48
49/* VFP supports all of the four defined rounding modes.  */
50enum
51  {
52    FE_TONEAREST =
53#define FE_TONEAREST	0
54      FE_TONEAREST,
55    FE_UPWARD =
56#define FE_UPWARD	0x400000
57      FE_UPWARD,
58    FE_DOWNWARD =
59#define FE_DOWNWARD	0x800000
60      FE_DOWNWARD,
61    FE_TOWARDZERO =
62#define FE_TOWARDZERO	0xc00000
63      FE_TOWARDZERO
64  };
65
66/* Type representing exception flags. */
67typedef unsigned int fexcept_t;
68
69/* Type representing floating-point environment.  */
70typedef struct
71  {
72    unsigned int __cw;
73  }
74fenv_t;
75
76/* If the default argument is used we use this value.  */
77#define FE_DFL_ENV	((const fenv_t *) -1l)
78
79#ifdef __USE_GNU
80/* Floating-point environment where none of the exceptions are masked.  */
81# define FE_NOMASK_ENV  ((const fenv_t *) -2)
82#endif
83
84#if __GLIBC_USE (IEC_60559_BFP_EXT_C23)
85/* Type representing floating-point control modes.  */
86typedef unsigned int femode_t;
87
88/* Default floating-point control modes.  */
89# define FE_DFL_MODE	((const femode_t *) -1L)
90#endif