diff options
author | Richard Henderson <rth@redhat.com> | 2000-03-20 20:32:11 +0000 |
---|---|---|
committer | Richard Henderson <rth@redhat.com> | 2000-03-20 20:32:11 +0000 |
commit | b7434f8243547189c14e42559c09c14c41d521ad (patch) | |
tree | 06c7bbb887a1c7db4b0140260a53e39eb3fb0aec /sysdeps/alpha/fpu/s_floor.c | |
parent | 45159f0082e995c3a0e4829dd7c8662ffc0bd041 (diff) |
* sysdeps/alpha/fpu/fraiseexcpt.c: Use get/set_fp_control instead of arithmetic instructions.
* sysdeps/alpha/fpu/s_ceil.c: Use round to -inf instead of playing
with the fpcr. Protect from INV exception.
* sysdeps/alpha/fpu/s_ceilf.c: Likewise.
* sysdeps/alpha/fpu/s_floor.c: Protect from INV exception.
* sysdeps/alpha/fpu/s_floorf.c: Likewise.
* sysdeps/alpha/fpu/s_copysign.c: New.
* sysdeps/alpha/fpu/s_copysignf.c: New.
* sysdeps/alpha/fpu/s_fabs.c: New.
* sysdeps/alpha/fpu/s_fabsf.c: New.
* sysdeps/alpha/fpu/s_rint.c: New.
* sysdeps/alpha/fpu/s_rintf.c: New.
* sysdeps/alpha/fpu/fraiseexcpt.c: Use get/set_fp_control instead
of arithmetic instructions.
* sysdeps/alpha/fpu/s_ceil.c: Use round to -inf instead of playing
with the fpcr. Protect from INV exception.
* sysdeps/alpha/fpu/s_ceilf.c: Likewise.
* sysdeps/alpha/fpu/s_floor.c: Protect from INV exception.
* sysdeps/alpha/fpu/s_floorf.c: Likewise.
* sysdeps/alpha/fpu/s_copysign.c: New.
* sysdeps/alpha/fpu/s_copysignf.c: New.
* sysdeps/alpha/fpu/s_fabs.c: New.
* sysdeps/alpha/fpu/s_fabsf.c: New.
* sysdeps/alpha/fpu/s_rint.c: New.
* sysdeps/alpha/fpu/s_rintf.c: New.
Diffstat (limited to 'sysdeps/alpha/fpu/s_floor.c')
-rw-r--r-- | sysdeps/alpha/fpu/s_floor.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/sysdeps/alpha/fpu/s_floor.c b/sysdeps/alpha/fpu/s_floor.c index 146e19b35a..b6d01f5947 100644 --- a/sysdeps/alpha/fpu/s_floor.c +++ b/sysdeps/alpha/fpu/s_floor.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998, 1999 Free Software Foundation, Inc. +/* Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Richard Henderson. @@ -27,10 +27,10 @@ double __floor (double x) { - /* Check not zero since floor(-0) == -0. */ - if (x != 0 && fabs (x) < 9007199254740992.0) /* 1 << DBL_MANT_DIG */ + if (isless (fabs (x), 9007199254740992.0)) /* 1 << DBL_MANT_DIG */ { - double __tmp1; + double tmp1, new_x; + __asm ( #ifdef _IEEE_FP_INEXACT "cvttq/svim %2,%1\n\t" @@ -38,8 +38,12 @@ __floor (double x) "cvttq/svm %2,%1\n\t" #endif "cvtqt/m %1,%0\n\t" - : "=f"(x), "=&f"(__tmp1) + : "=f"(new_x), "=&f"(tmp1) : "f"(x)); + + /* floor(-0) == -0, and in general we'll always have the same + sign as our input. */ + x = copysign(new_x, x); } return x; } |