mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-08 14:20:07 +00:00
[powerpc] fesetenv: optimize FPSCR access
fesetenv() reads the current value of the Floating-Point Status and Control Register (FPSCR) to determine the difference between the current state of exception enables and the newly requested state. All of these bits are also returned by the lighter weight 'mffsl' instruction used by fegetenv_status(). Use that instead. Also, remove a local macro _FPU_MASK_ALL in favor of a common macro, FPU_ENABLES_MASK from fenv_libc.h. Finally, use a local variable ('new') in favor of a pointer dereference ('*envp').
This commit is contained in:
parent
e905212627
commit
fec2bd2c2d
@ -1,3 +1,9 @@
|
||||
2019-08-28 Paul A. Clarke <pc@us.ibm.com>
|
||||
|
||||
* sysdeps/powerpc/fpu/fesetenv.c (__fesetenv): Utilize lightweight
|
||||
FPSCR read.
|
||||
(_FPU_MASK_ALL): Delete.
|
||||
|
||||
2019-08-28 Paul A. Clarke <pc@us.ibm.com>
|
||||
|
||||
* sysdeps/powerpc/fpu/fenv_private.h (libc_feholdsetround_ppc_ctx):
|
||||
|
@ -19,8 +19,6 @@
|
||||
#include <fenv_libc.h>
|
||||
#include <fpu_control.h>
|
||||
|
||||
#define _FPU_MASK_ALL (_FPU_MASK_ZM | _FPU_MASK_OM | _FPU_MASK_UM | _FPU_MASK_XM | _FPU_MASK_IM)
|
||||
|
||||
int
|
||||
__fesetenv (const fenv_t *envp)
|
||||
{
|
||||
@ -28,25 +26,23 @@ __fesetenv (const fenv_t *envp)
|
||||
|
||||
/* get the currently set exceptions. */
|
||||
new.fenv = *envp;
|
||||
old.fenv = fegetenv_register ();
|
||||
if (old.l == new.l)
|
||||
return 0;
|
||||
old.fenv = fegetenv_status ();
|
||||
|
||||
/* If the old env has no enabled exceptions and the new env has any enabled
|
||||
exceptions, then unmask SIGFPE in the MSR FE0/FE1 bits. This will put the
|
||||
hardware into "precise mode" and may cause the FPU to run slower on some
|
||||
hardware. */
|
||||
if ((old.l & _FPU_MASK_ALL) == 0 && (new.l & _FPU_MASK_ALL) != 0)
|
||||
if ((old.l & FPSCR_ENABLES_MASK) == 0 && (new.l & FPSCR_ENABLES_MASK) != 0)
|
||||
(void) __fe_nomask_env_priv ();
|
||||
|
||||
/* If the old env had any enabled exceptions and the new env has no enabled
|
||||
exceptions, then mask SIGFPE in the MSR FE0/FE1 bits. This may allow the
|
||||
FPU to run faster because it always takes the default action and can not
|
||||
generate SIGFPE. */
|
||||
if ((old.l & _FPU_MASK_ALL) != 0 && (new.l & _FPU_MASK_ALL) == 0)
|
||||
if ((old.l & FPSCR_ENABLES_MASK) != 0 && (new.l & FPSCR_ENABLES_MASK) == 0)
|
||||
(void)__fe_mask_env ();
|
||||
|
||||
fesetenv_register (*envp);
|
||||
fesetenv_register (new.fenv);
|
||||
|
||||
/* Success. */
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user