1/* Floating point environment.  C-SKY version.
  2   Copyright (C) 2018-2025 Free Software Foundation, Inc.
  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
  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.
  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
 13   Lesser General Public License for more details.
 14
 15   You should have received a copy of the GNU Lesser General Public
 16   License along with the GNU C Library.  If not, see
 17   <https://www.gnu.org/licenses/>.  */
 18
 19#ifndef _FENV_H
 20# error "Never use <bits/fenv.h> directly; include <fenv.h> instead."
 21#endif
 22
 23#ifdef __csky_hard_float__
 24/* Define bits representing the exception.  We use the bit positions
 25   of the appropriate bits in the FPU control word.  */
 26enum
 27  {
 28    FE_INVALID =
 29#define FE_INVALID	0x01
 30      FE_INVALID,
 31    FE_DIVBYZERO =
 32#define FE_DIVBYZERO	0x02
 33      FE_DIVBYZERO,
 34    FE_OVERFLOW =
 35#define FE_OVERFLOW	0x04
 36      FE_OVERFLOW,
 37    FE_UNDERFLOW =
 38#define FE_UNDERFLOW	0x08
 39      FE_UNDERFLOW,
 40    FE_INEXACT =
 41#define FE_INEXACT	0x10
 42      FE_INEXACT,
 43    __FE_DENORMAL = 0x20
 44  };
 45
 46#define FE_ALL_EXCEPT \
 47	(FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID)
 48
 49/* The C-SKY FPU supports all of the four defined rounding modes.  We
 50   use again the bit positions in the FPU control word as the values
 51   for the appropriate macros.  */
 52enum
 53  {
 54    FE_TONEAREST =
 55#define FE_TONEAREST	(0x0 << 24)
 56      FE_TONEAREST,
 57    FE_TOWARDZERO =
 58#define FE_TOWARDZERO	(0x1 << 24)
 59      FE_TOWARDZERO,
 60    FE_UPWARD =
 61#define FE_UPWARD	(0x2 << 24)
 62      FE_UPWARD,
 63    FE_DOWNWARD =
 64#define FE_DOWNWARD	(0x3 << 24)
 65      FE_DOWNWARD,
 66    __FE_ROUND_MASK = (0x3 << 24)
 67  };
 68
 69#else
 70
 71/* In the soft-float case, only rounding to nearest is supported, with
 72   no exceptions.  */
 73
 74enum
 75  {
 76    __FE_UNDEFINED = -1,
 77
 78    FE_TONEAREST =
 79# define FE_TONEAREST	0x0
 80      FE_TONEAREST
 81  };
 82
 83# define FE_ALL_EXCEPT 0
 84
 85#endif
 86
 87/* Type representing exception flags.  */
 88typedef unsigned int fexcept_t;
 89
 90/* Type representing floating-point environment.  */
 91typedef struct
 92{
 93  unsigned int __fpcr;
 94  unsigned int __fpsr;
 95} fenv_t;
 96
 97/* If the default argument is used we use this value.  */
 98#define FE_DFL_ENV	((const fenv_t *) -1)
 99
100#if defined __USE_GNU && defined __csky_hard_float__
101/* Floating-point environment where none of the exceptions are masked.  */
102# define FE_NOMASK_ENV	((const fenv_t *) -2)
103#endif
104
105#if __GLIBC_USE (IEC_60559_BFP_EXT_C23)
106/* Type representing floating-point control modes.  */
107typedef unsigned int femode_t;
108
109/* Default floating-point control modes.  */
110# define FE_DFL_MODE	((const femode_t *) -1L)
111#endif