2001-02-18  Ulrich Drepper  <drepper@redhat.com>

	* math/libm-test.inc (pow_test): Correct expected results for x == +-1.
	* sysdeps/i386/fpu/e_pow.S: Handle x == +-1 correctly.
	* sysdeps/i386/fpu/e_powf.S: Likewise.
	* sysdeps/i386/fpu/e_powl.S: Likewise.

	* sysdeps/i386/fpu/bits/mathinline.h: Remove pow inline code.

	* sysdeps/generic/e_exp2l.c: ...this.   New file.
	* sysdeps/i386/fpu/e_exp2.S: ...this.   New file.
	* sysdeps/i386/fpu/e_exp2f.S: ...this.   New file.
	* sysdeps/i386/fpu/e_exp2l.S: ...this.   New file.
	* sysdeps/ieee754/flt-32/e_exp2f.c: ...this.   New file.
	* sysdeps/ieee754/dbl-64/e_exp2.c: ...this.   New file.
	* sysdeps/m68k/fpu/e_exp2.c: ...this.   New file.
	* sysdeps/m68k/fpu/e_exp2f.c: ...this.   New file.
	* sysdeps/m68k/fpu/e_exp2l.c: ...this.   New file.
This commit is contained in:
Ulrich Drepper 2001-02-18 09:02:38 +00:00
parent 4ebacc5a62
commit 6571c5709a
6 changed files with 66 additions and 77 deletions

View File

@ -1,25 +1,34 @@
2001-02-18 Ulrich Drepper <drepper@redhat.com>
* math/libm-test.inc (pow_test): Correct expected results for x == +-1.
* sysdeps/i386/fpu/e_pow.S: Handle x == +-1 correctly.
* sysdeps/i386/fpu/e_powf.S: Likewise.
* sysdeps/i386/fpu/e_powl.S: Likewise.
* sysdeps/i386/fpu/bits/mathinline.h: Remove pow inline code.
2001-02-17 Ulrich Drepper <drepper@redhat.com> 2001-02-17 Ulrich Drepper <drepper@redhat.com>
* math/Makefile (libm-calls): It's e_exp2 not s_exp2. * math/Makefile (libm-calls): It's e_exp2 not s_exp2.
* sysdeps/generic/s_exp2l.c: Renamed to... * sysdeps/generic/s_exp2l.c: Renamed to...
* sysdeps/generic/s_exp2l.c: ...this. New file. * sysdeps/generic/e_exp2l.c: ...this. New file.
* sysdeps/i386/fpu/s_exp2.S: Renamed to... * sysdeps/i386/fpu/s_exp2.S: Renamed to...
* sysdeps/i386/fpu/s_exp2.S: ...this. New file. * sysdeps/i386/fpu/e_exp2.S: ...this. New file.
* sysdeps/i386/fpu/s_exp2f.S: Renamed to... * sysdeps/i386/fpu/s_exp2f.S: Renamed to...
* sysdeps/i386/fpu/s_exp2f.S: ...this. New file. * sysdeps/i386/fpu/e_exp2f.S: ...this. New file.
* sysdeps/i386/fpu/s_exp2l.S: Renamed to... * sysdeps/i386/fpu/s_exp2l.S: Renamed to...
* sysdeps/i386/fpu/s_exp2l.S: ...this. New file. * sysdeps/i386/fpu/e_exp2l.S: ...this. New file.
* sysdeps/ieee754/flt-32/s_exp2f.c: Renamed to... * sysdeps/ieee754/flt-32/s_exp2f.c: Renamed to...
* sysdeps/ieee754/flt-32/s_exp2f.c: ...this. New file. * sysdeps/ieee754/flt-32/e_exp2f.c: ...this. New file.
* sysdeps/ieee754/dbl-64/s_exp2.c: Renamed to... * sysdeps/ieee754/dbl-64/s_exp2.c: Renamed to...
* sysdeps/ieee754/dbl-64/s_exp2.c: ...this. New file. * sysdeps/ieee754/dbl-64/e_exp2.c: ...this. New file.
* sysdeps/m68k/fpu/s_exp2.c: Renamed to... * sysdeps/m68k/fpu/s_exp2.c: Renamed to...
* sysdeps/m68k/fpu/s_exp2.c: ...this. New file. * sysdeps/m68k/fpu/e_exp2.c: ...this. New file.
* sysdeps/m68k/fpu/s_exp2f.c: Renamed to... * sysdeps/m68k/fpu/s_exp2f.c: Renamed to...
* sysdeps/m68k/fpu/s_exp2f.c: ...this. New file. * sysdeps/m68k/fpu/e_exp2f.c: ...this. New file.
* sysdeps/m68k/fpu/s_exp2l.c: Renamed to... * sysdeps/m68k/fpu/s_exp2l.c: Renamed to...
* sysdeps/m68k/fpu/s_exp2l.c: ...this. New file. * sysdeps/m68k/fpu/e_exp2l.c: ...this. New file.
2001-02-17 Andreas Jaeger <aj@suse.de> 2001-02-17 Andreas Jaeger <aj@suse.de>

View File

@ -3468,7 +3468,7 @@ pow_test (void)
TEST_ff_f (pow, nan_value, nan_value, nan_value); TEST_ff_f (pow, nan_value, nan_value, nan_value);
TEST_ff_f (pow, 0, nan_value, nan_value); TEST_ff_f (pow, 0, nan_value, nan_value);
TEST_ff_f (pow, 1, nan_value, nan_value); TEST_ff_f (pow, 1, nan_value, 1);
TEST_ff_f (pow, -1, nan_value, nan_value); TEST_ff_f (pow, -1, nan_value, nan_value);
TEST_ff_f (pow, nan_value, 1, nan_value); TEST_ff_f (pow, nan_value, 1, nan_value);
TEST_ff_f (pow, nan_value, -1, nan_value); TEST_ff_f (pow, nan_value, -1, nan_value);
@ -3476,10 +3476,10 @@ pow_test (void)
/* pow (x, NaN) == NaN. */ /* pow (x, NaN) == NaN. */
TEST_ff_f (pow, 3.0, nan_value, nan_value); TEST_ff_f (pow, 3.0, nan_value, nan_value);
TEST_ff_f (pow, 1, plus_infty, nan_value, INVALID_EXCEPTION); TEST_ff_f (pow, 1, plus_infty, 1);
TEST_ff_f (pow, -1, plus_infty, nan_value, INVALID_EXCEPTION); TEST_ff_f (pow, -1, plus_infty, 1);
TEST_ff_f (pow, 1, minus_infty, nan_value, INVALID_EXCEPTION); TEST_ff_f (pow, 1, minus_infty, 1);
TEST_ff_f (pow, -1, minus_infty, nan_value, INVALID_EXCEPTION); TEST_ff_f (pow, -1, minus_infty, 1);
TEST_ff_f (pow, -0.1L, 1.1L, nan_value, INVALID_EXCEPTION); TEST_ff_f (pow, -0.1L, 1.1L, nan_value, INVALID_EXCEPTION);
TEST_ff_f (pow, -0.1L, -1.1L, nan_value, INVALID_EXCEPTION); TEST_ff_f (pow, -0.1L, -1.1L, nan_value, INVALID_EXCEPTION);

View File

@ -1,5 +1,5 @@
/* Inline math functions for i387. /* 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. This file is part of the GNU C Library.
Contributed by John C. Bowman <bowman@math.ualberta.ca>, 1995. Contributed by John C. Bowman <bowman@math.ualberta.ca>, 1995.
@ -413,56 +413,6 @@ __inline_mathcodeNP (tan, __x, \
("fptan" \ ("fptan" \
: "=t" (__value2), "=u" (__value) : "0" (__x)); \ : "=t" (__value2), "=u" (__value) : "0" (__x)); \
return __value) 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__ */ #endif /* __FAST_MATH__ */

View File

@ -1,5 +1,5 @@
/* ix87 specific implementation of pow function. /* 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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@ -130,7 +130,18 @@ ENTRY(__ieee754_pow)
orl %edx, %ecx orl %edx, %ecx
jnz 6b jnz 6b
fstp %st(0) // ST*x 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) .align ALIGNARG(4)
2: /* y is a real number. */ 2: /* y is a real number. */
@ -189,8 +200,7 @@ ENTRY(__ieee754_pow)
ret ret
.align ALIGNARG(4) .align ALIGNARG(4)
14: fldl MO(infinity) 14: fldl MO(one)
fmull MO(zero) // raise invalid exception
ret ret
.align ALIGNARG(4) .align ALIGNARG(4)

View File

@ -1,5 +1,5 @@
/* ix87 specific implementation of pow function. /* 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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@ -125,7 +125,18 @@ ENTRY(__ieee754_powf)
testl %edx, %edx testl %edx, %edx
jnz 6b jnz 6b
fstp %st(0) // ST*x 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) .align ALIGNARG(4)
2: /* y is a real number. */ 2: /* y is a real number. */
@ -184,8 +195,7 @@ ENTRY(__ieee754_powf)
ret ret
.align ALIGNARG(4) .align ALIGNARG(4)
14: fldl MO(infinity) 14: fldl MO(one)
fmull MO(zero) // raise invalid exception
ret ret
.align ALIGNARG(4) .align ALIGNARG(4)

View File

@ -1,5 +1,5 @@
/* ix87 specific implementation of pow function. /* 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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@ -130,7 +130,18 @@ ENTRY(__ieee754_powl)
orl %edx, %ecx orl %edx, %ecx
jnz 6b jnz 6b
fstp %st(0) // ST*x 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) .align ALIGNARG(4)
2: /* y is a real number. */ 2: /* y is a real number. */
@ -189,8 +200,7 @@ ENTRY(__ieee754_powl)
ret ret
.align ALIGNARG(4) .align ALIGNARG(4)
14: fldl MO(infinity) 14: fldl MO(one)
fmull MO(zero) // raise invalid exception
ret ret
.align ALIGNARG(4) .align ALIGNARG(4)