(__ieee754_powf): Don't generate invalid exception if |y| >= 1U<<31.

This commit is contained in:
Ulrich Drepper 2004-07-20 07:04:32 +00:00
parent b27e7a5457
commit c747e725e3
1 changed files with 12 additions and 1 deletions

View File

@ -1,5 +1,5 @@
/* ix87 specific implementation of pow function.
Copyright (C) 1996, 1997, 1999, 2001 Free Software Foundation, Inc.
Copyright (C) 1996, 1997, 1999, 2001, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@ -48,6 +48,9 @@ one: .double 1.0
ASM_TYPE_DIRECTIVE(limit,@object)
limit: .double 0.29
ASM_SIZE_DIRECTIVE(limit)
ASM_TYPE_DIRECTIVE(p31,@object)
p31: .byte 0, 0, 0, 0, 0, 0, 0xe0, 0x41
ASM_SIZE_DIRECTIVE(p31)
#ifdef PIC
#define MO(op) op##@GOTOFF(%ecx)
@ -96,6 +99,14 @@ ENTRY(__ieee754_powf)
fxch // y : x
/* fistpl raises invalid exception for |y| >= 1L<<31. */
fld %st // y : y : x
fabs // |y| : y : x
fcompl MO(p31) // y : x
fnstsw
sahf
jnc 2f
/* First see whether `y' is a natural number. In this case we
can use a more precise algorithm. */
fld %st // y : y : x