Skip to content

Commit

Permalink
[BZ #3451]
Browse files Browse the repository at this point in the history
2006-11-10  Ulrich Drepper  <drepper@redhat.com>
	[BZ #3451]
	* sysdeps/i386/fpu/bits/mathinline.h (floor): Make rounding mode
	change atomic.
	(ceil): Likewise.
  • Loading branch information
Ulrich Drepper committed Nov 10, 2006
1 parent 52a3379 commit 5c2af13
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 15 deletions.
7 changes: 7 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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
Expand Down
42 changes: 27 additions & 15 deletions sysdeps/i386/fpu/bits/mathinline.h
Original file line number Diff line number Diff line change
@@ -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.
Expand Down Expand Up @@ -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__
Expand Down

0 comments on commit 5c2af13

Please sign in to comment.