about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--sysdeps/i386/fpu/bits/mathinline.h14
2 files changed, 12 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index c032f1a749..109b6a100a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -8,6 +8,11 @@
 	* manual/stdio.texi (Opening Streams): Document additional fopen
 	parameters.
 
+2012-04-09  Roland McGrath  <roland@hack.frob.com>
+
+	* sysdeps/i386/fpu/bits/mathinline.h (__sincos_code): Don't clobber
+	%eax without telling the compiler.
+
 2012-04-09  Carlos O'Donell  <carlos_odonell@mentor.com>
 
 	[BZ # 13963]
diff --git a/sysdeps/i386/fpu/bits/mathinline.h b/sysdeps/i386/fpu/bits/mathinline.h
index 276acf8e71..6561ebaa39 100644
--- a/sysdeps/i386/fpu/bits/mathinline.h
+++ b/sysdeps/i386/fpu/bits/mathinline.h
@@ -1,6 +1,5 @@
 /* Inline math functions for i387.
-   Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2003,2004,2006,2007,2009,
-   2010 Free Software Foundation, Inc.
+   Copyright (C) 1995-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by John C. Bowman <bowman@math.ualberta.ca>, 1995.
 
@@ -324,22 +323,23 @@ __inline_mathcode (__pow2, __x, \
 #  define __sincos_code \
   register long double __cosr;						      \
   register long double __sinr;						      \
+  register unsigned int __swtmp;					      \
   __asm __volatile__							      \
     ("fsincos\n\t"							      \
-     "fnstsw	%%ax\n\t"						      \
-     "testl	$0x400, %%eax\n\t"					      \
+     "fnstsw	%w2\n\t"						      \
+     "testl	$0x400, %2\n\t"						      \
      "jz	1f\n\t"							      \
      "fldpi\n\t"							      \
      "fadd	%%st(0)\n\t"						      \
      "fxch	%%st(1)\n\t"						      \
      "2: fprem1\n\t"							      \
-     "fnstsw	%%ax\n\t"						      \
-     "testl	$0x400, %%eax\n\t"					      \
+     "fnstsw	%w2\n\t"						      \
+     "testl	$0x400, %2\n\t"						      \
      "jnz	2b\n\t"							      \
      "fstp	%%st(1)\n\t"						      \
      "fsincos\n\t"							      \
      "1:"								      \
-     : "=t" (__cosr), "=u" (__sinr) : "0" (__x));			      \
+     : "=t" (__cosr), "=u" (__sinr), "=a" (__swtmp) : "0" (__x));	      \
   *__sinx = __sinr;							      \
   *__cosx = __cosr