mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-27 11:43:34 +08:00
S390: Use libc_fe* macros in fe* functions.
This patch updates the s390 specific functions fegetround, fesetround, feholdexcept, fesetenv, feupdateenv, fegetexceptflag, fetestexcept, fesetexceptflag, fetestexceptflag. Now those functions are using the libc_fe* macros if possible. Furthermore fegetexceptflag is now returning the exception from dxc field shifted to the usual exception-flags. Thus a special fetestexceptflag implementation is not needed anymore.
This commit is contained in:
parent
7c94d036c1
commit
238adf59db
@ -17,17 +17,12 @@
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <fenv_libc.h>
|
||||
#include <fpu_control.h>
|
||||
#include <get-rounding-mode.h>
|
||||
|
||||
int
|
||||
__fegetround (void)
|
||||
{
|
||||
fexcept_t cw;
|
||||
|
||||
_FPU_GETCW (cw);
|
||||
|
||||
return cw & FPC_RM_MASK;
|
||||
return get_rounding_mode ();
|
||||
}
|
||||
libm_hidden_def (__fegetround)
|
||||
weak_alias (__fegetround, fegetround)
|
||||
|
@ -17,19 +17,11 @@
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <fenv_libc.h>
|
||||
#include <fpu_control.h>
|
||||
#include <fenv_private.h>
|
||||
|
||||
int __feholdexcept (fenv_t *envp)
|
||||
{
|
||||
fexcept_t fpc;
|
||||
/* Store the environment. */
|
||||
__fegetenv (envp);
|
||||
/* Clear the current sticky bits as more than one exception
|
||||
may be generated. */
|
||||
fpc = envp->__fpc & ~(FPC_FLAGS_MASK | FPC_DXC_MASK);
|
||||
/* Hold from generating fpu exceptions temporarily. */
|
||||
_FPU_SETCW ((fpc & ~(FE_ALL_EXCEPT << FPC_EXCEPTION_MASK_SHIFT)));
|
||||
libc_feholdexcept_s390 (envp);
|
||||
return 0;
|
||||
}
|
||||
libm_hidden_def (__feholdexcept)
|
||||
|
@ -17,28 +17,13 @@
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <fenv_libc.h>
|
||||
#include <fpu_control.h>
|
||||
#include <stddef.h>
|
||||
#include <unistd.h>
|
||||
#include <fenv_private.h>
|
||||
|
||||
int
|
||||
__fesetenv (const fenv_t *envp)
|
||||
{
|
||||
fenv_t env;
|
||||
|
||||
if (envp == FE_DFL_ENV)
|
||||
{
|
||||
env.__fpc = _FPU_DEFAULT;
|
||||
}
|
||||
else if (envp == FE_NOMASK_ENV)
|
||||
{
|
||||
env.__fpc = FPC_EXCEPTION_MASK;
|
||||
}
|
||||
else
|
||||
env = (*envp);
|
||||
|
||||
_FPU_SETCW (env.__fpc);
|
||||
fenv_t env = libc_handle_user_fenv_s390 (envp);
|
||||
libc_fesetenv_s390 (&env);
|
||||
|
||||
/* Success. */
|
||||
return 0;
|
||||
|
@ -17,21 +17,18 @@
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <fenv_libc.h>
|
||||
#include <fpu_control.h>
|
||||
#include <fenv_private.h>
|
||||
|
||||
int
|
||||
__fesetround (int round)
|
||||
{
|
||||
if ((round|FPC_RM_MASK) != FPC_RM_MASK)
|
||||
if ((round | FPC_RM_MASK) != FPC_RM_MASK)
|
||||
{
|
||||
/* ROUND is not a valid rounding mode. */
|
||||
return 1;
|
||||
}
|
||||
__asm__ __volatile__ ("srnm 0(%0)"
|
||||
:
|
||||
: "a" (round));
|
||||
|
||||
libc_fesetround_s390 (round);
|
||||
return 0;
|
||||
}
|
||||
libm_hidden_def (__fesetround)
|
||||
|
@ -1,31 +0,0 @@
|
||||
/* Test exception in saved exception state. S/390 version.
|
||||
Copyright (C) 2016-2019 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
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <fenv.h>
|
||||
#include <fenv_libc.h>
|
||||
|
||||
int
|
||||
fetestexceptflag (const fexcept_t *flagp, int excepts)
|
||||
{
|
||||
/* As *flagp is obtained by an earlier call of fegetexceptflag the
|
||||
bits 0-5 of dxc-byte are either zero or correspond to the
|
||||
flag-bits. Evaluate flags and last dxc-exception-code. */
|
||||
return (((*flagp >> FPC_FLAGS_SHIFT) | (*flagp >> FPC_DXC_SHIFT))
|
||||
& excepts
|
||||
& FE_ALL_EXCEPT);
|
||||
}
|
@ -18,21 +18,13 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
|
||||
#include <fenv_libc.h>
|
||||
#include <fpu_control.h>
|
||||
#include <fenv_private.h>
|
||||
|
||||
int
|
||||
__feupdateenv (const fenv_t *envp)
|
||||
{
|
||||
fexcept_t temp;
|
||||
|
||||
_FPU_GETCW (temp);
|
||||
temp = (temp & FPC_FLAGS_MASK) >> FPC_FLAGS_SHIFT;
|
||||
|
||||
/* Raise the exceptions since the last call to feholdenv */
|
||||
/* re install saved environment. */
|
||||
__fesetenv (envp);
|
||||
__feraiseexcept ((int) temp);
|
||||
fenv_t env = libc_handle_user_fenv_s390 (envp);
|
||||
libc_feupdateenv_s390 (&env);
|
||||
|
||||
/* Success. */
|
||||
return 0;
|
||||
|
@ -17,24 +17,12 @@
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <fenv_libc.h>
|
||||
#include <fpu_control.h>
|
||||
#include <fenv_private.h>
|
||||
|
||||
int
|
||||
fegetexceptflag (fexcept_t *flagp, int excepts)
|
||||
{
|
||||
fexcept_t temp, newexcepts;
|
||||
|
||||
/* Get the current exceptions. */
|
||||
_FPU_GETCW (temp);
|
||||
newexcepts = excepts << FPC_FLAGS_SHIFT;
|
||||
if ((temp & FPC_NOT_FPU_EXCEPTION) == 0)
|
||||
/* Bits 6, 7 of dxc-byte are zero,
|
||||
thus bits 0-5 of dxc-byte correspond to the flag-bits.
|
||||
Evaluate flags and last dxc-exception-code. */
|
||||
newexcepts |= excepts << FPC_DXC_SHIFT;
|
||||
|
||||
*flagp = temp & newexcepts;
|
||||
*flagp = libc_fetestexcept_s390 (excepts);
|
||||
|
||||
/* Success. */
|
||||
return 0;
|
||||
|
@ -24,29 +24,26 @@
|
||||
int
|
||||
fesetexceptflag (const fexcept_t *flagp, int excepts)
|
||||
{
|
||||
fexcept_t temp, newexcepts;
|
||||
fexcept_t fpc, fpc_new;
|
||||
|
||||
/* Get the current environment. We have to do this since we cannot
|
||||
separately set the status word. */
|
||||
_FPU_GETCW (temp);
|
||||
/* Install the new exception bits in the Accrued Exception Byte. */
|
||||
excepts = excepts & FE_ALL_EXCEPT;
|
||||
newexcepts = excepts << FPC_FLAGS_SHIFT;
|
||||
temp &= ~newexcepts;
|
||||
if ((temp & FPC_NOT_FPU_EXCEPTION) == 0)
|
||||
_FPU_GETCW (fpc);
|
||||
|
||||
/* Clear the current exception bits. */
|
||||
fpc_new = fpc & ~((excepts & FE_ALL_EXCEPT) << FPC_FLAGS_SHIFT);
|
||||
if ((fpc & FPC_NOT_FPU_EXCEPTION) == 0)
|
||||
/* Bits 6, 7 of dxc-byte are zero,
|
||||
thus bits 0-5 of dxc-byte correspond to the flag-bits.
|
||||
Clear given exceptions in dxc-field. */
|
||||
temp &= ~(excepts << FPC_DXC_SHIFT);
|
||||
fpc_new &= ~((excepts & FE_ALL_EXCEPT) << FPC_DXC_SHIFT);
|
||||
|
||||
/* Integrate dxc-byte of flagp into flags. The dxc-byte of flagp contains
|
||||
either an ieee-exception or 0 (see fegetexceptflag). */
|
||||
temp |= (*flagp | ((*flagp >> FPC_DXC_SHIFT) << FPC_FLAGS_SHIFT))
|
||||
& newexcepts;
|
||||
/* Set exceptions from flagp in flags-field. */
|
||||
fpc_new |= (*flagp & excepts & FE_ALL_EXCEPT) << FPC_FLAGS_SHIFT;
|
||||
|
||||
/* Store the new status word (along with the rest of the environment.
|
||||
Possibly new exceptions are set but they won't get executed. */
|
||||
_FPU_SETCW (temp);
|
||||
_FPU_SETCW (fpc_new);
|
||||
|
||||
/* Success. */
|
||||
return 0;
|
||||
|
@ -17,23 +17,11 @@
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <fenv_libc.h>
|
||||
#include <fpu_control.h>
|
||||
#include <fenv_private.h>
|
||||
|
||||
int
|
||||
fetestexcept (int excepts)
|
||||
{
|
||||
fexcept_t temp, res;
|
||||
|
||||
/* Get current exceptions. */
|
||||
_FPU_GETCW (temp);
|
||||
res = temp >> FPC_FLAGS_SHIFT;
|
||||
if ((temp & FPC_NOT_FPU_EXCEPTION) == 0)
|
||||
/* Bits 6, 7 of dxc-byte are zero,
|
||||
thus bits 0-5 of dxc-byte correspond to the flag-bits.
|
||||
Evaluate flags and last dxc-exception-code. */
|
||||
res |= temp >> FPC_DXC_SHIFT;
|
||||
|
||||
return res & excepts & FE_ALL_EXCEPT;
|
||||
return libc_fetestexcept_s390 (excepts);
|
||||
}
|
||||
libm_hidden_def (fetestexcept)
|
||||
|
Loading…
Reference in New Issue
Block a user