aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/i386/fpu
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/i386/fpu')
-rw-r--r--sysdeps/i386/fpu/bits/mathinline.h52
-rw-r--r--sysdeps/i386/fpu/e_pow.S18
-rw-r--r--sysdeps/i386/fpu/e_powf.S18
-rw-r--r--sysdeps/i386/fpu/e_powl.S18
4 files changed, 43 insertions, 63 deletions
diff --git a/sysdeps/i386/fpu/bits/mathinline.h b/sysdeps/i386/fpu/bits/mathinline.h
index e79713dfd5..3539231376 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,96,97,98,99,2000 Free Software Foundation, Inc.
+ Copyright (C) 1995,96,97,98,99,2000,2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by John C. Bowman <bowman@math.ualberta.ca>, 1995.
@@ -413,56 +413,6 @@ __inline_mathcodeNP (tan, __x, \
("fptan" \
: "=t" (__value2), "=u" (__value) : "0" (__x)); \
return __value)
-
-
-__inline_mathcodeNP2 (pow, __x, __y, \
- register long double __value; \
- register long double __exponent; \
- __extension__ long long int __p = (long long int) __y; \
- if (__x == 0.0) \
- { \
- if (__y > 0.0) \
- return __y == (double) __p && (__p & 1) != 0 ? __x : 0.0; \
- else if (__y < 0.0) \
- return (__y == (double) __p && (-__p & 1) != 0 \
- ? 1.0 / __x : 1.0 / fabs (__x)); \
- } \
- if (__y == (double) __p) \
- { \
- long double __r = 1.0; \
- if (__p == 0) \
- return 1.0; \
- if (__p < 0) \
- { \
- __p = -__p; \
- __x = 1.0 / __x; \
- } \
- while (1) \
- { \
- if (__p & 1) \
- __r *= __x; \
- __p >>= 1; \
- if (__p == 0) \
- return __r; \
- __x *= __x; \
- } \
- /* NOTREACHED */ \
- } \
- __asm __volatile__ \
- ("fyl2x" : "=t" (__value) : "0" (__x), "u" (1.0) : "st(1)"); \
- __asm __volatile__ \
- ("fmul %%st(1) # y * log2(x)\n\t" \
- "fst %%st(1)\n\t" \
- "frndint # int(y * log2(x))\n\t" \
- "fxch\n\t" \
- "fsub %%st(1) # fract(y * log2(x))\n\t" \
- "f2xm1 # 2^(fract(y * log2(x))) - 1\n\t" \
- : "=t" (__value), "=u" (__exponent) : "0" (__y), "1" (__value)); \
- __value += 1.0; \
- __asm __volatile__ \
- ("fscale" \
- : "=t" (__value) : "0" (__value), "u" (__exponent)); \
- return __value)
#endif /* __FAST_MATH__ */
diff --git a/sysdeps/i386/fpu/e_pow.S b/sysdeps/i386/fpu/e_pow.S
index 75b39e4884..842faaba85 100644
--- a/sysdeps/i386/fpu/e_pow.S
+++ b/sysdeps/i386/fpu/e_pow.S
@@ -1,5 +1,5 @@
/* ix87 specific implementation of pow function.
- Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997, 1998, 1999, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@@ -130,7 +130,18 @@ ENTRY(__ieee754_pow)
orl %edx, %ecx
jnz 6b
fstp %st(0) // ST*x
-30: ret
+ ret
+
+ /* y is ±NAN */
+30: fldl 4(%esp) // x : y
+ fldl MO(one) // 1.0 : x : y
+ fucomp %st(1) // x : y
+ fnstsw
+ sahf
+ je 31f
+ fxch // y : x
+31: fstp %st(1)
+ ret
.align ALIGNARG(4)
2: /* y is a real number. */
@@ -189,8 +200,7 @@ ENTRY(__ieee754_pow)
ret
.align ALIGNARG(4)
-14: fldl MO(infinity)
- fmull MO(zero) // raise invalid exception
+14: fldl MO(one)
ret
.align ALIGNARG(4)
diff --git a/sysdeps/i386/fpu/e_powf.S b/sysdeps/i386/fpu/e_powf.S
index c023c11e65..30f262e843 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 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997, 1999, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@@ -125,7 +125,18 @@ ENTRY(__ieee754_powf)
testl %edx, %edx
jnz 6b
fstp %st(0) // ST*x
-30: ret
+ ret
+
+ /* y is ±NAN */
+30: flds 4(%esp) // x : y
+ fldl MO(one) // 1.0 : x : y
+ fucomp %st(1) // x : y
+ fnstsw
+ sahf
+ je 31f
+ fxch // y : x
+31: fstp %st(1)
+ ret
.align ALIGNARG(4)
2: /* y is a real number. */
@@ -184,8 +195,7 @@ ENTRY(__ieee754_powf)
ret
.align ALIGNARG(4)
-14: fldl MO(infinity)
- fmull MO(zero) // raise invalid exception
+14: fldl MO(one)
ret
.align ALIGNARG(4)
diff --git a/sysdeps/i386/fpu/e_powl.S b/sysdeps/i386/fpu/e_powl.S
index 769be4c197..c6aa731423 100644
--- a/sysdeps/i386/fpu/e_powl.S
+++ b/sysdeps/i386/fpu/e_powl.S
@@ -1,5 +1,5 @@
/* ix87 specific implementation of pow function.
- Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997, 1998, 1999, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@@ -130,7 +130,18 @@ ENTRY(__ieee754_powl)
orl %edx, %ecx
jnz 6b
fstp %st(0) // ST*x
-30: ret
+ ret
+
+ /* y is ±NAN */
+30: fldt 4(%esp) // x : y
+ fldl MO(one) // 1.0 : x : y
+ fucomp %st(1) // x : y
+ fnstsw
+ sahf
+ je 31f
+ fxch // y : x
+31: fstp %st(1)
+ ret
.align ALIGNARG(4)
2: /* y is a real number. */
@@ -189,8 +200,7 @@ ENTRY(__ieee754_powl)
ret
.align ALIGNARG(4)
-14: fldl MO(infinity)
- fmull MO(zero) // raise invalid exception
+14: fldl MO(one)
ret
.align ALIGNARG(4)