diff options
author | Ulrich Drepper <drepper@redhat.com> | 2004-07-20 07:04:32 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2004-07-20 07:04:32 +0000 |
commit | c747e725e310d16c40aa815ed9e3e9f2805351e7 (patch) | |
tree | 1c1e5b3392dc7a91bb4163503350daf91cda29c5 | |
parent | b27e7a54576ba9aa47a2c8d630084c41c502479a (diff) | |
download | glibc-c747e725e310d16c40aa815ed9e3e9f2805351e7.tar.gz glibc-c747e725e310d16c40aa815ed9e3e9f2805351e7.tar.xz glibc-c747e725e310d16c40aa815ed9e3e9f2805351e7.zip |
(__ieee754_powf): Don't generate invalid exception if |y| >= 1U<<31.
-rw-r--r-- | sysdeps/i386/fpu/e_powf.S | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/sysdeps/i386/fpu/e_powf.S b/sysdeps/i386/fpu/e_powf.S index dce81697db..b3fa624f4d 100644 --- a/sysdeps/i386/fpu/e_powf.S +++ b/sysdeps/i386/fpu/e_powf.S @@ -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 |