about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--sysdeps/i386/fpu/bits/mathinline.h42
2 files changed, 34 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index 6a175b5a47..37effa8e18 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2006-11-10  Ulrich Drepper  <drepper@redhat.com>
+
+	[BZ #3451]
+	* sysdeps/i386/fpu/bits/mathinline.h (floor): Make rounding mode
+	change atomic.
+	(ceil): Likewise.
+
 2006-11-10  Jakub Jelinek  <jakub@redhat.com>
 
 	* string/strxfrm_l.c (STRXFRM): Fix trailing \1 optimization
diff --git a/sysdeps/i386/fpu/bits/mathinline.h b/sysdeps/i386/fpu/bits/mathinline.h
index e04ce95099..8e7a867ec6 100644
--- a/sysdeps/i386/fpu/bits/mathinline.h
+++ b/sysdeps/i386/fpu/bits/mathinline.h
@@ -1,5 +1,5 @@
 /* Inline math functions for i387.
-   Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004
+   Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2006
    Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by John C. Bowman <bowman@math.ualberta.ca>, 1995.
@@ -529,24 +529,36 @@ __inline_mathcodeNP (tanh, __x, \
 
 __inline_mathcodeNP (floor, __x, \
   register long double __value;						      \
-  __volatile unsigned short int __cw;					      \
-  __volatile unsigned short int __cwtmp;				      \
-  __asm __volatile ("fnstcw %0" : "=m" (__cw));				      \
-  __cwtmp = (__cw & 0xf3ff) | 0x0400; /* rounding down */		      \
-  __asm __volatile ("fldcw %0" : : "m" (__cwtmp));			      \
-  __asm __volatile ("frndint" : "=t" (__value) : "0" (__x));		      \
-  __asm __volatile ("fldcw %0" : : "m" (__cw));				      \
+  register int __ignore;						      \
+  unsigned short int __cw;						      \
+  unsigned short int __cwtmp;						      \
+  __asm __volatile ("fnstcw %4\n\t"					      \
+		    "movzwl %4, %1\n\t"					      \
+		    "andl $0xf3ff, %1\n\t"				      \
+		    "orl $0x0400, %1\n\t"	/* rounding down */	      \
+		    "movw %1, %3\n\t"					      \
+		    "fldcw %3\n\t"					      \
+		    "frndint\n\t"					      \
+		    "fldcw %4"						      \
+		    : "=t" (__value), "=&q" (__ignore)			      \
+		    : "0" (__x), "m" (__cwtmp), "m" (__cw));		      \
   return __value)
 
 __inline_mathcodeNP (ceil, __x, \
   register long double __value;						      \
-  __volatile unsigned short int __cw;					      \
-  __volatile unsigned short int __cwtmp;				      \
-  __asm __volatile ("fnstcw %0" : "=m" (__cw));				      \
-  __cwtmp = (__cw & 0xf3ff) | 0x0800; /* rounding up */			      \
-  __asm __volatile ("fldcw %0" : : "m" (__cwtmp));			      \
-  __asm __volatile ("frndint" : "=t" (__value) : "0" (__x));		      \
-  __asm __volatile ("fldcw %0" : : "m" (__cw));				      \
+  register int __ignore;						      \
+  unsigned short int __cw;						      \
+  unsigned short int __cwtmp;						      \
+  __asm __volatile ("fnstcw %4\n\t"					      \
+		    "movzwl %4, %1\n\t"					      \
+		    "andl $0xf3ff, %1\n\t"				      \
+		    "orl $0x0800, %1\n\t"	/* rounding up */	      \
+		    "movw %1, %3\n\t"					      \
+		    "fldcw %3\n\t"					      \
+		    "frndint\n\t"					      \
+		    "fldcw %4"						      \
+		    : "=t" (__value), "=&q" (__ignore)			      \
+		    : "0" (__x), "m" (__cwtmp), "m" (__cw));		      \
   return __value)
 
 #ifdef __FAST_MATH__