From db910efdbdbdde9e7c0a33cb6f6fc9e91672d6f2 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 22 Dec 2011 16:28:08 -0500 Subject: Also retrieve SSE exceptions in x86-32 fegetexceptflag --- ChangeLog | 6 ++++++ NEWS | 8 ++++---- sysdeps/i386/fpu/fgetexcptflg.c | 22 ++++++++++++++++++---- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 205020dd9f..7c79547d63 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2011-12-22 Ulrich Drepper + + [BZ #13185] + * sysdeps/i386/fpu/fgetexcptflg.c (__fegetexceptflag): Also return + SSE flags if possible. + 2011-12-22 Liubov Dmitrieva * sysdeps/i386/i686/multiarch/strcpy-ssse3.S: Fix wrong copying diff --git a/NEWS b/NEWS index 3fe9e9861e..eeee9ac071 100644 --- a/NEWS +++ b/NEWS @@ -11,10 +11,10 @@ Version 2.15 6779, 6783, 9696, 10103, 10709, 11589, 12403, 12847, 12868, 12852, 12874, 12885, 12892, 12907, 12922, 12935, 13007, 13021, 13067, 13068, 13090, - 13092, 13114, 13118, 13123, 13134, 13138, 13147, 13150, 13179, 13189, - 13192, 13268, 13276, 13282, 13291, 13305, 13328, 13335, 13337, 13344, - 13358, 13367, 13413, 13416, 13423, 13439, 13446, 13472, 13484, 13506, - 13515, 13523, 13524, 13538 + 13092, 13114, 13118, 13123, 13134, 13138, 13147, 13150, 13179, 13185, + 13189, 13192, 13268, 13276, 13282, 13291, 13305, 13328, 13335, 13337, + 13344, 13358, 13367, 13413, 13416, 13423, 13439, 13446, 13472, 13484, + 13506, 13515, 13523, 13524, 13538 * New program pldd to list loaded object of a process Implemented by Ulrich Drepper. diff --git a/sysdeps/i386/fpu/fgetexcptflg.c b/sysdeps/i386/fpu/fgetexcptflg.c index 5f60511b61..1a0e6df63e 100644 --- a/sysdeps/i386/fpu/fgetexcptflg.c +++ b/sysdeps/i386/fpu/fgetexcptflg.c @@ -1,5 +1,5 @@ /* Store current representation for exceptions. - Copyright (C) 1997,99,2000,01 Free Software Foundation, Inc. + Copyright (C) 1997,99,2000,01,11 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. @@ -19,7 +19,10 @@ 02111-1307 USA. */ #include -#include +#include +#include +#include + int __fegetexceptflag (fexcept_t *flagp, int excepts) @@ -31,6 +34,17 @@ __fegetexceptflag (fexcept_t *flagp, int excepts) *flagp = temp & excepts & FE_ALL_EXCEPT; + /* If the CPU supports SSE, we clear the MXCSR as well. */ + if ((GLRO(dl_hwcap) & HWCAP_I386_XMM) != 0) + { + unsigned int sse_exc; + + /* Get the current MXCSR. */ + __asm__ ("stmxcsr %0" : "=m" (*&sse_exc)); + + *flagp |= sse_exc & excepts & FE_ALL_EXCEPT; + } + /* Success. */ return 0; } @@ -38,7 +52,7 @@ __fegetexceptflag (fexcept_t *flagp, int excepts) #include #if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2) strong_alias (__fegetexceptflag, __old_fegetexceptflag) -compat_symbol (libm, BP_SYM (__old_fegetexceptflag), BP_SYM (fegetexceptflag), GLIBC_2_1); +compat_symbol (libm, __old_fegetexceptflag, fegetexceptflag, GLIBC_2_1); #endif -versioned_symbol (libm, BP_SYM (__fegetexceptflag), BP_SYM (fegetexceptflag), GLIBC_2_2); +versioned_symbol (libm, __fegetexceptflag, fegetexceptflag, GLIBC_2_2); -- cgit 1.4.1