diff options
author | Ulrich Drepper <drepper@redhat.com> | 1999-01-29 10:58:02 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1999-01-29 10:58:02 +0000 |
commit | d51913e933e4a323fcafbac9b054c0addb7a201e (patch) | |
tree | dd14ac7cbf641bdbbed049be25cfc6232c98870c /sysdeps/alpha | |
parent | baa9f3f31ea57a9e46a487a2a113eb5da4705f62 (diff) | |
download | glibc-d51913e933e4a323fcafbac9b054c0addb7a201e.tar.gz |
Update.
* sysdeps/alpha/fpu/s_floor.c (__floor): Don't depend on inlining,
duplicate the code.
* sysdeps/alpha/fpu/s_floorf.c (__floorf): Likewise.
Diffstat (limited to 'sysdeps/alpha')
-rw-r--r-- | sysdeps/alpha/fpu/s_floor.c | 17 | ||||
-rw-r--r-- | sysdeps/alpha/fpu/s_floorf.c | 24 |
2 files changed, 37 insertions, 4 deletions
diff --git a/sysdeps/alpha/fpu/s_floor.c b/sysdeps/alpha/fpu/s_floor.c index 7b647923e2..c7e14662fe 100644 --- a/sysdeps/alpha/fpu/s_floor.c +++ b/sysdeps/alpha/fpu/s_floor.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998 Free Software Foundation, Inc. +/* Copyright (C) 1998, 1999 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Richard Henderson. @@ -29,7 +29,20 @@ double __floor (double x) { - return __i_floor(x); + if (x != 0 && fabs (x) < 9007199254740992.0) /* 1 << DBL_MANT_DIG */ + { + double __tmp1; + __asm ( +#ifdef _IEEE_FP_INEXACT + "cvttq/svim %2,%1\n\t" +#else + "cvttq/svm %2,%1\n\t" +#endif + "cvtqt/m %1,%0\n\t" + : "=f"(x), "=&f"(__tmp1) + : "f"(x)); + } + return x; } weak_alias (__floor, floor) diff --git a/sysdeps/alpha/fpu/s_floorf.c b/sysdeps/alpha/fpu/s_floorf.c index d25643d19e..7502b6781e 100644 --- a/sysdeps/alpha/fpu/s_floorf.c +++ b/sysdeps/alpha/fpu/s_floorf.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998 Free Software Foundation, Inc. +/* Copyright (C) 1998, 1999 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Richard Henderson. @@ -29,7 +29,27 @@ float __floorf (float x) { - return __i_floorf(x); + /* Check not zero since floor(-0) == -0. */ + if (x != 0 && fabsf (x) < 16777216.0f) /* 1 << FLT_MANT_DIG */ + { + /* Note that Alpha S_Floating is stored in registers in a + restricted T_Floating format, so we don't even need to + convert back to S_Floating in the end. The initial + conversion to T_Floating is needed to handle denormals. */ + + float __tmp1, __tmp2; + + __asm ("cvtst/s %3,%2\n\t" +#ifdef _IEEE_FP_INEXACT + "cvttq/svim %2,%1\n\t" +#else + "cvttq/svm %2,%1\n\t" +#endif + "cvtqt/m %1,%0\n\t" + : "=f"(x), "=&f"(__tmp1), "=&f"(__tmp2) + : "f"(x)); + } + return x; } weak_alias (__floorf, floorf) |