fenv.h 2.8 KB

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