fpu_control.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /* Copyright (C) 1996-2025 Free Software Foundation, Inc.
  2. The GNU C Library is free software; you can redistribute it and/or
  3. modify it under the terms of the GNU Lesser General Public License as
  4. published by the Free Software Foundation; either version 2.1 of the
  5. License, or (at your option) any later version.
  6. The GNU C Library is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  9. Lesser General Public License for more details.
  10. You should have received a copy of the GNU Lesser General Public
  11. License along with the GNU C Library; if not, see
  12. <https://www.gnu.org/licenses/>. */
  13. #ifndef _AARCH64_FPU_CONTROL_H
  14. #define _AARCH64_FPU_CONTROL_H
  15. #include <features.h>
  16. /* Macros for accessing the FPCR and FPSR. */
  17. #if __GNUC_PREREQ (6,0)
  18. # define _FPU_GETCW(fpcr) (fpcr = __builtin_aarch64_get_fpcr ())
  19. # define _FPU_SETCW(fpcr) __builtin_aarch64_set_fpcr (fpcr)
  20. # define _FPU_GETFPSR(fpsr) (fpsr = __builtin_aarch64_get_fpsr ())
  21. # define _FPU_SETFPSR(fpsr) __builtin_aarch64_set_fpsr (fpsr)
  22. #else
  23. # define _FPU_GETCW(fpcr) \
  24. ({ \
  25. __uint64_t __fpcr; \
  26. __asm__ __volatile__ ("mrs %0, fpcr" : "=r" (__fpcr)); \
  27. fpcr = __fpcr; \
  28. })
  29. # define _FPU_SETCW(fpcr) \
  30. ({ \
  31. __uint64_t __fpcr = fpcr; \
  32. __asm__ __volatile__ ("msr fpcr, %0" : : "r" (__fpcr)); \
  33. })
  34. # define _FPU_GETFPSR(fpsr) \
  35. ({ \
  36. __uint64_t __fpsr; \
  37. __asm__ __volatile__ ("mrs %0, fpsr" : "=r" (__fpsr)); \
  38. fpsr = __fpsr; \
  39. })
  40. # define _FPU_SETFPSR(fpsr) \
  41. ({ \
  42. __uint64_t __fpsr = fpsr; \
  43. __asm__ __volatile__ ("msr fpsr, %0" : : "r" (__fpsr)); \
  44. })
  45. #endif
  46. /* Reserved bits should be preserved when modifying register
  47. contents. These two masks indicate which bits in each of FPCR and
  48. FPSR should not be changed. */
  49. #define _FPU_RESERVED 0xfe0fe0f8
  50. #define _FPU_FPSR_RESERVED 0x0fffffe0
  51. #define _FPU_DEFAULT 0x00000000
  52. #define _FPU_FPSR_DEFAULT 0x00000000
  53. /* Layout of FPCR and FPSR:
  54. | | | | | | | |
  55. 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0
  56. s s s s s s s s s s s
  57. c c c c c c c c c c c c
  58. N Z C V Q A D F R R S S S L L L I U U I U O D I I U U I U O D I
  59. C H N Z M M T T B E E E D N N X F F Z O D N N X F F Z O
  60. P O O R R Z N N N E K K E E E E E C K K C C C C C
  61. D D I I P
  62. E E D D
  63. E E
  64. */
  65. #define _FPU_FPCR_RM_MASK 0xc00000
  66. #define _FPU_FPCR_MASK_IXE 0x1000
  67. #define _FPU_FPCR_MASK_UFE 0x0800
  68. #define _FPU_FPCR_MASK_OFE 0x0400
  69. #define _FPU_FPCR_MASK_DZE 0x0200
  70. #define _FPU_FPCR_MASK_IOE 0x0100
  71. #define _FPU_FPCR_IEEE \
  72. (_FPU_DEFAULT | _FPU_FPCR_MASK_IXE \
  73. | _FPU_FPCR_MASK_UFE | _FPU_FPCR_MASK_OFE \
  74. | _FPU_FPCR_MASK_DZE | _FPU_FPCR_MASK_IOE)
  75. #define _FPU_FPSR_IEEE 0
  76. typedef unsigned int fpu_control_t;
  77. typedef unsigned int fpu_fpsr_t;
  78. /* Default control word set at startup. */
  79. extern fpu_control_t __fpu_control;
  80. #endif