From ff6b24501f70da7d6375d6f5929262b9509db39e Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Tue, 28 Aug 2018 20:48:49 +0000 Subject: Split fenv_private.h out of math_private.h more consistently. On some architectures, the parts of math_private.h relating to the floating-point environment are in a separate file fenv_private.h included from math_private.h. As this is purely an architecture-specific convention used by several architectures, however, all such architectures still need their own math_private.h, even if it has nothing to do beyond #include and peculiarity of including the i386 file directly instead of having a shared file in sysdeps/x86. This patch makes the fenv_private.h name an architecture-independent convention in glibc. The include of fenv_private.h from math_private.h becomes architecture-independent (until callers are updated to include fenv_private.h directly so the include from math_private.h is no longer needed). Some architecture math_private.h headers are removed if no longer needed, or renamed to fenv_private.h if all they define belongs in that header; architecture fenv_private.h headers now do require #include_next . The i386 fenv_private.h file moves to sysdeps/x86/fpu/ to reflect how it is actually shared with x86_64. The generic math_private.h gets a new include of , as needed for bool in some prototypes in that header (previously that was indirectly included via include/fenv.h, which now only gets included too late in math_private.h, after those prototypes). Tested for x86_64 and x86, and tested with build-many-glibcs.py that installed stripped shared libraries are unchanged by the patch. * sysdeps/aarch64/fpu/fenv_private.h: New file. Based on .... * sysdeps/aarch64/fpu/math_private.h: ... this file. All contents moved to fenv_private.h except for ... (TOINT_INTRINSICS): Kept in math_private.h. (roundtoint): Likewise. (converttoint): Likewise. * sysdeps/arm/fenv_private.h: Change multiple-include guard to [ARM_FENV_PRIVATE_H]. Include next . * sysdeps/arm/math_private.h: Remove. * sysdeps/generic/fenv_private.h: New file. Contents moved from .... * sysdeps/generic/math_private.h: ... this file. Include . Do not include or . Include . Remove functions and macros moved to fenv_private.h. * sysdeps/i386/fpu/math_private.h: Remove. * sysdeps/mips/math_private.h: Move to .... * sysdeps/mips/fpu/fenv_private.h: ... here. Change multiple-include guard to [MIPS_FENV_PRIVATE_H]. Remove [__mips_hard_float] conditional. Include next . * sysdeps/powerpc/fpu/fenv_private.h: Change multiple-include guard to [POWERPC_FENV_PRIVATE_H]. Include next . * sysdeps/powerpc/fpu/math_private.h: Do not include . * sysdeps/riscv/rvf/math_private.h: Move to .... * sysdeps/riscv/rvf/fenv_private.h: ... here. Change multiple-include guard to [RISCV_FENV_PRIVATE_H]. Include next . * sysdeps/sparc/fpu/fenv_private.h: Change multiple-include guard to [SPARC_FENV_PRIVATE_H]. Include next . * sysdeps/sparc/fpu/math_private.h: Remove. * sysdeps/i386/fpu/fenv_private.h: Move to .... * sysdeps/x86/fpu/fenv_private.h: ... here. Change multiple-include guard to [X86_FENV_PRIVATE_H]. Include next . * sysdeps/x86_64/fpu/math_private.h: Do not include . --- sysdeps/riscv/rvf/fenv_private.h | 161 +++++++++++++++++++++++++++++++++++++++ sysdeps/riscv/rvf/math_private.h | 161 --------------------------------------- 2 files changed, 161 insertions(+), 161 deletions(-) create mode 100644 sysdeps/riscv/rvf/fenv_private.h delete mode 100644 sysdeps/riscv/rvf/math_private.h (limited to 'sysdeps/riscv/rvf') diff --git a/sysdeps/riscv/rvf/fenv_private.h b/sysdeps/riscv/rvf/fenv_private.h new file mode 100644 index 0000000000..b5b9f36882 --- /dev/null +++ b/sysdeps/riscv/rvf/fenv_private.h @@ -0,0 +1,161 @@ +/* Private floating point rounding and exceptions handling. RISC-V version. + Copyright (C) 2014-2018 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifndef RISCV_FENV_PRIVATE_H +#define RISCV_FENV_PRIVATE_H 1 + +#include +#include +#include + +static __always_inline int +riscv_getround (void) +{ + return get_rounding_mode (); +} + +static __always_inline void +riscv_setround (int rm) +{ + asm volatile ("fsrm %z0" : : "rJ" (rm)); +} + +static __always_inline int +riscv_getflags (void) +{ + int flags; + asm volatile ("frflags %0" : "=r" (flags)); + return flags; +} + +static __always_inline void +riscv_setflags (int flags) +{ + asm volatile ("fsflags %z0" : : "rJ" (flags)); +} + +static __always_inline void +libc_feholdexcept_riscv (fenv_t *envp) +{ + asm volatile ("csrrc %0, fcsr, %1" : "=r" (*envp) : "i" (FE_ALL_EXCEPT)); +} + +#define libc_feholdexcept libc_feholdexcept_riscv +#define libc_feholdexceptf libc_feholdexcept_riscv +#define libc_feholdexceptl libc_feholdexcept_riscv + +static __always_inline void +libc_fesetround_riscv (int round) +{ + riscv_setround (round); +} + +#define libc_fesetround libc_fesetround_riscv +#define libc_fesetroundf libc_fesetround_riscv +#define libc_fesetroundl libc_fesetround_riscv + +static __always_inline void +libc_feholdexcept_setround_riscv (fenv_t *envp, int round) +{ + libc_feholdexcept_riscv (envp); + libc_fesetround_riscv (round); +} + +#define libc_feholdexcept_setround libc_feholdexcept_setround_riscv +#define libc_feholdexcept_setroundf libc_feholdexcept_setround_riscv +#define libc_feholdexcept_setroundl libc_feholdexcept_setround_riscv + +static __always_inline int +libc_fetestexcept_riscv (int ex) +{ + return riscv_getflags () & ex; +} + +#define libc_fetestexcept libc_fetestexcept_riscv +#define libc_fetestexceptf libc_fetestexcept_riscv +#define libc_fetestexceptl libc_fetestexcept_riscv + +static __always_inline void +libc_fesetenv_riscv (const fenv_t *envp) +{ + long int env = (long int) envp - (long int) FE_DFL_ENV; + if (env != 0) + env = *envp; + + _FPU_SETCW (env); +} + +#define libc_fesetenv libc_fesetenv_riscv +#define libc_fesetenvf libc_fesetenv_riscv +#define libc_fesetenvl libc_fesetenv_riscv +#define libc_feresetround_noex libc_fesetenv_riscv +#define libc_feresetround_noexf libc_fesetenv_riscv +#define libc_feresetround_noexl libc_fesetenv_riscv + +static __always_inline int +libc_feupdateenv_test_riscv (const fenv_t *envp, int ex) +{ + fenv_t env = *envp; + int flags = riscv_getflags (); + asm volatile ("csrw fcsr, %z0" : : "rJ" (env | flags)); + return flags & ex; +} + +#define libc_feupdateenv_test libc_feupdateenv_test_riscv +#define libc_feupdateenv_testf libc_feupdateenv_test_riscv +#define libc_feupdateenv_testl libc_feupdateenv_test_riscv + +static __always_inline void +libc_feupdateenv_riscv (const fenv_t *envp) +{ + _FPU_SETCW (*envp | riscv_getflags ()); +} + +#define libc_feupdateenv libc_feupdateenv_riscv +#define libc_feupdateenvf libc_feupdateenv_riscv +#define libc_feupdateenvl libc_feupdateenv_riscv + +static __always_inline void +libc_feholdsetround_riscv (fenv_t *envp, int round) +{ + /* Note this implementation makes an improperly-formatted fenv_t and + so should only be used in conjunction with libc_feresetround. */ + int old_round; + asm volatile ("csrrw %0, frm, %z1" : "=r" (old_round) : "rJ" (round)); + *envp = old_round; +} + +#define libc_feholdsetround libc_feholdsetround_riscv +#define libc_feholdsetroundf libc_feholdsetround_riscv +#define libc_feholdsetroundl libc_feholdsetround_riscv + +static __always_inline void +libc_feresetround_riscv (fenv_t *envp) +{ + /* Note this implementation takes an improperly-formatted fenv_t and + so should only be used in conjunction with libc_feholdsetround. */ + riscv_setround (*envp); +} + +#define libc_feresetround libc_feresetround_riscv +#define libc_feresetroundf libc_feresetround_riscv +#define libc_feresetroundl libc_feresetround_riscv + +#include_next + +#endif diff --git a/sysdeps/riscv/rvf/math_private.h b/sysdeps/riscv/rvf/math_private.h deleted file mode 100644 index ca587620cb..0000000000 --- a/sysdeps/riscv/rvf/math_private.h +++ /dev/null @@ -1,161 +0,0 @@ -/* Private floating point rounding and exceptions handling. RISC-V version. - Copyright (C) 2014-2018 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#ifndef RISCV_MATH_PRIVATE_H -#define RISCV_MATH_PRIVATE_H 1 - -#include -#include -#include - -static __always_inline int -riscv_getround (void) -{ - return get_rounding_mode (); -} - -static __always_inline void -riscv_setround (int rm) -{ - asm volatile ("fsrm %z0" : : "rJ" (rm)); -} - -static __always_inline int -riscv_getflags (void) -{ - int flags; - asm volatile ("frflags %0" : "=r" (flags)); - return flags; -} - -static __always_inline void -riscv_setflags (int flags) -{ - asm volatile ("fsflags %z0" : : "rJ" (flags)); -} - -static __always_inline void -libc_feholdexcept_riscv (fenv_t *envp) -{ - asm volatile ("csrrc %0, fcsr, %1" : "=r" (*envp) : "i" (FE_ALL_EXCEPT)); -} - -#define libc_feholdexcept libc_feholdexcept_riscv -#define libc_feholdexceptf libc_feholdexcept_riscv -#define libc_feholdexceptl libc_feholdexcept_riscv - -static __always_inline void -libc_fesetround_riscv (int round) -{ - riscv_setround (round); -} - -#define libc_fesetround libc_fesetround_riscv -#define libc_fesetroundf libc_fesetround_riscv -#define libc_fesetroundl libc_fesetround_riscv - -static __always_inline void -libc_feholdexcept_setround_riscv (fenv_t *envp, int round) -{ - libc_feholdexcept_riscv (envp); - libc_fesetround_riscv (round); -} - -#define libc_feholdexcept_setround libc_feholdexcept_setround_riscv -#define libc_feholdexcept_setroundf libc_feholdexcept_setround_riscv -#define libc_feholdexcept_setroundl libc_feholdexcept_setround_riscv - -static __always_inline int -libc_fetestexcept_riscv (int ex) -{ - return riscv_getflags () & ex; -} - -#define libc_fetestexcept libc_fetestexcept_riscv -#define libc_fetestexceptf libc_fetestexcept_riscv -#define libc_fetestexceptl libc_fetestexcept_riscv - -static __always_inline void -libc_fesetenv_riscv (const fenv_t *envp) -{ - long int env = (long int) envp - (long int) FE_DFL_ENV; - if (env != 0) - env = *envp; - - _FPU_SETCW (env); -} - -#define libc_fesetenv libc_fesetenv_riscv -#define libc_fesetenvf libc_fesetenv_riscv -#define libc_fesetenvl libc_fesetenv_riscv -#define libc_feresetround_noex libc_fesetenv_riscv -#define libc_feresetround_noexf libc_fesetenv_riscv -#define libc_feresetround_noexl libc_fesetenv_riscv - -static __always_inline int -libc_feupdateenv_test_riscv (const fenv_t *envp, int ex) -{ - fenv_t env = *envp; - int flags = riscv_getflags (); - asm volatile ("csrw fcsr, %z0" : : "rJ" (env | flags)); - return flags & ex; -} - -#define libc_feupdateenv_test libc_feupdateenv_test_riscv -#define libc_feupdateenv_testf libc_feupdateenv_test_riscv -#define libc_feupdateenv_testl libc_feupdateenv_test_riscv - -static __always_inline void -libc_feupdateenv_riscv (const fenv_t *envp) -{ - _FPU_SETCW (*envp | riscv_getflags ()); -} - -#define libc_feupdateenv libc_feupdateenv_riscv -#define libc_feupdateenvf libc_feupdateenv_riscv -#define libc_feupdateenvl libc_feupdateenv_riscv - -static __always_inline void -libc_feholdsetround_riscv (fenv_t *envp, int round) -{ - /* Note this implementation makes an improperly-formatted fenv_t and - so should only be used in conjunction with libc_feresetround. */ - int old_round; - asm volatile ("csrrw %0, frm, %z1" : "=r" (old_round) : "rJ" (round)); - *envp = old_round; -} - -#define libc_feholdsetround libc_feholdsetround_riscv -#define libc_feholdsetroundf libc_feholdsetround_riscv -#define libc_feholdsetroundl libc_feholdsetround_riscv - -static __always_inline void -libc_feresetround_riscv (fenv_t *envp) -{ - /* Note this implementation takes an improperly-formatted fenv_t and - so should only be used in conjunction with libc_feholdsetround. */ - riscv_setround (*envp); -} - -#define libc_feresetround libc_feresetround_riscv -#define libc_feresetroundf libc_feresetround_riscv -#define libc_feresetroundl libc_feresetround_riscv - -#include_next - -#endif -- cgit 1.4.1