summaryrefslogtreecommitdiff
path: root/sysdeps/sparc/sparc64/soft-fp/qp_util.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2012-05-27 21:02:14 -0700
committerDavid S. Miller <davem@davemloft.net>2012-05-27 21:11:42 -0700
commitd66ef399f5a9e1656fe8e435a8fa655cf271b676 (patch)
treefa8fa1a3d009ccbac649f4587ede51c4e2d0b871 /sysdeps/sparc/sparc64/soft-fp/qp_util.c
parent04fb54b50745587b5bfb7baff66ac9f69ac92db9 (diff)
downloadglibc-d66ef399f5a9e1656fe8e435a8fa655cf271b676.tar.gz
Fix underflow reporting and tie up loose ends in sparc soft-fp.
* sysdeps/sparc/sparc32/soft-fp/q_util.c (___Q_numbers): Delete. (___Q_zero): New. (__Q_simulate_exceptions): Return void. Change to simulate exceptions by writing into the %fsr. * sysdeps/sparc/sparc64/soft-fp/qp_util.c (__Qp_handle_exceptions): Likewise. (numbers): Delete. * sysdeps/sparc/sparc64/soft-fp/Versions: Remove entry for __Qp_handle_exceptions. * sysdeps/unix/sysv/linux/sparc/sparc64/nptl/libc.abilist: Remove __Qp_handle_exceptions. * sysdeps/sparc/sparc32/soft-fp/sfp-machine.h (_FP_DECL_EX): Mark as unused and give dummy FP_RND_NEAREST initializer. (FP_INHIBIT_RESULTS): Define. (___Q_simulate_exceptions): Update declaration. (FP_HANDLE_EXCEPTIONS): Use ___Q_zero and tidy inline asm formatting. * sysdeps/sparc/sparc64/soft-fp/sfp-machine.h (_FP_DECL_EX): Mark as unused and give dummy FP_RND_NEAREST initializer. (__Qp_handle_exceptions): Update declaration. (FP_HANDLE_EXCEPTIONS, QP_NO_EXCEPTIONS): Tidy inline asm formatting.
Diffstat (limited to 'sysdeps/sparc/sparc64/soft-fp/qp_util.c')
-rw-r--r--sysdeps/sparc/sparc64/soft-fp/qp_util.c49
1 files changed, 17 insertions, 32 deletions
diff --git a/sysdeps/sparc/sparc64/soft-fp/qp_util.c b/sysdeps/sparc/sparc64/soft-fp/qp_util.c
index fd3043bb8e..358d0e4ec0 100644
--- a/sysdeps/sparc/sparc64/soft-fp/qp_util.c
+++ b/sysdeps/sparc/sparc64/soft-fp/qp_util.c
@@ -1,7 +1,7 @@
/* Software floating-point emulation.
Helper routine for _Qp_* routines.
Simulate exceptions using double arithmetics.
- Copyright (C) 1999 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jakub Jelinek (jj@ultra.linux.cz).
@@ -21,36 +21,21 @@
#include "soft-fp.h"
-static unsigned long numbers [] = {
-0x7fef000000000000UL, /* A huge double number */
-0x0010100000000000UL, /* Very tiny number */
-0x0010000000000000UL, /* Minimum normalized number */
-0x0000000000000000UL, /* Zero */
-};
-
-double __Qp_handle_exceptions(int exceptions)
+void __Qp_handle_exceptions(int exceptions)
{
- double d, *p = (double *)numbers;
- if (exceptions & FP_EX_INVALID)
- d = p[3]/p[3];
- if (exceptions & FP_EX_OVERFLOW)
- {
- d = p[0] + p[0];
- exceptions &= ~FP_EX_INEXACT;
- }
- if (exceptions & FP_EX_UNDERFLOW)
- {
- if (exceptions & FP_EX_INEXACT)
- {
- d = p[2] * p[2];
- exceptions &= ~FP_EX_INEXACT;
- }
- else
- d = p[1] - p[2];
- }
- if (exceptions & FP_EX_DIVZERO)
- d = 1.0/p[3];
- if (exceptions & FP_EX_INEXACT)
- d = p[0] - p[2];
- return d;
+ fpu_control_t fcw;
+ int tem, ou;
+
+ _FPU_GETCW(fcw);
+
+ tem = (fcw >> 23) & 0x1f;
+
+ ou = exceptions & (FP_EX_OVERFLOW | FP_EX_UNDERFLOW);
+ if (ou & tem)
+ exceptions &= ~FP_EX_INVALID;
+
+ fcw &= ~0x1f;
+ fcw |= (exceptions | (exceptions << 5));
+
+ _FPU_SETCW(fcw);
}