glibc/sysdeps
Joseph Myers 2145f97cee Handle more state in i386/x86_64 fesetenv (bug 16068).
fenv_t should include architecture-specific floating-point modes and
status flags.  i386 and x86_64 fesetenv limit which bits they use from
the x87 status and control words, when using saved state, and limit
which parts of the state they set to fixed values, when using
FE_DFL_ENV / FE_NOMASK_ENV.  The following should be included but are
excluded in at least some cases: status and masking for the "denormal
operand" exception (which isn't part of FE_ALL_EXCEPT); precision
control (explicitly mentioned in Annex F as something that counts as
part of the floating-point environment); MXCSR FZ and DAZ bits (for
FE_DFL_ENV and FE_NOMASK_ENV).  This patch arranges for this extra
state to be handled by fesetenv (and thereby by feupdateenv, which
calls fesetenv).

(Note that glibc functions using floating point are not generally
expected to work correctly with non-default values of this state,
especially precision control, but it is still logically part of the
floating-point environment and should be handled as such by fesetenv.
Changes to the state relating to subnormals ought generally to work
with libm functions when the arguments aren't subnormal and neither
are the expected results; that's a consequence of functions avoiding
spurious internal underflows.)

A question arising from this is whether FE_NOMASK_ENV should or should
not mask the "denormal operand" exception.  I decided it should mask
that exception.  This is the status quo - previously that exception
could only be unmasked by direct manipulation of control registers
(possibly via <fpu_control.h>).  In addition, it means that use of
FE_NOMASK_ENV leaves a floating-point environment the same as could be
obtained by fesetenv (FE_DFL_ENV); feenableexcept (FE_ALL_EXCEPT);,
rather than an environment in which an exception is unmasked that
could only be masked again by using fesetenv with FE_DFL_ENV (or a
previously saved environment) - this exception not being usable with
other <fenv.h> functions because it's outside FE_ALL_EXCEPT.

Tested for x86_64 and x86.

	[BZ #16068]
	* sysdeps/i386/fpu/fesetenv.c: Include <fpu_control.h>.
	(FE_ALL_EXCEPT_X86): New macro.
	(__fesetenv): Use FE_ALL_EXCEPT_X86 in most places instead of
	FE_ALL_EXCEPT.  Ensure precision control is included in
	floating-point state.  Ensure that FE_DFL_ENV and FE_NOMASK_ENV
	handle "denormal operand exception" and clear FZ and DAZ bits.
	* sysdeps/x86_64/fpu/fesetenv.c: Include <fpu_control.h>.
	(FE_ALL_EXCEPT_X86): New macro.
	(__fesetenv): Use FE_ALL_EXCEPT_X86 in most places instead of
	FE_ALL_EXCEPT.  Ensure precision control is included in
	floating-point state.  Ensure that FE_DFL_ENV and FE_NOMASK_ENV
	handle "denormal operand exception" and clear FZ and DAZ bits.
	* sysdeps/x86/fpu/test-fenv-sse-2.c: New file.
	* sysdeps/x86/fpu/test-fenv-x87.c: Likewise.
	* sysdeps/x86/fpu/Makefile [$(subdir) = math] (tests): Add
	test-fenv-x87 and test-fenv-sse-2.
	[$(subdir) = math] (CFLAGS-test-fenv-sse-2.c): New variable.
2015-10-28 22:58:29 +00:00
..
aarch64 Regenerate aarch64 libm-test-ulps 2015-09-24 14:22:31 +01:00
alpha Move bits/atomic.h to atomic-machine.h (bug 14912). 2015-09-11 20:00:19 +00:00
arm Remove configure test for ARM TLS descriptors support. 2015-10-27 23:56:50 +00:00
generic malloc: Rewrite with explicit TLS access using __thread 2015-10-17 12:06:48 +02:00
gnu Add more TCP_* values to netinet/tcp.h. 2015-09-01 13:45:49 +00:00
hppa Rename bits/linkmap.h to linkmap.h (bug 14912). 2015-09-04 19:44:27 +00:00
i386 Handle more state in i386/x86_64 fesetenv (bug 16068). 2015-10-28 22:58:29 +00:00
ia64 Convert 231 sysdeps function definitions to prototype style. 2015-10-19 12:04:33 +00:00
ieee754 Use C11 *_TRUE_MIN macros where applicable. 2015-10-28 21:42:52 +00:00
init_array NPTL: Initializer for .init_array-only configurations. 2015-02-13 13:19:11 -08:00
m68k Convert miscellaneous function definitions to prototype style. 2015-10-20 21:27:22 +00:00
mach Convert 24 more function definitions to prototype style (array parameters). 2015-10-20 11:51:03 +00:00
microblaze Use soft-fp fma for MicroBlaze (bug 13304). 2015-09-25 17:29:19 +00:00
mips Remove MIPS16 atomics using __sync_* (bug 17404). 2015-10-27 23:47:56 +00:00
nacl NaCl: Do not install <sys/mtio.h>. 2015-09-11 14:16:18 -07:00
nios2 Fixes extern protected data handling testcases elf/tst-protected1a 2015-07-26 05:27:18 -07:00
nptl Remove sysdeps/nptl/configure.ac. 2015-10-27 21:46:03 +00:00
posix Convert 69 more function definitions to prototype style (line wrap cases). 2015-10-19 21:23:47 +00:00
powerpc powerpc: Provide __tls_get_addr () in static libc 2015-10-28 11:42:23 -02:00
pthread Convert 113 more function definitions to prototype style (files with assertions). 2015-10-20 11:54:09 +00:00
s390 Convert 231 sysdeps function definitions to prototype style. 2015-10-19 12:04:33 +00:00
sh Convert 231 sysdeps function definitions to prototype style. 2015-10-19 12:04:33 +00:00
sparc Convert 69 more function definitions to prototype style (line wrap cases). 2015-10-19 21:23:47 +00:00
tile tile: regenerate libm-test-ulps 2015-10-22 12:00:31 -04:00
unix powerpc: Fix usage of elision transient failure adapt param 2015-10-27 17:27:41 -02:00
wordsize-32 Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
wordsize-64 Update copyright dates with scripts/update-copyrights. 2015-01-02 16:29:47 +00:00
x86 Handle more state in i386/x86_64 fesetenv (bug 16068). 2015-10-28 22:58:29 +00:00
x86_64 Handle more state in i386/x86_64 fesetenv (bug 16068). 2015-10-28 22:58:29 +00:00