mirror of
git://sourceware.org/git/glibc.git
synced 2025-03-01 13:17:19 +08:00
Add powerpc-nofpu/e500 support functions for atomic compound assignment and FLT_ROUNDS.
This commit is contained in:
parent
c5df760908
commit
91a1f3fea0
25
ChangeLog
25
ChangeLog
@ -1,5 +1,30 @@
|
||||
2013-11-28 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* sysdeps/powerpc/nofpu/atomic-feclearexcept.c: New file.
|
||||
* sysdeps/powerpc/nofpu/atomic-feholdexcept.c: Likewise.
|
||||
* sysdeps/powerpc/nofpu/atomic-feupdateenv.c: Likewise.
|
||||
* sysdeps/powerpc/nofpu/flt-rounds.c: Likewise.
|
||||
* sysdeps/powerpc/powerpc32/e500/nofpu/atomic-feclearexcept.c:
|
||||
Likewise.
|
||||
* sysdeps/powerpc/powerpc32/e500/nofpu/atomic-feholdexcept.c:
|
||||
Likewise.
|
||||
* sysdeps/powerpc/powerpc32/e500/nofpu/atomic-feupdateenv.c:
|
||||
Likewise.
|
||||
* sysdeps/powerpc/powerpc32/e500/nofpu/flt-rounds.c: Likewise.
|
||||
* sysdeps/powerpc/nofpu/Makefile [$(subdir) = soft-fp]
|
||||
(sysdep_routines): Add atomic-feholdexcept, atomic-feclearexcept,
|
||||
atomic-feupdateenv and flt-rounds.
|
||||
* sysdeps/powerpc/nofpu/Versions (libc): Add
|
||||
__atomic_feholdexcept, __atomic_feclearexcept,
|
||||
__atomic_feupdateenv and __flt_rounds to GLIBC_2.19.
|
||||
* sysdeps/powerpc/powerpc32/e500/nofpu/fenv_libc.h
|
||||
(__feraiseexcept_soft): Declare and use libc_hidden_proto here.
|
||||
* sysdeps/powerpc/powerpc32/e500/nofpu/fraiseexcept-soft.c
|
||||
(__feraiseexcept_soft): Don't declare and use libc_hidden_proto
|
||||
here.
|
||||
* sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/nptl/libc.abilist:
|
||||
Update.
|
||||
|
||||
* manual/arith.texi (FP Exceptions): Document that exceptions may
|
||||
not be raised when matherr is used.
|
||||
(Math Error Reporting): Document overflow in directed rounding
|
||||
|
@ -2,7 +2,8 @@
|
||||
|
||||
ifeq ($(subdir),soft-fp)
|
||||
sysdep_routines += $(gcc-single-routines) $(gcc-double-routines) \
|
||||
sim-full
|
||||
sim-full atomic-feholdexcept atomic-feclearexcept \
|
||||
atomic-feupdateenv flt-rounds
|
||||
endif
|
||||
|
||||
ifeq ($(subdir),math)
|
||||
|
@ -17,6 +17,10 @@ libc {
|
||||
__gtdf2; __gtsf2;
|
||||
__ltdf2; __ltsf2;
|
||||
}
|
||||
GLIBC_2.19 {
|
||||
__atomic_feholdexcept; __atomic_feclearexcept; __atomic_feupdateenv;
|
||||
__flt_rounds;
|
||||
}
|
||||
GLIBC_PRIVATE {
|
||||
__sim_exceptions_thread;
|
||||
__sim_disabled_exceptions_thread;
|
||||
|
28
sysdeps/powerpc/nofpu/atomic-feclearexcept.c
Normal file
28
sysdeps/powerpc/nofpu/atomic-feclearexcept.c
Normal file
@ -0,0 +1,28 @@
|
||||
/* Clear floating-point exceptions for atomic compound assignment.
|
||||
Copyright (C) 2013 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
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include "soft-fp.h"
|
||||
#include "soft-supp.h"
|
||||
|
||||
void
|
||||
__atomic_feclearexcept (void)
|
||||
{
|
||||
/* This function postdates the global variables being turned into
|
||||
compat symbols, so no need to set them. */
|
||||
__sim_exceptions_thread = 0;
|
||||
}
|
38
sysdeps/powerpc/nofpu/atomic-feholdexcept.c
Normal file
38
sysdeps/powerpc/nofpu/atomic-feholdexcept.c
Normal file
@ -0,0 +1,38 @@
|
||||
/* Store current floating-point environment and clear exceptions for
|
||||
atomic compound assignment.
|
||||
Copyright (C) 2013 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
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include "soft-fp.h"
|
||||
#include "soft-supp.h"
|
||||
|
||||
void
|
||||
__atomic_feholdexcept (fenv_t *envp)
|
||||
{
|
||||
fenv_union_t u;
|
||||
|
||||
u.l[0] = __sim_exceptions_thread;
|
||||
/* The rounding mode is not changed by arithmetic, so no need to
|
||||
save it. */
|
||||
u.l[1] = __sim_disabled_exceptions_thread;
|
||||
*envp = u.fenv;
|
||||
|
||||
/* This function postdates the global variables being turned into
|
||||
compat symbols, so no need to set them. */
|
||||
__sim_exceptions_thread = 0;
|
||||
__sim_disabled_exceptions_thread = FE_ALL_EXCEPT;
|
||||
}
|
37
sysdeps/powerpc/nofpu/atomic-feupdateenv.c
Normal file
37
sysdeps/powerpc/nofpu/atomic-feupdateenv.c
Normal file
@ -0,0 +1,37 @@
|
||||
/* Install given floating-point environment and raise exceptions for
|
||||
atomic compound assignment.
|
||||
Copyright (C) 2013 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
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include "soft-fp.h"
|
||||
#include "soft-supp.h"
|
||||
#include <signal.h>
|
||||
|
||||
void
|
||||
__atomic_feupdateenv (const fenv_t *envp)
|
||||
{
|
||||
fenv_union_t u;
|
||||
int saved_exceptions = __sim_exceptions_thread;
|
||||
|
||||
/* This function postdates the global variables being turned into
|
||||
compat symbols, so no need to set them. */
|
||||
u.fenv = *envp;
|
||||
__sim_exceptions_thread |= u.l[0];
|
||||
__sim_disabled_exceptions_thread = u.l[1];
|
||||
if (saved_exceptions & ~__sim_disabled_exceptions_thread)
|
||||
raise (SIGFPE);
|
||||
}
|
38
sysdeps/powerpc/nofpu/flt-rounds.c
Normal file
38
sysdeps/powerpc/nofpu/flt-rounds.c
Normal file
@ -0,0 +1,38 @@
|
||||
/* Return current rounding mode as correct value for FLT_ROUNDS.
|
||||
Copyright (C) 2013 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
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include "soft-fp.h"
|
||||
#include "soft-supp.h"
|
||||
|
||||
int
|
||||
__flt_rounds (void)
|
||||
{
|
||||
switch (__sim_round_mode_thread)
|
||||
{
|
||||
case FP_RND_ZERO:
|
||||
return 0;
|
||||
case FP_RND_NEAREST:
|
||||
return 1;
|
||||
case FP_RND_PINF:
|
||||
return 2;
|
||||
case FP_RND_MINF:
|
||||
return 3;
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
}
|
50
sysdeps/powerpc/powerpc32/e500/nofpu/atomic-feclearexcept.c
Normal file
50
sysdeps/powerpc/powerpc32/e500/nofpu/atomic-feclearexcept.c
Normal file
@ -0,0 +1,50 @@
|
||||
/* Clear floating-point exceptions for atomic compound assignment.
|
||||
e500 version.
|
||||
Copyright (C) 2004-2013 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
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <fenv_libc.h>
|
||||
#include <stdlib.h>
|
||||
#include <sysdep.h>
|
||||
#include <sys/prctl.h>
|
||||
|
||||
void
|
||||
__atomic_feclearexcept (void)
|
||||
{
|
||||
unsigned int fpescr, old_fpescr;
|
||||
|
||||
/* Get the current state. */
|
||||
old_fpescr = fpescr = fegetenv_register ();
|
||||
|
||||
/* Clear the relevant bits. */
|
||||
fpescr &= ~SPEFSCR_ALL_EXCEPT;
|
||||
|
||||
/* Put the new state in effect. */
|
||||
fesetenv_register (fpescr);
|
||||
|
||||
/* Let the kernel know if the "invalid" or "underflow" bit was
|
||||
cleared. */
|
||||
if (old_fpescr & (SPEFSCR_FINVS | SPEFSCR_FUNFS))
|
||||
{
|
||||
int pflags __attribute__ ((__unused__)), r;
|
||||
INTERNAL_SYSCALL_DECL (err);
|
||||
|
||||
r = INTERNAL_SYSCALL (prctl, err, 2, PR_GET_FPEXC, &pflags);
|
||||
if (INTERNAL_SYSCALL_ERROR_P (r, err))
|
||||
abort ();
|
||||
}
|
||||
}
|
55
sysdeps/powerpc/powerpc32/e500/nofpu/atomic-feholdexcept.c
Normal file
55
sysdeps/powerpc/powerpc32/e500/nofpu/atomic-feholdexcept.c
Normal file
@ -0,0 +1,55 @@
|
||||
/* Store current floating-point environment and clear exceptions for
|
||||
atomic compound assignment. e500 version.
|
||||
Copyright (C) 2004-2013 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
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <fenv_libc.h>
|
||||
#include <stdlib.h>
|
||||
#include <sysdep.h>
|
||||
#include <sys/prctl.h>
|
||||
|
||||
void
|
||||
__atomic_feholdexcept (fenv_t *envp)
|
||||
{
|
||||
fenv_union_t u;
|
||||
INTERNAL_SYSCALL_DECL (err);
|
||||
int r;
|
||||
|
||||
/* Get the current state. */
|
||||
r = INTERNAL_SYSCALL (prctl, err, 2, PR_GET_FPEXC, &u.l[0]);
|
||||
if (INTERNAL_SYSCALL_ERROR_P (r, err))
|
||||
abort ();
|
||||
|
||||
u.l[1] = fegetenv_register ();
|
||||
*envp = u.fenv;
|
||||
|
||||
/* Clear everything except for the rounding mode and trapping to the
|
||||
kernel. */
|
||||
u.l[0] &= ~(PR_FP_EXC_DIV
|
||||
| PR_FP_EXC_OVF
|
||||
| PR_FP_EXC_UND
|
||||
| PR_FP_EXC_RES
|
||||
| PR_FP_EXC_INV);
|
||||
u.l[1] &= SPEFSCR_FRMC | (SPEFSCR_ALL_EXCEPT_ENABLE & ~SPEFSCR_FINXE);
|
||||
|
||||
/* Put the new state in effect. */
|
||||
fesetenv_register (u.l[1]);
|
||||
r = INTERNAL_SYSCALL (prctl, err, 2, PR_SET_FPEXC,
|
||||
u.l[0] | PR_FP_EXC_SW_ENABLE);
|
||||
if (INTERNAL_SYSCALL_ERROR_P (r, err))
|
||||
abort ();
|
||||
}
|
46
sysdeps/powerpc/powerpc32/e500/nofpu/atomic-feupdateenv.c
Normal file
46
sysdeps/powerpc/powerpc32/e500/nofpu/atomic-feupdateenv.c
Normal file
@ -0,0 +1,46 @@
|
||||
/* Install given floating-point environment and raise exceptions for
|
||||
atomic compound assignment. e500 version.
|
||||
Copyright (C) 2004-2013 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
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <fenv_libc.h>
|
||||
#include <stdlib.h>
|
||||
#include <sysdep.h>
|
||||
#include <sys/prctl.h>
|
||||
|
||||
void
|
||||
__atomic_feupdateenv (const fenv_t *envp)
|
||||
{
|
||||
int exc;
|
||||
fenv_union_t u;
|
||||
INTERNAL_SYSCALL_DECL (err);
|
||||
int r;
|
||||
|
||||
/* Save the currently set exceptions. */
|
||||
exc = fegetenv_register () & SPEFSCR_ALL_EXCEPT;
|
||||
|
||||
u.fenv = *envp;
|
||||
|
||||
fesetenv_register (u.l[1]);
|
||||
r = INTERNAL_SYSCALL (prctl, err, 2, PR_SET_FPEXC,
|
||||
u.l[0] | PR_FP_EXC_SW_ENABLE);
|
||||
if (INTERNAL_SYSCALL_ERROR_P (r, err))
|
||||
abort ();
|
||||
|
||||
/* Raise (if appropriate) saved exceptions. */
|
||||
__feraiseexcept_soft (exc);
|
||||
}
|
@ -27,6 +27,9 @@
|
||||
int __feraiseexcept_spe (int);
|
||||
libm_hidden_proto (__feraiseexcept_spe)
|
||||
|
||||
int __feraiseexcept_soft (int);
|
||||
libc_hidden_proto (__feraiseexcept_soft)
|
||||
|
||||
int __fexcepts_to_spe (int);
|
||||
libm_hidden_proto (__fexcepts_to_spe)
|
||||
|
||||
|
39
sysdeps/powerpc/powerpc32/e500/nofpu/flt-rounds.c
Normal file
39
sysdeps/powerpc/powerpc32/e500/nofpu/flt-rounds.c
Normal file
@ -0,0 +1,39 @@
|
||||
/* Return current rounding mode as correct value for FLT_ROUNDS. e500
|
||||
version.
|
||||
Copyright (C) 2013 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
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <fenv_libc.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int
|
||||
__flt_rounds (void)
|
||||
{
|
||||
switch (fegetenv_register () & SPEFSCR_FRMC)
|
||||
{
|
||||
case FE_TOWARDZERO:
|
||||
return 0;
|
||||
case FE_TONEAREST:
|
||||
return 1;
|
||||
case FE_UPWARD:
|
||||
return 2;
|
||||
case FE_DOWNWARD:
|
||||
return 3;
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
}
|
@ -20,9 +20,6 @@
|
||||
#include <fenv_libc.h>
|
||||
#include <libc-symbols.h>
|
||||
|
||||
int __feraiseexcept_soft (int);
|
||||
libc_hidden_proto (__feraiseexcept_soft)
|
||||
|
||||
#define __FERAISEEXCEPT_INTERNAL __feraiseexcept_soft
|
||||
#include "spe-raise.c"
|
||||
libc_hidden_def (__feraiseexcept_soft)
|
||||
|
@ -1784,6 +1784,12 @@ GLIBC_2.17
|
||||
GLIBC_2.18
|
||||
GLIBC_2.18 A
|
||||
__cxa_thread_atexit_impl F
|
||||
GLIBC_2.19
|
||||
GLIBC_2.19 A
|
||||
__atomic_feclearexcept F
|
||||
__atomic_feholdexcept F
|
||||
__atomic_feupdateenv F
|
||||
__flt_rounds F
|
||||
GLIBC_2.2
|
||||
GLIBC_2.2 A
|
||||
_IO_adjust_wcolumn F
|
||||
|
Loading…
Reference in New Issue
Block a user