fpu_control.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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. #include <stdint.h>
  17. /* Macros for accessing the FPCR and FPSR. */
  18. #if __GNUC_PREREQ (6,0)
  19. # define _FPU_GETCW(fpcr) (fpcr = __builtin_aarch64_get_fpcr ())
  20. # define _FPU_SETCW(fpcr) __builtin_aarch64_set_fpcr (fpcr)
  21. # define _FPU_GETFPSR(fpsr) (fpsr = __builtin_aarch64_get_fpsr ())
  22. # define _FPU_SETFPSR(fpsr) __builtin_aarch64_set_fpsr (fpsr)
  23. #else
  24. # define _FPU_GETCW(fpcr) \
  25. ({ \
  26. uint64_t __fpcr; \
  27. __asm__ __volatile__ ("mrs %0, fpcr" : "=r" (__fpcr)); \
  28. fpcr = __fpcr; \
  29. })
  30. # define _FPU_SETCW(fpcr) \
  31. ({ \
  32. uint64_t __fpcr = fpcr; \
  33. __asm__ __volatile__ ("msr fpcr, %0" : : "r" (__fpcr)); \
  34. })
  35. # define _FPU_GETFPSR(fpsr) \
  36. ({ \
  37. uint64_t __fpsr; \
  38. __asm__ __volatile__ ("mrs %0, fpsr" : "=r" (__fpsr)); \
  39. fpsr = __fpsr; \
  40. })
  41. # define _FPU_SETFPSR(fpsr) \
  42. ({ \
  43. uint64_t __fpsr = fpsr; \
  44. __asm__ __volatile__ ("msr fpsr, %0" : : "r" (__fpsr)); \
  45. })
  46. #endif
  47. /* Reserved bits should be preserved when modifying register
  48. contents. These two masks indicate which bits in each of FPCR and
  49. FPSR should not be changed. */
  50. #define _FPU_RESERVED 0xfe0fe0f8
  51. #define _FPU_FPSR_RESERVED 0x0fffffe0
  52. #define _FPU_DEFAULT 0x00000000
  53. #define _FPU_FPSR_DEFAULT 0x00000000
  54. /* Layout of FPCR and FPSR:
  55. | | | | | | | |
  56. 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
  57. s s s s s s s s s s s
  58. c c c c c c c c c c c c
  59. 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
  60. 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
  61. 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
  62. D D I I P
  63. E E D D
  64. E E
  65. */
  66. #define _FPU_FPCR_RM_MASK 0xc00000
  67. #define _FPU_FPCR_MASK_IXE 0x1000
  68. #define _FPU_FPCR_MASK_UFE 0x0800
  69. #define _FPU_FPCR_MASK_OFE 0x0400
  70. #define _FPU_FPCR_MASK_DZE 0x0200
  71. #define _FPU_FPCR_MASK_IOE 0x0100
  72. #define _FPU_FPCR_IEEE \
  73. (_FPU_DEFAULT | _FPU_FPCR_MASK_IXE \
  74. | _FPU_FPCR_MASK_UFE | _FPU_FPCR_MASK_OFE \
  75. | _FPU_FPCR_MASK_DZE | _FPU_FPCR_MASK_IOE)
  76. #define _FPU_FPSR_IEEE 0
  77. typedef unsigned int fpu_control_t;
  78. typedef unsigned int fpu_fpsr_t;
  79. /* Default control word set at startup. */
  80. extern fpu_control_t __fpu_control;
  81. #endif