diff options
-rw-r--r-- | ChangeLog | 22 | ||||
-rw-r--r-- | csu/init-first.c | 5 | ||||
-rw-r--r-- | elf/dl-support.c | 6 | ||||
-rw-r--r-- | math/Makefile | 11 | ||||
-rw-r--r-- | math/test-fpucw-ieee-static.c | 1 | ||||
-rw-r--r-- | math/test-fpucw-ieee.c | 24 | ||||
-rw-r--r-- | math/test-fpucw-static.c | 1 | ||||
-rw-r--r-- | math/test-fpucw.c | 10 |
8 files changed, 69 insertions, 11 deletions
@@ -1,3 +1,25 @@ +2013-09-09 Maciej W. Rozycki <macro@codesourcery.com> + + * csu/init-first.c (_init): Remove the !SHARED condition around + FPU control word initialization. + * elf/dl-support.c (_dl_fpu_control): New variable. + (_dl_aux_init) <AT_FPUCW>: Initialize it. + * math/test-fpucw.c [!FPU_CONTROL] (FPU_CONTROL): New macro. + (main): Replace _FPU_DEFAULT with FPU_CONTROL throughout. + * math/test-fpucw-static.c: New file. + * math/test-fpucw-ieee.c: New file. + * math/test-fpucw-ieee-static.c: New file. + * math/Makefile (tests): Add `test-fpucw-ieee' and + `$(tests-static)'. + (tests-static): New variable. + [($(build-shared),yes)] ($(addprefix $(objpfx),$(tests))): Move + dependency to... + [($(build-shared),yes)] + ($(addprefix $(objpfx),$(filter-out $(tests-static),$(tests)))): + ... this. + [($(build-shared),yes)] ($(addprefix $(objpfx),$(tests-static))): + New dependency. + 2013-09-09 Allan McRae <allan@archlinux.org> [BZ #15939] diff --git a/csu/init-first.c b/csu/init-first.c index f0ebc94b8d..b4d22ce6aa 100644 --- a/csu/init-first.c +++ b/csu/init-first.c @@ -61,11 +61,8 @@ _init (int argc, char **argv, char **envp) if (!__libc_multiple_libcs) { /* Set the FPU control word to the proper default value if the - kernel would use a different value. (In a static program we - don't have this information.) */ -#ifdef SHARED + kernel would use a different value. */ if (__fpu_control != GLRO(dl_fpu_control)) -#endif __setfpucw (__fpu_control); } diff --git a/elf/dl-support.c b/elf/dl-support.c index 5a082feb7a..2023bd031c 100644 --- a/elf/dl-support.c +++ b/elf/dl-support.c @@ -167,6 +167,9 @@ size_t _dl_phnum; uint64_t _dl_hwcap __attribute__ ((nocommon)); uint64_t _dl_hwcap2 __attribute__ ((nocommon)); +/* The value of the FPU control word the kernel will preset in hardware. */ +fpu_control_t _dl_fpu_control = _FPU_DEFAULT; + /* This is not initialized to HWCAP_IMPORTANT, matching the definition of _dl_important_hwcaps, below, where no hwcap strings are ever used. This mask is still used to mediate the lookups in the cache @@ -253,6 +256,9 @@ _dl_aux_init (ElfW(auxv_t) *av) case AT_HWCAP2: GLRO(dl_hwcap2) = (unsigned long int) av->a_un.a_val; break; + case AT_FPUCW: + GLRO(dl_fpu_control) = av->a_un.a_val; + break; #ifdef NEED_DL_SYSINFO case AT_SYSINFO: GL(dl_sysinfo) = av->a_un.a_val; diff --git a/math/Makefile b/math/Makefile index 3ed78fc9c3..a9bd49baee 100644 --- a/math/Makefile +++ b/math/Makefile @@ -87,9 +87,11 @@ long-c-yes = $(calls:=l) # Rules for the test suite. tests = test-matherr test-fenv atest-exp atest-sincos atest-exp2 basic-test \ - test-misc test-fpucw tst-definitions test-tgmath test-tgmath-ret \ - bug-nextafter bug-nexttoward bug-tgmath1 test-tgmath-int \ - test-tgmath2 test-powl tst-CMPLX tst-CMPLX2 test-snan + test-misc test-fpucw test-fpucw-ieee tst-definitions test-tgmath \ + test-tgmath-ret bug-nextafter bug-nexttoward bug-tgmath1 \ + test-tgmath-int test-tgmath2 test-powl tst-CMPLX tst-CMPLX2 test-snan \ + $(tests-static) +tests-static = test-fpucw-static test-fpucw-ieee-static # We do the `long double' tests only if this data type is available and # distinct from `double'. test-longdouble-yes = test-ldouble test-ildoubl @@ -217,7 +219,8 @@ $(objpfx)libieee.a: $(objpfx)ieee-math.o $(LN_S) $(<F) $(@F) ifeq ($(build-shared),yes) -$(addprefix $(objpfx),$(tests)): $(objpfx)libm.so$(libm.so-version) +$(addprefix $(objpfx),$(filter-out $(tests-static),$(tests))): $(objpfx)libm.so$(libm.so-version) +$(addprefix $(objpfx),$(tests-static)): $(objpfx)libm.a else $(addprefix $(objpfx),$(tests)): $(objpfx)libm.a endif diff --git a/math/test-fpucw-ieee-static.c b/math/test-fpucw-ieee-static.c new file mode 100644 index 0000000000..3a35542060 --- /dev/null +++ b/math/test-fpucw-ieee-static.c @@ -0,0 +1 @@ +#include "test-fpucw-ieee.c" diff --git a/math/test-fpucw-ieee.c b/math/test-fpucw-ieee.c new file mode 100644 index 0000000000..ae5fc73f6e --- /dev/null +++ b/math/test-fpucw-ieee.c @@ -0,0 +1,24 @@ +/* FPU control word overridden initialization test. + 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/>. */ + +#define FPU_CONTROL _FPU_IEEE + +#include "test-fpucw.c" + +/* Preempt the library's definition of `__fpu_control'. */ +fpu_control_t __fpu_control = _FPU_IEEE; diff --git a/math/test-fpucw-static.c b/math/test-fpucw-static.c new file mode 100644 index 0000000000..bc1cfa8ce5 --- /dev/null +++ b/math/test-fpucw-static.c @@ -0,0 +1 @@ +#include "test-fpucw.c" diff --git a/math/test-fpucw.c b/math/test-fpucw.c index 1961a67481..ae6a2c9a71 100644 --- a/math/test-fpucw.c +++ b/math/test-fpucw.c @@ -19,6 +19,10 @@ #include <fpu_control.h> #include <stdio.h> +#ifndef FPU_CONTROL +# define FPU_CONTROL _FPU_DEFAULT +#endif + int main (void) { @@ -30,11 +34,11 @@ main (void) cw &= ~_FPU_RESERVED; - if (cw != (_FPU_DEFAULT & ~_FPU_RESERVED)) + if (cw != (FPU_CONTROL & ~_FPU_RESERVED)) printf ("control word is 0x%lx but should be 0x%lx.\n", - (long int) cw, (long int) (_FPU_DEFAULT & ~_FPU_RESERVED)); + (long int) cw, (long int) (FPU_CONTROL & ~_FPU_RESERVED)); - return cw != (_FPU_DEFAULT & ~_FPU_RESERVED); + return cw != (FPU_CONTROL & ~_FPU_RESERVED); #else return 0; |