[AArch64] Use builtins for fpcr/fpsr

Since GCC has support for accessing FPSR/FPCR, use them when possible
so that the asm instructions can be removed eventually.  Although GCC 5
supports the builtins, it has an optimization bug, so use them from GCC 6
onwards.

	* sysdeps/aarch64/fpu/fpu_control.h: Use builtins for accessing
	FPCR/FPSR.
This commit is contained in:
Wilco Dijkstra 2018-02-09 16:59:23 +00:00
parent 1f6676d7da
commit 3f8d9d58c5
2 changed files with 16 additions and 4 deletions

View File

@ -1,3 +1,8 @@
2018-02-09 Wilco Dijkstra <wdijkstr@arm.com>
* sysdeps/aarch64/fpu/fpu_control.h: Use builtins for accessing
FPCR/FPSR.
2018-02-09 Rical Jasan <ricaljasan@pacific.net> 2018-02-09 Rical Jasan <ricaljasan@pacific.net>
* manual/creature.texi: Convert references to gcc.info to gcc. * manual/creature.texi: Convert references to gcc.info to gcc.

View File

@ -21,17 +21,24 @@
/* Macros for accessing the FPCR and FPSR. */ /* Macros for accessing the FPCR and FPSR. */
#define _FPU_GETCW(fpcr) \ #if __GNUC_PREREQ (6,0)
# define _FPU_GETCW(fpcr) (fpcr = __builtin_aarch64_get_fpcr ())
# define _FPU_SETCW(fpcr) __builtin_aarch64_set_fpcr (fpcr)
# define _FPU_GETFPSR(fpsr) (fpsr = __builtin_aarch64_get_fpsr ())
# define _FPU_SETFPSR(fpsr) __builtin_aarch64_set_fpsr (fpsr)
#else
# define _FPU_GETCW(fpcr) \
__asm__ __volatile__ ("mrs %0, fpcr" : "=r" (fpcr)) __asm__ __volatile__ ("mrs %0, fpcr" : "=r" (fpcr))
#define _FPU_SETCW(fpcr) \ # define _FPU_SETCW(fpcr) \
__asm__ __volatile__ ("msr fpcr, %0" : : "r" (fpcr)) __asm__ __volatile__ ("msr fpcr, %0" : : "r" (fpcr))
#define _FPU_GETFPSR(fpsr) \ # define _FPU_GETFPSR(fpsr) \
__asm__ __volatile__ ("mrs %0, fpsr" : "=r" (fpsr)) __asm__ __volatile__ ("mrs %0, fpsr" : "=r" (fpsr))
#define _FPU_SETFPSR(fpsr) \ # define _FPU_SETFPSR(fpsr) \
__asm__ __volatile__ ("msr fpsr, %0" : : "r" (fpsr)) __asm__ __volatile__ ("msr fpsr, %0" : : "r" (fpsr))
#endif
/* Reserved bits should be preserved when modifying register /* Reserved bits should be preserved when modifying register
contents. These two masks indicate which bits in each of FPCR and contents. These two masks indicate which bits in each of FPCR and