fpu_control.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /* Copyright (C) 1996-2021 Free Software Foundation, Inc.
  2. This file is part of the GNU C Library.
  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 License as
  5. published by the Free Software Foundation; either version 2.1 of the
  6. 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 _AARCH64_FPU_CONTROL_H
  15. #define _AARCH64_FPU_CONTROL_H
  16. #include <features.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. __asm__ __volatile__ ("mrs %0, fpcr" : "=r" (fpcr))
  26. # define _FPU_SETCW(fpcr) \
  27. __asm__ __volatile__ ("msr fpcr, %0" : : "r" (fpcr))
  28. # define _FPU_GETFPSR(fpsr) \
  29. __asm__ __volatile__ ("mrs %0, fpsr" : "=r" (fpsr))
  30. # define _FPU_SETFPSR(fpsr) \
  31. __asm__ __volatile__ ("msr fpsr, %0" : : "r" (fpsr))
  32. #endif
  33. /* Reserved bits should be preserved when modifying register
  34. contents. These two masks indicate which bits in each of FPCR and
  35. FPSR should not be changed. */
  36. #define _FPU_RESERVED 0xfe0fe0ff
  37. #define _FPU_FPSR_RESERVED 0x0fffffe0
  38. #define _FPU_DEFAULT 0x00000000
  39. #define _FPU_FPSR_DEFAULT 0x00000000
  40. /* Layout of FPCR and FPSR:
  41. | | | | | | | |
  42. 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
  43. s s s s s s s s s s s
  44. c c c c c c c c c c c c
  45. 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
  46. 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
  47. 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
  48. D D I I P
  49. E E D D
  50. E E
  51. */
  52. #define _FPU_FPCR_RM_MASK 0xc00000
  53. #define _FPU_FPCR_MASK_IXE 0x1000
  54. #define _FPU_FPCR_MASK_UFE 0x0800
  55. #define _FPU_FPCR_MASK_OFE 0x0400
  56. #define _FPU_FPCR_MASK_DZE 0x0200
  57. #define _FPU_FPCR_MASK_IOE 0x0100
  58. #define _FPU_FPCR_IEEE \
  59. (_FPU_DEFAULT | _FPU_FPCR_MASK_IXE \
  60. | _FPU_FPCR_MASK_UFE | _FPU_FPCR_MASK_OFE \
  61. | _FPU_FPCR_MASK_DZE | _FPU_FPCR_MASK_IOE)
  62. #define _FPU_FPSR_IEEE 0
  63. typedef unsigned int fpu_control_t;
  64. typedef unsigned int fpu_fpsr_t;
  65. /* Default control word set at startup. */
  66. extern fpu_control_t __fpu_control;
  67. #endif